@@ -2,3 +2,4 @@
.pytest_cache/
.coverage
htmlcov/
+.ruff_cache/
@@ -16,3 +16,12 @@ coverage *args:
# Run the suite with an HTML coverage report (written to htmlcov/).
coverage-html *args:
pytest {{args}} --cov=wic --cov-branch --cov-report=term-missing --cov-report=html
+
+# Lint the test suite; it is held to a clean bar, so this must be clean.
+lint-tests:
+ ruff check tests
+
+# Lint the test suite and then the wic source. src/ is not yet
+# ruff-clean, so its findings are a preview, not a gate.
+lint: lint-tests
+ ruff check src
@@ -26,6 +26,7 @@ tests = [
"pytest >= 9.1.1",
"coverage >= 7.15.0",
"pytest-cov >= 7.1.0",
+ "ruff == 0.15.20",
"rust-just >= 1.55.1",
]
@@ -52,3 +53,10 @@ testpaths = ["tests"]
# leftover directories under the pytest base temp directory.
tmp_path_retention_policy = "failed"
tmp_path_retention_count = 1
+
+[tool.ruff.lint.per-file-ignores]
+# Test modules prepend the in-tree src/ directory to sys.path before
+# importing wic, so the suite runs against a checkout that has not been
+# installed. That bootstrap runs before the wic imports, which trips
+# E402; the ordering is deliberate, so ignore E402 for the test tree.
+"tests/**" = ["E402"]
Lint with ruff via just recipes. lint-tests runs ruff over tests/ and is held to a clean bar; lint also runs it over src/, whose findings are a preview since the wic source is not yet ruff-clean. ruff joins the tests extra and .gitignore ignores its .ruff_cache/. ruff is pinned exactly so the gate is reproducible: a ruff minor release can add rules that turn a previously clean tree red, so every machine must lint with the same version. Test modules relax E402 via per-file-ignores: they prepend src/ to sys.path before importing wic, which trips the rule, and that ordering is deliberate. AI-Generated: codex/claude-opus 4.8 (xhigh) Signed-off-by: Trevor Woerner <twoerner@gmail.com> --- changes in v4: - expose linting through just recipes (lint-tests, lint) rather than run-tests.sh flags. - pin ruff exactly (was a stale >= floor) so the clean-bar gate is reproducible across machines. - fold in the tests/** E402 ignore (its own patch in v2 and v3) and drop the linting.md doc; the pyproject.toml comment explains it. changes in v3: - no change in this revision. changes in v2: - v1 submitted the entire test suite as a single commit; v2 breaks the work into a reviewable series, and this patch is one step of it. --- .gitignore | 1 + justfile | 9 +++++++++ pyproject.toml | 8 ++++++++ 3 files changed, 18 insertions(+)