diff --git a/dataconf/exceptions.py b/dataconf/exceptions.py index 99dfae0..45b4a94 100644 --- a/dataconf/exceptions.py +++ b/dataconf/exceptions.py @@ -34,6 +34,12 @@ class EnvListOrderException(Exception): pass +class EnvListFormatException(Exception): + """Format exception.""" + + pass + + class ParseException(Exception): """Parsing exception.""" diff --git a/dataconf/utils.py b/dataconf/utils.py index 164478a..fbdd3fa 100644 --- a/dataconf/utils.py +++ b/dataconf/utils.py @@ -17,7 +17,7 @@ from typing import Type from typing import Union -from dataconf.exceptions import AmbiguousSubclassException +from dataconf.exceptions import AmbiguousSubclassException, EnvListFormatException from dataconf.exceptions import EnvListOrderException from dataconf.exceptions import MalformedConfigException from dataconf.exceptions import MissingTypeException @@ -333,6 +333,8 @@ def set_lens(p, focus, v): if len(p) == 1: # []x if isinstance(focus, list): + if not isinstance(p[0], int): + raise EnvListFormatException if p[0] != len(focus): raise EnvListOrderException focus.append(v) @@ -346,9 +348,8 @@ def set_lens(p, focus, v): if p[0] not in focus: # []{x} if isinstance(focus, list): - if p[0] != len(focus): - raise EnvListOrderException - focus.append({}) + if p[0] == len(focus): + focus.append({}) # {}{x} else: focus[p[0]] = {} diff --git a/tests/test_env_vars.py b/tests/test_env_vars.py index fa6dd57..bebc7c3 100644 --- a/tests/test_env_vars.py +++ b/tests/test_env_vars.py @@ -1,4 +1,4 @@ -from dataconf.exceptions import EnvListOrderException +from dataconf.exceptions import EnvListFormatException, EnvListOrderException from dataconf.exceptions import ParseException from dataconf.utils import __env_vars_parse as env_vars_parse import pytest @@ -65,6 +65,37 @@ def test_ls_order(self) -> None: with pytest.raises(EnvListOrderException): env_vars_parse("P", env) + def test_ls_obj(self) -> None: + env = { + "P_A_0__A": "1", + "P_A_1__A": "2", + } + assert env_vars_parse("P", env) == dict(a=[dict(a="1"), dict(a="2")]) + + env = { + "P_A_0__A": "1", + "P_A_0__B": "2", + } + assert env_vars_parse("P", env) == dict(a=[dict(a="1", b="2")]) + + env = { + "P_A_0__A": "1", + "P_A_0__B": "2", + "P_A_1__A": "3", + "P_A_1__B": "4", + } + assert env_vars_parse("P", env) == dict( + a=[dict(a="1", b="2"), dict(a="3", b="4")] + ) + + def test_ls_wrong_obj(self) -> None: + env = { + "P_A_0_A": "1", + "P_A_1_A": "2", + } + with pytest.raises(EnvListFormatException): + env_vars_parse("P", env) + def test_number(self) -> None: env = { "A": "1",