diff --git a/ate/utils.py b/ate/utils.py index 31d96f7d..f3f00ce2 100644 --- a/ate/utils.py +++ b/ate/utils.py @@ -294,3 +294,18 @@ def match_expected(value, expected, comparator="eq"): return True except AssertionError: return False + +def deep_update_dict(origin_dict, override_dict): + """ update origin dict with override dict recursively + e.g. origin_dict = {'a': 1, 'b': {'c': 2, 'd': 4}} + override_dict = {'b': {'c': 3}} + return: {'a': 1, 'b': {'c': 3, 'd': 4}} + """ + for key, val in override_dict.items(): + if isinstance(val, dict): + tmp = deep_update_dict(origin_dict.get(key, {}), val) + origin_dict[key] = tmp + else: + origin_dict[key] = override_dict[key] + + return origin_dict diff --git a/test/test_utils.py b/test/test_utils.py index da701d30..c648d04a 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -279,3 +279,12 @@ class TestUtils(ApiServerUnittest): self.assertTrue(utils.match_expected("2017-06-29 17:29:58", 19, "str_len")) self.assertTrue(utils.match_expected("2017-06-29 17:29:58", "19", "str_len")) + + def test_deep_update_dict(self): + origin_dict = {'a': 1, 'b': {'c': 3, 'd': 4}, 'f': 6} + override_dict = {'a': 2, 'b': {'c': 33, 'e': 5}, 'g': 7} + updated_dict = utils.deep_update_dict(origin_dict, override_dict) + self.assertEqual( + updated_dict, + {'a': 2, 'b': {'c': 33, 'd': 4, 'e': 5}, 'f': 6, 'g': 7} + )