def __init__(self, tag=None, structnode=None, parent=None, name=None, attrs=None, children=None, objclassdict=None, **kwargs): self.structnode = structnode if objclassdict: self.objclassdict = objclassdict self.rootparent = parent self.objdict = {} parent = None self.parent = parent self.children = GnrDict() self.childalias = {} self.name = name self.id = None if self.structnode: if not name: self.name = structnode.getLabel() self.attributes = dict(structnode.getAttr()) children = structnode.getValue() self.id = structnode.getAttr('id') if self.id: self.id = self.id.replace('*', self.name) self.root.objdict[self.id] = self else: self.attributes = attrs or {} self.attributes.update(kwargs) buildChildren = self._captureChildren(children) self.init(**kwargs) if self.parent != None: self.parent.newChild(self) if children and buildChildren: self.buildChildren(children) self.afterChildrenCreation()
class GnrStructObj(GnrObject): """It is a tree of :class:`GnrObjects <gnr.core.gnrlang.GnrObject>` classes that it is auto-builded starting from an instance of the :class:`GnrStructData` class. """ def makeRoot(cls, parent, structnode, objclassdict, **kwargs): """Instantiate the root element :param cls: TODO :param parent: TODO :param structnode: TODO :param objclassdict: dictionary of the classes """ if isinstance(structnode, Bag): structnode = structnode.getNode('#0') tag = structnode.getAttr('tag').lower() if tag in objclassdict: return objclassdict[tag](structnode=structnode, parent=parent, objclassdict=objclassdict, **kwargs) makeRoot = classmethod(makeRoot) def __init__(self, tag=None, structnode=None, parent=None, name=None, attrs=None, children=None, objclassdict=None, **kwargs): self.structnode = structnode if objclassdict: self.objclassdict = objclassdict self.rootparent = parent self.objdict = {} parent = None self.parent = parent self.children = GnrDict() self.childalias = {} self.name = name self.id = None if self.structnode: if not name: self.name = structnode.getLabel() self.attributes = dict(structnode.getAttr()) children = structnode.getValue() self.id = structnode.getAttr('id') if self.id: self.id = self.id.replace('*', self.name) self.root.objdict[self.id] = self else: self.attributes = attrs or {} self.attributes.update(kwargs) buildChildren = self._captureChildren(children) self.init(**kwargs) if self.parent != None: self.parent.newChild(self) if children and buildChildren: self.buildChildren(children) self.afterChildrenCreation() def _captureChildren(self, children): return True def buildChildren(self, children): """TODO :param children: TODO """ objclassdict = self.root.objclassdict for child in children: tag = child.getAttr('tag') if tag == 'meta': self.metadata.setItem(child.label, child.value, _attributes=dict(child.attr)) if tag: factory = objclassdict[tag.lower()] obj = factory(structnode=child, parent=self) self.children[obj.name.lower()] = obj if child.getAttr('alias'): for alias in child.getAttr('alias').lower().split(','): self.childalias[alias] = obj else: pass def _get_metadata(self): if not hasattr(self, '_metadata'): self._metadata = Bag() return self._metadata metadata = property(_get_metadata) def buildChild(self, childnode, **kwargs): """Build a child :param childnode: the child node """ objclassdict = self.root.objclassdict tag = childnode.getAttr('tag').lower() if tag in objclassdict: return objclassdict[tag](structnode=childnode, parent=self, **kwargs) def deleteChild(self, name): """Delete a child :param name: the child name """ child = self.children.pop(name) child.deleteChildren() child.onDelete() def onDelete(self): """Hook method on delete action""" pass def deleteChildren(self): """TODO""" for k in self.children.keys(): self.deleteChild(k) def afterChildrenCreation(self): """Hook method after children creation""" pass def newChild(self, obj): """Hook method on creation of a new child :param obj: TODO """ pass def _get_root(self): if self.parent == None: return self else: return self.parent.root root = property(_get_root) def getById(self, id): """TODO :param id: the id of the object """ return self.root.objdict.get(id, None) def getItem(self, path, default=None, static=False): """Build a child :param path: TODO :param default: TODO :param static: TODO """ if path.startswith('.'): return self.root[path[1:]] if path.startswith('!'): return self.getById(path[1:]) obj, label = self._htraverse(path) if hasattr(obj, 'get'): if static: return obj.getResolver(label, default=default) return obj.get(label, default) else: return default __getitem__ = getItem def get(self, name, default=None): """Build a child :param name: TODO :param default: TODO """ name = name.lower() if name in self.children: obj = self.children[name] elif name in self.childalias: obj = self.childalias[name] else: obj = default if isinstance(obj, BagResolver): return obj() else: return obj def getResolver(self, name, default=None): """Build a child :param name: TODO :param default: TODO """ return self.children.get(name.lower(), default=default) def _htraverse(self, pathlist, **kwargs): curr = self if isinstance(pathlist, basestring): pathlist = gnrstring.smartsplit(pathlist.replace('../', '#^.'), '.') pathlist = [x for x in pathlist if x] if not pathlist: return curr, '' label = pathlist.pop(0) while label == '#^' and pathlist: curr = curr.parent label = pathlist.pop(0) if not pathlist: return curr, label newcurr = curr.get(label) isbag = hasattr(newcurr, '_htraverse') if isbag: return newcurr._htraverse(pathlist) else: return newcurr, '.'.join(pathlist) def __len__(self): return len(self.children) def __iter__(self): return self.children.__iter__() def __contains__(self, name): return (name.lower() in self.children) or (name.lower() in self.childalias) def items(self): """Same of ``items`` method's dict, applied on the ``children`` attribute""" return self.children.items() def keys(self): """Same of ``keys`` method's dict, applied on the ``children`` attribute""" return self.children.keys() def values(self): """Same of ``values`` method's dict, applied on the ``children`` attribute""" return self.children.values() def _set_structnode(self, structnode): if structnode != None: self.__structnode = structnode else: self.__structnode = None def _get_structnode(self): if self.__structnode: return self.__structnode structnode = property(_get_structnode, _set_structnode) def _set_parent(self, parent): if parent != None: self._parent = parent else: self._parent = None def _get_parent(self): if hasattr(self, '_parent'): return self._parent parent = property(_get_parent, _set_parent) def init(self): """TODO""" pass def newChild(self, child): """TODO :param child: TODO """ pass def afterChildrenCreation(self): """TODO""" pass def asBag(self): """TODO""" return StructObjResolver(self)
class GnrStructObj(GnrObject): """It is a tree of :class:`GnrObjects <gnr.core.gnrlang.GnrObject>` classes that it is auto-builded starting from an instance of the :class:`GnrStructData` class""" def makeRoot(cls, parent, structnode, objclassdict, **kwargs): """Instantiate the root element :param cls: TODO :param parent: TODO :param structnode: TODO :param objclassdict: dictionary of the classes""" if isinstance(structnode, Bag): structnode = structnode.getNode('#0') tag = structnode.getAttr('tag').lower() if tag in objclassdict: return objclassdict[tag](structnode=structnode, parent=parent, objclassdict=objclassdict, **kwargs) makeRoot = classmethod(makeRoot) def __init__(self, tag=None, structnode=None, parent=None, name=None, attrs=None, children=None, objclassdict=None, **kwargs): self.structnode = structnode if objclassdict: self.objclassdict = objclassdict self.rootparent = parent self.objdict = {} parent = None self.parent = parent self.children = GnrDict() self.childalias = {} self.name = name self.id = None if self.structnode: if not name: self.name = structnode.getLabel() self.attributes = dict(structnode.getAttr()) children = structnode.getValue() self.id = structnode.getAttr('id') if self.id: self.id = self.id.replace('*', self.name) self.root.objdict[self.id] = self else: self.attributes = attrs or {} self.attributes.update(kwargs) buildChildren = self._captureChildren(children) self.init(**kwargs) if self.parent != None: self.parent.newChild(self) if children and buildChildren: self.buildChildren(children) self.afterChildrenCreation() def _captureChildren(self, children): return True def buildChildren(self, children): """TODO :param children: TODO""" objclassdict = self.root.objclassdict for child in children: tag = child.getAttr('tag') if tag == 'meta': self.metadata.setItem(child.label, child.value, _attributes=dict(child.attr)) if tag: factory = objclassdict[tag.lower()] obj = factory(structnode=child, parent=self) self.children[obj.name.lower()] = obj if child.getAttr('alias'): for alias in child.getAttr('alias').lower().split(','): self.childalias[alias] = obj else: pass def _get_metadata(self): if not hasattr(self, '_metadata'): self._metadata = Bag() return self._metadata metadata = property(_get_metadata) def buildChild(self, childnode, **kwargs): """Build a child :param childnode: the child node""" objclassdict = self.root.objclassdict tag = childnode.getAttr('tag').lower() if tag in objclassdict: return objclassdict[tag](structnode=childnode, parent=self, **kwargs) def deleteChild(self, name): """Delete a child :param name: the child name""" child = self.children.pop(name) child.deleteChildren() child.onDelete() def onDelete(self): """Hook method on delete action""" pass def deleteChildren(self): """TODO""" for k in self.children.keys(): self.deleteChild(k) def afterChildrenCreation(self): """Hook method after children creation""" pass def newChild(self, obj): """Hook method on creation of a new child :param obj: TODO""" pass def _get_root(self): if self.parent == None: return self else: return self.parent.root root = property(_get_root) def getById(self, id): """TODO :param id: the id of the object""" return self.root.objdict.get(id, None) def getItem(self, path, default=None, static=False): """Build a child :param path: TODO :param default: TODO :param static: TODO""" if path.startswith('.'): return self.root[path[1:]] if path.startswith('!'): return self.getById(path[1:]) obj, label = self._htraverse(path) if hasattr(obj, 'get'): if static: return obj.getResolver(label, default=default) return obj.get(label, default) else: return default __getitem__ = getItem def get(self, name, default=None): """Build a child :param name: TODO :param default: TODO""" name = name.lower() if name in self.children: obj = self.children[name] elif name in self.childalias: obj = self.childalias[name] else: obj = default if isinstance(obj, BagResolver): return obj() else: return obj def getResolver(self, name, default=None): """Build a child :param name: TODO :param default: TODO""" return self.children.get(name.lower(), default=default) def _htraverse(self, pathlist, **kwargs): curr = self if isinstance(pathlist, basestring): pathlist = gnrstring.smartsplit(pathlist.replace('../', '#^.'), '.') pathlist = [x for x in pathlist if x] if not pathlist: return curr, '' label = pathlist.pop(0) while label == '#^' and pathlist: curr = curr.parent label = pathlist.pop(0) if not pathlist: return curr, label newcurr = curr.get(label) isbag = hasattr(newcurr, '_htraverse') if isbag: return newcurr._htraverse(pathlist) else: return newcurr, '.'.join(pathlist) def __len__(self): return len(self.children) def __iter__(self): return self.children.__iter__() def __contains__(self, name): return (name.lower() in self.children) or (name.lower() in self.childalias) def items(self): """Same of ``items`` method's dict, applied on the ``children`` attribute""" return self.children.items() def keys(self): """Same of ``keys`` method's dict, applied on the ``children`` attribute""" return self.children.keys() def values(self): """Same of ``values`` method's dict, applied on the ``children`` attribute""" return self.children.values() def _set_structnode(self, structnode): if structnode != None: #self.__structnode=weakref.ref(structnode) self.__structnode = structnode else: self.__structnode = None def _get_structnode(self): if self.__structnode: return self.__structnode #return self.__structnode() structnode = property(_get_structnode, _set_structnode) def _set_parent(self, parent): if parent != None: #self._parent=weakref.ref(parent) self._parent = parent else: self._parent = None def _get_parent(self): if hasattr(self, '_parent'): return self._parent parent = property(_get_parent, _set_parent) def init(self): """TODO""" pass def newChild(self, child): """TODO :param child: TODO""" pass def afterChildrenCreation(self): """TODO""" pass def asBag(self): """TODO""" return StructObjResolver(self)