nalgeon/iuliia-py

View on GitHub
iuliia/schemas.py

Summary

Maintainability
A
0 mins
Test Coverage
"""
Transliteration schema registry.
"""

import json
from operator import attrgetter
from pathlib import Path
from enum import Enum
from typing import List, Tuple
from iuliia.schema import Schema


def _schema_loader():
    return (Schema.load(defn) for defn in _definition_reader())


def _definition_reader():
    schemas_path = Path(__file__).parent / "schemas"
    if not schemas_path.exists():
        raise ValueError(f"Schema path does not exist: {schemas_path}")
    paths = schemas_path.glob("*.json")
    for path in paths:
        definition = _load_definition(path)
        yield definition


def _load_definition(path):
    with open(path, encoding="utf-8") as file:
        return json.load(file)


class _Schemas(Enum):
    """Base class for supported transliteration schemas."""

    @classmethod
    def names(cls) -> List[str]:
        """Return names of all supported schemas."""
        return sorted(item.name for item in cls)

    @classmethod
    def items(cls) -> List[Tuple[str, Schema]]:
        """Return all supported schemas."""
        return [(item.name, item.value) for item in sorted(cls, key=attrgetter("value.name"))]

    @classmethod
    def get(cls, name: str) -> Schema:
        """Return schema by its name or ``None`` if nothing found."""
        item = cls.__members__.get(name)
        return item.value if item else None


# All supported transliteration schemas
# pylint: disable=invalid-name
Schemas = Enum(  # type: ignore
    "Schemas", [(schema.name, schema) for schema in _schema_loader()], type=_Schemas
)