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' )
20 A singleton class holding informations about automatically generated 22 --> package holding that Configurable 23 --> library holding the components related to that Configurable 24 --> python module holding the Configurable 25 --> a dictionary of duplicates 36 def add( self, configurable, package, module, lib ):
37 """Method to populate the Db. 38 It is called from the auto-generated Xyz_confDb.py files (genconf.cpp) 39 @param configurable: the name of the configurable being added 40 @param package: the name of the package which holds this Configurable 41 @param module: the name of the python module holding the Configurable 42 @param lib: the name of the library holding the component(s) (ie: the 43 C++ Gaudi component which is mapped by the Configurable) 45 cfg = {
'package' : package,
48 if self.has_key( configurable ):
50 if cfg[
'lib'] != self[configurable][
'lib']:
51 log.debug(
"dup!! [%s] p=%s m=%s lib=%s",
52 configurable, package, module, lib )
53 if self._duplicates.has_key(configurable):
58 log.debug(
"added [%s] p=%s m=%s lib=%s",
59 configurable, package, module, lib )
60 self[configurable] = cfg
67 for i,ll
in enumerate(f):
69 if l.startswith(
'#')
or len(l) <= 0:
74 pkg = line[0].split(
'.')[0]
77 self.
add(cname, pkg, module, lib)
81 "invalid line format: %s:%d: %r" %
107 """Helper function to load all ConfigurableDb files (modules) holding 108 informations about Configurables 112 from glob
import glob
113 from os.path
import join
as path_join
114 log.debug(
"loading confDb files..." )
116 pathlist = os.getenv(
"LD_LIBRARY_PATH",
"").split(os.pathsep)
117 for path
in pathlist:
118 if not os.path.isdir(path):
120 log.debug(
"walking in [%s]...", path )
121 confDbFiles = [f
for f
in [path_join(path, f)
for f
in os.listdir(path)
122 if f.endswith(
'.confdb')]
123 if os.path.isfile(f)]
125 mergedConfDbFiles = [f
for f
in confDbFiles
126 if f.endswith(
'_merged.confdb')]
127 if mergedConfDbFiles:
129 confDbFiles = mergedConfDbFiles
131 for confDb
in confDbFiles:
132 log.debug(
"\t-loading [%s]...", confDb )
134 cfgDb._loadModule( confDb )
135 except Exception, err:
136 log.warning(
"Could not load file [%s] !", confDb )
137 log.warning(
"Reason: %s", err )
139 log.debug(
"loading confDb files... [DONE]" )
140 nPkgs = len( set([k[
'package']
for k
in cfgDb.values()]) )
141 log.debug(
"loaded %i confDb packages", nPkgs )
149 confClass = string.translate( confClass, _transtable )
151 confClassInfo = cfgDb.get(confClass)
152 if not confClassInfo:
153 confClassInfo = cfgDb.get(confClass)
155 confMod = confClassInfo
and confClassInfo.get(
'module')
157 log.warning(
"%s: Class %s not in database", requester, className )
161 mod = __import__(confMod,globals(),locals(),confClass)
163 log.warning(
"%s: Module %s not found (needed for configurable %s)",
164 requester, confMod, className )
168 confClass = getattr(mod,confClass)
169 except AttributeError:
170 log.warning(
"%s: Configurable %s not found in module %s",
171 requester, confClass, confMod )
174 log.debug(
"%s: Found configurable %s in module %s",
175 requester, confClass, confMod )
def loadConfigurableDb()
Helper function to load all ConfigurableDb files holding informations.
def _loadModule(self, fname)
def add(self, configurable, package, module, lib)
__obj
the object this singleton is holding No other object will be created...
def getConfigurable(className, requester='', assumeCxxClass=True)