# DEV Ground Rule tooling configuration (test / coverage / lint). # Only [tool.*] sections live here — runtime dependencies stay in requirements.txt. [tool.pytest.ini_options] minversion = "7.0" testpaths = ["tests"] pythonpath = ["."] addopts = [ "-ra", "--strict-markers", "--strict-config", ] markers = [ "unit: pure unit test (no external services)", "integration: requires real external services", "slow: takes > 1s", "e2e: hits a live local server", "llm: requires a real LLM call (skip with E2E_SKIP_LLM=1)", ] [tool.coverage.run] branch = true # Application packages measured for the unit-coverage gate. source = ["common", "config", "functions", "lib", "products"] omit = [ "*/__init__.py", # Server entrypoints (sockets, threads, SSL, subprocesses) — not unit-testable. "run_cqa_test_app.py", "mcp_server.py", "testapps/*", # Integration modules that require live external services (DB engines, Athenz # ZTS, Jira, cert tooling). These are exercised via API E2E / integration # tests, not unit tests. "products/dbs/mysql.py", "products/dbs/postgresql.py", "products/dbs/mongodb.py", "products/dbs/cassandra.py", "products/dbs/opensearch.py", "products/mcp/jira.py", "products/mcp/flava_function.py", "lib/athenz_client.py", "lib/jira_client.py", "lib/generate_cert.py", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "raise NotImplementedError", "if __name__ == .__main__.:", "if TYPE_CHECKING:", ] [tool.ruff] line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "W", "B"] ignore = ["E501"]