Skip to content

Commit

Permalink
Merge pull request #74 from MJedr/authors
Browse files Browse the repository at this point in the history
dict merger: dedupe only remove patches
  • Loading branch information
drjova authored Sep 30, 2021
2 parents ad20fcf + e38bc05 commit 8f4a8c2
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 57 deletions.
6 changes: 3 additions & 3 deletions json_merger/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@
>>> m = Merger(root, head, update, DictMergerOps.FALLBACK_KEEP_HEAD,
... UnifierOps.KEEP_ONLY_HEAD_ENTITIES)
>>> m.merge() # No conflict here
>>> m.merged_root['badges'] == ['cool', 'nice']
>>> m.merged_root['badges'] == ['cool', 'nice', 'random']
True
>>> m = Merger(root, head, update, DictMergerOps.FALLBACK_KEEP_HEAD,
... UnifierOps.KEEP_ONLY_UPDATE_ENTITIES)
Expand All @@ -135,12 +135,12 @@
>>> m = Merger(root, head, update, DictMergerOps.FALLBACK_KEEP_HEAD,
... UnifierOps.KEEP_UPDATE_AND_HEAD_ENTITIES_HEAD_FIRST)
>>> m.merge() # No conflict here
>>> m.merged_root['badges'] == ['cool', 'fun', 'nice', 'healthy']
>>> m.merged_root['badges'] == ['cool', 'fun', 'nice', 'random', 'healthy']
True
>>> m = Merger(root, head, update, DictMergerOps.FALLBACK_KEEP_HEAD,
... UnifierOps.KEEP_UPDATE_AND_HEAD_ENTITIES_UPDATE_FIRST)
>>> m.merge()
>>> m.merged_root['badges'] == ['fun', 'cool', 'nice', 'healthy']
>>> m.merged_root['badges'] == ['fun', 'cool', 'nice', 'healthy', 'random']
True
These options keep the order relations between the entities. For example,
Expand Down
23 changes: 16 additions & 7 deletions json_merger/dict_merger.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,14 +139,14 @@ def conflicts(self):
def _merge_base_values(self):
if self.head == self.update:
self.merged_root = self.head
elif self.head == self.root:
self.merged_root = self.update
elif self.update == self.root:
self.merged_root = self.head
elif self.head == NOTHING:
self.merged_root = self.update
elif self.update == NOTHING:
self.merged_root = self.head
elif self.head == self.root:
self.merged_root = self.update
elif self.update == self.root:
self.merged_root = self.head
else:
strategy = self._get_rule_for_field(self.key_path)
self.merged_root, conflict = {
Expand All @@ -171,10 +171,19 @@ def _merge_dicts(self):
self._solve_dict_conflicts(non_list_merger, e.content)

self._restore_lists()
remove_patches = []
other_patches = []
for patch_ in non_list_merger.unified_patches:
if patch_[0] == 'remove':
remove_patches.append(patch_)
else:
other_patches.append(patch_)
remove_patches_deduped = dedupe_list(remove_patches)
unified_patches = remove_patches_deduped + other_patches
self.merged_root = patch(
dedupe_list(non_list_merger.unified_patches),
self.root
)
unified_patches,
self.root
)

def _solve_dict_conflicts(self, non_list_merger, conflicts):
strategies = [self._get_custom_strategy(conflict)
Expand Down
4 changes: 1 addition & 3 deletions json_merger/merger.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
from .dict_merger import SkipListsMerger
from .errors import MergeError
from .list_unify import ListUnifier
from .nothing import NOTHING
from .utils import (
get_conf_set_for_key_path, get_dotted_key_path, get_obj_at_key_path,
set_obj_at_key_path
Expand Down Expand Up @@ -262,8 +261,7 @@ def _recursive_merge(self, root, head, update, key_path=()):
)
new_obj = self._recursive_merge(root_obj, head_obj, update_obj,
absolute_key_path + (idx, ))
if new_obj != NOTHING:
new_list.append(new_obj)
new_list.append(new_obj)

root = set_obj_at_key_path(root, list_field, new_list)
self._build_aligned_lists_and_stats(unifier, absolute_key_path)
Expand Down
12 changes: 0 additions & 12 deletions tests/unit/test_dict_merger.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,18 +87,6 @@ def test_merge_with_nothing():
m.merge()
assert m.merged_root == {'some': 'other object'}

m = SkipListsMerger({'some': 'other object'},
NOTHING, {'some': 'other object'},
DictMergerOps.FALLBACK_KEEP_HEAD)
m.merge()
assert m.merged_root == NOTHING

m = SkipListsMerger({'some': 'other object'},
{'some': 'other object'}, NOTHING,
DictMergerOps.FALLBACK_KEEP_HEAD)
m.merge()
assert m.merged_root == NOTHING


def test_simple_conflicts_keep_head():
r = {}
Expand Down
33 changes: 1 addition & 32 deletions tests/unit/test_merger.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,38 +218,7 @@ def test_keep_head_conflict_on_new_update():
with pytest.raises(MergeError):
m.merge()

expected_merge = [2]
expected_merge = [1, 2]
expected_conflict = [('INSERT', (0,), 3)]
assert m.merged_root == expected_merge
assert m.conflicts == expected_conflict


def test_merger_doesnt_add_elements_removed_in_head_when_root_matches_update():
update = {
'ids': [
{'schema': 'INSPIRE ID', 'value': 'INSPIRE-00231894'},
{'schema': 'ORCID', 'value': '0000-0002-0165-6297'}
]
}
head = {
'ids': [
{'value': 'INSPIRE-00231894', 'schema': 'INSPIRE ID'},
{'value': 'V.Nikolaenko.1', 'schema': 'INSPIRE BAI'}
]
}
root = {
'ids': [
{'schema': 'INSPIRE ID', 'value': 'INSPIRE-00231894'},
{'schema': 'ORCID', 'value': '0000-0002-0165-6297'}
]
}

m = Merger(root, head, update,
DictMergerOps.FALLBACK_KEEP_HEAD,
UnifierOps.KEEP_UPDATE_AND_HEAD_ENTITIES_UPDATE_FIRST)

m.merge()
assert m.merged_root['ids'] == [
{'value': 'INSPIRE-00231894', 'schema': 'INSPIRE ID'},
{'value': 'V.Nikolaenko.1', 'schema': 'INSPIRE BAI'}
]

0 comments on commit 8f4a8c2

Please sign in to comment.