From 0e272ffa4c4f3f3be6b7b64a4e3e4b2e63dc8bdd Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Fri, 2 Jul 2021 14:18:22 +0200
Subject: [PATCH] TMSS-745: added dict_with_overrides

---
 LCS/PyCommon/util.py | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/LCS/PyCommon/util.py b/LCS/PyCommon/util.py
index 4177e345467..470015ab1da 100644
--- a/LCS/PyCommon/util.py
+++ b/LCS/PyCommon/util.py
@@ -27,6 +27,7 @@ This package contains different utilities that are common for LOFAR software
 import sys
 import os, os.path
 import time
+from copy import deepcopy
 
 
 def check_bit(value, bit):
@@ -220,15 +221,15 @@ def find_free_port(preferred_port: int=0, allow_reuse_of_lingering_port: bool=Tr
         return s.getsockname()[1]
 
 
-def dict_search_and_replace(d: dict, key, value):
-    '''perform an in-place search-and-replace to replace all items for the given key by the given value'''
-    if key in d:
-        d[key] = value
-    # recurse over nested items.
-    for k in d:
-        if isinstance(d[k], dict):
-            dict_search_and_replace(d[k], key, value)
-        elif isinstance(d[k], list):
-            for i in d[k]:
-                if isinstance(i, dict):
-                    dict_search_and_replace(i, key, value)
+def dict_with_overrides(org_dict: dict, overrides_dict: dict) -> dict:
+    '''return a copy of the original (nested) org_dict with all (nested) key/value pairs in the overrides_dict applied'''
+    new_dict = deepcopy(org_dict)
+    for override_key, override_value in overrides_dict.items():
+        # recurse
+        if isinstance(override_value, dict):
+            new_dict[override_key] = dict_with_overrides(org_dict.get(override_key,{}), override_value)
+        else:
+            new_dict[override_key] = override_value
+
+    return new_dict
+
-- 
GitLab