Skip to content

Commit b207476

Browse files
authored
Merge pull request #80 from MJedr/comparator
comparator: fields are equal if they are not present
2 parents 3ed869d + dda2984 commit b207476

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

json_merger/comparator.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,25 @@ class PrimaryKeyComparator(BaseComparator):
105105
primary_key_fields = ['pk']
106106
normalization_functions = {}
107107

108-
def _have_field_equal(self, obj1, obj2, field):
108+
def _get_compared_objects_at_field_path(self, obj1, obj2, field):
109109
key_path = tuple(k for k in field.split('.') if k)
110110
o1 = get_obj_at_key_path(obj1, key_path, NOTHING)
111111
o2 = get_obj_at_key_path(obj2, key_path, NOTHING)
112+
return o1, o2
113+
114+
def _have_field_equal(self, obj1, obj2, field):
115+
o1, o2 = self._get_compared_objects_at_field_path(obj1, obj2, field)
112116
if o1 == NOTHING or o2 == NOTHING:
113117
return False
114118

115119
fn = self.normalization_functions.get(field, lambda x: x)
116120
return fn(o1) == fn(o2)
117121

122+
def _are_fields_nothing(self, obj1, obj2, field):
123+
o1, o2 = self._get_compared_objects_at_field_path(obj1, obj2, field)
124+
if o1 == NOTHING or o2 == NOTHING:
125+
return True
126+
118127
def equal(self, obj1, obj2):
119128
if obj1 == obj2:
120129
return True
@@ -124,7 +133,11 @@ def equal(self, obj1, obj2):
124133
field_set = [field_set]
125134
checks = [self._have_field_equal(obj1, obj2, field)
126135
for field in field_set]
127-
if all(checks):
136+
are_all_fields_nothing = [
137+
self._are_fields_nothing(obj1, obj2, field)
138+
for field in field_set
139+
]
140+
if all(checks) and not all(are_all_fields_nothing):
128141
return True
129142

130143
return False

0 commit comments

Comments
 (0)