diff --git a/deep_diff.py b/deep_diff.py index fc30dfa..7a7eb4f 100644 --- a/deep_diff.py +++ b/deep_diff.py @@ -2,6 +2,7 @@ import json from copy import deepcopy from jay_diff import jay_diff_full, jay_merge_full + def deep_diff(data, temp_data): new_data = {} for k in data.keys(): @@ -50,9 +51,9 @@ if __name__ == '__main__': diffed_list = [] last = {} for s in src: - diffed = jay_diff_full(last, s, combine_upd_add=diff_mode_update_add) print(f"Old: {last}") print(f"New: {s}") + diffed = jay_diff_full(last, s, combine_upd_add=diff_mode_update_add) print(f"Diffed: {diffed}") diffed_list.append(deepcopy(diffed)) last = deepcopy(s) @@ -60,9 +61,9 @@ if __name__ == '__main__': merged_list = [] last = {} for d in diffed_list: - merged = jay_merge_full(last, d) print(f"Old: {last}") print(f"Diff: {d}") + merged = jay_merge_full(last, d) print(f"Merged: {merged}") last = deepcopy(merged) merged_list.append(deepcopy(merged)) diff --git a/jay_diff.py b/jay_diff.py index 7d5715a..bfcef0f 100644 --- a/jay_diff.py +++ b/jay_diff.py @@ -84,10 +84,11 @@ def jay_merge_update(_old, _new): def jay_merge_add(_old, _new): for k, v in _new.items(): if isinstance(v, dict): + r = jay_merge_add(_old.get(k, {}), v) if k in _old: - _old[k].update(v) + _old[k].update(r) else: - _old[k] = v + _old[k] = r else: _old[k] = _new[k] return _old @@ -539,3 +540,29 @@ if __name__ == '__main__': result = jay_merge_full({}, {'add': {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}}) assert result == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}} + result = jay_merge_full({}, {'add': {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': {'coffee': {'h': 'black'}}}}}) + assert result == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': {'coffee': {'h': 'black'}}}} + + result = jay_merge_full({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': {'coffee': {'h': 'black'}}}}, {'add': {'c': {'f': {'coffee': {'j': 'sugar'}}}}}) + assert result == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': {'coffee': {'h': 'black', 'j': 'sugar'}}}} + + old = {'charging': { + 'batteryStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:34Z', 'cruisingRangeElectric_km': 192}}, + 'chargingStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:34Z'}}, + 'chargingSettings': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:30Z'}}, + 'plugStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:29Z'}}}} + update = {'charging': { + 'batteryStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:35:46Z', 'cruisingRangeElectric_km': 191}}, + 'chargingStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:35:46Z'}}}} + add = {'charging': { + 'batteryStatus': {'value': {'currentSOC_pct': 55}}}, + 'fuelStatus': {'rangeStatus': {'value': {'primaryEngine': {'currentSOC_pct': 55}}}}, + 'measurements': {'fuelLevelStatus': {'value': {'currentSOC_pct': 55}}}} + + delete = {'charging': { + 'chargingSettings': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:30Z'}}, + 'plugStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:29Z'}}}} + + result = jay_merge_full(old, {'update':update, 'add':add, 'delete':delete}) + assert result == old +