| """Centralised filesystem paths. |
| |
| Hugging Face Spaces only allow writing under ``/tmp``. Locally (esp. on |
| Windows) ``/tmp`` does not exist, so we fall back to :func:`tempfile.gettempdir`. |
| All write-paths in the project should resolve through this module. |
| """ |
|
|
| from __future__ import annotations |
|
|
| import os |
| import tempfile |
|
|
|
|
| def _base_tmp() -> str: |
| explicit = os.environ.get("FSCANNER_TMP_DIR", "").strip() |
| if explicit: |
| os.makedirs(explicit, exist_ok=True) |
| return explicit |
| |
| if os.path.isdir("/tmp"): |
| return "/tmp" |
| return tempfile.gettempdir() |
|
|
|
|
| TMP_DIR: str = _base_tmp() |
|
|
| CACHE_PATH: str = os.environ.get( |
| "FSCANNER_CACHE_PATH", |
| os.path.join(TMP_DIR, "us_flow_scanner_ohlcv.parquet"), |
| ) |
|
|
| HISTORY_DIR: str = os.environ.get( |
| "FSCANNER_HISTORY_DIR", |
| os.path.join(TMP_DIR, "us_flow_scanner_history"), |
| ) |
|
|
| SECTOR_CACHE_PATH: str = os.environ.get( |
| "FSCANNER_SECTOR_CACHE", |
| os.path.join(TMP_DIR, "us_flow_scanner_sectors.parquet"), |
| ) |
|
|
| WATCHLIST_PATH: str = os.environ.get( |
| "FSCANNER_WATCHLIST", |
| os.path.join(TMP_DIR, "us_flow_scanner_watchlist.json"), |
| ) |
|
|
| LEARNED_WEIGHTS_PATH: str = os.environ.get( |
| "FSCANNER_LEARNED_WEIGHTS", |
| os.path.join(TMP_DIR, "us_flow_scanner_learned_weights.json"), |
| ) |
|
|
| PERFORMANCE_LOG_PATH: str = os.environ.get( |
| "FSCANNER_PERFORMANCE_LOG", |
| os.path.join(TMP_DIR, "us_flow_scanner_performance.parquet"), |
| ) |
|
|
| RESULTS_CSV_PATH: str = os.path.join(TMP_DIR, "us_flow_scan_results.csv") |
|
|
| L2_CACHE_PATH: str = os.environ.get( |
| "FSCANNER_L2_CACHE", |
| os.path.join(TMP_DIR, "us_flow_scanner_l2.parquet"), |
| ) |
|
|
| OPTIONS_CACHE_PATH: str = os.environ.get( |
| "FSCANNER_OPTIONS_CACHE", |
| os.path.join(TMP_DIR, "us_flow_scanner_options.parquet"), |
| ) |
|
|
| TICK_CACHE_DIR: str = os.environ.get( |
| "FSCANNER_TICK_CACHE", |
| os.path.join(TMP_DIR, "us_flow_scanner_ticks"), |
| ) |
|
|
| INTRADAY_CACHE_DIR: str = os.environ.get( |
| "FSCANNER_INTRADAY_CACHE", |
| os.path.join(TMP_DIR, "us_flow_scanner_intraday"), |
| ) |
|
|
| STUB_DIR: str = os.environ.get( |
| "FSCANNER_STUB_DIR", |
| os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data", "stubs"), |
| ) |
|
|
|
|
| def ensure_dirs() -> None: |
| for d in (TMP_DIR, HISTORY_DIR, TICK_CACHE_DIR, INTRADAY_CACHE_DIR): |
| try: |
| os.makedirs(d, exist_ok=True) |
| except OSError: |
| pass |
|
|
|
|
| ensure_dirs() |
|
|