from dataclasses import dataclass, field from pathlib import Path @dataclass class Config: project_name: str = "" copybook_paths: list = field(default_factory=lambda: ["./copybooks"]) dialect: str = "ibm" llm_model: str = "gpt-4o-mini" llm_timeout: int = 15 llm_cache_dir: str = ".cache/llm" coverage_default: str = "boundary" rounding_mode: str = "TRUNCATE" tolerance: float = 0.01 runner_mode: str = "native" spark_master: str = "local[*]" spark_input_format: str = "json" num_records: int = 1000 branch_pass: float = 0.80 max_llm_cost: float = 0.50 @classmethod def from_toml(cls, path="aurak.toml"): import tomllib try: with open(path, "rb") as f: d = tomllib.load(f) except: return cls() c = cls() p = d.get("project", {}) c.project_name = p.get("name", "") c.copybook_paths = p.get("copybook_paths", c.copybook_paths) c.dialect = p.get("dialect", "ibm") ll = d.get("llm", {}) c.llm_model = ll.get("model", c.llm_model) co = d.get("coverage", {}) c.coverage_default = co.get("default_target", "boundary") cp = d.get("comparison", {}) c.rounding_mode = cp.get("rounding_mode", "TRUNCATE") c.tolerance = cp.get("default_tolerance", c.tolerance) r = d.get("runner", {}) c.runner_mode = r.get("mode", "native") s = d.get("spark", {}) c.spark_master = s.get("master", "local[*]") c.num_records = s.get("num_records", c.num_records) return c