in geneve/utils/__init__.py [0:0]
def deep_merge(a, b, path=None, *, overwrite=False):
"""Recursively merge two dictionaries"""
for key in b:
if key in a:
path = (path or []) + [str(key)]
if isinstance(a[key], dict) and isinstance(b[key], dict):
deep_merge(a[key], b[key], path, overwrite=overwrite)
elif isinstance(a[key], list) and isinstance(b[key], list):
a[key].extend(x for x in b[key] if x not in a[key])
elif overwrite:
a[key] = b[key]
elif a[key] != b[key]:
raise ValueError(f"Destination field already exists: {'.'.join(path)} ('{a[key]}' != '{b[key]}')")
else:
a[key] = b[key]
return a