def test_delitem_with_3_valid_keys(self): d = { 'a': { 'b': { 'c': 1, 'd': 2, }, } } b = KeypathDict(d) del b['a.b.c'] with self.assertRaises(KeyError): del b['a.b.c'] self.assertEqual(b.get('a.b'), {'d': 2}) del b['a.b.d'] with self.assertRaises(KeyError): del b['a.b.d'] self.assertEqual(b.get('a.b'), {}) del b['a.b'] with self.assertRaises(KeyError): del b['a.b'] self.assertEqual(b.get('a.b'), None)
def test_get_with_1_not_str_key(self): d = { None: None, False: False, } b = KeypathDict(d) self.assertEqual(b.get(None, 1), None) self.assertEqual(b.get(False, True), False) self.assertEqual(b.get(True, True), True) self.assertEqual(b.get(0, 1), 0)
def test_list_indexes_with_quotes(self): d = { 'a': [1, 2, 3], } b = KeypathDict(d) self.assertEqual(b.get('a[\'0\']'), 1) self.assertEqual(b.get('a[\"0\"]'), 1) self.assertEqual(b.get("a[\"0\"]"), 1) self.assertEqual(b.get("a[\'0\']"), 1) self.assertEqual(b.get('a[\'\']'), None) self.assertEqual(b.get('a[\"\"]'), None) self.assertEqual(b.get("a[\"\"]"), None) self.assertEqual(b.get("a[\'\']"), None)
def test_get_with_flat_list(self): d = { 'a': [1, 2, 3], } b = KeypathDict(d) self.assertEqual(b.get('a[0]'), 1) self.assertEqual(b.get('a[1]'), 2) self.assertEqual(b.get('a[2]'), 3) self.assertEqual(b.get('a[-1]'), 3) self.assertEqual(b.get('a[-2]'), 2) self.assertEqual(b.get('a[-3]'), 1)
def test_get_with_keys_list_and_no_keypath_separator(self): d = { 'a': { 'b': { 'c': 1, 'd': 2, }, }, } b = KeypathDict(d, keypath_separator=None) self.assertEqual(b.get(['a', 'b.c']), None) self.assertEqual(b.get(['a', 'b', 'c']), 1) self.assertEqual(b.get(['a', 'b', 'd']), 2) self.assertEqual(b.get(['a', 'b', 'e']), None)
def test_init_with_custom_separator(self): d = { 'a.b': { 'c.d': 1, 'e.f': 2, }, 'g.h': { 'i.j': 3, 'k.l': 4, }, } b = KeypathDict(d, keypath_separator='/') self.assertEqual(b.get('a.b/c.d'), 1) self.assertEqual(b.get('a.b/e.f'), 2) self.assertEqual(b.get('g.h/i.j'), 3) self.assertEqual(b.get('g.h/k.l'), 4)
def test_init_without_keypath_separator(self): d = { 'a': { 'b': 1, 'c': 2, }, 'd': { 'e': 3, 'f': 4, }, } b = KeypathDict(d, keypath_separator=None) self.assertEqual(b.get('a.b'), None) self.assertEqual(b.get('a.c'), None) self.assertEqual(b.get('d.e'), None) self.assertEqual(b.get('d.f'), None)
def test_delitem_with_2_valid_keys(self): d = { 'a': { 'b': 1, } } b = KeypathDict(d) del b['a.b'] with self.assertRaises(KeyError): del b['a.b'] self.assertEqual(b.get('a'), {}) del b['a'] with self.assertRaises(KeyError): del b['a'] self.assertEqual(b.get('a'), None)
def test_delitem_with_1_invalid_key(self): d = { 'a': 1, } b = KeypathDict(d) with self.assertRaises(KeyError): del b['b'] self.assertEqual(b.get('b'), None)
def test_update_with_dict_without_separator_in_keys(self): d1 = { 'a': 1, 'b': 2, 'c': 3, } d2 = { 'a.x': 4, 'a.y': 5, 'a.z': 6, } b = KeypathDict(d1, keypath_separator='/') b.update(d2) self.assertEqual(b.get('a'), 1) self.assertEqual(b.get('b'), 2) self.assertEqual(b.get('c'), 3) self.assertEqual(b.get('a.x'), 4) self.assertEqual(b.get('a.y'), 5) self.assertEqual(b.get('a.z'), 6)
def test_delitem_with_2_invalid_keys(self): d = { 'a': { 'b': 1, } } b = KeypathDict(d) with self.assertRaises(KeyError): del b['a.c'] self.assertEqual(b.get('a'), {'b': 1})
def test_get_with_keys_list(self): d = { 'a': { 'b': { 'c': 1, 'd': 2, }, }, } b = KeypathDict(d) self.assertEqual(b.get([]), None) self.assertEqual(b.get(['a']), { 'b': { 'c': 1, 'd': 2, }, }) self.assertEqual(b.get(['a', 'b.c']), 1) self.assertEqual(b.get(['a', 'b', 'c']), 1) self.assertEqual(b.get(['a', 'b', 'd']), 2) self.assertEqual(b.get(['a', 'b', 'e']), None)
def test_delitem_with_3_invalid_keys(self): d = { 'a': { 'b': { 'c': 1, 'd': 2, }, } } b = KeypathDict(d) with self.assertRaises(KeyError): del b['a.b.c.d'] self.assertEqual(b.get('a.b.c'), 1)
def test_delitem_with_keys_list_and_no_keypath_separator(self): d = { 'a': { 'b': { 'c': 1, 'd': 2, }, } } b = KeypathDict(d, keypath_separator=None) with self.assertRaises(KeyError): del b['a', 'b', 'c', 'd'] del b['a', 'b', 'c'] self.assertEqual(b.get('a.b.c', 3), 3)
def test_pop_with_2_invalid_keys(self): d = { 'a': { 'b': 1, } } b = KeypathDict(d) val = b.pop('a.c', 2) self.assertEqual(val, 2) with self.assertRaises(KeyError): val = b.pop('a.c') self.assertEqual(b.get('a'), {'b': 1}) val = b.pop('x.y', 1) self.assertEqual(val, 1) with self.assertRaises(KeyError): val = b.pop('x.y')
def test_pop_with_keys_list_and_no_keypath_separator(self): d = { 'a': { 'b': 1, } } b = KeypathDict(d, keypath_separator=None) val = b.pop(['a', 'c'], 2) self.assertEqual(val, 2) with self.assertRaises(KeyError): val = b.pop(['a', 'c']) self.assertEqual(b.get('a'), {'b': 1}) val = b.pop(['x', 'y'], 1) self.assertEqual(val, 1) with self.assertRaises(KeyError): val = b.pop(['x', 'y']) val = b.pop(['a', 'b']) self.assertEqual(val, 1)
def test_get_with_1_invalid_key(self): d = { 'a': 1, } b = KeypathDict(d) self.assertEqual(b.get('b', 2), 2)
def test_get_with_nested_list(self): d = { 'a': { 'b': [ { 'c': 1, 'd': [ 1, 2, 3, [0], ], }, { 'c': 2, 'd': [ 4, 5, 6, [0], ], }, { 'c': 3, 'd': [ 7, 8, 9, [0], ], }, ], }, } b = KeypathDict(d) self.assertEqual(b.get('a.b[0].c'), 1) self.assertEqual(b.get('a.b[0].d'), [1, 2, 3, [0]]) self.assertEqual(b.get('a.b[0].d[0]'), 1) self.assertEqual(b.get('a.b[0].d[1]'), 2) self.assertEqual(b.get('a.b[0].d[2]'), 3) self.assertEqual(b.get('a.b[0].d[3][0]'), 0) self.assertEqual(b.get('a.b[1].c'), 2) self.assertEqual(b.get('a.b[1].d'), [4, 5, 6, [0]]) self.assertEqual(b.get('a.b[1].d[0]'), 4) self.assertEqual(b.get('a.b[1].d[1]'), 5) self.assertEqual(b.get('a.b[1].d[2]'), 6) self.assertEqual(b.get('a.b[1].d[3][0]'), 0) self.assertEqual(b.get('a.b[2].c'), 3) self.assertEqual(b.get('a.b[2].d'), [7, 8, 9, [0]]) self.assertEqual(b.get('a.b[2].d[0]'), 7) self.assertEqual(b.get('a.b[2].d[1]'), 8) self.assertEqual(b.get('a.b[2].d[2]'), 9) self.assertEqual(b.get('a.b[2].d[3][0]'), 0)
def test_get_with_2_valid_keys(self): d = {'a': {'b': 1}} b = KeypathDict(d) self.assertEqual(b.get('a.b', 2), 1)
def test_get_with_1_valid_key(self): d = {'a': 1, 1: 1} b = KeypathDict(d) self.assertEqual(b.get('a', 2), 1) self.assertEqual(b.get(1, 2), 1)
def test_get_with_wrong_index(self): d = { 'a': [1, 2, 3], } b = KeypathDict(d) self.assertEqual(b.get('a[3]', 1), 1)
def test_get_with_empty_keys_list(self): d = { 'a': 1, } b = KeypathDict(d) self.assertEqual(b.get([]), None)
def test_get_with_3_invalid_keys(self): d = {'a': {'b': {'c': 1}}} b = KeypathDict(d) self.assertEqual(b.get('c.b.a', 2), 2)