Mercurial > hgrepos > Python > libs > ConfigMix
changeset 110:29cf359ddf4d
Remove the "_first" parameter from "merge" and "safe_merge" by splitting into two functions
| author | Franz Glasner <hg@dom66.de> |
|---|---|
| date | Sat, 24 Mar 2018 16:06:08 +0100 |
| parents | 057d87d030f1 |
| children | d51a18e5b0e3 |
| files | configmix/__init__.py |
| diffstat | 1 files changed, 29 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/configmix/__init__.py Sat Mar 24 16:04:52 2018 +0100 +++ b/configmix/__init__.py Sat Mar 24 16:06:08 2018 +0100 @@ -82,39 +82,53 @@ return result -def merge(user, default, _first=True): - """A simple (YAML-)tree-merge. +def merge(user, default): + """Logically merge the configuration in `user` into `default`. :param ~configmix.config.Configuration user: - the new configuration that will be merged into `default` + the new configuration that will be logically merged + into `default` :param ~configmix.config.Configuration default: - the base configuration where `user` is merged into - :param bool _first: an intexrnal argument for controlling recursion + the base configuration where `user` is logically merged into + :returns: `user` with the necessary amendments from `default`. + If `user` is ``None`` then `default` is returned. + + .. note:: The configuration in `default` is not changed but the + configuration given in `user` is changed **inplace**. From http://stackoverflow.com/questions/823196/yaml-merge-in-python - .. note:: `_first` is an internal argument. - """ - if _first and (user is None): + if 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, False) + user[k] = _merge(user[k], v) return user -def safe_merge(user, default, _first=True): - """A more safe version of :func:`merge()` that makes shallow copies of +def _merge(user, default): + """Recursion helper for :meth:`merge` + + """ + 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 + + +def safe_merge(user, default): + """A more safe version of :func:`merge` that makes shallow copies of the returned container objects. - .. note:: `_first` is an internal argument. - """ - if _first and (user is None): + if user is None: return copy.copy(default) user = copy.copy(user) if isinstance(user, dict) and isinstance(default, dict): @@ -122,5 +136,5 @@ if k not in user: user[k] = copy.copy(v) else: - user[k] = merge(user[k], v, False) + user[k] = _merge(user[k], v) return user
