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."""
@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.
"""
@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."""