16from AthenaConfiguration.AthConfigFlags
import CfgFlag
29 Basic node class, so we can get all the egregious flags from a
30 flags object, and use, and pass round, the individual nodes, as
31 actual nodes without all the nonsense limitations of using the
35 def __init__(self, name="root", flags=None, root=None ):
36 object.__setattr__(self,
"_lockstate", _UNLOCKED)
37 object.__setattr__(self,
"_name", name)
38 object.__setattr__(self,
"_children", {})
39 object.__setattr__(self,
"_flags", flags)
40 object.__setattr__(self,
"_root", root)
42 def lock(self, lockstate=_LOCKED):
43 for node
in self.
nodes() : node.lock(lockstate)
44 object.__setattr__(self,
"_lockstate", lockstate)
49 object.__setattr__(self,
"_lockstate", _UNLOCKED)
50 for node
in self.
nodes(): node.unlock()
53 self.
lock(_LOCKED_FOREVER)
59 if self.
_lockstate == _LOCKED_FOREVER :
raise RuntimeError(f
"Node '{self._name}' is permanently locked; ")
62 if self.
_lockstate == _LOCKED :
raise RuntimeError(f
"Node '{self._name}' is locked; ")
63 if self.
_lockstate == _LOCKED_FOREVER :
raise RuntimeError(f
"Node '{self._name}' is permanently locked; ")
67 object.__setattr__(self, name, value)
70 value = object.__getattribute__(self, name)
71 if isinstance(value, CfgFlag):
72 flags = object.__getattribute__(self,
"_flags")
73 return value.get(flags)
78 """ will attempt a dynamic load from flags if need be """
84 if name
in self.
_root._children :
return self.
_root._children[name]
86 if name
in self.
_root._children :
return self.
_root._children[name]
91 raise AttributeError(f
"no attribute {name}")
95 """ load dynamic flags - can only load flags on the root node """
100 if flags
is None :
raise AttributeError(f
"no attribute {name}")
102 object.__setattr__(self,
"_lockstate", _UNLOCKED)
104 if name
in flags._dynaflags :
return self.
_addDynaFlags(name)
105 for key
in flags._dynaflags :
110 if lockstate != _UNLOCKED : self.
lock(lockstate)
115 self._flags._loadDynaFlags(name)
116 for key, val
in self._flags._flagdict.items() :
117 if key == name
or key.startswith(name+
".") : self.
_addFlagUnlock( key, val, flags )
125 if self.
_root is rootnode :
return
126 object.__setattr__(self,
"_root", rootnode )
127 for node
in self.
nodes() : node._setrootnode(rootnode)
132 def add(self, attr_name, value):
133 """ add an attribute to this node """
134 setattr(self, attr_name, value)
137 """ addFlag method like that in the egregious flags """
139 if flags
is not None and self._flags
is None : node._flags = flags
140 names = tag.split(
".")
141 for name
in names[:-1]:
142 node = node.addNewNode(name, flags )
143 if unlock : object.__setattr__( node,
"_lockstate", _UNLOCKED )
144 if flags
is not None : node._flags = flags
145 if names[-1]
in node.__dict__ :
return False
146 setattr(node, names[-1], value)
151 raise KeyError(f
"node: {tag} already exists")
158 """ add a new child node """
163 if flags
is not None : node._flags = flags
167 """ an en existing node as a child node """
171 if node._root
and rootnode
is not node.root :
172 raise RuntimeError(f
"cannot add node {node.name()} from a different tree")
174 if not node._root : node.setrootnode( rootnode )
178 return hasattr( self, name )
191 raise RuntimeError(f
"So such child: {name}")
200 raise RuntimeError(f
"name {newname} already in node")
208 """Return an independent copy" of this node"""
210 if name
is not None : newnode =
Node(name)
213 for key, value
in self.
__dict__.items():
214 if key
in {
"_name",
"_children",
"_lockstate",
"_root" } :
continue
216 setattr(newnode, key, value)
218 for node
in self.
nodes():
219 newnode.addNode(node.clone())
226 if spacer==
"" : spacer =
"|__"
227 else: spacer=f
" {spacer}"
228 for key, value
in self.
__dict__.items():
229 if key
in {
"_name",
"_children",
"_lockstate",
"_flags",
"_root"} :
continue
230 print( spacer, key,
" : ", value )
231 for node
in self.
nodes() : node.print( spacer )
239 """ check whether the flags have an actual item with this name
240 NB using hasFlag(name) is really dengerous, as that seems to
241 actually evaluate any actual functions ? shouldn't
242 something like that be called testFlag() ?
244 return name
not in flags._flagdict
249 """ take an egregious flags list and convert to a lovely tree """
252 for tag, value
in flags._flagdict.items():
253 root.addFlag( tag, value, flags )
261 """ take a lovely tree and convert to an egregious flags list,
262 only adding items that are not in the original flags list """
264 for key, value
in node.__dict__.items():
265 if key
in {
"_name",
"_children",
"_lockstate",
"_flags",
"_root" } :
continue
266 name = f
"{domain}.{key}"
267 if notDefined(flags,name) : flags.addFlag( name, value )
269 for n
in node.nodes() :
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
void name(const std::string &n)
addNewNode(self, name, flags=None)
lock(self, lockstate=_LOCKED)
addFlag(self, tag, value, flags=None)
_setrootnode(self, rootnode)
return self._children[name] _children
__init__(self, name="root", flags=None, root=None)
__setattr__(self, name, value)
_addDynaFlags(self, name)
_addFlagImpl(self, tag, value, flags=None, unlock=False)
_addFlagUnlock(self, tag, value, flags=None)
delattr(self, name) __dict__
add(self, attr_name, value)
__getattribute__(self, name)
return self._root._loadflags(name) _root
_fail_if_locked_forever(self)
rename(self, name, newname)
decode_flags(flags, domain=None)
update_flags(flags, node, domain="")