[tool:pytest] testpaths = tests eval/tests addopts = -v markers = integration: opt-in test requiring a live database (see tests/integration/test_executor_live.py). Skipped by default; set RUN_LIVE_DB_TESTS=1 to run. domain_data: asserts a specific real IME domain value (a real table/column name, a real ring name, a real synonym, the eval golden set, ...) that project_config.example/ deliberately does not contain. Auto-skipped (see rootdir conftest.py's pytest_collection_modifyitems) whenever PROJECT_CONFIG_DIR resolves to project_config.example/; runs normally against the real project_config/. [coverage:run] branch = True source = . omit = tests/* eval/tests/* scripts/* web/* .venv/* */__pycache__/* # ── Interactive tooling: excluded by policy, not by neglect ────────── # These are operator-driven wizards and CLI front-ends. Their value is # in being run by a human, and unit-testing an interactive prompt flow # buys close to nothing. Excluded so the gate below measures the engine. setup_project.py llm/wizard_llm.py database/schema_inspector_cli.py # ── Ratchet: still out of scope after Phase 4 ──────────────────────── # Phase 4 extracted and tested schema_data/{tables,columns,relationships}.py # (now schema_data/registry.py, loading project_config/schema.yaml — see # tests/test_schema_registry_loader.py and # tests/test_schema_registry_snapshot.py). schema_inspector.py (275 stmts) # and relationship_map.py (73 stmts) were NOT part of that phase's scope # and remain untouched, untested, and at 0% today. Including them now # would put the achievable gate at 74%, which would mean lowering the bar # rather than holding it. They enter scope whenever a future phase # extracts and tests them (relationship_map.py in particular is not # currently imported by any application code — see its own module # docstring), and the gate does not move down to accommodate them. database/schema_inspector.py database/relationship_map.py [coverage:report] show_missing = True skip_covered = False # Raised 85 -> 90 when the README started advertising the measured figure. # A badge that says 92% with a gate at 85 is a number nobody is holding: # coverage could fall seven points and every build would stay green while # the README kept claiming otherwise. 90 leaves real headroom under the # 92.84% measured at 4.10.1 without letting the claim rot silently. fail_under = 90 exclude_also = if TYPE_CHECKING: raise NotImplementedError \.\.\.$ if __name__ == .__main__.: