comparison configmix/__init__.py @ 111:d51a18e5b0e3

Reimplement configmix.safe_merge() do to a deepcopy of all source configurations when merging. configmix.safe_merge() does now a deepcopy of all source configurations when merging. Changes in configuration instances after will not be reflected in the merged configuration any more.
author Franz Glasner <hg@dom66.de>
date Sat, 24 Mar 2018 18:47:54 +0100
parents 29cf359ddf4d
children c50ad93eb5dc
comparison
equal deleted inserted replaced
110:29cf359ddf4d 111:d51a18e5b0e3
122 user[k] = _merge(user[k], v) 122 user[k] = _merge(user[k], v)
123 return user 123 return user
124 124
125 125
126 def safe_merge(user, default): 126 def safe_merge(user, default):
127 """A more safe version of :func:`merge` that makes shallow copies of 127 """A more safe version of :func:`merge` that makes deep copies of
128 the returned container objects. 128 the returned container objects.
129
130 No given argument is ever changed inplace. Every object from `default`
131 is decoupled from the result -- so changing the `default` configuration
132 lates does not yield into a merged configuration later.
129 133
130 """ 134 """
131 if user is None: 135 if user is None:
132 return copy.copy(default) 136 return copy.deepcopy(default)
133 user = copy.copy(user) 137 user = copy.deepcopy(user)
134 if isinstance(user, dict) and isinstance(default, dict): 138 if isinstance(user, dict) and isinstance(default, dict):
135 for k, v in default.items(): 139 for k, v in default.items():
136 if k not in user: 140 if k not in user:
137 user[k] = copy.copy(v) 141 user[k] = copy.deepcopy(v)
138 else: 142 else:
139 user[k] = _merge(user[k], v) 143 user[k] = _safe_merge(user[k], v)
140 return user 144 return user
145
146
147 def _safe_merge(user, default):
148 """Recursion helper for :meth:`safe_merge`
149
150 """
151 if isinstance(user, dict) and isinstance(default, dict):
152 for k, v in default.items():
153 if k not in user:
154 user[k] = copy.deepcopy(v)
155 else:
156 user[k] = _safe_merge(user[k], v)
157 return user