3
0
Fork 0

fix: diff should use "intersection" of fields by default

if either "old" or "new" data has more fields than the other set, only
the fields they have in common should be used unless caller overrides
This commit is contained in:
Lance Edgar 2026-02-25 08:54:58 -06:00
parent 69a83ea47f
commit b0a8d87d4f
2 changed files with 15 additions and 4 deletions

View file

@ -83,7 +83,11 @@ class Diff: # pylint: disable=too-many-instance-attributes
self.cell_padding = cell_padding
def make_fields(self): # pylint: disable=missing-function-docstring
return sorted(set(self.old_data) | set(self.new_data), key=lambda x: x.lower())
if self.old_data and self.new_data:
fields = set(self.old_data) & set(self.new_data)
else:
fields = set(self.old_data or self.new_data)
return sorted(fields, key=lambda f: f.lower())
def render_html(self, template=None, **kwargs):
"""

View file

@ -19,13 +19,20 @@ class TestDiff(ConfigTestCase):
self.assertEqual(diff.cell_padding, "0.5rem")
def test_make_fields(self):
old_data = {"foo": "bar"}
new_data = {"foo": "bar", "baz": "zer"}
# should return "sorted intersection" of fields
old_data = {"foo": "bar", "baz": "abc"}
new_data = {"foo": "bar", "baz": "xyz", "flurg": "foo"}
# nb. this calls make_fields()
diff = self.make_diff(old_data, new_data)
# TODO: should the fields be cumulative? or just use new_data?
self.assertEqual(diff.fields, ["baz", "foo"])
# all fields are used if only one data set
diff = self.make_diff(old_data, {})
self.assertEqual(diff.fields, ["baz", "foo"])
diff = self.make_diff({}, new_data)
self.assertEqual(diff.fields, ["baz", "flurg", "foo"])
def test_values(self):
old_data = {"foo": "bar"}
new_data = {"foo": "baz"}