Completed
Pull Request — master (#1438)
by Sudheesh
01:34
created

coalib.results.LineDiff.change()   B

Complexity

Conditions 5

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 5
dl 0
loc 3
rs 8.5454
1
from coalib.misc.Decorators import generate_repr
2
3
4
@generate_repr('change', 'delete', 'add_after')
5
class LineDiff:
6
    """
7
    A LineDiff holds the difference between two strings.
8
    """
9
10
    def __init__(self, change=False, delete=False, add_after=False):
11
        """
12
        Creates a new LineDiff object. Note that a line cannot be
13
        changed _and_ deleted at the same time.
14
15
        :param change: False or a tuple (original, replacement)
16
        :param delete: True/False
17
        :param add_after: False or a list of lines to append after this ones
18
        """
19
        # change property setter will need this value for assertion
20
        self._delete = False
21
22
        self.change = change
23
        self.delete = delete
24
        self.add_after = add_after
25
26
    def __eq__(self, other):
27
        return (self.change == other.change and
28
                self.delete == other.delete and
29
                self.add_after == other.add_after)
30
31
    @property
32
    def change(self):
33
        return self._change
34
35
    @change.setter
36
    def change(self, value):
37
        if value is not False and not isinstance(value, tuple):
38
            raise TypeError("change must be False or a tuple with an original "
39
                            "and a replacement string.")
40
        if value is not False and self.delete is not False:
41
            raise AssertionError("A line cannot be changed and deleted "
42
                                 "at the same time.")
43
44
        self._change = value
45
46
    @property
47
    def delete(self):
48
        return self._delete
49
50
    @delete.setter
51
    def delete(self, value):
52
        if not isinstance(value, bool):
53
            raise TypeError("delete can only be a boolean value.")
54
        if value is not False and self.change is not False:
55
            raise AssertionError("A line cannot be changed and deleted "
56
                                 "at the same time.")
57
58
        self._delete = value
59
60
    @property
61
    def add_after(self):
62
        return self._add_after
63
64
    @add_after.setter
65
    def add_after(self, value):
66
        if value is not False and not isinstance(value, list):
67
            raise TypeError(
68
                "add_after must be False or a list of lines to append.")
69
70
        self._add_after = value if value != [] else False
71