# HG changeset patch # User Franz Glasner # Date 1639124867 -3600 # Node ID 23941c0141304d3bbd9012effc576dc4424c2052 # Parent 94cf5a8722d6a07c01dab90f1b8e0af67ae685cd FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging diff -r 94cf5a8722d6 -r 23941c014130 configmix/__init__.py --- a/configmix/__init__.py Fri Dec 10 03:00:11 2021 +0100 +++ b/configmix/__init__.py Fri Dec 10 09:27:47 2021 +0100 @@ -431,7 +431,11 @@ # do not copy del user[k] else: - user[k] = _merge(user[k], v, filter_comments) + if isinstance(user, Configuration): + user[k] = _merge( + user.getitem_ns(k), v, filter_comments) + else: + user[k] = _merge(user[k], v, filter_comments) else: user[k] = v _filter_deletions(user) @@ -451,7 +455,11 @@ # do not copy del user[k] else: - user[k] = _merge(user[k], v, filter_comments) + if isinstance(user, Configuration): + user[k] = _merge( + user.getitem_ns(k), v, filter_comments) + else: + user[k] = _merge(user[k], v, filter_comments) else: user[k] = v return user @@ -484,7 +492,11 @@ # do not copy del user[k] else: - user[k] = _safe_merge(user[k], v, filter_comments) + if isinstance(user, Configuration): + user[k] = _safe_merge( + user.getitem_ns(k), v, filter_comments) + else: + user[k] = _safe_merge(user[k], v, filter_comments) else: user[k] = copy.deepcopy(v) _filter_deletions(user) @@ -504,7 +516,11 @@ # do not copy del user[k] else: - user[k] = _safe_merge(user[k], v, filter_comments) + if isinstance(user, Configuration): + user[k] = _safe_merge( + user.getitem_ns(k), v, filter_comments) + else: + user[k] = _safe_merge(user[k], v, filter_comments) else: user[k] = copy.deepcopy(v) return user @@ -520,12 +536,21 @@ if not isinstance(d, dict): return # use a copy of the keys because we change `d` while iterating - for k in list(d.keys()): - if _is_comment(k): - del d[k] - else: - if isinstance(d[k], dict): - _filter_comments(d[k]) + if isinstance(d, Configuration): + for k in list(d.keys()): + if _is_comment(k): + del d[k] + else: + dk = d.getitem_ns(k) + if isinstance(dk, dict): + _filter_comments(dk) + else: + for k in list(d.keys()): + if _is_comment(k): + del d[k] + else: + if isinstance(d[k], dict): + _filter_comments(d[k]) def _is_comment(k): @@ -548,12 +573,21 @@ if not isinstance(d, dict): return # use a copy of the items because we change `d` while iterating - for k, v in list(d.items()): - if v == constants.DEL_VALUE: - del d[k] - else: - if isinstance(d[k], dict): - _filter_deletions(d[k]) + if isinstance(d, Configuration): + for k, v in list(d.items()): + if v == constants.DEL_VALUE: + del d[k] + else: + dk = d.getitem_ns(k) + if isinstance(dk, dict): + _filter_deletions(dk) + else: + for k, v in list(d.items()): + if v == constants.DEL_VALUE: + del d[k] + else: + if isinstance(d[k], dict): + _filter_deletions(d[k]) # diff -r 94cf5a8722d6 -r 23941c014130 configmix/config.py --- a/configmix/config.py Fri Dec 10 03:00:11 2021 +0100 +++ b/configmix/config.py Fri Dec 10 09:27:47 2021 +0100 @@ -268,6 +268,14 @@ else: return super(Configuration, self).__contains__(key) + def getitem_ns(self, key): + """Just forward to the *original* :meth:`dict.__getitem__`. + + No variable interpolation and key path access. + + """ + return super(Configuration, self).__getitem__(key) + def getvarl(self, *path, **kwds): """Get a variable where the hierarchy is given in `path` as sequence and the namespace is given in the `namespace` keyword argument.