changeset 8:7090c295c940

Two differend tree merge function implementations: not yet finished
author Franz Glasner <hg@dom66.de>
date Wed, 09 Mar 2016 09:05:41 +0100
parents 7c095c6223b8
children 6835a5663008
files configmix/__init__.py
diffstat 1 files changed, 35 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/configmix/__init__.py	Wed Mar 09 00:52:32 2016 +0100
+++ b/configmix/__init__.py	Wed Mar 09 09:05:41 2016 +0100
@@ -19,3 +19,38 @@
 
 
 __all__ = []
+
+
+#
+# From: https://github.com/jet9/python-yconfig/blob/master/yconfig.py
+# License: BSD License
+#
+def dict_merge(a, b):
+    """Recursively merges dict's. not just simple a['key'] = b['key'], if
+    both a and bhave a key who's value is a dict then dict_merge is called
+    on both values and the result stored in the returned dictionary."""
+
+    if not isinstance(b, dict):
+        return b
+    result = deepcopy(a)
+    for k, v in b.iteritems():
+        if k in result and isinstance(result[k], dict):
+                result[k] = dict_merge(result[k], v)
+        else:
+            result[k] = deepcopy(v)
+    return result
+
+
+def merge(user, default):
+    """A simple (YAML-)tree merge.
+
+    From http://stackoverflow.com/questions/823196/yaml-merge-in-python
+
+    """
+    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)
+    return user