Mercurial > hgrepos > Python > libs > ConfigMix
changeset 443:23941c014130
FIX: Merge properly when the configuration's __getitem__ do now interpolate: prohibit duplicate interpolation and interpolation while merging
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Fri, 10 Dec 2021 09:27:47 +0100 |
| parents | 94cf5a8722d6 |
| children | 7ff4ee40b36c |
| files | configmix/__init__.py configmix/config.py |
| diffstat | 2 files changed, 58 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- 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]) #
--- 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.
