From 8100f2b7710a4c3f1e7e257920d8e8747199dbb9 Mon Sep 17 00:00:00 2001 From: ryanohnemus Date: Mon, 4 Sep 2017 11:04:37 -0500 Subject: [PATCH] NodeAttributes.to_dict now does a recursive merge please see #64 for an example of the issue fixes #64 --- chef/node.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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.