diff configmix/__init__.py @ 13:24ba462b9b4b

Return the `default' argument when the given `user' argument is `None' and when it is the first call on merge
author Franz Glasner <f.glasner@feldmann-mg.com>
date Wed, 09 Mar 2016 11:43:18 +0100
parents aecb36d4025f
children 6a91db2c2469
line wrap: on
line diff
--- a/configmix/__init__.py	Wed Mar 09 11:35:57 2016 +0100
+++ b/configmix/__init__.py	Wed Mar 09 11:43:18 2016 +0100
@@ -40,31 +40,39 @@
         return result
 
 
-def merge(user, default):
+def merge(user, default, _first=True):
     """A simple (YAML-)tree merge.
 
     From http://stackoverflow.com/questions/823196/yaml-merge-in-python
 
+    .. note:: `_first` is an internal argument.
+
     """
+    if _first and (user is None):
+        return default
     if isinstance(user, dict) and isinstance(default, dict):
         for k, v in default.items():
             if k not in user:
                 user[k] = v
             else:
-                user[k] = merge(user[k], v)
+                user[k] = merge(user[k], v, False)
     return user
 
 
-def safe_merge(user, default):
+def safe_merge(user, default, _first=True):
     """A more safe version of `merge()` that makes shallow copies of
-    the container objects.
+    the returned container objects.
+
+    .. note:: `_first` is an internal argument.
 
     """
+    if _first and (user is None):
+        return copy.copy(default)
     user = copy.copy(user)
     if isinstance(user, dict) and isinstance(default, dict):
         for k, v in default.items():
             if k not in user:
                 user[k] = copy.copy(v)
             else:
-                user[k] = merge(user[k], v)
+                user[k] = merge(user[k], v, False)
     return user