# HG changeset patch # User Franz Glasner # Date 1457510741 -3600 # Node ID 7090c295c940efa898892f9f2c6c7c4852385073 # Parent 7c095c6223b873bf1500d39666792fee068dc124 Two differend tree merge function implementations: not yet finished diff -r 7c095c6223b8 -r 7090c295c940 configmix/__init__.py --- 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