| # Ruff config — engine/ | |
| # Style: strict. Detail: docs/14-Engineering.md §3.1 | |
| target-version = "py311" | |
| line-length = 100 | |
| [lint] | |
| select = [ | |
| "E", # pycodestyle errors | |
| "W", # pycodestyle warnings | |
| "F", # pyflakes | |
| "I", # isort | |
| "B", # bugbear | |
| "C4", # comprehensions | |
| "UP", # pyupgrade | |
| "ASYNC", # async patterns | |
| "S", # security | |
| "TID", # tidy imports | |
| "TCH", # type-checking blocks | |
| "RUF", # ruff-specific | |
| "PL", # pylint subset | |
| "SIM", # simplify | |
| ] | |
| ignore = [ | |
| "S101", # assert in tests is fine | |
| "PLR2004", # magic numbers — too noisy at MVP | |
| ] | |
| [lint.flake8-tidy-imports] | |
| ban-relative-imports = "all" | |
| # === Layer purity — invariant I-8 === | |
| # engine/ must never import from devvit-app/ | |
| [lint.flake8-tidy-imports.banned-api] | |
| "devvit_app".msg = "Layer violation: engine cannot import from devvit-app/. See docs/Specs.md §4.2." | |
| [lint.per-file-ignores] | |
| # Tests use literal "secrets", inline imports for monkeypatched env, and assertions. | |
| "test_*.py" = ["S101", "S105", "S106", "PLR2004", "ASYNC", "PLC0415"] | |
| "__init__.py" = ["F401"] | |
| # Alembic auto-generated migration files: long lines + trailing whitespace are fine. | |
| "alembic/versions/*.py" = ["E501", "W291", "I001"] | |
| [lint.isort] | |
| known-first-party = ["api", "orchestrator", "tools", "llm", "memory", "store", "observability"] | |
| [format] | |
| quote-style = "double" | |
| indent-style = "space" | |
| docstring-code-format = true | |