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.