"""SplitLookup class."""
from typing import TYPE_CHECKING, Optional, cast
from text_lint.config import LOOKUP_TRANSFORMATION_PREFIX
from text_lint.operations.lookups.bases.lookup_encoder_base import (
LookupEncoderBase,
)
from text_lint.operations.lookups.encoders.split import SplitEncoder
from text_lint.operations.mixins.parameter_validation import (
validator_factories,
)
from text_lint.utilities.translations import _
if TYPE_CHECKING: # pragma: no cover
from text_lint.linter.states import LookupState
from text_lint.operations.lookups.bases.lookup_base import AliasLookupParams
from text_lint.operations.validators.args.lookup_expression import (
LookupExpression,
)
YAML_EXAMPLE_COMPONENTS = (
_("split lookup example"),
)
YAML_EXAMPLE = """
- name: {0}
operation: validate_debug
saved:
- example.split()
- example.split("-").to_group()
""".format(*YAML_EXAMPLE_COMPONENTS)
[docs]
class SplitLookup(LookupEncoderBase):
"""SplitLookup operation for ResultForest instances."""
encoder_class = SplitEncoder
hint = _("split the values of a save id")
operation = LOOKUP_TRANSFORMATION_PREFIX + "split"
yaml_example = YAML_EXAMPLE
[docs]
def __init__(
self,
lookup_name: str,
lookup_expression: "LookupExpression",
lookup_params: "AliasLookupParams",
requesting_operation_name: str,
) -> None:
"""Initialize SplitLookup instances.
:param lookup_name: The name of this lookup operation.
:param lookup_expression: The lookup expression this lookup is a part of.
:param lookup_params: The parameters being used with this lookup operation.
:param requesting_operation_name: The name of the validation operation.
:raises: LookupFailure
"""
super().__init__(
lookup_name,
lookup_expression,
lookup_params,
requesting_operation_name,
)
self.seperator = self._parse_seperator()
[docs]
class Parameters(LookupEncoderBase.Parameters):
"""Parameter validation for this operation."""
lookup_params = {
"type":
list,
"of":
str,
"validators":
[
validator_factories.create_is_greater_than_or_equal(
0,
conversion_function=len,
),
validator_factories.create_is_less_than_or_equal(
1,
conversion_function=len,
),
],
}
def _parse_seperator(self) -> Optional[str]:
if self.lookup_params:
return cast(str, self.lookup_params[0])
return None
[docs]
def apply(
self,
state: "LookupState",
) -> None:
"""Split all values at current location and in the lookup results."""
self.encoder_params = {"seperator": self.seperator}
state.results = self.encode(state.results)