@@ -16,30 +16,49 @@ def load_csv(fp, key=None):
1616
1717
1818def compare (previous , current ):
19+ result = {
20+ "added" : [],
21+ "removed" : [],
22+ "changed" : [],
23+ "columns_added" : [],
24+ "columns_removed" : [],
25+ }
26+ # Have the columns changed?
27+ previous_columns = set (next (iter (previous .values ())).keys ())
28+ current_columns = set (next (iter (current .values ())).keys ())
29+ ignore_columns = None
30+ if previous_columns != current_columns :
31+ result ["columns_added" ] = [
32+ c for c in current_columns if c not in previous_columns
33+ ]
34+ result ["columns_removed" ] = [
35+ c for c in previous_columns if c not in current_columns
36+ ]
37+ ignore_columns = current_columns .symmetric_difference (previous_columns )
1938 # Have any rows been removed or added?
2039 removed = [id for id in previous if id not in current ]
2140 added = [id for id in current if id not in previous ]
2241 # How about changed?
2342 removed_or_added = set (removed ) | set (added )
2443 potential_changes = [id for id in current if id not in removed_or_added ]
2544 changed = [id for id in potential_changes if current [id ] != previous [id ]]
26- result = {"added" : [], "removed" : [], "changed" : []}
2745 if added :
2846 result ["added" ] = [current [id ] for id in added ]
2947 if removed :
3048 result ["removed" ] = [previous [id ] for id in removed ]
3149 if changed :
3250 for id in changed :
33- d = list (diff (previous [id ], current [id ]))
34- result ["changed" ].append (
35- {
36- "key" : id ,
37- "changes" : {
38- field : [prev_value , current_value ]
39- for _ , field , (prev_value , current_value ) in d
40- },
41- }
42- )
51+ d = list (diff (previous [id ], current [id ], ignore = ignore_columns ))
52+ if d :
53+ result ["changed" ].append (
54+ {
55+ "key" : id ,
56+ "changes" : {
57+ field : [prev_value , current_value ]
58+ for _ , field , (prev_value , current_value ) in d
59+ },
60+ }
61+ )
4362 return result
4463
4564
@@ -49,6 +68,28 @@ def human_text(result, key=None, singular=None, plural=None):
4968 title = []
5069 summary = []
5170 show_headers = sum (1 for key in result if result [key ]) > 1
71+ if result ["columns_added" ]:
72+ fragment = "{} {} added" .format (
73+ len (result ["columns_added" ]),
74+ "column" if len (result ["columns_added" ]) == 1 else "columns" ,
75+ )
76+ title .append (fragment )
77+ summary .extend (
78+ [fragment ]
79+ + [" {}" .format (c ) for c in sorted (result ["columns_added" ])]
80+ + ["" ]
81+ )
82+ if result ["columns_removed" ]:
83+ fragment = "{} {} removed" .format (
84+ len (result ["columns_removed" ]),
85+ "column" if len (result ["columns_removed" ]) == 1 else "columns" ,
86+ )
87+ title .append (fragment )
88+ summary .extend (
89+ [fragment ]
90+ + [" {}" .format (c ) for c in sorted (result ["columns_removed" ])]
91+ + ["" ]
92+ )
5293 if result ["changed" ]:
5394 fragment = "{} {} changed" .format (
5495 len (result ["changed" ]), singular if len (result ["changed" ]) == 1 else plural
0 commit comments