Passed
Push — master ( a2f918...f5437c )
by Max
56s
created

structured_data._patterns   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 50
dl 0
loc 79
rs 10
c 0
b 0
f 0
wmc 16

11 Methods

Rating   Name   Duplication   Size   Complexity  
A AsPattern.__new__() 0 4 2
A AsPattern.matcher() 0 4 1
A AsPattern.match() 0 4 1
A Pattern.__new__() 0 8 4
A Pattern.name() 0 4 1
A DictPattern.exhaustive() 0 3 1
A DictPattern.__new__() 0 2 1
A AttrPattern.__new__() 0 5 2
A Pattern.__getitem__() 0 2 1
A AttrPattern.match_dict() 0 3 1
A DictPattern.match_dict() 0 3 1
1
import keyword
2
3
DISCARD = object()
4
5
6
class Pattern(tuple):
7
    """A matcher that binds a value to a name."""
8
9
    __slots__ = ()
10
11
    def __new__(cls, name: str):
12
        if name == "_":
13
            return DISCARD
14
        if not name.isidentifier():
15
            raise ValueError
16
        if keyword.iskeyword(name):
17
            raise ValueError
18
        return super().__new__(cls, (name,))
19
20
    @property
21
    def name(self):
22
        """Return the name of the matcher."""
23
        return tuple.__getitem__(self, 0)
24
25
    def __getitem__(self, other):
26
        return AsPattern(self, other)
27
28
29
class AsPattern(tuple):
30
    """A matcher that contains further bindings."""
31
32
    __slots__ = ()
33
34
    def __new__(cls, matcher: Pattern, match):
35
        if match is DISCARD:
36
            return matcher
37
        return super().__new__(cls, (matcher, match))
38
39
    @property
40
    def matcher(self):
41
        """Return the left-hand-side of the as-match."""
42
        return self[0]
43
44
    @property
45
    def match(self):
46
        """Return the right-hand-side of the as-match."""
47
        return self[1]
48
49
50
class AttrPattern(tuple):
51
52
    __slots__ = ()
53
54
    def __new__(*args, **kwargs):
55
        cls, *args = args
56
        if args:
57
            raise ValueError(args)
58
        return super(AttrPattern, cls).__new__(cls, (tuple(kwargs.items()),))
59
60
    @property
61
    def match_dict(self):
62
        return self[0]
63
64
65
class DictPattern(tuple):
66
67
    __slots__ = ()
68
69
    def __new__(cls, match_dict, *, exhaustive=False):
70
        return super(DictPattern, cls).__new__(cls, (tuple(match_dict.items()), exhaustive))
71
72
    @property
73
    def match_dict(self):
74
        return self[0]
75
76
    @property
77
    def exhaustive(self):
78
        return self[1]
79