"""Reader factory: fast calamine engine by default, streaming iterparse as fallback.""" from __future__ import annotations import os from .xlsx_reader import TransactionReader def _calamine_available() -> bool: if os.environ.get("AR_USE_CALAMINE", "1") == "0": return False try: import python_calamine # noqa: F401 return True except Exception: return False def make_reader(path: str, saved_overrides: dict[str, str] | None = None): """ Return a reader with the TransactionReader interface (detect/iter_records/file_meta/close). Uses python-calamine when available (much faster, higher peak memory); otherwise the low-memory streaming reader. Set AR_USE_CALAMINE=0 to force the streaming reader. """ if _calamine_available(): from .calamine_reader import CalamineReader return CalamineReader(path, saved_overrides=saved_overrides) return TransactionReader(path, saved_overrides=saved_overrides)