Changeset - 31250d5e3c6a
[Not reviewed]
default
0 1 0
Mads Kiilerich - 6 years ago 2020-03-28 21:21:47
mads@kiilerich.com
Grafted from: 6ba98c5609cf
vcs: avoid node base class knowledge of sub classes

Pytype very reasonably got confused over the sub class property references in
the base class.

Fixed by moving base class specific parts of comparison to the sub classes and
calling the base class.

With .content only referenced in FileNode, there is even less need for an
explicitly failing .content getter for DirNode.
1 file changed with 29 insertions and 18 deletions:
0 comments (0 inline, 0 general)
kallithea/lib/vcs/nodes.py
Show inline comments
 
@@ -135,13 +135,6 @@ class Node(object):
 
            return False
 
        if self.path != other.path:
 
            return False
 
        if self.is_file():
 
            return self.content == other.content
 
        else:
 
            # For DirNode's check without entering each dir
 
            self_nodes_paths = list(sorted(n.path for n in self.nodes))
 
            other_nodes_paths = list(sorted(n.path for n in self.nodes))
 
            return self_nodes_paths == other_nodes_paths
 

	
 
    def __lt__(self, other):
 
        if self.kind < other.kind:
 
@@ -152,13 +145,6 @@ class Node(object):
 
            return True
 
        if self.path > other.path:
 
            return False
 
        if self.is_file():
 
            return self.content < other.content
 
        else:
 
            # For DirNode's check without entering each dir
 
            self_nodes_paths = list(sorted(n.path for n in self.nodes))
 
            other_nodes_paths = list(sorted(n.path for n in self.nodes))
 
            return self_nodes_paths < other_nodes_paths
 

	
 
    def __repr__(self):
 
        return '<%s %r>' % (self.__class__.__name__, self.path)
 
@@ -247,6 +233,18 @@ class FileNode(Node):
 
        self._content = content
 
        self._mode = mode or 0o100644
 

	
 
    def __eq__(self, other):
 
        eq = super(FileNode, self).__eq__(other)
 
        if eq is not None:
 
            return eq
 
        return self.content == other.content
 

	
 
    def __lt__(self, other):
 
        lt = super(FileNode, self).__lt__(other)
 
        if lt is not None:
 
            return lt
 
        return self.content < other.content
 

	
 
    @LazyProperty
 
    def mode(self):
 
        """
 
@@ -465,10 +463,23 @@ class DirNode(Node):
 
        self.changeset = changeset
 
        self._nodes = nodes
 

	
 
    @LazyProperty
 
    def content(self):
 
        raise NodeError("%s represents a dir and has no ``content`` attribute"
 
            % self)
 
    def __eq__(self, other):
 
        eq = super(DirNode, self).__eq__(other)
 
        if eq is not None:
 
            return eq
 
        # check without entering each dir
 
        self_nodes_paths = list(sorted(n.path for n in self.nodes))
 
        other_nodes_paths = list(sorted(n.path for n in self.nodes))
 
        return self_nodes_paths == other_nodes_paths
 

	
 
    def __lt__(self, other):
 
        lt = super(DirNode, self).__lt__(other)
 
        if lt is not None:
 
            return lt
 
        # check without entering each dir
 
        self_nodes_paths = list(sorted(n.path for n in self.nodes))
 
        other_nodes_paths = list(sorted(n.path for n in self.nodes))
 
        return self_nodes_paths < other_nodes_paths
 

	
 
    @LazyProperty
 
    def nodes(self):
0 comments (0 inline, 0 general)