improved tests

This commit is contained in:
2024-10-20 11:45:22 +02:00
parent b6566e754c
commit e1bc75ec59
+185 -36
View File
@@ -1,46 +1,73 @@
from copy import deepcopy from copy import deepcopy
def jay_diff_rev(delta, data, temp_data): def jay_diff_rev(_new, _old):
for k in data.keys(): delta = {}
if k not in temp_data: for k in _new.keys():
temp_data[k] = data[k] if k in _old:
delta[k] = data[k] if isinstance(_new[k], dict):
res = jay_diff_rev(_new[k], _old[k])
if len(res.keys()):
delta[k] = res
else: else:
if isinstance(temp_data[k], dict): _old[k] = _new[k]
if k not in delta: delta[k] = _new[k]
delta[k] = {}
jay_diff_rev(delta[k], data[k], temp_data[k]) return delta
def jay_diff_plus(_old, _new): def jay_diff_add(_old, _new):
__old = deepcopy(_old) __old = deepcopy(_old)
delta = {} delta = jay_diff_rev(_new, __old)
jay_diff_rev(delta, _new, __old)
return delta return delta
def jay_diff_minus(_old, _new): def jay_diff_del(_old, _new):
__new = deepcopy(_new) __new = deepcopy(_new)
delta = {} delta = jay_diff_rev(_old, __new)
jay_diff_rev(delta, _old, __new)
return delta return delta
def jay_diff_upd(temp_data, data): def jay_diff_upd(temp_data, data, add_if_not_exist=False):
new_data = {} new_data = {}
for k in data.keys(): for k in data.keys():
if k in temp_data: if k in temp_data:
if data[k] != temp_data[k]: if isinstance(data[k], dict):
res = jay_diff_upd(temp_data[k], data[k], add_if_not_exist)
new_data[k] = res
elif data[k] != temp_data[k]:
new_data[k] = data[k] new_data[k] = data[k]
elif add_if_not_exist:
new_data[k] = data[k]
return new_data return new_data
def jay_diff_full(data, temp_data): def jay_diff_upd_add(temp_data, data):
update = jay_diff_upd(data, temp_data) return jay_diff_upd(temp_data, data, add_if_not_exist=True)
plus = jay_diff_plus(data, temp_data)
minus = jay_diff_minus(data, temp_data)
return {'diff': {'plus': plus, 'minus': minus, 'update': update}} def jay_diff_full(data, temp_data, combine_upd_add=False):
diff = {}
if combine_upd_add:
res = jay_diff_upd_add(data, temp_data)
if len(res.keys()):
diff['update_add'] = res
res = jay_diff_del(data, temp_data)
if len(res.keys()):
diff['delete'] = res
else:
res = jay_diff_upd(data, temp_data)
if len(res.keys()):
diff['update'] = res
res = jay_diff_add(data, temp_data)
if len(res.keys()):
diff['add'] = res
res = jay_diff_del(data, temp_data)
if len(res.keys()):
diff['delete'] = res
return diff
def jay_merge_update(d, u): def jay_merge_update(d, u):
@@ -76,45 +103,51 @@ def jay_merge_minus(d, u):
if __name__ == '__main__': if __name__ == '__main__':
diffed = jay_diff_plus({}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}) diffed = jay_diff_add({}, {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}})
assert diffed == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}} assert diffed == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}
diffed = jay_diff_plus({'a':'hamburger', 'b':'fries', 'c':'pepsi'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) diffed = jay_diff_add({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'})
assert diffed == {} assert diffed == {}
diffed = jay_diff_plus({'a':'hamburger', 'b':'fries', 'c':'pepsi', 'd':'icecream'}, {'a':'hamburger', 'b':'fries', 'c':'pepsi'}) diffed = jay_diff_add({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi', 'd': 'icecream'}, {'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'})
assert diffed == {} assert diffed == {}
diffed = jay_diff_plus({'a':'hamburger', 'b':'fries', 'c':'pepsi'}, {'a':'hamburger', 'd':'icecream', 'c':'coke'}) diffed = jay_diff_add({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'd': 'icecream', 'c': 'coke'})
assert diffed == {'d':'icecream'} assert diffed == {'d':'icecream'}
diffed = jay_diff_plus({'a':'hamburger', 'c':'pepsi', 'd':'icecream'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) diffed = jay_diff_add({'a': 'hamburger', 'c': 'pepsi', 'd': 'icecream'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'})
assert diffed == {'b':'fries'} assert diffed == {'b':'fries'}
diffed = jay_diff_plus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke'}}, {'c': {'f': 'coffee'}}) diffed = jay_diff_add({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke'}}, {'c': {'f': 'coffee'}})
assert diffed == {'c': {'f': 'coffee'}} assert diffed == {'c': {'f': 'coffee'}}
diffed = jay_diff_minus({'a':'hamburger', 'c':'pepsi', 'd':'icecream'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) diffed = jay_diff_add({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a': 'hamburger', 'b': 'fries', 'c': {'f': 'coffee'}})
assert diffed == {}
diffed = jay_diff_del({'a': 'hamburger', 'c': 'pepsi', 'd': 'icecream'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'})
assert diffed == {'d':'icecream'} assert diffed == {'d':'icecream'}
diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c':'coke'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) diffed = jay_diff_del({'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'})
assert diffed == {} assert diffed == {}
diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c':'coke'}, {'a':'hamburger', 'b':'fries', 'c':'pepsi'}) diffed = jay_diff_del({'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, {'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'})
assert diffed == {} assert diffed == {}
diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c':'pepsi'}, {'a':'hamburger', 'b':'fries'}) diffed = jay_diff_del({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'b': 'fries'})
assert diffed == {'c':'pepsi'} assert diffed == {'c':'pepsi'}
diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c':'pepsi'}, {'a':'hamburger', 'b':'fries', 'c':'coke'}) diffed = jay_diff_del({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'})
assert diffed == {} assert diffed == {}
diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries'}) diffed = jay_diff_del({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a': 'hamburger', 'b': 'fries'})
assert diffed == {'c': {'e': 'coke', 'f': 'coffee'}} assert diffed == {'c': {'e': 'coke', 'f': 'coffee'}}
diffed = jay_diff_minus({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'coke'}}) diffed = jay_diff_del({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'coke'}})
assert diffed == {'a':'hamburger', 'b':'fries', 'c': {'f': 'coffee'}} assert diffed == {'a':'hamburger', 'b':'fries', 'c': {'f': 'coffee'}}
diffed = jay_diff_del({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'pepsi', 'f': 'coffee'}})
assert diffed == {}
diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'potatoes'}) diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'potatoes'})
assert diffed == {'a':'hotdog', 'b':'potatoes'} assert diffed == {'a':'hotdog', 'b':'potatoes'}
@@ -124,11 +157,127 @@ if __name__ == '__main__':
diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'fries'}) diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'fries'})
assert diffed == {'a':'hotdog'} assert diffed == {'a':'hotdog'}
diffed = jay_diff_upd({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'd': 'icecream', 'c': 'coke'})
assert diffed == {'c':'coke'}
diffed = jay_diff_upd({'a': 'hamburger', 'c': 'pepsi', 'd': 'icecream'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'})
assert diffed == {'c':'coke'}
diffed = jay_diff_upd({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke'}}, {'c': {'f': 'coffee'}})
assert diffed == {'c': {}}
diffed = jay_diff_upd({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'pepsi', 'f': 'coffee'}}) 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'}} assert diffed == {'c': {'e': 'pepsi'}}
# ToDo: jay_diff_full # Update/add
diffed = jay_diff_upd_add({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'potatoes', 'd': 'icecream'})
assert diffed == {'a':'hotdog', 'b':'potatoes', 'd': 'icecream'}
diffed = jay_diff_upd_add({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'pepsi', 'g': 'tea', 'h': 'cake'}, 'b':'potatoes'})
assert diffed == {'b':'potatoes', 'c': {'e': 'pepsi', 'g': 'tea', 'h': 'cake'}}
diffed = jay_diff_upd_add({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'fries'})
assert diffed == {'a':'hotdog'}
diffed = jay_diff_upd_add({'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_upd_add({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'potatoes'})
assert diffed == {'a':'hotdog', 'b':'potatoes'}
diffed = jay_diff_upd_add({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'pepsi'}})
assert diffed == {'c': {'e': 'pepsi'}}
diffed = jay_diff_upd_add({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'fries'})
assert diffed == {'a':'hotdog'}
diffed = jay_diff_upd_add({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'd': 'icecream', 'c': 'coke'})
assert diffed == {'c': 'coke', 'd': 'icecream'}
diffed = jay_diff_upd_add({'a': 'hamburger', 'c': 'pepsi', 'd': 'icecream'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'})
assert diffed == {'b': 'fries', 'c': 'coke'}
diffed = jay_diff_upd_add({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke'}}, {'c': {'f': 'coffee'}})
assert diffed == {'c': {'f': 'coffee'}}
diffed = jay_diff_upd_add({'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_upd_add({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'pepsi', 'f': 'coffee', 'h': 'cake'}})
assert diffed == {'c': {'e': 'pepsi', 'h': 'cake'}}
# ToDo: jay_diff_full
diffed = jay_diff_full({}, {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, combine_upd_add=False)
assert diffed == {'add': {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, combine_upd_add=False)
assert diffed == {'update': {'c': 'coke'}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi', 'd': 'icecream'}, {'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, combine_upd_add=False)
assert diffed == {'delete': {'d': 'icecream'}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'd': 'icecream', 'c': 'coke'}, combine_upd_add=False)
assert diffed == {'add': {'d': 'icecream'}, 'delete': {'b': 'fries'}, 'update': {'c': 'coke'}}
diffed = jay_diff_full({'a': 'hamburger', 'c': 'pepsi', 'd': 'icecream'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, combine_upd_add=False)
assert diffed == {'add': {'b': 'fries'}, 'delete': {'d': 'icecream'}, 'update': {'c': 'coke'}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke'}}, {'c': {'f': 'coffee'}}, combine_upd_add=False)
assert diffed == {'add': {'c': {'f': 'coffee'}}, 'delete': {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke'}}, 'update': {'c': {}}}
diffed = jay_diff_full({'a': 'hamburger', 'c': 'pepsi', 'd': 'icecream'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, combine_upd_add=False)
assert diffed == {'add': {'b': 'fries'}, 'delete': {'d': 'icecream'}, 'update': {'c': 'coke'}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, combine_upd_add=False)
assert diffed == {}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, {'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, combine_upd_add=False)
assert diffed == {'update': {'c': 'pepsi'}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'b': 'fries'}, combine_upd_add=False)
assert diffed == {'delete': {'c': 'pepsi'}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, combine_upd_add=False)
assert diffed == {'update': {'c': 'coke'}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a': 'hamburger', 'b': 'fries'}, combine_upd_add=False)
assert diffed == {'delete': {'c': {'e': 'coke', 'f': 'coffee'}}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a': 'hamburger', 'b': 'fries', 'c': {'f': 'coffee'}}, combine_upd_add=False)
assert diffed == {'delete': {'c': {'e': 'coke'}}, 'update': {'c': {}}}
diffed = jay_diff_full({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'coke'}}, combine_upd_add=False)
assert diffed == {'delete': {'a': 'hamburger', 'b': 'fries', 'c': {'f': 'coffee'}}, 'update': {'c': {}}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'potatoes'}, combine_upd_add=False)
assert diffed == {'delete': {'c': {'e': 'coke', 'f': 'coffee'}}, 'update': {'a': 'hotdog', 'b': 'potatoes'}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'pepsi'}}, combine_upd_add=False)
assert diffed == {'delete': {'a': 'hamburger', 'b': 'fries', 'c': {'f': 'coffee'}}, 'update': {'c': {'e': 'pepsi'}}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'fries'}, combine_upd_add=False)
assert diffed == {'delete': {'c': {'e': 'coke', 'f': 'coffee'}}, 'update': {'a': 'hotdog'}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'pepsi', 'f': 'coffee'}}, combine_upd_add=False)
assert diffed == {'update': {'c': {'e': 'pepsi'}}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'potatoes', 'd': 'icecream'}, combine_upd_add=False)
assert diffed == {'add': {'d': 'icecream'}, 'delete': {'c': {'e': 'coke', 'f': 'coffee'}}, 'update': {'a': 'hotdog', 'b': 'potatoes'}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'pepsi', 'g': 'tea', 'h': 'cake'}, 'b':'potatoes'}, combine_upd_add=False)
assert diffed == {'add': {'c': {'g': 'tea', 'h': 'cake'}}, 'delete': {'a': 'hamburger', 'c': {'f': 'coffee'}}, 'update': {'b': 'potatoes', 'c': {'e': 'pepsi'}}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hotdog', 'b':'fries'}, combine_upd_add=False)
assert diffed == {'delete': {'c': {'e': 'coke', 'f': 'coffee'}}, 'update': {'a': 'hotdog'}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'pepsi', 'f': 'coffee'}}, combine_upd_add=False)
assert diffed == {'update': {'c': {'e': 'pepsi'}}}
diffed = jay_diff_full({'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'pepsi', 'f': 'coffee', 'h': 'cake'}})
assert diffed == {'add': {'c': {'h': 'cake'}}, 'update': {'c': {'e': 'pepsi'}}}
# Merge
merged = jay_merge_plus({}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}) merged = jay_merge_plus({}, {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}})
assert merged == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}} assert merged == {'a':'hamburger', 'b':'fries', 'c': {'e': 'coke', 'f': 'coffee'}}