Source code for lector.types.abc

from __future__ import annotations

from abc import ABC, abstractmethod
from dataclasses import dataclass, field

import rich.repr
from pyarrow import Array


@dataclass
[docs] class Conversion: """Return type of a conversion/cast."""
[docs] result: Array
[docs] meta: dict = field(default_factory=dict)
@dataclass @rich.repr.auto
[docs] class Converter(ABC): """Simple base class for dependency injection of new custom data types. If a proportion of values smaller than `threshold` can be successfully converted, the converter should return None. """
[docs] threshold: float = 1.0
@abstractmethod
[docs] def convert(self, arr: Array) -> Conversion | None: """To be implemented in subclasses."""
@dataclass
[docs] class ConverterRegistry: """Registry to manage converters."""
[docs] convs: dict[str, Converter] = field(default_factory=dict)
[docs] def register(self, registered: type) -> type: self.convs[registered.__name__.lower()] = registered return registered
[docs] def __getitem__(self, item: str) -> Converter: return self.convs[item.lower()]
[docs] Registry = ConverterRegistry()
"""'Singleton' conversion registry."""