Source code for coalib.results.TextPosition

from coala_utils.decorators import (
    enforce_signature, generate_ordering, generate_repr)


[docs]class ZeroOffsetError(ValueError): pass
[docs]@generate_repr('line', 'column') @generate_ordering('line', 'column') class TextPosition: @enforce_signature def __init__(self, line: (int, None) = None, column: (int, None) = None): """ Creates a new TextPosition object that represents the position inside a string with line/column numbers. :param line: The line in file or None, the first line is 1. :param column: The column indicating the character. The first one in a line is 1. :raises TypeError: Raised when line or columns are no integers. :raises ValueError: Raised when a column is set but line is None. """ if line is None and column is not None: raise ValueError('A column can only be set if a line is set.') if line == 0 and column == 0: raise ZeroOffsetError('Line and column offset cannot be zero.') elif line == 0: raise ZeroOffsetError('Line offset cannot be zero.') elif column == 0: raise ZeroOffsetError('Column offset cannot be zero.') self._line = line self._column = column @property def line(self): return self._line @property def column(self): return self._column def __le__(self, other): """ Test whether ``self`` is behind or equals the other ``TextPosition``. If the column in a ``TextPosition`` is ``None``, consider whole line. If the line in a ``TextPosition`` is ``None``, consider whole file. :param other: ``TextPosition`` to compare with. :return: Whether this ``TextPosition`` is behind the other one or the same. """ if self.line is None or other.line is None: return True if self.line == other.line: return (True if self.column is None or other.column is None else self.column <= other.column) else: return self.line < other.line def __ge__(self, other): """ Test whether ``self`` is ahead of or equals the other ``TextPosition``. If the column in a ``TextPosition`` is ``None``, consider whole line. If the line in a ``TextPosition`` is ``None``, consider whole file. :param other: ``TextPosition`` to compare with. :return: Whether this ``TextPosition`` is ahead of the other one or the same. """ if self.line is None or other.line is None: return True if self.line == other.line: return (True if self.column is None or other.column is None else self.column >= other.column) else: return self.line > other.line