reportlab/lib/utils.py
author rgbecker
Tue, 23 Mar 2004 13:54:42 +0000
changeset 2244 58148991bc4d
parent 2240 068e2487e780
child 2247 256cea0756a9
permissions -rw-r--r--
Improvements for compact running
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
494
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 474
diff changeset
     1
#copyright ReportLab Inc. 2000
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 474
diff changeset
     2
#see license.txt for license details
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 474
diff changeset
     3
#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/utils.py?cvsroot=reportlab
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
     4
#$Header: /tmp/reportlab/reportlab/lib/utils.py,v 1.65 2004/03/23 13:54:42 rgbecker Exp $
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
     5
__version__=''' $Id: utils.py,v 1.65 2004/03/23 13:54:42 rgbecker Exp $ '''
562
6c9408ec3302 Minor neglectable changes.
dinu_gherman
parents: 519
diff changeset
     6
1375
cb8e4098def5 Added ArgvDictValue and getArgvDict
rgbecker
parents: 1153
diff changeset
     7
import string, os, sys
413
6312e8296c9b Initial version
rgbecker
parents:
diff changeset
     8
from types import *
674
c25a9dbfc27a Improved ImportError handling
rgbecker
parents: 562
diff changeset
     9
from reportlab.lib.logger import warnOnce
413
6312e8296c9b Initial version
rgbecker
parents:
diff changeset
    10
SeqTypes = (ListType,TupleType)
562
6c9408ec3302 Minor neglectable changes.
dinu_gherman
parents: 519
diff changeset
    11
2215
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    12
def _findFiles(dirList,ext='.ttf'):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    13
    from os.path import isfile, isdir, join as path_join
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    14
    from os import listdir
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    15
    ext = ext.lower()
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    16
    R = []
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    17
    A = R.append
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    18
    for D in dirList:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    19
        if not isdir(D): continue
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    20
        for fn in listdir(D):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    21
            fn = path_join(D,fn)
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    22
            if isfile(fn) and (not ext or fn.lower().endswith(ext)): A(fn)
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    23
    return R
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    24
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    25
try:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    26
    _UserDict = dict
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    27
except:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    28
    from UserDict import UserDict as _UserDict
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    29
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    30
class CIDict(_UserDict):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    31
    def __init__(self,*a,**kw):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    32
        map(self.update, a)
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    33
        self.update(kw)
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    34
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    35
    def update(self,D):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    36
        for k,v in D.items(): self[k] = v
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    37
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    38
    def __setitem__(self,k,v):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    39
        try:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    40
            k = k.lower()
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    41
        except:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    42
            pass
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    43
        _UserDict.__setitem__(self,k,v)
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    44
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    45
    def __getitem__(self,k):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    46
        try:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    47
            k = k.lower()
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    48
        except:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    49
            pass
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    50
        return _UserDict.__getitem__(self,k)
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    51
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    52
    def __delitem__(self,k):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    53
        try:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    54
            k = k.lower()
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    55
        except:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    56
            pass
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    57
        return _UserDict.__delitem__(self,k)
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    58
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    59
    def get(self,k,dv=None):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    60
        try:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    61
            return self[k]
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    62
        except KeyError:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    63
            return dv
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    64
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    65
    def has_key(self,k):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    66
        try:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    67
            self[k]
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    68
            return True
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    69
        except:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    70
            return False
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    71
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    72
    def pop(self,k,*a):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    73
        try:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    74
            k = k.lower()
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    75
        except:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    76
            pass
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    77
        return _UserDict.pop(*((self,k)+a))
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    78
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    79
    def setdefault(self,k,*a):
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    80
        try:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    81
            k = k.lower()
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    82
        except:
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    83
            pass
e86aad9766c7 Added _findFiles & CIDict
rgbecker
parents: 2200
diff changeset
    84
        return _UserDict.setdefault(*((self,k)+a))
1837
a3920893b1b8 Back in synch, diagnostic function for distro type added
andy_robinson
parents: 1835
diff changeset
    85
1902
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
    86
if os.name == 'mac':
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
    87
    #with the Mac, we need to tag the file in a special
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
    88
    #way so the system knows it is a PDF file.
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
    89
    #This supplied by Joe Strout
2057
22e7a13fa031 Fixed so that file creator and types are now correctly set on the Mac again
rptlab
parents: 2053
diff changeset
    90
    import macfs, macostools
2007
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    91
    _KNOWN_MAC_EXT = {
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    92
        'BMP' : ('ogle','BMP '),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    93
        'EPS' : ('ogle','EPSF'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    94
        'EPSF': ('ogle','EPSF'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    95
        'GIF' : ('ogle','GIFf'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    96
        'JPG' : ('ogle','JPEG'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    97
        'JPEG': ('ogle','JPEG'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    98
        'PCT' : ('ttxt','PICT'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
    99
        'PICT': ('ttxt','PICT'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   100
        'PNG' : ('ogle','PNGf'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   101
        'PPM' : ('ogle','.PPM'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   102
        'TIF' : ('ogle','TIFF'),
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   103
        'TIFF': ('ogle','TIFF'),
2051
50350756e12c Added HTML to the Mac markfilename routine - HTML files should now 'know'
johnprecedo
parents: 2045
diff changeset
   104
        'PDF' : ('CARO','PDF '),
2057
22e7a13fa031 Fixed so that file creator and types are now correctly set on the Mac again
rptlab
parents: 2053
diff changeset
   105
        'HTML': ('MSIE','TEXT'),
2007
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   106
        }
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   107
    def markfilename(filename,creatorcode=None,filetype=None,ext='PDF'):
1902
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
   108
        try:
2007
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   109
            if creatorcode is None or filetype is None and ext is not None:
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   110
                try:
2057
22e7a13fa031 Fixed so that file creator and types are now correctly set on the Mac again
rptlab
parents: 2053
diff changeset
   111
                    creatorcode, filetype = _KNOWN_MAC_EXT[string.upper(ext)]
2007
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   112
                except:
2759dd179707 Added John's mac type dict to markfilename
rgbecker
parents: 1999
diff changeset
   113
                    return
1902
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
   114
            macfs.FSSpec(filename).SetCreatorType(creatorcode,filetype)
2051
50350756e12c Added HTML to the Mac markfilename routine - HTML files should now 'know'
johnprecedo
parents: 2045
diff changeset
   115
            macostools.touched(filename)
1902
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
   116
        except:
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
   117
            pass
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
   118
else:
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
   119
    def markfilename(filename,creatorcode=None,filetype=None):
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
   120
        pass
3dc6869b1b47 Moved markfilename from pdfdoc
rgbecker
parents: 1837
diff changeset
   121
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   122
import reportlab
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   123
_RL_DIR=os.path.dirname(reportlab.__file__)
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   124
_RL_ADIR=os.path.abspath(_RL_DIR)
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   125
del reportlab
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   126
2225
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   127
#Attempt to detect if this copy of reportlab is running in a
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   128
#file system (as opposed to mostly running in a zip or McMillan
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   129
#archive or Jar file).  This is used by test cases, so that
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   130
#we can write test cases that don't get activated in a compiled
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   131
try:
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   132
    __file__
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   133
except:
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   134
    __file__ = sys.argv[0]
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   135
try:
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   136
    _isFSD = not __loader__
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   137
    _loaderpfxlen = len(__loader__.archive+os.sep)
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   138
    _loaderpfxlenA = _loaderpfxlen+len(_RL_ADIR)-len(_RL_DIR)
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   139
except:
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   140
    _isFSD = os.path.isfile(__file__)   #slight risk of wrong path
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   141
    __loader__ = None
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   142
_isFSSD = _isFSD and os.path.isfile(os.path.splitext(__file__)[0] +'.py')
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   143
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   144
def _startswith_rl(fn):
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   145
    '''if the name starts with a known prefix strip it off'''
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   146
    fn = fn.replace('/',os.sep)
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   147
    if fn.startswith(_RL_DIR): return fn[_loaderpfxlen:]
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   148
    elif fn.startswith(_RL_ADIR): return fn[_loaderpfxlenA:]
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   149
    return fn
2225
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   150
1837
a3920893b1b8 Back in synch, diagnostic function for distro type added
andy_robinson
parents: 1835
diff changeset
   151
def isFileSystemDistro():
2225
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   152
    '''return truth if a file system distribution'''
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   153
    return _isFSD
1837
a3920893b1b8 Back in synch, diagnostic function for distro type added
andy_robinson
parents: 1835
diff changeset
   154
a3920893b1b8 Back in synch, diagnostic function for distro type added
andy_robinson
parents: 1835
diff changeset
   155
def isCompactDistro():
2225
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   156
    '''return truth if not a file system distribution'''
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   157
    return not _isFSD
1837
a3920893b1b8 Back in synch, diagnostic function for distro type added
andy_robinson
parents: 1835
diff changeset
   158
a3920893b1b8 Back in synch, diagnostic function for distro type added
andy_robinson
parents: 1835
diff changeset
   159
def isSourceDistro():
2225
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   160
    '''return truth if a source file system distribution'''
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   161
    return _isFSSD
1143
46a5ec2d3d2c Better import error checking
rgbecker
parents: 998
diff changeset
   162
413
6312e8296c9b Initial version
rgbecker
parents:
diff changeset
   163
try:
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   164
    #raise ImportError
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   165
    ### NOTE!  FP_STR SHOULD PROBABLY ALWAYS DO A PYTHON STR() CONVERSION ON ARGS
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   166
    ### IN CASE THEY ARE "LAZY OBJECTS".  ACCELLERATOR DOESN'T DO THIS (YET)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   167
    try:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   168
        from _rl_accel import fp_str                # in case of builtin version
2053
2a962a30dc46 Removed checkImportError
rgbecker
parents: 2051
diff changeset
   169
    except ImportError:
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   170
        from reportlab.lib._rl_accel import fp_str  # specific
2053
2a962a30dc46 Removed checkImportError
rgbecker
parents: 2051
diff changeset
   171
except ImportError:
2139
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   172
    from math import log
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   173
    _log_10 = lambda x,log=log,_log_e_10=log(10.0): log(x)/_log_e_10
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   174
    _fp_fmts = "%.0f", "%.1f", "%.2f", "%.3f", "%.4f", "%.5f", "%.6f"
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   175
    import re
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   176
    _tz_re = re.compile('0+$')
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   177
    del re
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   178
    def fp_str(*a):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   179
        if len(a)==1 and type(a[0]) in SeqTypes: a = a[0]
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   180
        s = []
2139
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   181
        A = s.append
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   182
        for i in a:
2139
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   183
            sa =abs(i)
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   184
            if sa<=1e-7: A('0')
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   185
            else:
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   186
                l = sa<=1 and 6 or min(max(0,(6-int(_log_10(sa)))),6)
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   187
                n = _fp_fmts[l]%i
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   188
                if l:
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   189
                    n = _tz_re.sub('',n)
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   190
                    try:
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   191
                        if n[-1]=='.': n = n[:-1]
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   192
                    except:
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   193
                        print i, n
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   194
                        raise
0f27f8cb5586 Make fp_str more like _rl_accel(C/java) versions
rgbecker
parents: 2133
diff changeset
   195
                A((n[0]!='0' or len(n)==1) and n or n[1:])
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   196
        return string.join(s)
448
cb0c4d97e29b Added _className func
rgbecker
parents: 413
diff changeset
   197
981
b3dfa2ba427c Attempt to fix the locale mismatch problem
rgbecker
parents: 962
diff changeset
   198
#hack test for comma users
b3dfa2ba427c Attempt to fix the locale mismatch problem
rgbecker
parents: 962
diff changeset
   199
if ',' in fp_str(0.25):
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   200
    _FP_STR = fp_str
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   201
    def fp_str(*a):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   202
        return string.replace(apply(_FP_STR,a),',','.')
981
b3dfa2ba427c Attempt to fix the locale mismatch problem
rgbecker
parents: 962
diff changeset
   203
1821
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   204
def recursiveImport(modulename, baseDir=None, noCWD=0, debug=0):
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   205
    """Dynamically imports possible packagized module, or raises ImportError"""
2160
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   206
    normalize = lambda x: os.path.normcase(os.path.abspath(os.path.normpath(x)))
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   207
    path = map(normalize,sys.path)
2156
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   208
    if baseDir:
1834
c7ee3661d73a Fix typo
rgbecker
parents: 1833
diff changeset
   209
        if type(baseDir) not in SeqTypes:
2156
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   210
            tp = [baseDir]
1833
135322abc191 Fix recursivImport for case when baseDir is a sequence
rgbecker
parents: 1821
diff changeset
   211
        else:
2156
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   212
            tp = filter(None,list(baseDir))
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   213
        for p in tp:
2160
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   214
            p = normalize(p)
2156
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   215
            if p not in path: path.insert(0,p)
1396
40d1361f08b7 Enhanced the error message from recursiveImport
andy_robinson
parents: 1389
diff changeset
   216
1821
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   217
    if noCWD:
2160
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   218
        for p in ('','.',normalize('.')):
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   219
            while p in path:
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   220
                if debug: print 'removed "%s" from path' % p
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   221
                path.remove(p)
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   222
    elif '.' not in path:
1821
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   223
            path.insert(0,'.')
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   224
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   225
    if debug:
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   226
        import pprint
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   227
        pp = pprint.pprint
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   228
        print 'path=',
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   229
        pp(path)
2200
be0cfccc662a Fixed up tabs and whitespace in all source files
andy_robinson
parents: 2160
diff changeset
   230
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   231
    #make import errors a bit more informative
2156
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   232
    opath = sys.path
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   233
    try:
2156
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   234
        sys.path = path
2160
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   235
        exec 'import %s\nm = %s\n' % (modulename,modulename) in locals()
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   236
        sys.path = opath
2156
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   237
        return m
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   238
    except ImportError:
2160
0ac717b8d778 Minor changes to recursiveimport
rgbecker
parents: 2156
diff changeset
   239
        sys.path = opath
2156
e0398bc717f2 First attempt at using import rather than imp
rgbecker
parents: 2139
diff changeset
   240
        msg = "recursiveimport(%s,baseDir=%s) failed" % (modulename,baseDir)
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   241
        if baseDir:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   242
            msg = msg + " under paths '%s'" % `path`
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   243
        raise ImportError, msg
1396
40d1361f08b7 Enhanced the error message from recursiveImport
andy_robinson
parents: 1389
diff changeset
   244
1821
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   245
def recursiveGetAttr(obj, name):
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   246
    "Can call down into e.g. object1.object2[4].attr"
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   247
    return eval(name, obj.__dict__)
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   248
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   249
def recursiveSetAttr(obj, name, value):
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   250
    "Can call down into e.g. object1.object2[4].attr = value"
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   251
    #get the thing above last.
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   252
    tokens = string.split(name, '.')
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   253
    #print 'name=%s, tokens=%s' % (name, tokens)
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   254
    if len(tokens) == 1:
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   255
        setattr(obj, name, value)
2200
be0cfccc662a Fixed up tabs and whitespace in all source files
andy_robinson
parents: 2160
diff changeset
   256
    else:
1821
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   257
        most = string.join(tokens[:-1], '.')
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   258
        last = tokens[-1]
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   259
        #print 'most=%s, last=%s' % (most, last)
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   260
        parent = recursiveGetAttr(obj, most)
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   261
        #print 'parent=%s' % parent
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   262
        setattr(parent, last, value)
7854ddd0fc30 Fixed recursive import, setting and gettign attributes
andy_robinson
parents: 1683
diff changeset
   263
674
c25a9dbfc27a Improved ImportError handling
rgbecker
parents: 562
diff changeset
   264
def import_zlib():
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   265
    try:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   266
        import zlib
2053
2a962a30dc46 Removed checkImportError
rgbecker
parents: 2051
diff changeset
   267
    except ImportError:
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   268
        zlib = None
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   269
        from reportlab.rl_config import ZLIB_WARNINGS
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   270
        if ZLIB_WARNINGS: warnOnce('zlib not available')
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   271
    return zlib
674
c25a9dbfc27a Improved ImportError handling
rgbecker
parents: 562
diff changeset
   272
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   273
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   274
# Image Capability Detection.  Set a flag haveImages
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   275
# to tell us if either PIL or Java imaging libraries present.
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   276
# define PIL_Image as either None, or an alias for the PIL.Image
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   277
# module, as there are 2 ways to import it
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   278
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   279
if sys.platform[0:4] == 'java':
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   280
    try:
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   281
        import javax.imageio
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   282
        import java.awt.image
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   283
        haveImages = 1
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   284
    except:
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   285
        haveImages = 0
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   286
else:
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   287
    try:
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   288
        from PIL import Image
2053
2a962a30dc46 Removed checkImportError
rgbecker
parents: 2051
diff changeset
   289
    except ImportError:
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   290
        try:
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   291
            import Image
2053
2a962a30dc46 Removed checkImportError
rgbecker
parents: 2051
diff changeset
   292
        except ImportError:
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   293
            Image = None
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   294
    haveImages = Image is not None
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   295
    if haveImages: del Image
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   296
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   297
1586
d600d8ffaa21 This seems adequate if we avoid Dinuisms like writing to initialised StringIOs
rgbecker
parents: 1584
diff changeset
   298
__StringIO=None
1580
50792f072538 use generalised StringIO instance interface
rgbecker
parents: 1575
diff changeset
   299
def getStringIO(buf=None):
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   300
    '''unified StringIO instance interface'''
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   301
    global __StringIO
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   302
    if not __StringIO:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   303
        try:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   304
            from cStringIO import StringIO
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   305
        except ImportError:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   306
            from StringIO import StringIO
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   307
        __StringIO = StringIO
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   308
    return buf is not None and __StringIO(buf) or __StringIO()
1580
50792f072538 use generalised StringIO instance interface
rgbecker
parents: 1575
diff changeset
   309
1375
cb8e4098def5 Added ArgvDictValue and getArgvDict
rgbecker
parents: 1153
diff changeset
   310
class ArgvDictValue:
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   311
    '''A type to allow clients of getArgvDict to specify a conversion function'''
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   312
    def __init__(self,value,func):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   313
        self.value = value
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   314
        self.func = func
1375
cb8e4098def5 Added ArgvDictValue and getArgvDict
rgbecker
parents: 1153
diff changeset
   315
cb8e4098def5 Added ArgvDictValue and getArgvDict
rgbecker
parents: 1153
diff changeset
   316
def getArgvDict(**kw):
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   317
    ''' Builds a dictionary from its keyword arguments with overrides from sys.argv.
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   318
        Attempts to be smart about conversions, but the value can be an instance
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   319
        of ArgDictValue to allow specifying a conversion function.
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   320
    '''
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   321
    def handleValue(v,av,func):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   322
        if func:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   323
            v = func(av)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   324
        else:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   325
            t = type(v)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   326
            if t is StringType:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   327
                v = av
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   328
            elif t is FloatType:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   329
                v = float(av)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   330
            elif t is IntType:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   331
                v = int(av)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   332
            elif t is ListType:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   333
                v = list(eval(av))
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   334
            elif t is TupleType:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   335
                v = tuple(eval(av))
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   336
            else:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   337
                raise TypeError, "Can't convert string '%s' to %s" % (av,str(t))
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   338
        return v
1387
715edbf17c7a Improved argv stuff
rgbecker
parents: 1375
diff changeset
   339
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   340
    A = sys.argv[1:]
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   341
    R = {}
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   342
    for k, v in kw.items():
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   343
        if isinstance(v,ArgvDictValue):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   344
            v, func = v.value, v.func
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   345
        else:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   346
            func = None
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   347
        handled = 0
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   348
        ke = k+'='
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   349
        for a in A:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   350
            if string.find(a,ke)==0:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   351
                av = a[len(ke):]
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   352
                A.remove(a)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   353
                R[k] = handleValue(v,av,func)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   354
                handled = 1
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   355
                break
1387
715edbf17c7a Improved argv stuff
rgbecker
parents: 1375
diff changeset
   356
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   357
        if not handled: R[k] = handleValue(v,v,func)
1387
715edbf17c7a Improved argv stuff
rgbecker
parents: 1375
diff changeset
   358
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   359
    return R
1375
cb8e4098def5 Added ArgvDictValue and getArgvDict
rgbecker
parents: 1153
diff changeset
   360
452
6bb011a0d63e Initial version of D Yoo's pyHnj
rgbecker
parents: 448
diff changeset
   361
def getHyphenater(hDict=None):
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   362
    try:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   363
        from reportlab.lib.pyHnj import Hyphen
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   364
        if hDict is None: hDict=os.path.join(os.path.dirname(__file__),'hyphen.mashed')
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   365
        return Hyphen(hDict)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   366
    except ImportError, errMsg:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   367
        if str(errMsg)!='No module named pyHnj': raise
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   368
        return None
452
6bb011a0d63e Initial version of D Yoo's pyHnj
rgbecker
parents: 448
diff changeset
   369
448
cb0c4d97e29b Added _className func
rgbecker
parents: 413
diff changeset
   370
def _className(self):
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   371
    '''Return a shortened class name'''
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   372
    try:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   373
        name = self.__class__.__name__
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   374
        i=string.rfind(name,'.')
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   375
        if i>=0: return name[i+1:]
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   376
        return name
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   377
    except AttributeError:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   378
        return str(self)
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   379
1575
7d2360bdfc4d Added open_for_read
rgbecker
parents: 1561
diff changeset
   380
def open_for_read(name,mode='b'):
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   381
    '''attempt to open a file or URL for reading'''
2229
99cb312c5269 Fix transparency & jpeg behaviour
rgbecker
parents: 2227
diff changeset
   382
    if hasattr(name,'read'): return name
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   383
    import urllib
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   384
    try:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   385
        t, o = urllib.splittype(name)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   386
        if not t or t=='file': raise ValueError
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   387
        o = urllib.urlopen(name)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   388
        return getStringIO(o.read())
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   389
    except:
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   390
        if 'r' not in mode: mode = 'r'+mode
2231
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   391
        try:
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   392
            return open(name,mode)
2231
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   393
        except IOError:
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   394
            t, v = sys.exc_info()[:2]
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   395
            if _isFSD or __loader__ is None: raise
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   396
            try:
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   397
                #we have a __loader__, perhaps the filename starts with
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   398
                #the dirname(reportlab.__file__) or is relative
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   399
                name = _startswith_rl(name)
2231
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   400
                s = __loader__.get_data(name)
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   401
                if 'b' not in mode and os.linesep!='\n': s = s.replace(os.linesep,'\n')
2231
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   402
                return getStringIO(s)
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   403
            except:
19537d9c99f1 First attempt at reading from the zip archive
rgbecker
parents: 2229
diff changeset
   404
                raise t, v
1575
7d2360bdfc4d Added open_for_read
rgbecker
parents: 1561
diff changeset
   405
2225
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   406
def open_and_read(name,mode='b'):
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   407
    return open_for_read(name,mode).read()
783cbac215e5 Improve the fs distro check
rgbecker
parents: 2215
diff changeset
   408
2240
068e2487e780 Added rl_isfile
rgbecker
parents: 2231
diff changeset
   409
def rl_isfile(fn,os_path_isfile=os.path.isfile):
068e2487e780 Added rl_isfile
rgbecker
parents: 2231
diff changeset
   410
    if hasattr(fn,'read'): return True
068e2487e780 Added rl_isfile
rgbecker
parents: 2231
diff changeset
   411
    if os_path_isfile(fn): return True
068e2487e780 Added rl_isfile
rgbecker
parents: 2231
diff changeset
   412
    if _isFSD or __loader__ is None: return False
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   413
    fn = _startswith_rl(fn)
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   414
    return fn in __loader__._files.keys()
2240
068e2487e780 Added rl_isfile
rgbecker
parents: 2231
diff changeset
   415
2244
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   416
def rl_isdir(pn,os_path_isdir=os.path.isdir):
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   417
    if os_path_isdir(pn): return True
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   418
    if _isFSD or __loader__ is None: return False
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   419
    pn = _startswith_rl(pn)
58148991bc4d Improvements for compact running
rgbecker
parents: 2240
diff changeset
   420
    return len(filter(lambda x: x.startswith(pn),__loader__._files.keys()))>0
2240
068e2487e780 Added rl_isfile
rgbecker
parents: 2231
diff changeset
   421
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   422
class ImageReader:
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   423
    "Wraps up either PIL or Java to get data from bitmaps"
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   424
    def __init__(self, fileName):
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   425
        if not haveImages:
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   426
            warnOnce('Imaging Library not available, unable to import bitmaps')
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   427
            return
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   428
        #start wih lots of null private fields, to be populated by
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   429
        #the relevant engine.
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   430
        self.fileName = fileName
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   431
        self._image = None
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   432
        self._width = None
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   433
        self._height = None
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   434
        self._transparent = None
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   435
        self._data = None
2229
99cb312c5269 Fix transparency & jpeg behaviour
rgbecker
parents: 2227
diff changeset
   436
        self.fp = open_for_read(fileName,'b')
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   437
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   438
        #detect which library we are using and open the image
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   439
        if sys.platform[0:4] == 'java':
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   440
            from javax.imageio import ImageIO
2229
99cb312c5269 Fix transparency & jpeg behaviour
rgbecker
parents: 2227
diff changeset
   441
            self._image = ImageIO.read(self.fp)
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   442
        else:
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   443
            import PIL.Image
2229
99cb312c5269 Fix transparency & jpeg behaviour
rgbecker
parents: 2227
diff changeset
   444
            self._image = PIL.Image.open(self.fp)
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   445
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   446
    def getSize(self):
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   447
        if (self._width is None or self._height is None):
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   448
            if sys.platform[0:4] == 'java':
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   449
                self._width = self._image.getWidth()
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   450
                self._height = self._image.getHeight()
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   451
            else:
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   452
                self._width, self._height = self._image.size
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   453
        return (self._width, self._height)
2200
be0cfccc662a Fixed up tabs and whitespace in all source files
andy_robinson
parents: 2160
diff changeset
   454
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   455
    def getRGBData(self):
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   456
        "Return byte array of RGB data as string"
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   457
        if self._data is None:
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   458
            if sys.platform[0:4] == 'java':
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   459
                import jarray
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   460
                from java.awt.image import PixelGrabber
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   461
                width, height = self.getSize()
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   462
                buffer = jarray.zeros(width*height, 'i')
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   463
                pg = PixelGrabber(self._image, 0,0,width,height,buffer,0,width)
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   464
                pg.grabPixels()
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   465
                # there must be a way to do this with a cast not a byte-level loop,
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   466
                # I just haven't found it yet...
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   467
                pixels = []
2059
e5eec1dd6f0c ImageReader can now take File objects as well as Strings
dragan1
parents: 2057
diff changeset
   468
                a = pixels.append
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   469
                for i in range(len(buffer)):
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   470
                    rgb = buffer[i]
2087
5c4b76884d9d fixed java file read bug
dragan1
parents: 2086
diff changeset
   471
                    a(chr((rgb>>16)&0xff))
5c4b76884d9d fixed java file read bug
dragan1
parents: 2086
diff changeset
   472
                    a(chr((rgb>>8)&0xff))
2059
e5eec1dd6f0c ImageReader can now take File objects as well as Strings
dragan1
parents: 2057
diff changeset
   473
                    a(chr(rgb&0xff))
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   474
                self._data = ''.join(pixels)
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   475
            else:
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   476
                rgb = self._image.convert('RGB')
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   477
                self._data = rgb.tostring()
2200
be0cfccc662a Fixed up tabs and whitespace in all source files
andy_robinson
parents: 2160
diff changeset
   478
        return self._data
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   479
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   480
    def getImageData(self):
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   481
        width, height = self.getSize()
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   482
        return width, height, self.getRGBData()
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   483
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   484
    def getTransparent(self):
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   485
        if sys.platform[0:4] == 'java':
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   486
            return None
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   487
        else:
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   488
            if self._image.info.has_key("transparency"):
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   489
                transparency = self._image.info["transparency"] * 3
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   490
                palette = self._image.palette
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   491
                try:
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   492
                    palette = palette.palette
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   493
                except:
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   494
                    palette = palette.data
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   495
                return map(ord, palette[transparency:transparency+3])
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   496
            else:
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   497
                return None
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   498
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   499
def getImageData(imageFileName):
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   500
    "Get width, height and RGB pixels from image file.  Wraps Java/PIL"
2045
cc042609c62e hack to ImageReader
rgbecker
parents: 2044
diff changeset
   501
    return ImageReader.getImageData(imageFileName)
2044
3be472f4a6dd Various work on abstracting out images, plus outstanding patches
andy_robinson
parents: 2007
diff changeset
   502
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   503
class DebugMemo:
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   504
    '''Intended as a simple report back encapsulator
1545
966ccacc4c7d Changes to DebugMemo.__doc__
rgbecker
parents: 1543
diff changeset
   505
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   506
    Typical usages
1683
7fa753e4420a Removed all trailing whitespace
andy_robinson
parents: 1677
diff changeset
   507
    1) To record error data
7fa753e4420a Removed all trailing whitespace
andy_robinson
parents: 1677
diff changeset
   508
        dbg = DebugMemo(fn='dbgmemo.dbg',myVar=value)
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   509
        dbg.add(anotherPayload='aaaa',andagain='bbb')
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   510
        dbg.dump()
1543
3681c7d8898d Slight formatting improvements & added payload method
rgbecker
parents: 1538
diff changeset
   511
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   512
    2) To show the recorded info
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   513
        dbg = DebugMemo(fn='dbgmemo.dbg',mode='r')
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   514
        dbg.load()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   515
        dbg.show()
1543
3681c7d8898d Slight formatting improvements & added payload method
rgbecker
parents: 1538
diff changeset
   516
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   517
    3) To re-use recorded information
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   518
        dbg = DebugMemo(fn='dbgmemo.dbg',mode='r')
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   519
            dbg.load()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   520
        myTestFunc(dbg.payload('myVar'),dbg.payload('andagain'))
1545
966ccacc4c7d Changes to DebugMemo.__doc__
rgbecker
parents: 1543
diff changeset
   521
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   522
    in addition to the payload variables the dump records many useful bits
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   523
    of information which are also printed in the show() method.
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   524
    '''
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   525
    def __init__(self,fn='rl_dbgmemo.dbg',mode='w',getScript=1,modules=(),**kw):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   526
        import time, socket
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   527
        self.fn = fn
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   528
        if mode!='w': return
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   529
        self.store = store = {}
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   530
        if sys.exc_info() != (None,None,None):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   531
            import traceback
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   532
            s = getStringIO()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   533
            traceback.print_exc(None,s)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   534
            store['__traceback'] = s.getvalue()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   535
        cwd=os.getcwd()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   536
        lcwd = os.listdir(cwd)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   537
        exed = os.path.abspath(os.path.dirname(sys.argv[0]))
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   538
        store.update({  'gmt': time.asctime(time.gmtime(time.time())),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   539
                        'platform': sys.platform,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   540
                        'version': sys.version,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   541
                        'executable': sys.executable,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   542
                        'prefix': sys.prefix,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   543
                        'path': sys.path,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   544
                        'argv': sys.argv,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   545
                        'cwd': cwd,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   546
                        'hostname': socket.gethostname(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   547
                        'lcwd': lcwd,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   548
                        })
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   549
        if exed!=cwd: store.update({'exed': exed,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   550
                                    'lexed': os.listdir(exed),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   551
                                    })
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   552
        if hasattr(os,'uname'):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   553
            store.update({
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   554
                'uname': os.uname(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   555
                'ctermid': os.ctermid(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   556
                'getgid': os.getgid(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   557
                'getuid': os.getuid(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   558
                'getegid': os.getegid(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   559
                'geteuid': os.geteuid(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   560
                'getlogin': os.getlogin(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   561
                'getgroups': os.getgroups(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   562
                'getpgrp': os.getpgrp(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   563
                'getpid': os.getpid(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   564
                'getppid': os.getppid(),
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   565
                })
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   566
        if getScript:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   567
            fn = os.path.abspath(sys.argv[0])
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   568
            if os.path.isfile(fn):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   569
                store['__script'] = open(fn,'r').read()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   570
        module_versions = {}
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   571
        for n,m in sys.modules.items():
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   572
            if n=='reportlab' or n=='rlextra' or n[:10]=='reportlab.' or n[:8]=='rlextra.':
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   573
                v = getattr(m,'__version__',None)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   574
                if v: module_versions[n] = v
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   575
        store['__module_versions'] = module_versions
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   576
        self.store['__payload'] = {}
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   577
        self._add(kw)
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   578
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   579
    def _add(self,D):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   580
        payload = self.store['__payload']
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   581
        for k, v in D.items():
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   582
            payload[k] = v
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   583
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   584
    def add(self,**kw):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   585
        self._add(kw)
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   586
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   587
    def dump(self):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   588
        import pickle
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   589
        pickle.dump(self.store,open(self.fn,'wb'))
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   590
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   591
    def load(self):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   592
        import pickle
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   593
        self.store = pickle.load(open(self.fn,'rb'))
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   594
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   595
    def _show_module_versions(self,k,v):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   596
        print k[2:]
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   597
        K = v.keys()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   598
        K.sort()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   599
        for k in K:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   600
            vk = v[k]
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   601
            try:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   602
                m = recursiveImport(k,sys.path[:],1)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   603
                d = getattr(m,'__version__',None)==vk and 'SAME' or 'DIFFERENT'
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   604
            except:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   605
                m = None
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   606
                d = '??????unknown??????'
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   607
            print '  %s = %s (%s)' % (k,vk,d)
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   608
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   609
    def _banner(self,k,what):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   610
        print '###################%s %s##################' % (what,k[2:])
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   611
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   612
    def _start(self,k):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   613
        self._banner(k,'Start  ')
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   614
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   615
    def _finish(self,k):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   616
        self._banner(k,'Finish ')
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   617
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   618
    def _show_lines(self,k,v):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   619
        self._start(k)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   620
        print v
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   621
        self._finish(k)
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   622
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   623
    def _show_payload(self,k,v):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   624
        if v:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   625
            import pprint
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   626
            self._start(k)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   627
            pprint.pprint(v)
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   628
            self._finish(k)
1538
faefcdc303a9 Added DebugMemo stuff
rgbecker
parents: 1537
diff changeset
   629
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   630
    specials = {'__module_versions': _show_module_versions,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   631
                '__payload': _show_payload,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   632
                '__traceback': _show_lines,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   633
                '__script': _show_lines,
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   634
                }
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   635
    def show(self):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   636
        K = self.store.keys()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   637
        K.sort()
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   638
        for k in K:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   639
            if k not in self.specials.keys(): print '%-15s = %s' % (k,self.store[k])
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   640
        for k in K:
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   641
            if k in self.specials.keys(): apply(self.specials[k],(self,k,self.store[k]))
1543
3681c7d8898d Slight formatting improvements & added payload method
rgbecker
parents: 1538
diff changeset
   642
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   643
    def payload(self,name):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   644
        return self.store['__payload'][name]
1561
1b10f25e76df Add DebugMemo __g/setitem__
rgbecker
parents: 1545
diff changeset
   645
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   646
    def __setitem__(self,name,value):
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   647
        self.store['__payload'][name] = value
1561
1b10f25e76df Add DebugMemo __g/setitem__
rgbecker
parents: 1545
diff changeset
   648
1677
1450177dd19e Exterminated all tab characters and added a test to make sure
andy_robinson
parents: 1650
diff changeset
   649
    def __getitem__(self,name):
1833
135322abc191 Fix recursivImport for case when baseDir is a sequence
rgbecker
parents: 1821
diff changeset
   650
        return self.store['__payload'][name]