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
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):
60 log.debug(
"added [%s] p=%s m=%s lib=%s",
61 configurable, package, module, lib )
62 self[configurable] = cfg
93 """Helper function to load all ConfigurableDb files (modules) holding
94 informations about Configurables
98 from zipfile
import is_zipfile, ZipFile
100 from os.path
import join
as path_join
101 log.debug(
"importing confDb packages..." )
103 for path
in sys.path:
104 log.debug(
"walking in [%s]..." % path )
105 if not os.path.exists(path):
109 confDbModules = [ os.path.splitext(f)[0].replace(
'/',
'.')
110 for f
in ZipFile(path).namelist()
111 if f.endswith(
"_merged_confDb.py")
or f.endswith(
"_merged_confDb.pyc") ]
114 confDbModules = [ os.path.splitext( f[len(path)+1:] )[0].replace(os.sep,
'.')
115 for f
in glob(path_join(path,
"*_merged_confDb.py"))
116 if os.path.isfile(f) ]
117 for confDbModule
in confDbModules:
119 log.debug(
"\t-importing [%s]..." % confDbModule )
121 mod = __import__( confDbModule )
122 except ImportError, err:
123 log.warning(
"Could not import module [%s] !", confDbModule )
124 log.warning(
"Reason: %s", err )
131 log.debug(
"importing confDb packages... [DONE]" )
132 nPkgs = len( set([k[
'package']
for k
in cfgDb.values()]) )
133 log.debug(
"imported %i confDb packages" % nPkgs )
141 confClass = string.translate( confClass, _transtable )
143 confClassInfo = cfgDb.get(confClass)
144 if not confClassInfo:
145 confClassInfo = cfgDb.get(confClass)
147 confMod = confClassInfo
and confClassInfo.get(
'module')
149 log.warning(
"%s: Class %s not in database", requester, className )
153 mod = __import__(confMod,globals(),locals(),confClass)
155 log.warning(
"%s: Module %s not found (needed for configurable %s)",
156 requester, confMod, className )
160 confClass = getattr(mod,confClass)
161 except AttributeError:
162 log.warning(
"%s: Configurable %s not found in module %s",
163 requester, confClass, confMod )
166 log.debug(
"%s: Found configurable %s in module %s",
167 requester, confClass, confMod )