def test_digit_in_dict(): data = { 'a': { '0': { 'c': 2 }, 'a': { 'c': 4 } }, } result = {'a.0.c': 2, 'a.a.c': 4} d = Dotli(list_brackets=False) assert d.flatten(data) == result assert data == d.unflatten(result) data = { 'a': { '0': 0, 'a': 1 }, } result = {'a.0': 0, 'a.a': 1} d = Dotli(list_brackets=False) assert d.flatten(data) == result assert data == d.unflatten(result)
def test_flatten_exception_key_not_str(): with pytest.raises(dotli.errors.KeyNotAStringError) as e: Dotli().flatten({'a': {1: 1}}) assert str( e.value) == 'Key "1" (<class \'int\'>) is not a string! @ root.a' # this check can be disabled with the safe flag assert Dotli(safe=False).flatten({'a': {1: 1}}) == {'a.1': 1}
def test_short(): data = ['1', '2', '3'] result = {'0': '1', '1': '2', '2': '3', } d = Dotli() assert d.flatten(data) == result assert data == d.unflatten(result) d = Dotli(list_brackets=True) result = {'[0]': '1', '[1]': '2', '[2]': '3', } assert d.flatten(data) == result assert data == d.unflatten(result)
def test_deep_nested(): data = {'a': {'b': {'0': 1, 'c': 2}, 'd': 'e'}} result = {'a.b.0': 1, 'a.b.c': 2, 'a.d': 'e'} d = Dotli() assert d.flatten(data) == result assert data == d.unflatten(result) d = Dotli(separator='-') result = {'a-b-0': 1, 'a-b-c': 2, 'a-d': 'e'} assert d.flatten(data) == result assert data == d.unflatten(result)
def test_nested(): data = {'a': {'d': 'e'}, 'b': {'f': 'g', 'h': 'i'}} result = {'a.d': 'e', 'b.f': 'g', 'b.h': 'i'} d = Dotli() assert d.flatten(data) == result assert data == d.unflatten(result)
def test_nested(): data = [['a', 'b', 'c'], ['d', 'e', 'f']] result = {'0.0': 'a', '0.1': 'b', '0.2': 'c', '1.0': 'd', '1.1': 'e', '1.2': 'f'} d = Dotli() assert d.flatten(data) == result assert data == d.unflatten(result) d = Dotli(list_brackets=True) result = {'[0].[0]': 'a', '[0].[1]': 'b', '[0].[2]': 'c', '[1].[0]': 'd', '[1].[1]': 'e', '[1].[2]': 'f'} assert d.flatten(data) == result assert data == d.unflatten(result) d = Dotli(list_brackets=True, separator='-') result = {'[0]-[0]': 'a', '[0]-[1]': 'b', '[0]-[2]': 'c', '[1]-[0]': 'd', '[1]-[1]': 'e', '[1]-[2]': 'f'} assert d.flatten(data) == result assert data == d.unflatten(result)
def test_flatten_exception_sep_in_key(): # list keys with pytest.raises(dotli.errors.SeparatorInKeyError) as e: Dotli(separator='1').flatten({'a': [0, 1]}) assert str(e.value) == 'Separator "1" is in key "1"! @ root.a' with pytest.raises(dotli.errors.SeparatorInKeyError) as e: Dotli(separator='1').flatten([[[0, 1]]]) assert str(e.value) == 'Separator "1" is in key "1"! @ root.[0].[0]' # dict keys with pytest.raises(dotli.errors.SeparatorInKeyError) as e: Dotli(separator='.').flatten({'a.a': {'a': 'b'}}) assert str(e.value) == 'Separator "." is in key "a.a"! @ root' with pytest.raises(dotli.errors.SeparatorInKeyError) as e: Dotli(separator='.').flatten({'a': {'b': {'c.c': 'd'}}}) assert str(e.value) == 'Separator "." is in key "c.c"! @ root.a.b'
def test_short(): data = {'a': 1, 'b': 2} result = { 'a': 1, 'b': 2, } d = Dotli() assert d.flatten(data) == result assert data == d.unflatten(result)
def test_int_keys_dict(): data = { 'a': { '1': [1], '2': ['e1'], } } result = {'a.1.[0]': 1, 'a.2.[0]': 'e1'} d = Dotli(list_brackets=True) assert d.flatten(data) == result assert data == d.unflatten(result)
def test_incomplete_list(): with pytest.raises(dotli.errors.IncompleteListError) as e: Dotli().unflatten({'a.0': 1, 'a.2': 2}) assert str(e.value) == 'No entry for index "1" in list! @ a'
def test_fill_value(): d = Dotli(fill_value_list=None) assert d.unflatten({'0': 0, '2': 0}) == [0, None, 0]