Пример #1
0
 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()
Пример #2
0
    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()
Пример #3
0
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)
Пример #4
0
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)