341 def _eval_statement(self, statement):
342 from GaudiKernel.Proxy.Configurable import (
343 Configurable,
344 ConfigurableGeneric,
345 PropertyReference,
346 )
347
348
349 _log.info("%s%s", statement, self.statement_sep)
350
351 property, value = statement.split("=", 1)
352
353 inc = None
354 if property[-1] in ["+", "-"]:
355 inc = property[-1]
356 property = property[:-1]
357
358 property = property.strip()
359 value = value.strip()
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376 property = ".".join([w.strip() for w in property.split(".")])
377 component, property = property.rsplit(".", 1)
378 if component in Configurable.allConfigurables:
379 cfg = Configurable.allConfigurables[component]
380 else:
381 cfg = ConfigurableGeneric(component)
382
383
384 value = value.replace("true", "True").replace("false", "False")
385 if value[0] == "{":
386
387 if ":" in value and not (
388 value[: value.index(":")].count('"') % 2
389 or value[: value.index(":")].count("'") % 2
390 ):
391
392 value = "{" + value[1:-1].replace("{", "[").replace("}", "]") + "}"
393 else:
394 value = value.replace("{", "[").replace("}", "]")
395
396
397 value = value.replace("\\", "\\\\")
398
399 value = (
400 value.replace(r"\\n", r"\n").replace(r"\\t", r"\t").replace(r'\\"', r"\"")
401 )
402
403 value = '"'.join(
404 [
405 (v if i % 2 else re.sub(r"\\[nt]", " ", v))
406 for i, v in enumerate(value.split('"'))
407 ]
408 )
409
410
411 m = self.reference.match(value)
412 if m:
413
414 value = PropertyReference(m.group(1))
415 else:
416 value = eval(value, self.units)
417
418
419
420
421 if property not in cfg.__slots__ and not hasattr(cfg, property):
422
423 lprop = property.lower()
424 for p in cfg.__slots__:
425 if lprop == p.lower():
426 _log.warning(
427 "property '%s' was requested for %s, but the correct spelling is '%s'",
428 property,
429 cfg.name(),
430 p,
431 )
432 property = p
433 break
434
435
436 if inc == "+":
437 if hasattr(cfg, property):
438 prop = getattr(cfg, property)
439 if isinstance(prop, dict):
440 for k in value:
441 prop[k] = value[k]
442 else:
443 prop += value
444 else:
445 setattr(cfg, property, value)
446 elif inc == "-":
447 if hasattr(cfg, property):
448 prop = getattr(cfg, property)
449 if isinstance(prop, dict):
450 for k in value:
451 if k in prop:
452 del prop[k]
453 else:
454 _log.warning(
455 "key '%s' not in %s.%s", k, cfg.name(), property
456 )
457 else:
458 for k in value:
459 if k in prop:
460 prop.remove(k)
461 else:
462 _log.warning(
463 "value '%s' not in %s.%s", k, cfg.name(), property
464 )
465 else:
466 setattr(cfg, property, value)
467
468