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))
120 """Helper function to load all ConfigurableDb files (modules) holding
121 informations about Configurables
124 from os.path
import join
as path_join
126 log.debug(
"loading confDb files...")
128 pathlist = os.getenv(
"LD_LIBRARY_PATH",
"").split(os.pathsep)
129 ignored_files = set(os.environ.get(
"CONFIGURABLE_DB_IGNORE",
"").split(
","))
130 for path
in pathlist:
131 if not os.path.isdir(path):
133 log.debug(
"walking in [%s]...", path)
137 path_join(path, f)
for f
in os.listdir(path)
if f.endswith(
".confdb")
139 if os.path.isfile(f)
and f
not in ignored_files
142 mergedConfDbFiles = [f
for f
in confDbFiles
if f.endswith(
"_merged.confdb")]
143 if mergedConfDbFiles:
145 confDbFiles = mergedConfDbFiles
147 for confDb
in confDbFiles:
148 log.debug(
"\t-loading [%s]...", confDb)
150 cfgDb._loadModule(confDb)
151 except Exception
as err:
152 log.warning(
"Could not load file [%s] !", confDb)
153 log.warning(
"Reason: %s", err)
155 log.debug(
"loading confDb files... [DONE]")
156 nPkgs = len(set([k[
"package"]
for k
in cfgDb.values()]))
157 log.debug(
"loaded %i confDb packages", nPkgs)
162 confClass = className
166 confClass = str.translate(confClass, _transtable)
167 except AttributeError:
169 confClass = string.translate(confClass, _transtable)
171 confClassInfo = cfgDb.get(confClass)
172 if not confClassInfo:
173 confClassInfo = cfgDb.get(confClass)
175 confMod = confClassInfo
and confClassInfo.get(
"module")
177 log.warning(
"%s: Class %s not in database", requester, className)
181 mod = __import__(confMod, globals(), locals(), confClass)
184 "%s: Module %s not found (needed for configurable %s)",
192 confClass = getattr(mod, confClass)
193 except AttributeError:
195 "%s: Configurable %s not found in module %s", requester, confClass, confMod
199 log.debug(
"%s: Found configurable %s in module %s", requester, confClass, confMod)