Example #1
0
 def create_tree(value):
     if isinstance(value, dict):
         res = ConfigTree(root=root)
         for key, child_value in value.items():
             res.put(key, create_tree(child_value))
         return res
     if isinstance(value, list):
         return [create_tree(v) for v in value]
     else:
         return value
Example #2
0
    def test_numerically_index_objects_to_arrays(self):
        config_tree = ConfigTree()
        config_tree.put("list.2", "b")
        config_tree.put("list.0", "a")
        assert config_tree.get_list("list") == ["a", "b"]

        config_tree.put("invalid-list.a", "c")
        config_tree.put("invalid-list.b", "d")
        with pytest.raises(ConfigException):
            config_tree.get_list("invalid-list")
Example #3
0
    def test_config_list(self):
        config_tree = ConfigTree()

        config_tree.put("a.b.c", [4, 5])
        assert config_tree.get("a.b.c") == [4, 5]

        config_tree.put("a.b.c", [6, 7])
        assert config_tree.get("a.b.c") == [6, 7]

        config_tree.put("a.b.c", [8, 9], True)
        assert config_tree.get("a.b.c") == [6, 7, 8, 9]
Example #4
0
 def test_config_tree_special_characters(self):
     special_characters = '$}[]:=+#`^?!@*&.'
     for char in special_characters:
         config_tree = ConfigTree()
         escaped_key = "\"test{char}key\"".format(char=char)
         key = "a.b.{escaped_key}".format(escaped_key=escaped_key)
         config_tree.put(key, "value")
         hocon_tree = HOCONConverter.to_hocon(config_tree)
         assert escaped_key in hocon_tree
         parsed_tree = ConfigFactory.parse_string(hocon_tree)
         assert parsed_tree.get(key) == "value"
Example #5
0
    def postParse(self, instring, loc, token_list):
        """Create ConfigTree from tokens

        :param instring:
        :param loc:
        :param token_list:
        :return:
        """
        config_tree = ConfigTree(root=self.root)
        for element in token_list:
            expanded_tokens = element.tokens if isinstance(element, ConfigInclude) else [element]

            for tokens in expanded_tokens:
                # key, value1 (optional), ...
                key = tokens[0].strip()
                operator = '='
                if len(tokens) == 3 and tokens[1].strip() in [':', '=', '+=']:
                    operator = tokens[1].strip()
                    values = tokens[2:]
                elif len(tokens) == 2:
                    values = tokens[1:]
                else:
                    raise ParseSyntaxException("Unknown tokens {tokens} received".format(tokens=tokens))
                # empty string
                if len(values) == 0:
                    config_tree.put(key, '')
                else:
                    value = values[0]
                    if isinstance(value, list) and operator == "+=":
                        value = ConfigValues([ConfigSubstitution(key, True, '', False, loc), value], False, loc)
                        config_tree.put(key, value, False)
                    elif isinstance(value, unicode) and operator == "+=":
                        value = ConfigValues([ConfigSubstitution(key, True, '', True, loc), ' ' + value], True, loc)
                        config_tree.put(key, value, False)
                    elif isinstance(value, list):
                        config_tree.put(key, value, False)
                    else:
                        existing_value = config_tree.get(key, None)
                        if isinstance(value, ConfigTree) and not isinstance(existing_value, list):
                            # Only Tree has to be merged with tree
                            config_tree.put(key, value, True)
                        elif isinstance(value, ConfigValues):
                            conf_value = value
                            value.parent = config_tree
                            value.key = key
                            if isinstance(existing_value, list) or isinstance(existing_value, ConfigTree):
                                config_tree.put(key, conf_value, True)
                            else:
                                config_tree.put(key, conf_value, False)
                        else:
                            config_tree.put(key, value, False)
        return config_tree
Example #6
0
def __generate(value: object, path):

    if is_dataclass(value):
        tree = {
            k: __generate(v, f"{path}.{k}")
            for k, v in asdict(value).items()
        }
        return ConfigTree(tree)

    if isinstance(value, dict):
        tree = {k: __generate(v, f"{path}.{k}") for k, v in value.items()}
        return ConfigTree(tree)

    if isinstance(value, list):
        tree = [__generate(e, f"{path}[]") for e in value]
        return ConfigList(tree)

    # needs a better impl.
    # if isinstance(value, timedelta):
    # if isinstance(value, relativedelta):

    return value
Example #7
0
    def test_config_tree_quoted_string(self):
        config_tree = ConfigTree()
        config_tree.put("a.b.c", "value")
        assert config_tree.get("a.b.c") == "value"

        with pytest.raises(ConfigMissingException):
            assert config_tree.get("a.b.d")

        with pytest.raises(ConfigMissingException):
            config_tree.get("a.d.e")

        with pytest.raises(ConfigWrongTypeException):
            config_tree.get("a.b.c.e")
Example #8
0
 def __init__(self, routers=None, **kwargs):
     self.extensions = {}
     self.kwargs = kwargs
     default_config_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), 'application.conf')
     config_file = self.kwargs.pop('config', default_config_file)
     if os.path.exists(config_file):
         self.config = ConfigFactory.parse_file(config_file)
     else:
         self.config = ConfigTree()
     if routers is None:
         routers = []
     self.routers = routers
     self.filters = []
Example #9
0
 def test_configmissing_raised(self):
     config_tree = ConfigTree()
     for getter in [
         config_tree.get,
         config_tree.get_bool,
         config_tree.get_config,
         config_tree.get_float,
         config_tree.get_int,
         config_tree.get_list,
         config_tree.get_string
     ]:
         with pytest.raises(ConfigMissingException):
             assert getter('missing_key')
Example #10
0
    def test_configtree_pop(self):
        config_tree = ConfigTree()
        config_tree.put("string", "string")
        assert config_tree.pop("string", "default") == "string"
        assert config_tree.pop("string-new", "default") == "default"
        assert config_tree == ConfigTree()

        with pytest.raises(ConfigMissingException):
            assert config_tree.pop("string-new")

        config_tree.put("list", [1, 2, 3])
        assert config_tree.pop("list", [4]) == [1, 2, 3]
        assert config_tree.pop("list-new", [4]) == [4]
        assert config_tree == ConfigTree()

        config_tree.put("config", {'a': 5})
        assert config_tree.pop("config", {'b': 1}) == {'a': 5}
        assert config_tree.pop("config-new", {'b': 1}) == {'b': 1}
        assert config_tree == ConfigTree()

        config_tree = ConfigTree()
        config_tree.put('key', 'value')
        assert config_tree.pop('key', 'value') == 'value'
        assert 'key' not in config_tree

        config_tree = ConfigTree()
        config_tree.put('a.b.c.one', 1)
        config_tree.put('a.b.c.two', 2)
        config_tree.put('"f.k".g.three', 3)

        exp = OrderedDict()
        exp['a'] = OrderedDict()
        exp['a']['b'] = OrderedDict()
        exp['a']['b']['c'] = OrderedDict()
        exp['a']['b']['c']['one'] = 1
        exp['a']['b']['c']['two'] = 2

        exp['f.k'] = OrderedDict()
        exp['f.k']['g'] = OrderedDict()
        exp['f.k']['g']['three'] = 3

        assert config_tree.pop(
            'a.b.c').as_plain_ordered_dict() == exp['a']['b']['c']
        assert config_tree.pop('a.b.c', None) is None

        with pytest.raises(ConfigMissingException):
            assert config_tree.pop('a.b.c')
        with pytest.raises(ConfigMissingException):
            assert config_tree['a']['b'].pop('c')

        assert config_tree.pop('a').as_plain_ordered_dict() == OrderedDict(
            b=OrderedDict())
        assert config_tree.pop('"f.k"').as_plain_ordered_dict() == OrderedDict(
            g=OrderedDict(three=3))
        assert config_tree.as_plain_ordered_dict() == OrderedDict()
Example #11
0
    def postParse(self, instring, loc, token_list):
        """Create ConfigTree from tokens

        :param instring:
        :param loc:
        :param token_list:
        :return:
        """
        config_tree = ConfigTree()
        for element in token_list:
            expanded_tokens = element.tokens if isinstance(
                element, ConfigInclude) else [element]

            for tokens in expanded_tokens:
                # key, value1 (optional), ...
                key = tokens[0].strip()
                values = tokens[1:]

                # empty string
                if len(values) == 0:
                    config_tree.put(key, '')
                else:
                    value = values[0]
                    if isinstance(value, list):
                        config_tree.put(key, value, False)
                    else:
                        if isinstance(value, ConfigTree):
                            config_tree.put(key, value, True)
                        elif isinstance(value, ConfigValues):
                            conf_value = value
                            value.parent = config_tree
                            value.key = key
                            existing_value = config_tree.get(key, None)
                            if isinstance(existing_value, list) or isinstance(
                                    existing_value, ConfigTree):
                                config_tree.put(key, conf_value, True)
                            else:
                                config_tree.put(key, conf_value, False)
                        else:
                            conf_value = value
                            config_tree.put(key, conf_value, False)
        return config_tree
Example #12
0
    def postParse(self, instring, loc, token_list):
        """Create ConfigTree from tokens

        :param instring:
        :param loc:
        :param token_list:
        :return:
        """
        config_tree = ConfigTree()
        for element in token_list:
            # from include then merge items
            expanded_tokens = element.items() if isinstance(
                element, ConfigTree) else [element]

            for tokens in expanded_tokens:
                # key, value1, value2, ...
                key = tokens[0].strip()
                values = tokens[1:]

                # empty string
                if len(values) == 0:
                    config_tree.put(key, '')
                else:
                    if isinstance(values[0], list):
                        # Merge arrays
                        config_tree.put(key, values[0], False)
                        for value in values[1:]:
                            config_tree.put(key, value, True)
                    else:
                        # Merge dict
                        for value in values:
                            if isinstance(value, ConfigList):
                                conf_value = list(value)
                            elif isinstance(value, ConfigValues):
                                conf_value = value
                                value.parent = config_tree
                                value.key = key
                            else:
                                conf_value = value
                            config_tree.put(key, conf_value)

        return config_tree
Example #13
0
    def test_getters_with_default(self):
        config_tree = ConfigTree()
        config_tree.put("int", 5)
        assert config_tree.get("int-new", 1) == 1
        assert config_tree.get_int("int", 1) == 5
        assert config_tree.get_int("int-new", 1) == 1
        assert config_tree.get_int("int-new.test", 1) == 1

        config_tree.put("float", 4.5)
        assert config_tree.get("float", 1.0) == 4.5
        assert config_tree.get("float-new", 1.0) == 1.0
        assert config_tree.get_float("float", 1.0) == 4.5
        assert config_tree.get_float("float-new", 1.0) == 1.0
        assert config_tree.get_float("float-new.test", 1.0) == 1.0

        config_tree.put("string", "string")
        assert config_tree.get("string", "default") == "string"
        assert config_tree.get("string-new", "default") == "default"
        assert config_tree.get_string("string", "default") == "string"
        assert config_tree.get_string("string-new", "default") == "default"
        assert config_tree.get_string("string-new.test",
                                      "default") == "default"

        config_tree.put("list", [1, 2, 3])
        assert config_tree.get("list", [4]) == [1, 2, 3]
        assert config_tree.get("list-new", [4]) == [4]
        assert config_tree.get_list("list", [4]) == [1, 2, 3]
        assert config_tree.get_list("list-new", [4]) == [4]

        config_tree.put("bool", True)
        assert config_tree.get("bool", False) is True
        assert config_tree.get("bool-new", False) is False
        assert config_tree.get_bool("bool", False) is True
        assert config_tree.get_bool("bool-new", False) is False

        config_tree.put("config", {'a': 5})
        assert config_tree.get("config", {'b': 1}) == {'a': 5}
        assert config_tree.get("config-new", {'b': 1}) == {'b': 1}
        assert config_tree.get_config("config", {'b': 1}) == {'a': 5}
        assert config_tree.get_config("config-new", {'b': 1}) == {'b': 1}
Example #14
0
    def test_getter_type_conversion_string_to_bool(self):
        config_tree = ConfigTree()
        config_tree.put("bool-string-true", "true")
        assert config_tree.get_bool("bool-string-true") is True

        config_tree.put("bool-string-false", "false")
        assert config_tree.get_bool("bool-string-false") is False

        config_tree.put("bool-string-yes", "yes")
        assert config_tree.get_bool("bool-string-yes") is True

        config_tree.put("bool-string-no", "no")
        assert config_tree.get_bool("bool-string-no") is False

        config_tree.put("bool-string-on", "on")
        assert config_tree.get_bool("bool-string-on") is True

        config_tree.put("bool-string-off", "off")
        assert config_tree.get_bool("bool-string-off") is False

        config_tree.put("invalid-bool-string", "invalid")
        with pytest.raises(ConfigException):
            config_tree.get_bool("invalid-bool-string")
Example #15
0
 def test_config_tree_null_items(self):
     config_tree = ConfigTree()
     config_tree.put("a", NoneValue())
     assert list(config_tree.items()) == [("a", None)]
Example #16
0
 def test_config_tree_null(self):
     config_tree = ConfigTree()
     config_tree.put("a.b.c", None)
     assert config_tree.get("a.b.c") is None
Example #17
0
 def test_config_logging(self):
     import logging.config
     config_tree = ConfigTree()
     config_tree.put('version', 1)
     config_tree.put('root.level', logging.INFO)
     assert dict(config_tree)['version'] == 1
Example #18
0
 def test_config_tree_iterator(self):
     config_tree = ConfigTree()
     config_tree.put("a.b.c", 5)
     for k in config_tree:
         assert k == "a"
         assert config_tree[k]["b.c"] == 5
Example #19
0
 def test_config_tree_number(self):
     config_tree = ConfigTree()
     config_tree.put("a.b.c", 5)
     config_tree.put("a.b.e", 4.5)
     assert config_tree.get("a.b.c") == 5
     assert config_tree.get("a.b.e") == 4.5
Example #20
0
    def test_keyerror_raised(self):
        config_tree = ConfigTree()
        config_tree.put("a", {'b': 5})

        with pytest.raises(KeyError):
            assert config_tree['c']
Example #21
0
 def test_overrides_int_with_config_append(self):
     config_tree = ConfigTree()
     config_tree.put("int", 5, True)
     config_tree.put("int.config", 1, True)
     assert config_tree == {'int': {'config': 1}}