4 """A singleton holding informations on the whereabouts of all the automatically 5 generated Configurables. 6 This repository of (informations on) Configurables is used by the PropertyProxy 7 class to locate Configurables and feed the JobOptionsSvc. It could also be used 8 to feed the AthenaEmacs module...""" 10 __all__ = [
'CfgDb',
'cfgDb',
'loadConfigurableDb',
'getConfigurable']
13 _transtable = string.maketrans(
'<>&*,: ().',
'__rp__s___')
16 log = logging.getLogger(
'ConfigurableDb')
21 A singleton class holding informations about automatically generated 23 --> package holding that Configurable 24 --> library holding the components related to that Configurable 25 --> python module holding the Configurable 26 --> a dictionary of duplicates 37 def add(self, configurable, package, module, lib):
38 """Method to populate the Db. 39 It is called from the auto-generated Xyz_confDb.py files (genconf.cpp) 40 @param configurable: the name of the configurable being added 41 @param package: the name of the package which holds this Configurable 42 @param module: the name of the python module holding the Configurable 43 @param lib: the name of the library holding the component(s) (ie: the 44 C++ Gaudi component which is mapped by the Configurable) 46 cfg = {
'package': package,
49 if self.has_key(configurable):
51 if cfg[
'lib'] != self[configurable][
'lib']:
52 log.debug(
"dup!! [%s] p=%s m=%s lib=%s",
53 configurable, package, module, lib)
54 if self._duplicates.has_key(configurable):
59 log.debug(
"added [%s] p=%s m=%s lib=%s",
60 configurable, package, module, lib)
61 self[configurable] = cfg
68 for i, ll
in enumerate(f):
70 if l.startswith(
'#')
or len(l) <= 0:
75 pkg = line[0].split(
'.')[0]
78 self.
add(cname, pkg, module, lib)
82 "invalid line format: %s:%d: %r" %
111 """Helper function to load all ConfigurableDb files (modules) holding 112 informations about Configurables 116 from glob
import glob
117 from os.path
import join
as path_join
118 log.debug(
"loading confDb files...")
120 if sys.platform ==
'darwin':
121 pathlist = os.getenv(
"DYLD_LIBRARY_PATH",
"").split(os.pathsep)
123 pathlist = os.getenv(
"LD_LIBRARY_PATH",
"").split(os.pathsep)
124 for path
in pathlist:
125 if not os.path.isdir(path):
127 log.debug(
"walking in [%s]...", path)
128 confDbFiles = [f
for f
in [path_join(path, f)
for f
in os.listdir(path)
129 if f.endswith(
'.confdb')]
130 if os.path.isfile(f)]
132 mergedConfDbFiles = [f
for f
in confDbFiles
133 if f.endswith(
'_merged.confdb')]
134 if mergedConfDbFiles:
136 confDbFiles = mergedConfDbFiles
138 for confDb
in confDbFiles:
139 log.debug(
"\t-loading [%s]...", confDb)
141 cfgDb._loadModule(confDb)
142 except Exception, err:
143 log.warning(
"Could not load file [%s] !", confDb)
144 log.warning(
"Reason: %s", err)
146 log.debug(
"loading confDb files... [DONE]")
147 nPkgs = len(set([k[
'package']
for k
in cfgDb.values()]))
148 log.debug(
"loaded %i confDb packages", nPkgs)
153 confClass = className
156 confClass = string.translate(confClass, _transtable)
158 confClassInfo = cfgDb.get(confClass)
159 if not confClassInfo:
160 confClassInfo = cfgDb.get(confClass)
162 confMod = confClassInfo
and confClassInfo.get(
'module')
164 log.warning(
"%s: Class %s not in database", requester, className)
168 mod = __import__(confMod, globals(), locals(), confClass)
170 log.warning(
"%s: Module %s not found (needed for configurable %s)",
171 requester, confMod, className)
175 confClass = getattr(mod, confClass)
176 except AttributeError:
177 log.warning(
"%s: Configurable %s not found in module %s",
178 requester, confClass, confMod)
181 log.debug(
"%s: Found configurable %s in module %s",
182 requester, confClass, confMod)
def _loadModule(self, fname)
def add(self, configurable, package, module, lib)
def getConfigurable(className, requester='', assumeCxxClass=True)