Passed
Push — master ( 3595cc...f7d59a )
by Fabio
05:19
created

BaseDict._get_dict_or_value()   A

Complexity

Conditions 5

Size

Total Lines 10
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 10
dl 0
loc 10
rs 9.3333
c 0
b 0
f 0
cc 5
nop 2
1
# -*- coding: utf-8 -*-
2
3
from benedict.core import clone as _clone
4
5
6
class BaseDict(dict):
7
8
    _dict = None
9
    _pointer = False
10
11
    @classmethod
12
    def _get_dict_or_value(cls, value):
13
        value = value.dict() if isinstance(value, cls) else value
14
        if isinstance(value, dict):
15
            for key in value.keys():
16
                key_val = value[key]
17
                if isinstance(key_val, cls):
18
                    key_val = cls._get_dict_or_value(value[key])
19
                    value[key] = key_val
20
        return value
21
22
    def __init__(self, *args, **kwargs):
23
        if len(args) == 1 and isinstance(args[0], dict):
24
            self._dict = self._get_dict_or_value(args[0])
25
            self._pointer = True
26
            super(BaseDict, self).__init__(self._dict)
27
            return
28
        self._dict = None
29
        self._pointer = False
30
        super(BaseDict, self).__init__(*args, **kwargs)
31
32
    def __bool__(self):
33
        if self._pointer:
34
            return bool(self._dict)
35
        return len(self.keys()) > 0
36
37
    def __contains__(self, key):
38
        if self._pointer:
39
            return key in self._dict
40
        return super(BaseDict, self).__contains__(key)
41
42
    def __deepcopy__(self, memo):
43
        obj = self.__class__()
44
        for key, value in self.items():
45
            obj[key] = _clone(value, memo=memo)
46
        return obj
47
48
    def __delitem__(self, key):
49
        if self._pointer:
50
            del self._dict[key]
51
            return
52
        super(BaseDict, self).__delitem__(key)
53
54
    def __eq__(self, other):
55
        if self._pointer:
56
            return self._dict == other
57
        return super(BaseDict, self).__eq__(other)
58
59
    def __getitem__(self, key):
60
        if self._pointer:
61
            return self._dict[key]
62
        return super(BaseDict, self).__getitem__(key)
63
64
    def __iter__(self):
65
        if self._pointer:
66
            return iter(self._dict)
67
        return super(BaseDict, self).__iter__()
68
69
    def __len__(self):
70
        if self._pointer:
71
            return len(self._dict)
72
        return super(BaseDict, self).__len__()
73
74
    def __repr__(self):
75
        if self._pointer:
76
            return repr(self._dict)
77
        return super(BaseDict, self).__repr__()
78
79
    def __setitem__(self, key, value):
80
        value = self._get_dict_or_value(value)
81
        if self._pointer:
82
            is_dict_item = key in self._dict and isinstance(self._dict[key], dict)
83
            is_dict_value = isinstance(value, dict)
84
            if is_dict_item and is_dict_value:
85
                self._dict[key].clear()
86
                self._dict[key].update(value)
87
                return
88
            self._dict[key] = value
89
            return
90
        super(BaseDict, self).__setitem__(key, value)
91
92
    def __str__(self):
93
        if self._pointer:
94
            return str(self._dict)
95
        return super(BaseDict, self).__str__()
96
97
    def clear(self):
98
        if self._pointer:
99
            self._dict.clear()
100
            return
101
        super(BaseDict, self).clear()
102
103
    def copy(self):
104
        if self._pointer:
105
            return self._dict.copy()
106
        return super(BaseDict, self).copy()
107
108
    def dict(self):
109
        if self._pointer:
110
            return self._dict
111
        return self
112
113
    def get(self, key, default=None):
114
        if self._pointer:
115
            return self._dict.get(key, default)
116
        return super(BaseDict, self).get(key, default)
117
118
    def items(self):
119
        if self._pointer:
120
            return self._dict.items()
121
        return super(BaseDict, self).items()
122
123
    def keys(self):
124
        if self._pointer:
125
            return self._dict.keys()
126
        return super(BaseDict, self).keys()
127
128
    def pop(self, key, *args):
129
        if self._pointer:
130
            return self._dict.pop(key, *args)
131
        return super(BaseDict, self).pop(key, *args)
132
133
    def setdefault(self, key, default=None):
134
        default = self._get_dict_or_value(default)
135
        if self._pointer:
136
            return self._dict.setdefault(key, default)
137
        return super(BaseDict, self).setdefault(key, default)
138
139
    def update(self, other):
140
        other = self._get_dict_or_value(other)
141
        if self._pointer:
142
            self._dict.update(other)
143
            return
144
        super(BaseDict, self).update(other)
145
146
    def values(self):
147
        if self._pointer:
148
            return self._dict.values()
149
        return super(BaseDict, self).values()
150