123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- '''module that aggregates config information'''
- __all__=('_reset','register_reset')
- def _defaults_init():
- '''
- create & return defaults for all reportlab settings from
- reportlab.rl_settings.py
- reportlab.local_rl_settings.py
- reportlab_settings.py or ~/.reportlab_settings
- latter values override earlier
- '''
- from reportlab.lib.utils import rl_exec
- import os
- _DEFAULTS={}
- rl_exec('from reportlab.rl_settings import *',_DEFAULTS)
- _overrides=_DEFAULTS.copy()
- try:
- rl_exec('from reportlab.local_rl_settings import *',_overrides)
- _DEFAULTS.update(_overrides)
- except ImportError:
- pass
- _overrides=_DEFAULTS.copy()
- try:
- rl_exec('from reportlab_settings import *',_overrides)
- _DEFAULTS.update(_overrides)
- except ImportError:
- _overrides=_DEFAULTS.copy()
- try:
- try:
- fn = os.path.expanduser(os.path.join('~','.reportlab_settings')) #appengine fails with KeyError/ImportError (dev/live)
- except (KeyError, ImportError):
- fn = None
- if fn:
- with open(fn,'rb') as f:
- rl_exec(f.read(),_overrides)
- _DEFAULTS.update(_overrides)
- except:
- pass
- return _DEFAULTS
- _DEFAULTS=_defaults_init()
- _SAVED = {}
- sys_version=None
- #this is used to set the options from
- def _setOpt(name, value, conv=None):
- '''set a module level value from environ/default'''
- from os import environ
- ename = 'RL_'+name
- if ename in environ:
- value = environ[ename]
- if conv: value = conv(value)
- globals()[name] = value
- def _startUp():
- '''This function allows easy resetting to the global defaults
- If the environment contains 'RL_xxx' then we use the value
- else we use the given default'''
- import os, sys
- global sys_version, _unset_
- sys_version = sys.version.split()[0] #strip off the other garbage
- from reportlab.lib import pagesizes
- from reportlab.lib.utils import rl_isdir
- if _SAVED=={}:
- _unset_ = getattr(sys,'_rl_config__unset_',None)
- if _unset_ is None:
- class _unset_: pass
- sys._rl_config__unset_ = _unset_ = _unset_()
- global __all__
- A = list(__all__)
- for k,v in _DEFAULTS.items():
- _SAVED[k] = globals()[k] = v
- if k not in __all__:
- A.append(k)
- __all__ = tuple(A)
- #places to search for Type 1 Font files
- import reportlab
- D = {'REPORTLAB_DIR': os.path.abspath(os.path.dirname(reportlab.__file__)),
- 'CWD': os.getcwd(),
- 'disk': os.getcwd().split(':')[0],
- 'sys_version': sys_version,
- 'XDG_DATA_HOME': os.environ.get('XDG_DATA_HOME','~/.local/share'),
- }
- for k in _SAVED:
- if k.endswith('SearchPath'):
- P=[]
- for p in _SAVED[k]:
- d = (p % D).replace('/',os.sep)
- if '~' in d:
- try:
- d = os.path.expanduser(d) #appengine fails with KeyError/ImportError (dev/live)
- except (KeyError, ImportError):
- continue
- if rl_isdir(d): P.append(d)
- _setOpt(k,os.pathsep.join(P),lambda x:x.split(os.pathsep))
- globals()[k] = list(filter(rl_isdir,globals()[k]))
- else:
- v = _SAVED[k]
- if isinstance(v,(int,float)):
- conv = type(v)
- elif k=='defaultPageSize':
- conv = lambda v,M=pagesizes: getattr(M,v)
- elif k in ('trustedHosts','trustedSchemes'):
- conv = lambda v: None if v is None else [y for y in [x.strip() for x in v.split(',')] if y] if isinstance(v,str) else v
- else: conv = None
- _setOpt(k,v,conv)
- _registered_resets=[]
- def register_reset(func):
- '''register a function to be called by rl_config._reset'''
- _registered_resets[:] = [x for x in _registered_resets if x()]
- L = [x for x in _registered_resets if x() is func]
- if L: return
- from weakref import ref
- _registered_resets.append(ref(func))
- def _reset():
- '''attempt to reset reportlab and friends'''
- _startUp() #our reset
- for f in _registered_resets[:]:
- c = f()
- if c:
- c()
- else:
- _registered_resets.remove(f)
- _startUp()
|