Completed
Push — master ( f65140...61bf8e )
by Valentin
8s
created

TypedAttributesHolder.type()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
crap 1
rs 10
1 1
from .attributesholder import AttributesHolder
2
3 1
class TypedAttributesHolder(AttributesHolder):
4
    """AttributesHolder with a special attributes holding type."""
5 1
    __slots__ = ()
6 1
    _type = None
7 1
    def __init__(self, *args, **attributes):
8
        # Sanity checks
9 1
        if self._type is None or self._possible_attributes is None:
10 1
            raise TypeError('%s is an abstract class.' % self.__class__)
11 1
        super(TypedAttributesHolder, self).__init__(*args, **attributes)
12
13 1
        self._attributes['type'] = self.type
14
15 1
    def _check_attributes(self, attributes, extra=None):
16 1
        if 'type' in attributes:
17 1
            assert attributes.pop('type') == self.type
18 1
        return super(TypedAttributesHolder, self) \
19
                ._check_attributes(attributes, extra)
20
21 1
    @property
22
    def type(self):
23
        """Type of the node."""
24 1
        return self._type
25
26 1
    def __repr__(self):
27 1
        return '<PPP node "%s" %r>' % (self.type,
28
                {x:y for (x,y) in self._attributes.items() if x != 'type'})
29
30 1
    def __eq__(self, other):
31
        """Tests equality with another AttributesHolder instance."""
32 1
        if isinstance(other, dict):
33
            return self.as_dict() == other
34 1
        elif isinstance(other, TypedAttributesHolder) and \
35
                self._type == other._type:
36 1
            return super(TypedAttributesHolder, self).__eq__(other)
37
        else:
38 1
            return NotImplemented
39
40 1
    def __hash__(self):
41 1
        return hash(frozenset(self._attributes.items()))
42
43