"""Reader factory: CSV, fast calamine (xlsx), or streaming iterparse 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). CSV reports (Amazon "Custom Unified Transaction" downloads) use CsvReader. Spreadsheets use 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. """ ext = os.path.splitext(path)[1].lower() if ext == ".csv": from .csv_reader import CsvReader return CsvReader(path, saved_overrides=saved_overrides) if _calamine_available(): from .calamine_reader import CalamineReader return CalamineReader(path, saved_overrides=saved_overrides) return TransactionReader(path, saved_overrides=saved_overrides)