@@ -16,30 +16,49 @@ def load_csv(fp, key=None):
16
16
17
17
18
18
def 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 )
19
38
# Have any rows been removed or added?
20
39
removed = [id for id in previous if id not in current ]
21
40
added = [id for id in current if id not in previous ]
22
41
# How about changed?
23
42
removed_or_added = set (removed ) | set (added )
24
43
potential_changes = [id for id in current if id not in removed_or_added ]
25
44
changed = [id for id in potential_changes if current [id ] != previous [id ]]
26
- result = {"added" : [], "removed" : [], "changed" : []}
27
45
if added :
28
46
result ["added" ] = [current [id ] for id in added ]
29
47
if removed :
30
48
result ["removed" ] = [previous [id ] for id in removed ]
31
49
if changed :
32
50
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
+ )
43
62
return result
44
63
45
64
@@ -49,6 +68,28 @@ def human_text(result, key=None, singular=None, plural=None):
49
68
title = []
50
69
summary = []
51
70
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
+ )
52
93
if result ["changed" ]:
53
94
fragment = "{} {} changed" .format (
54
95
len (result ["changed" ]), singular if len (result ["changed" ]) == 1 else plural
0 commit comments