def test_nest_with_wrong_keys(self): l = [ { 'id': 1, 'parent_id': None, 'name': 'John' }, { 'id': 2, 'parent_id': 1, 'name': 'Frank' }, { 'id': 3, 'parent_id': 2, 'name': 'Tony' }, { 'id': 4, 'parent_id': 3, 'name': 'Jimmy' }, { 'id': 5, 'parent_id': 1, 'name': 'Sam' }, { 'id': 6, 'parent_id': 3, 'name': 'Charles' }, { 'id': 7, 'parent_id': 2, 'name': 'Bob' }, { 'id': 8, 'parent_id': 3, 'name': 'Paul' }, { 'id': 9, 'parent_id': None, 'name': 'Michael' }, ] with self.assertRaises(ValueError): n = _nest(l, 'id', 'id', 'children') with self.assertRaises(ValueError): n = _nest(l, 'id', 'parent_id', 'id') with self.assertRaises(ValueError): n = _nest(l, 'id', 'parent_id', 'parent_id')
def nest(self, key, id_key='id', parent_id_key='parent_id', children_key='children'): """ Nest a list of dicts at the given key and return a new nested list using the specified keys to establish the correct items hierarchy. """ return _nest(self[key], id_key, parent_id_key, children_key)
def test_nest_with_wrong_input(self): l = {'id': 1, 'parent_id': None, 'name': 'John'} with self.assertRaises(ValueError): d = _nest(l, 'id', 'parent_id', 'children') l = [ [ { 'id': 1, 'parent_id': None, 'name': 'John' }, ], [ { 'id': 2, 'parent_id': 1, 'name': 'Frank' }, ], ] with self.assertRaises(ValueError): d = _nest(l, 'id', 'parent_id', 'children')
def test_nest(self): l = [ { 'id': 1, 'parent_id': None, 'name': 'John' }, { 'id': 2, 'parent_id': 1, 'name': 'Frank' }, { 'id': 3, 'parent_id': 2, 'name': 'Tony' }, { 'id': 4, 'parent_id': 3, 'name': 'Jimmy' }, { 'id': 5, 'parent_id': 1, 'name': 'Sam' }, { 'id': 6, 'parent_id': 3, 'name': 'Charles' }, { 'id': 7, 'parent_id': 2, 'name': 'Bob' }, { 'id': 8, 'parent_id': 3, 'name': 'Paul' }, { 'id': 9, 'parent_id': None, 'name': 'Michael' }, ] l_clone = _clone(l) n = _nest(l, 'id', 'parent_id', 'children') r = [ { 'id': 1, 'parent_id': None, 'name': 'John', 'children': [ { 'id': 2, 'parent_id': 1, 'name': 'Frank', 'children': [ { 'id': 3, 'parent_id': 2, 'name': 'Tony', 'children': [ { 'id': 4, 'parent_id': 3, 'name': 'Jimmy', 'children': [], }, { 'id': 6, 'parent_id': 3, 'name': 'Charles', 'children': [], }, { 'id': 8, 'parent_id': 3, 'name': 'Paul', 'children': [], }, ], }, { 'id': 7, 'parent_id': 2, 'name': 'Bob', 'children': [], }, ], }, { 'id': 5, 'parent_id': 1, 'name': 'Sam', 'children': [], }, ] }, { 'id': 9, 'parent_id': None, 'name': 'Michael', 'children': [], }, ] self.assertEqual(l, l_clone) self.assertEqual(n, r)