Added casting to benedict when retrieving dict values from a benedict instance.
This commit is contained in:
parent
6e541f57ae
commit
76a0e238ae
|
@ -11,16 +11,39 @@ class benedict(KeypathDict, ParseDict):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(benedict, self).__init__(*args, **kwargs)
|
super(benedict, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def cast(val):
|
||||||
|
if isinstance(val, dict) and not isinstance(val, benedict):
|
||||||
|
return benedict(val)
|
||||||
|
else:
|
||||||
|
return val
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
return benedict(
|
return benedict.cast(
|
||||||
super(benedict, self).copy())
|
super(benedict, self).copy())
|
||||||
|
|
||||||
def deepcopy(self):
|
def deepcopy(self):
|
||||||
return benedict(
|
return benedict.cast(
|
||||||
deepcopy(self))
|
deepcopy(self))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def fromkeys(cls, sequence, value=None):
|
def fromkeys(cls, sequence, value=None):
|
||||||
return benedict(
|
return benedict.cast(
|
||||||
KeypathDict.fromkeys(sequence, value))
|
KeypathDict.fromkeys(sequence, value))
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return benedict.cast(
|
||||||
|
super(benedict, self).__getitem__(key))
|
||||||
|
|
||||||
|
def get(self, key, default=None):
|
||||||
|
return benedict.cast(
|
||||||
|
super(benedict, self).get(key, default))
|
||||||
|
|
||||||
|
def pop(self, key, default=None):
|
||||||
|
return benedict.cast(
|
||||||
|
super(benedict, self).pop(key, default))
|
||||||
|
|
||||||
|
def setdefault(self, key, default=None):
|
||||||
|
return benedict.cast(
|
||||||
|
super(benedict, self).setdefault(key, default))
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,10 @@ class KeypathDict(dict):
|
||||||
while i < j:
|
while i < j:
|
||||||
key = keys[i]
|
key = keys[i]
|
||||||
if i < (j - 1):
|
if i < (j - 1):
|
||||||
subitem = item.get(key, None)
|
if item == self:
|
||||||
|
subitem = super(KeypathDict, self).get(key, None)
|
||||||
|
else:
|
||||||
|
subitem = item.get(key, None)
|
||||||
if not isinstance(subitem, dict):
|
if not isinstance(subitem, dict):
|
||||||
subitem = item[key] = {}
|
subitem = item[key] = {}
|
||||||
item = subitem
|
item = subitem
|
||||||
|
@ -113,10 +116,6 @@ class KeypathDict(dict):
|
||||||
else:
|
else:
|
||||||
super(KeypathDict, self).__setitem__(key, value)
|
super(KeypathDict, self).__setitem__(key, value)
|
||||||
|
|
||||||
def copy(self):
|
|
||||||
return KeypathDict(
|
|
||||||
super(KeypathDict, self).copy())
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def fromkeys(cls, sequence, value=None):
|
def fromkeys(cls, sequence, value=None):
|
||||||
d = KeypathDict()
|
d = KeypathDict()
|
||||||
|
|
|
@ -97,3 +97,68 @@ class BenedictTestCase(unittest.TestCase):
|
||||||
self.assertEqual(b, r)
|
self.assertEqual(b, r)
|
||||||
self.assertEqual(type(b), benedict)
|
self.assertEqual(type(b), benedict)
|
||||||
|
|
||||||
|
def test_get_item(self):
|
||||||
|
d = {
|
||||||
|
'a': 1,
|
||||||
|
'b': {
|
||||||
|
'c': 2,
|
||||||
|
'd': {
|
||||||
|
'e': 3,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b = benedict(d)
|
||||||
|
self.assertEqual(b['a'], 1)
|
||||||
|
self.assertEqual(b['b.c'], 2)
|
||||||
|
self.assertTrue(isinstance(b['b'], benedict))
|
||||||
|
self.assertTrue(isinstance(b['b.d'], benedict))
|
||||||
|
bb = b['b']
|
||||||
|
self.assertTrue(isinstance(bb['d'], benedict))
|
||||||
|
|
||||||
|
def test_get(self):
|
||||||
|
d = {
|
||||||
|
'a': 1,
|
||||||
|
'b': {
|
||||||
|
'c': 2,
|
||||||
|
'd': {
|
||||||
|
'e': 3,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b = benedict(d)
|
||||||
|
self.assertEqual(b.get('a'), 1)
|
||||||
|
self.assertEqual(b.get('b.c'), 2)
|
||||||
|
self.assertTrue(isinstance(b.get('b'), benedict))
|
||||||
|
self.assertTrue(isinstance(b.get('b.d'), benedict))
|
||||||
|
bb = b.get('b')
|
||||||
|
self.assertTrue(isinstance(bb.get('d'), benedict))
|
||||||
|
|
||||||
|
def test_pop(self):
|
||||||
|
d = {
|
||||||
|
'a': 1,
|
||||||
|
'b': {
|
||||||
|
'c': 2,
|
||||||
|
'd': {
|
||||||
|
'e': 3,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b = benedict(d)
|
||||||
|
self.assertEqual(b.pop('a'), 1)
|
||||||
|
self.assertEqual(b.pop('b.c'), 2)
|
||||||
|
self.assertTrue(isinstance(b.pop('b.d'), benedict))
|
||||||
|
|
||||||
|
def test_setdefault(self):
|
||||||
|
d = {
|
||||||
|
'a': 1,
|
||||||
|
'b': {
|
||||||
|
'c': 2,
|
||||||
|
'd': {
|
||||||
|
'e': 3,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b = benedict(d)
|
||||||
|
self.assertTrue(isinstance(b.setdefault('b', 1), benedict))
|
||||||
|
self.assertTrue(isinstance(b.setdefault('b.d', 1), benedict))
|
||||||
|
|
||||||
|
|
|
@ -14,23 +14,6 @@ class KeypathDictTestCase(unittest.TestCase):
|
||||||
# print(d)
|
# print(d)
|
||||||
# print(d[keys])
|
# print(d[keys])
|
||||||
|
|
||||||
def test_copy(self):
|
|
||||||
d = {
|
|
||||||
'a': {
|
|
||||||
'b': {
|
|
||||||
'c': 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
b = KeypathDict(d)
|
|
||||||
c = b.copy()
|
|
||||||
self.assertEqual(type(b), type(c))
|
|
||||||
self.assertEqual(b, c)
|
|
||||||
self.assertFalse(c is b)
|
|
||||||
c['a.b.c'] = 2
|
|
||||||
self.assertEqual(b.get('a.b.c'), 2)
|
|
||||||
self.assertEqual(c.get('a.b.c'), 2)
|
|
||||||
|
|
||||||
def test_fromkeys(self):
|
def test_fromkeys(self):
|
||||||
k = [
|
k = [
|
||||||
'a',
|
'a',
|
||||||
|
@ -335,7 +318,7 @@ class KeypathDictTestCase(unittest.TestCase):
|
||||||
'x.y',
|
'x.y',
|
||||||
'x.z',
|
'x.z',
|
||||||
]
|
]
|
||||||
self.assertEqual(b.get_keypaths(), r)
|
self.assertEqual(b.keypaths(), r)
|
||||||
|
|
||||||
def test_set_override_existing_item(self):
|
def test_set_override_existing_item(self):
|
||||||
d = {}
|
d = {}
|
||||||
|
|
Loading…
Reference in New Issue