diff --git a/chef/node.py b/chef/node.py index ea7666b..04a1534 100644 --- a/chef/node.py +++ b/chef/node.py @@ -123,9 +123,27 @@ def set_dotted(self, key, value): def to_dict(self): merged = {} for d in reversed(self.search_path): - merged.update(d) + self._dict_recursive_merge(merged, d) return merged + def _dict_recursive_merge(self, a, b, path=None): + """merges b into a, when a key already exists for an exact + path, it is overwritten + """ + if path is None: + path = [] + for key in b: + if key in a: + if isinstance(a[key], dict) and isinstance(b[key], dict): + self._dict_recursive_merge(a[key], b[key], path + [str(key)]) + elif a[key] == b[key]: + pass + else: + a[key] = b[key] + else: + a[key] = b[key] + return a + class Node(ChefObject): """A Chef node object.