diff configmix/__init__.py @ 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 fa08713a4992
children 7ff4ee40b36c
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])
 
 
 #