Source code for scapi.database.index.parsing

import warnings
from functools import wraps
from typing import Any, Callable, Iterator, TypeAlias

from scapi.enums import IndexFile


Entity: TypeAlias = dict[str, Any]
Data: TypeAlias = list[Entity]
Rows: TypeAlias = Iterator[tuple[str, Entity, list[str]]]
Parser: TypeAlias = Callable[[Any], Rows]

_PARSERS: dict[str, Parser] = {}


[docs] def get(path: str) -> Parser: """Retrieve parser for file path.""" filename = path.split("/")[-1] if filename not in _PARSERS: warnings.warn(f"Unknown file type: '{path}'") return lambda _: iter(()) # type: ignore return _PARSERS[filename]
def _register(filename: str): def decorator(func: Parser) -> Parser: @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) _PARSERS[filename] = wrapper return wrapper return decorator @_register(IndexFile.LISTING) def _listings(data: Data): for item in data: path = item["data"] entity_id = path.split("/")[-1].replace(".json", "") yield (entity_id, item, _extract(item, "name")) @_register(IndexFile.STATS) def _stats(data: Data): for item in data: entity_id = item["id"] yield (entity_id, item, _extract(item, "name")) @_register(IndexFile.ACHIEVEMENTS) def _achievements(data: Data): for item in data: entity_id = item["id"] yield (entity_id, item, _extract(item, "title")) # "description" def _extract(item: Any, *fields: str): return [text for field in fields for text in _translations(item, field)] def _translations(item: Any, field: str) -> list[str]: translation = item.get(field, {}) match translation.get("type"): case "translation": lines: dict[str, str] = translation.get("lines", {}) return [text for text in lines.values() if text] case "text": text = translation.get("text", "") return [text] if text else [] return []