Completed
Pull Request — master (#1585)
by Niraj
01:39
created

coalib.results.LineDiff.change()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

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