diff --git a/jay_diff.py b/jay_diff.py index c8cd26d..66421a8 100644 --- a/jay_diff.py +++ b/jay_diff.py @@ -1,29 +1,33 @@ from copy import deepcopy -def jay_diff_rev(data, temp_data): - new_data = {} + +def jay_diff_rev(delta, data, temp_data): for k in data.keys(): if k not in temp_data: temp_data[k] = data[k] - new_data[k] = data[k] + delta[k] = data[k] + else: if isinstance(temp_data[k], dict): - new_data, temp_data = jay_diff_rev(data[k], temp_data[k]) - return new_data, temp_data + if k not in delta: + delta[k] = {} + jay_diff_rev(delta[k], data[k], temp_data[k]) -def jay_diff_plus(data, temp_data): - temp = deepcopy(temp_data) - res, _ = jay_diff_rev(data, temp) - return res +def jay_diff_plus(_old, _new): + __old = deepcopy(_old) + delta = {} + jay_diff_rev(delta, _new, __old) + return delta -def jay_diff_minus(data, temp_data): - temp = deepcopy(data) - res, _ = jay_diff_rev(temp_data, temp) - return res +def jay_diff_minus(_old, _new): + __new = deepcopy(_new) + delta = {} + jay_diff_rev(delta, _old, __new) + return delta -def jay_diff_upd(data, temp_data): +def jay_diff_upd(temp_data, data): new_data = {} for k in data.keys(): if k in temp_data: @@ -72,85 +76,76 @@ def jay_merge_minus(d, u): if __name__ == '__main__': - a = {'a':'hamburger', 'b':'fries', 'c':'coke'} - b = {'a':'hamburger', 'b':'fries', 'c':'pepsi'} - c = {'a':'hamburger', 'b':'fries', 'c':'pepsi', 'd':'icecream'} - d = {'a':'hamburger', 'c':'pepsi', 'd':'icecream'} - e = {'a':'HotDog', 'b':'fries', 'd':'icecream'} + diffed = jay_diff_plus({}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}) + assert diffed == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}} - last = {} - diffed = jay_diff_plus(a, {}) - print(f"a: Plus: {diffed}") + diffed = jay_diff_plus({'a':'hamburger', 'b':'fries', 'c':'pepsi'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) + assert diffed == {} - diffed = jay_diff_plus(b, a) - print(f"b: Plus: {diffed}") + diffed = jay_diff_plus({'a':'hamburger', 'b':'fries', 'c':'pepsi', 'd':'icecream'}, {'a':'hamburger', 'b':'fries', 'c':'pepsi'}) + assert diffed == {} - diffed = jay_diff_plus(c, b) - print(f"c: Plus: {diffed}") + diffed = jay_diff_plus({'a':'hamburger', 'b':'fries', 'c':'pepsi'}, {'a':'hamburger', 'd':'icecream', 'c':'coke'}) + assert diffed == {'d':'icecream'} - diffed = jay_diff_plus(d, c) - print(f"d: Plus: {diffed}") + diffed = jay_diff_plus({'a':'hamburger', 'c':'pepsi', 'd':'icecream'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) + assert diffed == {'b':'fries'} - diffed = jay_diff_minus(a, {}) - print(f"a: Minus: {diffed}") + diffed = jay_diff_plus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke'}}, {'c': {'f': 'coffee'}}) + assert diffed == {'c': {'f': 'coffee'}} - diffed = jay_diff_minus(b, a) - print(f"b: Minus: {diffed}") + diffed = jay_diff_minus({'a':'hamburger', 'c':'pepsi', 'd':'icecream'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) + assert diffed == {'d':'icecream'} - diffed = jay_diff_minus(c, b) - print(f"a: Minus: {diffed}") + diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c':'coke'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) + assert diffed == {} - diffed = jay_diff_minus(d, c) - print(f"d: Minus: {diffed}") + diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c':'coke'}, {'a':'hamburger', 'b':'fries', 'c':'pepsi'}) + assert diffed == {} - diffed = jay_diff_upd(a, {}) - print(f"a: Update: {diffed}") + diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c':'pepsi'}, {'a':'hamburger', 'b':'fries'}) + assert diffed == {'c':'pepsi'} - diffed = jay_diff_upd(b, a) - print(f"b: Update: {diffed}") + diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c':'pepsi'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) + assert diffed == {} - diffed = jay_diff_upd(c, b) - print(f"a: Update: {diffed}") + diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries'}) + assert diffed == {'c': {'e': 'coke', 'f': 'coffee'}} - diffed = jay_diff_upd(d, c) - print(f"d: Update: {diffed}") + diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'coke'}}) + assert diffed == {'a':'hamburger', 'b':'fries', 'c': {'f': 'coffee'}} - diffed = jay_diff_full(a, {}) - print(f"a: Full: {diffed}") + diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'potatoes'}) + assert diffed == {'a':'hotdog', 'b':'potatoes'} - diffed = jay_diff_full(b, a) - print(f"b: Full: {diffed}") + diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'pepsi'}}) + assert diffed == {'c': {'e': 'pepsi'}} - diffed = jay_diff_full(c, b) - print(f"c: Full: {diffed}") + diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'fries'}) + assert diffed == {'a':'hotdog'} - diffed = jay_diff_full(d, c) - print(f"d: Full: {diffed}") + diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'pepsi', 'f': 'coffee'}}) + assert diffed == {'c': {'e': 'pepsi'}} - diffed = jay_diff_full(e, d) - print(f"e: Full: {diffed}") + # ToDo: jay_diff_full + merged = jay_merge_plus({}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}) + assert merged == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}} - a = {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}} - b = {'b':'fries', 'c':'pepsi'} - c = {'d':'icecream'} - d = {'c': {'f': 'coffee'}} + merged = jay_merge_plus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'d':'icecream'}) + assert merged == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}, 'd':'icecream'} - merged = jay_merge_plus({}, a) - print(f"a: Plus: {merged}") + merged = jay_merge_minus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}, 'd':'icecream'}, {'d':'icecream'}) + assert merged == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}} - merged = jay_merge_plus(merged, c) - print(f"c: Plus: {merged}") + merged = jay_merge_minus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'f': 'coffee'}}) + assert merged == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke'}} - merged = jay_merge_minus(merged, c) - print(f"c: Minus: {merged}") + merged = jay_merge_minus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'coke'}}) + assert merged == {'a':'hamburger', 'b':'fries', 'c': {'f': 'coffee'}} - merged = jay_merge_minus(merged, d) - print(f"d: Minus: {merged}") + merged = jay_merge_plus({'a':'hamburger', 'b':'fries', 'c': {'f': 'coffee'}}, {'d':'icecream'}) + assert merged == {'a':'hamburger', 'b':'fries', 'c': {'f': 'coffee'}, 'd':'icecream'} - merged = jay_merge_plus(merged, d) - print(f"d: Plus: {merged}") - - c = {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}, 'd':'icecream'} - d = {'a':'hamburger', 'c':'pepsi', 'd':'icecream'} - e = {'a':'HotDog', 'b':'fries', 'd':'icecream'} + merged = jay_merge_plus({'a':'hamburger', 'b':'fries', 'c': {'f': 'coffee'}, 'd':'icecream'}, {'d':'icecream'}) + assert merged == {'a':'hamburger', 'b':'fries', 'c': {'f': 'coffee'}, 'd':'icecream'}