13 """A singleton holding informations on the whereabouts of all the automatically
14 generated Configurables.
15 This repository of (informations on) Configurables is used by the PropertyProxy
16 class to locate Configurables and feed the JobOptionsSvc. It could also be used
17 to feed the AthenaEmacs module..."""
19 __all__ = [
"CfgDb",
"cfgDb",
"loadConfigurableDb",
"getConfigurable"]
24 _transtable = str.maketrans(
"<>&*,: ().",
"__rp__s___")
25 except AttributeError:
27 _transtable = string.maketrans(
"<>&*,: ().",
"__rp__s___")
31 log = logging.getLogger(
"ConfigurableDb")
36 A singleton class holding informations about automatically generated
38 --> package holding that Configurable
39 --> library holding the components related to that Configurable
40 --> python module holding the Configurable
41 --> a dictionary of duplicates
52 def add(self, configurable, package, module, lib):
53 """Method to populate the Db.
54 It is called from the auto-generated Xyz_confDb.py files (genconf.cpp)
55 @param configurable: the name of the configurable being added
56 @param package: the name of the package which holds this Configurable
57 @param module: the name of the python module holding the Configurable
58 @param lib: the name of the library holding the component(s) (ie: the
59 C++ Gaudi component which is mapped by the Configurable)
61 cfg = {
"package": package,
"module": module,
"lib": lib}
62 if configurable
in self:
64 if cfg[
"lib"] != self[configurable][
"lib"]:
66 "dup!! [%s] p=%s m=%s lib=%s", configurable, package, module, lib
73 log.debug(
"added [%s] p=%s m=%s lib=%s", configurable, package, module, lib)
74 self[configurable] = cfg
81 for i, ll
in enumerate(f):
83 if l.startswith(
"#")
or len(l) <= 0:
88 pkg = line[0].split(
".")[0]
91 self.
add(cname, pkg, module, lib)
94 raise Exception(
"invalid line format: %s:%d: %r" % (fname, i + 1, ll))
121 """Helper function to load all ConfigurableDb files (modules) holding
122 informations about Configurables
126 from glob
import glob
127 from os.path
import join
as path_join
129 log.debug(
"loading confDb files...")
131 pathlist = os.getenv(
"LD_LIBRARY_PATH",
"").split(os.pathsep)
132 ignored_files = set(os.environ.get(
"CONFIGURABLE_DB_IGNORE",
"").split(
","))
133 for path
in pathlist:
134 if not os.path.isdir(path):
136 log.debug(
"walking in [%s]...", path)
140 path_join(path, f)
for f
in os.listdir(path)
if f.endswith(
".confdb")
142 if os.path.isfile(f)
and f
not in ignored_files
145 mergedConfDbFiles = [f
for f
in confDbFiles
if f.endswith(
"_merged.confdb")]
146 if mergedConfDbFiles:
148 confDbFiles = mergedConfDbFiles
150 for confDb
in confDbFiles:
151 log.debug(
"\t-loading [%s]...", confDb)
153 cfgDb._loadModule(confDb)
154 except Exception
as err:
155 log.warning(
"Could not load file [%s] !", confDb)
156 log.warning(
"Reason: %s", err)
158 log.debug(
"loading confDb files... [DONE]")
159 nPkgs = len(set([k[
"package"]
for k
in cfgDb.values()]))
160 log.debug(
"loaded %i confDb packages", nPkgs)
165 confClass = className
169 confClass = str.translate(confClass, _transtable)
170 except AttributeError:
172 confClass = string.translate(confClass, _transtable)
174 confClassInfo = cfgDb.get(confClass)
175 if not confClassInfo:
176 confClassInfo = cfgDb.get(confClass)
178 confMod = confClassInfo
and confClassInfo.get(
"module")
180 log.warning(
"%s: Class %s not in database", requester, className)
184 mod = __import__(confMod, globals(), locals(), confClass)
187 "%s: Module %s not found (needed for configurable %s)",
195 confClass = getattr(mod, confClass)
196 except AttributeError:
198 "%s: Configurable %s not found in module %s", requester, confClass, confMod
202 log.debug(
"%s: Found configurable %s in module %s", requester, confClass, confMod)