|
1
|
|
|
from os.path import basename |
|
2
|
|
|
|
|
3
|
|
|
class Diff(object): |
|
4
|
|
|
|
|
5
|
|
|
NCHARSCOL = 20 |
|
6
|
|
|
defaultIgnore = ['_id'] |
|
7
|
|
|
|
|
8
|
|
|
def __init__(self, file1, file2): |
|
9
|
|
|
self.file1 = file1 |
|
10
|
|
|
self.file2 = file2 |
|
11
|
|
|
|
|
12
|
|
|
def getDifferences(self, ignore=None, select=None): |
|
13
|
|
|
assert isinstance(ignore, list) or ignore is None |
|
14
|
|
|
if ignore is None: |
|
15
|
|
|
ignore = [] |
|
16
|
|
|
ignore += self.defaultIgnore |
|
17
|
|
|
prov1 = self.file1.getProvenance() |
|
18
|
|
|
prov2 = self.file2.getProvenance() |
|
19
|
|
|
if select: |
|
20
|
|
|
allkeys = set(prov1.keys()+prov2.keys()) |
|
21
|
|
|
ignore = [k for k in allkeys if k not in select] |
|
22
|
|
|
diffDict = {} |
|
23
|
|
|
for k in set(prov1.keys()).difference(prov2.keys()): |
|
24
|
|
|
if k not in ignore: |
|
25
|
|
|
diffDict[k] = 'missingIn2' |
|
26
|
|
|
for k in set(prov2.keys()).difference(prov1.keys()): |
|
27
|
|
|
if k not in ignore: |
|
28
|
|
|
diffDict[k] = 'missingIn1' |
|
29
|
|
|
for k in set(prov1.keys()).intersection(prov2.keys()): |
|
30
|
|
|
if k not in ignore: |
|
31
|
|
|
if prov1[k] != prov2[k]: |
|
32
|
|
|
diffDict[k] = 'value' |
|
33
|
|
|
return diffDict |
|
34
|
|
|
|
|
35
|
|
|
def getDifferenceString(self, ignore=None, select=None): |
|
36
|
|
|
|
|
37
|
|
|
differences = self.getDifferences(ignore, select) |
|
38
|
|
|
if not differences: |
|
39
|
|
|
return '' |
|
40
|
|
|
name1 = basename(str(self.file1.location)) |
|
41
|
|
|
name2 = basename(str(self.file2.location)) |
|
42
|
|
|
prov1 = self.file1.getProvenance() |
|
43
|
|
|
prov2 = self.file2.getProvenance() |
|
44
|
|
|
def row(*vals): |
|
45
|
|
|
cells = [c[:self.NCHARSCOL] for c in vals] |
|
46
|
|
|
cells = [c.ljust(self.NCHARSCOL) for c in cells] |
|
47
|
|
|
return ' '.join(cells)+'\n' |
|
48
|
|
|
diffStr = 'Differences:\n' |
|
49
|
|
|
diffStr += row('', name1, name2) |
|
50
|
|
|
for field, status in differences.items(): |
|
51
|
|
|
val1 = prov1.get(field, 'n/a') |
|
52
|
|
|
val2 = prov2.get(field, 'n/a') |
|
53
|
|
|
diffStr += row(field, str(val1), str(val2)) |
|
54
|
|
|
return diffStr |
|
55
|
|
|
|
|
56
|
|
|
def areEqual(self, ignore=None, select=None): |
|
57
|
|
|
differences = self.getDifferences(ignore, select) |
|
58
|
|
|
return len(differences) == 0 |
|
59
|
|
|
|
|
60
|
|
|
def areEqualProtocol(self): |
|
61
|
|
|
protocol = self.file1.getProtocolFields() |
|
62
|
|
|
differences = self.getDifferences(select=protocol) |
|
63
|
|
|
return len(differences) == 0 |
|
64
|
|
|
|
|
65
|
|
|
def assertEqual(self, ignore=None, select=None): |
|
66
|
|
|
differences = self.getDifferenceString(ignore, select) |
|
67
|
|
|
if differences: |
|
68
|
|
|
raise AssertionError(differences) |
|
69
|
|
|
|
|
70
|
|
|
def assertEqualProtocol(self): |
|
71
|
|
|
protocol = self.file1.getProtocolFields() |
|
72
|
|
|
differences = self.getDifferenceString(select=protocol) |
|
73
|
|
|
if differences: |
|
74
|
|
|
raise AssertionError(differences) |
|
75
|
|
|
|
|
76
|
|
|
def __str__(self): |
|
77
|
|
|
return self.getDifferenceString() |
|
78
|
|
|
|