Source code for coalib.results.LineDiff
import collections
from coala_utils.decorators import generate_repr
[docs]class ConflictError(Exception):
pass
[docs]@generate_repr('change', 'delete', 'add_after')
class LineDiff:
"""
A LineDiff holds the difference between two strings.
"""
def __init__(self, change=False, delete=False, add_after=False):
"""
Creates a new LineDiff object. Note that a line cannot be
changed _and_ deleted at the same time.
:param change: False or a tuple (original, replacement)
:param delete: True/False
:param add_after: False or a list of lines to append after this ones
"""
# change property setter will need this value for assertion
self._delete = False
self.change = change
self.delete = delete
self.add_after = add_after
def __eq__(self, other):
return (self.change == other.change and
self.delete == other.delete and
self.add_after == other.add_after)
@property
def change(self):
return self._change
@change.setter
def change(self, value):
if value is not False and not isinstance(value, tuple):
raise TypeError('change must be False or a tuple with an original '
'and a replacement string.')
if value is not False and self.delete is not False:
raise ConflictError('A line cannot be changed and deleted '
'at the same time.')
self._change = value
@property
def delete(self):
return self._delete
@delete.setter
def delete(self, value):
if not isinstance(value, bool):
raise TypeError('delete can only be a boolean value.')
if value is not False and self.change is not False:
raise ConflictError('A line cannot be changed and deleted '
'at the same time.')
self._delete = value
@property
def add_after(self):
return self._add_after
@add_after.setter
def add_after(self, value):
if value is not False and not isinstance(value, collections.Iterable):
raise TypeError(
'add_after must be False or a list of lines to append.')
if isinstance(value, collections.Iterable):
value = list(value)
self._add_after = value if value != [] else False