Passed
Push — master ( 3318af...ce1cbc )
by Fabio
01:13
created

benedict.dicts.keylist   A

Complexity

Total Complexity 31

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 76
dl 0
loc 93
rs 9.92
c 0
b 0
f 0
wmc 31

13 Methods

Rating   Name   Duplication   Size   Complexity  
A KeylistDict.__init__() 0 2 1
A KeylistDict.__contains__() 0 4 2
A KeylistDict._delitem_by_keys() 0 9 3
A KeylistDict.__delitem__() 0 5 2
A KeylistDict._getitem_by_keys() 0 7 3
A KeylistDict.get() 0 4 2
A KeylistDict._setitem_by_keys() 0 2 1
A KeylistDict._contains_by_keys() 0 11 4
A KeylistDict.__getitem__() 0 4 2
A KeylistDict.pop() 0 4 2
A KeylistDict._pop_by_keys() 0 9 4
A KeylistDict.__setitem__() 0 5 2
A KeylistDict._get_by_keys() 0 7 3
1
# -*- coding: utf-8 -*-
2
3
from benedict.utils import keylist_util
4
5
6
class KeylistDict(dict):
7
8
    def __init__(self, *args, **kwargs):
9
        super(KeylistDict, self).__init__(*args, **kwargs)
10
11
    def __contains__(self, key):
12
        if isinstance(key, (list, tuple, )):
13
            return self._contains_by_keys(key)
14
        return super(KeylistDict, self).__contains__(key)
15
16
    def _contains_by_keys(self, keys):
17
        parent, key, _ = keylist_util.get_item(self, keys)
18
        if isinstance(parent, dict):
19
            return key in parent
20
        elif isinstance(parent, list):
21
            try:
22
                parent[key]
23
                return True
24
            except IndexError:
25
                return False
26
        return False
27
28
    def __delitem__(self, key):
29
        if isinstance(key, (list, tuple, )):
30
            self._delitem_by_keys(key)
31
            return
32
        super(KeylistDict, self).__delitem__(key)
33
34
    def _delitem_by_keys(self, keys):
35
        parent, key, _ = keylist_util.get_item(self, keys)
36
        if isinstance(parent, dict):
37
            del parent[key]
38
            return
39
        elif isinstance(parent, list):
40
            del parent[key]
41
            return
42
        raise KeyError
43
44
    def __getitem__(self, key):
45
        if isinstance(key, (list, tuple, )):
46
            return self._getitem_by_keys(key)
47
        return super(KeylistDict, self).__getitem__(key)
48
49
    def _getitem_by_keys(self, keys):
50
        parent, key, _ = keylist_util.get_item(self, keys)
51
        if isinstance(parent, dict):
52
            return parent[key]
53
        elif isinstance(parent, list):
54
            return parent[key]
55
        raise KeyError
56
57
    def __setitem__(self, key, value):
58
        if isinstance(key, (list, tuple, )):
59
            self._setitem_by_keys(key, value)
60
            return
61
        super(KeylistDict, self).__setitem__(key, value)
62
63
    def _setitem_by_keys(self, keys, value):
64
        keylist_util.set_item(self, keys, value)
65
66
    def get(self, key, default=None):
67
        if isinstance(key, (list, tuple, )):
68
            return self._get_by_keys(key, default)
69
        return super(KeylistDict, self).get(key, default)
70
71
    def _get_by_keys(self, keys, default=None):
72
        parent, key, _ = keylist_util.get_item(self, keys)
73
        if isinstance(parent, dict):
74
            return parent.get(key, default)
75
        elif isinstance(parent, list):
76
            return parent[key]
77
        return default
78
79
    def pop(self, key, *args):
80
        if isinstance(key, (list, tuple, )):
81
            return self._pop_by_keys(key, *args)
82
        return super(KeylistDict, self).pop(key, *args)
83
84
    def _pop_by_keys(self, keys, *args):
85
        parent, key, _ = keylist_util.get_item(self, keys)
86
        if isinstance(parent, dict):
87
            return parent.pop(key, *args)
88
        elif isinstance(parent, list):
89
            return parent.pop(key)
90
        if args:
91
            return args[0]
92
        raise KeyError
93
94