from __future__ import annotations import os from dataclasses import dataclass, field from dotenv import load_dotenv load_dotenv() @dataclass class Config: admin_username: str = os.getenv("ADMIN_USERNAME", "admin") admin_password: str = os.getenv("ADMIN_PASSWORD", "changeme") admin_host: str = os.getenv("ADMIN_HOST", "127.0.0.1") admin_port: int = int(os.getenv("ADMIN_PORT", "9000")) db_path: str = os.getenv("DB_PATH", "data/tracker.db") headless: bool = os.getenv("HEADLESS", "true").lower() == "true" chrome_binary: str | None = os.getenv("CHROME_BINARY") chromedriver_path: str = os.getenv("CHROMEDRIVER_PATH", "drivers/chromedriver") record_sessions: bool = os.getenv("RECORD_SESSIONS", "false").lower() == "true" recording_fps: int = int(os.getenv("RECORDING_FPS", "12")) recording_max_files: int = int(os.getenv("RECORDING_MAX_FILES", "3")) recordings_dir: str = os.getenv("RECORDINGS_DIR", "recordings") # Scenario 1 — SMS-OTP: list of phone numbers (one per line in env or comma-separated) phone_numbers: list[str] = field(default_factory=list) # Flow steps — ordered list of step names to execute after login # Override in .env as: FLOW_STEPS=step_home,step_browse,step_checkout flow_steps: list[str] = field(default_factory=lambda: ["step_home"]) def __post_init__(self) -> None: raw_phones = os.getenv("PHONE_NUMBERS", "") if raw_phones: self.phone_numbers = [p.strip() for p in raw_phones.split(",") if p.strip()] raw_steps = os.getenv("FLOW_STEPS", "") if raw_steps: self.flow_steps = [s.strip() for s in raw_steps.split(",") if s.strip()] config = Config()