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
125 from os.path
import join
as path_join
127 log.debug(
"loading confDb files...")
129 pathlist = os.getenv(
"LD_LIBRARY_PATH",
"").split(os.pathsep)
130 ignored_files = set(os.environ.get(
"CONFIGURABLE_DB_IGNORE",
"").split(
","))
131 for path
in pathlist:
132 if not os.path.isdir(path):
134 log.debug(
"walking in [%s]...", path)
138 path_join(path, f)
for f
in os.listdir(path)
if f.endswith(
".confdb")
140 if os.path.isfile(f)
and f
not in ignored_files
143 mergedConfDbFiles = [f
for f
in confDbFiles
if f.endswith(
"_merged.confdb")]
144 if mergedConfDbFiles:
146 confDbFiles = mergedConfDbFiles
148 for confDb
in confDbFiles:
149 log.debug(
"\t-loading [%s]...", confDb)
151 cfgDb._loadModule(confDb)
152 except Exception
as err:
153 log.warning(
"Could not load file [%s] !", confDb)
154 log.warning(
"Reason: %s", err)
156 log.debug(
"loading confDb files... [DONE]")
157 nPkgs = len(set([k[
"package"]
for k
in cfgDb.values()]))
158 log.debug(
"loaded %i confDb packages", nPkgs)
163 confClass = className
167 confClass = str.translate(confClass, _transtable)
168 except AttributeError:
170 confClass = string.translate(confClass, _transtable)
172 confClassInfo = cfgDb.get(confClass)
173 if not confClassInfo:
174 confClassInfo = cfgDb.get(confClass)
176 confMod = confClassInfo
and confClassInfo.get(
"module")
178 log.warning(
"%s: Class %s not in database", requester, className)
182 mod = __import__(confMod, globals(), locals(), confClass)
185 "%s: Module %s not found (needed for configurable %s)",
193 confClass = getattr(mod, confClass)
194 except AttributeError:
196 "%s: Configurable %s not found in module %s", requester, confClass, confMod
200 log.debug(
"%s: Found configurable %s in module %s", requester, confClass, confMod)