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

niprov.Diff   A

Complexity

Total Complexity 27

Size/Duplication

Total Lines 75
Duplicated Lines 0 %
Metric Value
dl 0
loc 75
rs 10
wmc 27

9 Methods

Rating   Name   Duplication   Size   Complexity  
F getDifferences() 0 22 13
A __str__() 0 2 1
A __init__() 0 3 1
A assertEqualProtocol() 0 5 2
B getDifferenceString() 0 20 6
A row() 0 4 3
A areEqualProtocol() 0 4 1
A areEqual() 0 3 1
A assertEqual() 0 4 2
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