Completed
Pull Request — master (#118)
by Jasper
01:08
created

niprov.Diff.areEqual()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 3
rs 10
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