@@ -52,7 +52,7 @@ def _simplify_json_row(r, common_keys):
5252 return r
5353
5454
55- def compare (previous , current , show_unchanged = False ):
55+ def compare (previous , current , show_unchanged = False , fields = None , ignorefields = None ):
5656 result = {
5757 "added" : [],
5858 "removed" : [],
@@ -64,45 +64,60 @@ def compare(previous, current, show_unchanged=False):
6464 previous_columns = set (next (iter (previous .values ())).keys ())
6565 current_columns = set (next (iter (current .values ())).keys ())
6666 ignore_columns = None
67- if previous_columns != current_columns :
68- result ["columns_added" ] = [
69- c for c in current_columns if c not in previous_columns
70- ]
71- result ["columns_removed" ] = [
72- c for c in previous_columns if c not in current_columns
73- ]
74- ignore_columns = current_columns .symmetric_difference (previous_columns )
67+
68+ # Apply fields/ignorefields filtering
69+ if fields :
70+ compare_columns = set (fields )
71+ elif ignorefields :
72+ compare_columns = previous_columns | current_columns
73+ compare_columns = compare_columns - set (ignorefields )
74+ else :
75+ compare_columns = previous_columns | current_columns
76+
77+ # Adjust columns_added/removed based on compare_columns
78+ result ["columns_added" ] = [c for c in current_columns if c not in previous_columns and c in compare_columns ]
79+ result ["columns_removed" ] = [c for c in previous_columns if c not in current_columns and c in compare_columns ]
80+ ignore_columns = (previous_columns | current_columns ) - compare_columns
81+
7582 # Have any rows been removed or added?
7683 removed = [id for id in previous if id not in current ]
7784 added = [id for id in current if id not in previous ]
78- # How about changed?
7985 removed_or_added = set (removed ) | set (added )
8086 potential_changes = [id for id in current if id not in removed_or_added ]
81- changed = [id for id in potential_changes if current [id ] != previous [id ]]
87+ changed = [
88+ id for id in potential_changes
89+ if any (
90+ (k in compare_columns ) and (current [id ].get (k ) != previous [id ].get (k ))
91+ for k in compare_columns
92+ )
93+ ]
8294 if added :
8395 result ["added" ] = [current [id ] for id in added ]
8496 if removed :
8597 result ["removed" ] = [previous [id ] for id in removed ]
8698 if changed :
8799 for id in changed :
88- diffs = list (diff (previous [id ], current [id ], ignore = ignore_columns ))
100+ diffs = list (diff (
101+ previous [id ], current [id ],
102+ ignore = ignore_columns if ignore_columns else None
103+ ))
89104 if diffs :
90105 changes = {
91106 "key" : id ,
92107 "changes" : {
93- # field can be a list if id contained '.' - #7
94108 field [0 ] if isinstance (field , list ) else field : [
95109 prev_value ,
96110 current_value ,
97111 ]
98112 for _ , field , (prev_value , current_value ) in diffs
113+ if (field [0 ] if isinstance (field , list ) else field ) in compare_columns
99114 },
100115 }
101116 if show_unchanged :
102117 changes ["unchanged" ] = {
103118 field : value
104119 for field , value in previous [id ].items ()
105- if field not in changes ["changes" ] and field != "id"
120+ if field not in changes ["changes" ] and field != "id" and field in compare_columns
106121 }
107122 result ["changed" ].append (changes )
108123 return result
0 commit comments