Passed
Push — master ( db2481...3bd527 )
by Fabio
03:28
created

benedict.dicts.keylist.keylist_dict   A

Complexity

Total Complexity 33

Size/Duplication

Total Lines 99
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 33
eloc 80
dl 0
loc 99
rs 9.76
c 0
b 0
f 0

15 Methods

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