7 _log = logging.getLogger(__name__)
11 def __init__(self, fmt=None, datefmt=None, prefix="# ", with_time=False):
12 logging.Formatter.__init__(self, fmt, datefmt)
17 fmsg = logging.Formatter.format(self, record)
20 prefix +=
'%f ' % time.time()
21 if record.levelno >= logging.WARNING:
22 prefix += record.levelname +
": " 23 s =
"\n".join([prefix + line
for line
in fmsg.splitlines()])
29 logging.Filter.__init__(self, name)
40 Decrease the printing_level of 'step' units. ( >0 means no print) 41 The level cannot go below 0, unless the force flag is set to True. 42 A negative value of the threshold disables subsequent "PrintOff"s. 54 Increase the printing_level of 'step' units. ( >0 means no print) 58 def disable(self, allowed=logging.WARNING):
62 def enable(self, allowed=logging.WARNING):
68 def __init__(self, stream=None, prefix=None, with_time=False):
71 logging.StreamHandler.__init__(self, stream)
80 self._formatter.prefix = prefix
84 Decrease the printing_level of 'step' units. ( >0 means no print) 85 The level cannot go below 0, unless the force flag is set to True. 86 A negative value of the threshold disables subsequent "PrintOff"s. 88 self._filter.printOn(step, force)
92 Increase the printing_level of 'step' units. ( >0 means no print) 94 self._filter.printOff(step)
96 def disable(self, allowed=logging.WARNING):
97 self._filter.disable(allowed)
99 def enable(self, allowed=logging.WARNING):
100 self._filter.enable(allowed)
103 _consoleHandler =
None 107 global _consoleHandler
108 if _consoleHandler
is None:
110 prefix=prefix, stream=stream, with_time=with_time)
111 elif prefix
is not None:
112 _consoleHandler.setPrefix(prefix)
113 return _consoleHandler
120 root_logger = logging.getLogger()
121 if not root_logger.handlers:
123 root_logger.setLevel(logging.WARNING)
124 if level
is not None:
125 root_logger.setLevel(level)
142 f = os.path.expandvars(f)
143 if os.path.isfile(f):
144 return os.path.realpath(f)
146 path = os.environ.get(
'JOBOPTSEARCHPATH',
'').split(os.pathsep)
148 candidates = [d
for d
in path
if os.path.isfile(os.path.join(d, f))]
150 raise ParserError(
"Cannot find '%s' in %s" % (f, path))
151 return os.path.realpath(os.path.join(candidates[0], f))
154 _included_files = set()
158 if f
in _included_files:
159 _log.warning(
"file '%s' already included, ignored.", f)
161 _included_files.add(f)
166 comment = re.compile(
r'(//.*)$')
169 comment_in_string = re.compile(
r'(["\']).*//.*\1')
170 directive = re.compile(
r'^\s*#\s*([\w!]+)\s*(.*)\s*$')
171 comment_ml = (re.compile(
r'/\*'), re.compile(
r'\*/'))
173 reference = re.compile(
r'^@([\w.]*)$')
179 if sys.platform !=
'win32':
185 _log.info(
"--> Including file '%s'", file)
187 _log.info(
"<-- End of file '%s'", file)
194 ifdef_skipping =
False 195 ifdef_skipping_level = 0
201 if l.startswith(
"#!"):
211 m = self.comment.search(l)
214 m2 = self.comment_in_string.search(l)
217 if not (m2
and m2.start() < m.start()):
220 l = l[:m.start()] + l[m.end():]
222 m = self.directive.search(l)
224 directive_name = m.group(1)
225 directive_arg = m.group(2).strip()
226 if directive_name ==
"include":
227 included_file = directive_arg.strip(
"'\"")
229 elif directive_name ==
"units":
230 units_file = directive_arg.strip(
"'\"")
232 elif directive_name
in [
"ifdef",
"ifndef"]:
233 ifdef_skipping_level = ifdef_level
235 if directive_arg
in self.
defines:
236 ifdef_skipping = directive_name ==
"ifndef" 238 ifdef_skipping = directive_name ==
"ifdef" 239 elif directive_name ==
"else":
240 ifdef_skipping =
not ifdef_skipping
241 elif directive_name ==
"endif":
243 if ifdef_skipping
and ifdef_skipping_level == ifdef_level:
244 ifdef_skipping =
False 245 elif directive_name ==
"pragma":
246 if not directive_arg:
249 pragma = directive_arg.split()
250 if pragma[0] ==
"print":
252 if pragma[1].upper()
in [
"ON",
"TRUE",
"1"]:
257 _log.warning(
"unknown directive '%s'", directive_name)
268 l, l1 = l[:m.start()], l[m.end():]
277 "End Of File reached before end of multi-line comment")
283 string_end = l.find(
'"')
285 statement += l[:string_end + 1]
286 l = l[string_end + 1:]
292 string_start = l.find(
'"')
293 if string_start >= 0:
294 string_end = l.find(
'"', string_start + 1)
297 statement += l[:string_end + 1]
298 l = l[string_end + 1:]
310 statement = l[i + 1:]
313 if statement.lstrip().startswith(
"//"):
321 for line
in open(file):
323 line = line[:line.index(
'//')]
327 nunit, value = line.split(
'=')
328 factor, unit = nunit.split()
329 value = eval(value) / eval(factor)
330 self.
units[unit] = value
333 from GaudiKernel.Proxy.Configurable
import (
334 ConfigurableGeneric, Configurable, PropertyReference)
338 property, value = statement.split(
"=", 1)
341 if property[-1]
in [
"+",
"-"]:
343 property = property[:-1]
345 property = property.strip()
346 value = value.strip()
363 property =
'.'.join([w.strip()
for w
in property.split(
'.')])
364 component, property = property.rsplit(
'.', 1)
365 if component
in Configurable.allConfigurables:
366 cfg = Configurable.allConfigurables[component]
368 cfg = ConfigurableGeneric(component)
371 value = value.replace(
'true',
'True').replace(
'false',
'False')
374 if ':' in value
and not (value[:value.index(
':')].count(
'"') % 2
or 375 value[:value.index(
':')].count(
"'") % 2):
378 value[1:-1].replace(
'{',
'[').replace(
'}',
']') +
'}' 380 value = value.replace(
'{',
'[').replace(
'}',
']')
383 value = value.replace(
'\\',
'\\\\')
385 value = (value.replace(
r"\\n",
r"\n").replace(
r"\\t",
r"\t").replace(
388 value =
'"'.join([(v
if i % 2
else re.sub(
r'\\[nt]',
' ', v))
389 for i, v
in enumerate(value.split(
'"'))])
392 m = self.reference.match(value)
395 value = PropertyReference(m.group(1))
397 value = eval(value, self.
units)
402 if property
not in cfg.__slots__
and not hasattr(cfg, property):
404 lprop = property.lower()
405 for p
in cfg.__slots__:
406 if lprop == p.lower():
408 "property '%s' was requested for %s, but the correct spelling is '%s'",
409 property, cfg.name(), p)
415 if hasattr(cfg, property):
416 prop = getattr(cfg, property)
417 if type(prop) == dict:
423 setattr(cfg, property, value)
425 if hasattr(cfg, property):
426 prop = getattr(cfg, property)
427 if type(prop)
is dict:
432 _log.warning(
"key '%s' not in %s.%s", k,
433 cfg.name(), property)
439 _log.warning(
"value '%s' not in %s.%s", k,
440 cfg.name(), property)
442 setattr(cfg, property, value)
463 input = open(file,
'rb')
464 catalog = pickle.load(input)
465 _log.info(
'Unpickled %d configurables', len(catalog))
472 _import_function_mapping = {
473 ".py": _import_python,
474 ".pkl": _import_pickle,
475 ".opts": _import_opts,
481 optsfile = os.path.expandvars(optsfile)
483 dummy, ext = os.path.splitext(optsfile)
484 if ext
in _import_function_mapping:
488 _log.info(
"--> Including file '%s'", optsfile)
490 _import_function_mapping[ext](optsfile)
491 _log.info(
"<-- End of file '%s'", optsfile)
493 raise ParserError(
"Unknown file type '%s' ('%s')" % (ext, optsfile))
505 unitsfile = os.path.expandvars(unitsfile)
508 _parser._include(unitsfile, _parser._parse_units)
def disable(self, allowed=logging.WARNING)
def __init__(self, stream=None, prefix=None, with_time=False)
def _parse_units(self, file)
def GetConsoleHandler(prefix=None, stream=None, with_time=False)
def _eval_statement(self, statement)
def enable(self, allowed=logging.WARNING)
def __init__(self, new_path)
def printOn(self, step=1, force=False)
def InstallRootLoggingHandler(prefix=None, level=None, stream=None, with_time=False)
def printOff(self, step=1)
def __init__(self, name="")
def _include(self, file, function)
def importOptions(optsfile)
def printOn(self, step=1, force=False)
def setPrefix(self, prefix)
def PrintOn(step=1, force=False)
def printOff(self, step=1)
def enable(self, allowed=logging.WARNING)
def disable(self, allowed=logging.WARNING)
def importUnits(unitsfile)