[tool.ruff] target-version = "py310" line-length = 100 [tool.ruff.lint] select = [ "E", # pycodestyle errors "F", # pyflakes (unused imports, variables) "W", # pycodestyle warnings "I", # isort (import order) "N", # pep8-naming (naming conventions) "UP", # pyupgrade (modern Python syntax) "B", # flake8-bugbear (common bug patterns) "C4", # flake8-comprehensions "SIM", # flake8-simplify "RUF", # ruff-specific rules ] ignore = [ "E501", # line too long (handled by formatter) "N818", # exception class names (not every exception needs "Error" suffix) "N802", # function names (test methods and templates use non-snake-case) "N806", # variable names (templates use non-snake-case) ] [tool.ruff.lint.per-file-ignores] # Templates and generated code "**/templates/*.py" = ["N802", "N803", "N806", "E402"] # CLI entry points may shadow builtins intentionally "**/cli.py" = ["A001", "A002"] # eval_runner modules with deliberate import patterns "eval_runner/comparison.py" = ["TCH"] "eval_runner/adapter.py" = ["TCH"] "eval_runner/manifest.py" = ["E402"] # Integration tests need sys.path manipulation before imports "tests/integration/*.py" = ["E402"] [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" [tool.pytest.ini_options] minversion = "7.0" testpaths = ["scripts", "eval_runner/tests", "tests/integration"] python_files = "test_*.py" python_classes = "*Test*" python_functions = "test_*" addopts = [ "-ra", "--strict-markers", "--tb=short", "--durations=10", "--cov=scripts", "--cov=eval_runner", "--cov-report=term-missing", "--cov-fail-under=60", ] [tool.coverage.run] branch = true source = ["scripts", "eval_runner"] omit = [ "*/tests/*", "*/templates/*", "*/test_*.py", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if __name__ == .__main__.:", "raise NotImplementedError", ] [tool.mypy] strict = true python_version = "3.10" warn_unreachable = true [[tool.mypy.overrides]] module = [ "eval_runner.tests.*", "tests.integration.*", "eval_runner.openai_adapter", "eval_runner.fake_adapter", "test-eval-coverage", "test-eval-validation", "check-artifacts", ] ignore_errors = true [tool.radon] cc_min = "B" [tool.deptry] requirements_files = ["requirements-dev.txt"] extend_exclude = [ "agent-council", "agent-production-operations", "binary-analysis", "forward-deployed-engineering", "neckbeard", "product-lifecycle", "production-excellence", "research-and-vault", "tailscale", "templates", "workflow-architect", "tests", "life-coach", "raleigh", "forgejo-cli", "jellyfin", "comic-chat", "fireflies", "linear", "autogen", "crewai", "dspy", "haystack", "langchain", "langgraph", "llamaindex", "nous-branding", "open-knowledge-format", "color-management", "data-scientist", "data-architect", "esp32-development", "site-reliability-engineering", "opensource-contributions", "artifact-pyramids", "woodpecker-ci", "yc-default-alive-calculator", "yc-weekly-growth-compass", ] [tool.deptry.per_rule_ignores] DEP002 = ["ruff", "pytest", "pytest-cov", "pytest-xdist", "mypy", "radon", "deptry", "bandit", "requests", "types-jsonschema"] DEP001 = ["eval_validation"]