예제 #1
0
파일: node.py 프로젝트: mcruse/monotone
class NodeSpace(object):
    implements(INodeSpace)

    def __init__(self, location = '', *args, **kw):
        self.__nodetree = Dictionary()
        self.__url = location
        super(NodeSpace, self).__init__(*args, **kw)

    def __get_node_tree(self):
        return Dictionary(self.__nodetree)
    nodetree = property(__get_node_tree)

    def __get_url(self):
        return self.__url
    url = property(__get_url)

    def __get_root(self):
        return self.as_node('/')
    root = property(__get_root)

    def as_node(self, path):
        if not isinstance(path, str) and hasattr(path, 'url'):
            path = path.url
        node = self.__nodetree.get(path)
        if not node:
            node = IConfigurableNode(_og_as_node(path))
        return node

    def as_node_collection(self, paths):
        nodes = map(self.as_node, paths)
        return OrderedCollection(nodes)

    def as_internal_node(self, path):
        return self.as_node(path)

    def as_node_url(self, node):
        if isinstance(node, str) and self.__nodetree.has_key(node):
            return node
        else: return self.as_node(node).url

    def as_node_url_collection(self,nodes):
        urls = map(self.as_node_url, nodes)
        return OrderedCollection(urls)

    def create_node(self,factory):
        return factory(self)

    def add_node(self, node, url = None):
        if url is None:
            url = node.url
        assigned = self.__nodetree.setdefault(url, node)
        if assigned is not node:
            raise ValueError('URL "%s" already taken' % url)
        return url

    def remove_node(self, node, url = None):
        if url is None: url = self.as_node_url(node)
        elif self.as_node(url) is not node:
            raise ValueError('Node at %s is not node provided' % url)
        return self.__nodetree.pop(url)
예제 #2
0
class NodeSpace(object):
    implements(INodeSpace)

    def __init__(self, location='', *args, **kw):
        self.__nodetree = Dictionary()
        self.__url = location
        super(NodeSpace, self).__init__(*args, **kw)

    def __get_node_tree(self):
        return Dictionary(self.__nodetree)

    nodetree = property(__get_node_tree)

    def __get_url(self):
        return self.__url

    url = property(__get_url)

    def __get_root(self):
        return self.as_node('/')

    root = property(__get_root)

    def as_node(self, path):
        if not isinstance(path, str) and hasattr(path, 'url'):
            path = path.url
        node = self.__nodetree.get(path)
        if not node:
            node = IConfigurableNode(_og_as_node(path))
        return node

    def as_node_collection(self, paths):
        nodes = map(self.as_node, paths)
        return OrderedCollection(nodes)

    def as_internal_node(self, path):
        return self.as_node(path)

    def as_node_url(self, node):
        if isinstance(node, str) and self.__nodetree.has_key(node):
            return node
        else:
            return self.as_node(node).url

    def as_node_url_collection(self, nodes):
        urls = map(self.as_node_url, nodes)
        return OrderedCollection(urls)

    def create_node(self, factory):
        return factory(self)

    def add_node(self, node, url=None):
        if url is None:
            url = node.url
        assigned = self.__nodetree.setdefault(url, node)
        if assigned is not node:
            raise ValueError('URL "%s" already taken' % url)
        return url

    def remove_node(self, node, url=None):
        if url is None: url = self.as_node_url(node)
        elif self.as_node(url) is not node:
            raise ValueError('Node at %s is not node provided' % url)
        return self.__nodetree.pop(url)
예제 #3
0
파일: node.py 프로젝트: mcruse/monotone
class CompositeNode(ConfigurableNode):
    implements(ICompositeNode)
    STARTCHILDFAILURE = '"%s" failed to start child "%s".'
    STOPCHILDFAILURE = '"%s" failed to stop child "%s".'
    PRUNECHILDFAILURE = '"%s" failed to stop child "%s".'

    def __init__(self, *args, **kw):
        self.__children = Dictionary()
        self.__nameorder = []
        super(CompositeNode, self).__init__(*args, **kw)

    def __get_children(self):
        return self.__children.copy()
    children = property(__get_children)

    def children_nodes(self):
        return map(self.__children.get, self.__nameorder)

    def children_names(self):
        return self.__nameorder[:]

    def create_child(self, factory, name):
        if self.has_child(name):
            raise ValueError('Child named "%s" exists.' % name)
        child = factor(self.nodespace)
        child.configure({'name': name, 'parent': self})
        return self.get_child(name)

    def add_child(self,node):
        if not IConfigurableNode.providedBy(node):
            raise TypeError('node is not IConfigurableNode')
        child = self.__children.setdefault(node.name, node)
        if child is not node:
            raise ValueError('Child "%s" already exists.' % node.name)
        self.__nameorder.append(node.name)
        childurl = path.join(self.url, child.name)
        self.nodespace.add_node(child, childurl)
        return childurl

    def rename_child(self, child, oldname):
        if self.get_child(oldname) is not child:
            raise ValueError('Child with name %s it not same' % oldname)
        index = self.get_index(oldname)
        nodeurl = self.add_child(child)
        self.remove_child(child, oldname)
        # Preserve the child's position.
        self.__nameorder.remove(child.name)
        self.__nameorder.insert(index, child.name)
        return nodeurl

    def remove_child(self, node, name = None):
        if name is None:
            name = node.name
        self.__nameorder.remove(name)
        self.__children.pop(name)
        nodeurl = path.join(self.url, name)
        self.nodespace.remove_node(node, nodeurl)

    def prune(self):
        for child in self.children_nodes():
            try: child.prune()
            except:
                try: message = self.PRUNECHILDFAILURE % (self.url, child.name)
                except: msglog.exception(prefix = 'Handled')
                else: msglog.log('broadway', msglog.types.ERR, message)
                msglog.exception(prefix = 'Handled')
        return super(CompositeNode, self).prune()

    def prune_child(self, node):
        self.get_child(node).prune()

    def start(self):
        result = super(CompositeNode, self).start()
        for child in self.children_nodes():
            try: child.start()
            except:
                try: message = self.STARTCHILDFAILURE % (self.url, child.name)
                except: msglog.exception(prefix = 'Handled')
                else: msglog.log('broadway', msglog.types.ERR, message)
                msglog.exception(prefix = 'Handled')
        return result

    def stop(self):
        for child in self.children_nodes():
            try: child.stop()
            except:
                try: message = self.STOPCHILDFAILURE % (self.url, child.name)
                except: msglog.exception(prefix = 'Handled')
                else: msglog.log('broadway', msglog.types.ERR, message)
                msglog.exception(prefix = 'Handled')
        return super(CompositeNode, self).stop()

    def has_child(self, child):
        return self.__children.has_key(child) or (child in self.children_nodes())

    def get_index(self, child):
        if not isinstance(child, str):
            child = child.name
        return self.__nameorder.index(child)

    def get_child(self, child):
        if not isinstance(child, str):
            child = child.name
        c = self.__children
        if c.has_key(child):
            return c[child]
        raise ENoSuchName(child)

    def descendants_nodes(self):
        nodes = self.children_nodes()
        count = len(nodes)
        for child in nodes[0:count]:
            if IParentNode.providedBy(child):
                nodes.extend(child.descendants_nodes())
        return nodes

    def descendants_names(self):
        nodes = self.descendants_nodes()
        return [node.name for node in nodes]
예제 #4
0
class CompositeNode(ConfigurableNode):
    implements(ICompositeNode)
    STARTCHILDFAILURE = '"%s" failed to start child "%s".'
    STOPCHILDFAILURE = '"%s" failed to stop child "%s".'
    PRUNECHILDFAILURE = '"%s" failed to stop child "%s".'

    def __init__(self, *args, **kw):
        self.__children = Dictionary()
        self.__nameorder = []
        super(CompositeNode, self).__init__(*args, **kw)

    def __get_children(self):
        return self.__children.copy()

    children = property(__get_children)

    def children_nodes(self):
        return map(self.__children.get, self.__nameorder)

    def children_names(self):
        return self.__nameorder[:]

    def create_child(self, factory, name):
        if self.has_child(name):
            raise ValueError('Child named "%s" exists.' % name)
        child = factor(self.nodespace)
        child.configure({'name': name, 'parent': self})
        return self.get_child(name)

    def add_child(self, node):
        if not IConfigurableNode.providedBy(node):
            raise TypeError('node is not IConfigurableNode')
        child = self.__children.setdefault(node.name, node)
        if child is not node:
            raise ValueError('Child "%s" already exists.' % node.name)
        self.__nameorder.append(node.name)
        childurl = path.join(self.url, child.name)
        self.nodespace.add_node(child, childurl)
        return childurl

    def rename_child(self, child, oldname):
        if self.get_child(oldname) is not child:
            raise ValueError('Child with name %s it not same' % oldname)
        index = self.get_index(oldname)
        nodeurl = self.add_child(child)
        self.remove_child(child, oldname)
        # Preserve the child's position.
        self.__nameorder.remove(child.name)
        self.__nameorder.insert(index, child.name)
        return nodeurl

    def remove_child(self, node, name=None):
        if name is None:
            name = node.name
        self.__nameorder.remove(name)
        self.__children.pop(name)
        nodeurl = path.join(self.url, name)
        self.nodespace.remove_node(node, nodeurl)

    def prune(self):
        for child in self.children_nodes():
            try:
                child.prune()
            except:
                try:
                    message = self.PRUNECHILDFAILURE % (self.url, child.name)
                except:
                    msglog.exception(prefix='Handled')
                else:
                    msglog.log('broadway', msglog.types.ERR, message)
                msglog.exception(prefix='Handled')
        return super(CompositeNode, self).prune()

    def prune_child(self, node):
        self.get_child(node).prune()

    def start(self):
        result = super(CompositeNode, self).start()
        for child in self.children_nodes():
            try:
                child.start()
            except:
                try:
                    message = self.STARTCHILDFAILURE % (self.url, child.name)
                except:
                    msglog.exception(prefix='Handled')
                else:
                    msglog.log('broadway', msglog.types.ERR, message)
                msglog.exception(prefix='Handled')
        return result

    def stop(self):
        for child in self.children_nodes():
            try:
                child.stop()
            except:
                try:
                    message = self.STOPCHILDFAILURE % (self.url, child.name)
                except:
                    msglog.exception(prefix='Handled')
                else:
                    msglog.log('broadway', msglog.types.ERR, message)
                msglog.exception(prefix='Handled')
        return super(CompositeNode, self).stop()

    def has_child(self, child):
        return self.__children.has_key(child) or (child
                                                  in self.children_nodes())

    def get_index(self, child):
        if not isinstance(child, str):
            child = child.name
        return self.__nameorder.index(child)

    def get_child(self, child):
        if not isinstance(child, str):
            child = child.name
        c = self.__children
        if c.has_key(child):
            return c[child]
        raise ENoSuchName(child)

    def descendants_nodes(self):
        nodes = self.children_nodes()
        count = len(nodes)
        for child in nodes[0:count]:
            if IParentNode.providedBy(child):
                nodes.extend(child.descendants_nodes())
        return nodes

    def descendants_names(self):
        nodes = self.descendants_nodes()
        return [node.name for node in nodes]