Source code for autobean_refactor.models.block_comment
from typing import final
from typing_extensions import Self
from . import base
from .internal import registry as _registry
from .internal import spacing_accessors as _spacing_accessors
from .internal import value_properties as _value_properties
def _splitlines(s: str) -> list[str]:
lines = s.splitlines(keepends=True)
if not lines or lines[-1].endswith('\n'):
lines.append('')
return lines
[docs]@_registry.token_model
class BlockComment(base.RawTokenModel, _value_properties.RWValueWithIndent[str], _spacing_accessors.SpacingAccessorsMixin):
"""Comment that occupies one or more whole lines."""
RULE = 'BLOCK_COMMENT'
@final
def __init__(self, raw_text: str, indent: str, value: str, *, claimed: bool = True) -> None:
super().__init__(raw_text)
self._value = value
self._indent = indent
self._claimed = claimed
@property
def raw_text(self) -> str:
return super().raw_text
@raw_text.setter
def raw_text(self, raw_text: str) -> None:
self._update_raw_text(raw_text)
self._indent, self._value = self._parse_value(raw_text)
@property
def value(self) -> str:
return self._value
@value.setter
def value(self, value: str) -> None:
self._value = value
self._update_raw_text(self._format_value(self._indent, value))
@property
def indent(self) -> str:
return self._indent
@indent.setter
def indent(self, indent: str) -> None:
self._indent = indent
self._update_raw_text(self._format_value(indent, self._value))
@property
def claimed(self) -> bool:
return self._claimed
@claimed.setter
def claimed(self, claimed: bool) -> None:
self._claimed = claimed
[docs] @classmethod
def from_value(cls, value: str, *, indent: str = '') -> Self:
return cls(cls._format_value(indent, value), indent, value)
[docs] @classmethod
def from_raw_text(cls, raw_text: str) -> Self:
indent, value = cls._parse_value(raw_text)
return cls(raw_text, indent, value)
@classmethod
def _parse_value(cls, raw_text: str) -> tuple[str, str]:
indents, values = zip(*(
tuple(line.split(';', maxsplit=1))
for line in _splitlines(raw_text)
))
lines = list(values)
spaced = all(not line.rstrip('\r\n') or line.startswith(' ') for line in lines)
if spaced:
lines = [line.removeprefix(' ') for line in lines]
return indents[0], ''.join(lines)
@classmethod
def _format_value(cls, indent: str, value: str) -> str:
return ''.join(
f'{indent}; {line}' if line.rstrip('\r\n') else f'{indent};{line}'
for line in _splitlines(value)
)
def _clone(self: 'BlockComment') -> 'BlockComment':
return type(self)(self.raw_text, self.indent, self.value, claimed=self.claimed)