yak(make-checkverify-format-gate-rewrites-files-instead-of-checking-lnje): make check/verify format gate rewrites files instead of checking

This commit is contained in:
Willem van den Ende
2026-10-28 21:50:01 +00:00
parent a6a7b3a8c7
commit 4e7798c906
4 changed files with 39 additions and 11 deletions
+7 -1
View File
@@ -71,7 +71,9 @@ This is a Phoenix Liveview monorepo, the blogging library is in blogex, the appl
Main make targets: Main make targets:
- `make check` - cheap static gate for both apps (no DB): app `credo --strict` + - `make check` - cheap static gate for both apps (no DB): app `credo --strict` +
format, blogex compile (warnings fatal) + format, then `scripts/check-pins.sh` format **check** (`mix format --check-formatted`), blogex compile (warnings
fatal) + format **check**, then `scripts/check-pins.sh`. It never rewrites
files.
- `make precommit` - alias of `check`; fast, safe to run on every commit - `make precommit` - alias of `check`; fast, safe to run on every commit
- `make test` - both suites (app needs PostgreSQL on localhost:5432) - `make test` - both suites (app needs PostgreSQL on localhost:5432)
- `make verify` - the Lens pass: `check`, then per-app heavy sensors and both suites - `make verify` - the Lens pass: `check`, then per-app heavy sensors and both suites
@@ -86,6 +88,10 @@ no coverage, about a second. `make precommit` is the same target. Per app,
`mix precommit` (run inside `app/` or `blogex/`) is the fuller loop: compile with `mix precommit` (run inside `app/` or `blogex/`) is the fuller loop: compile with
warnings fatal, format, test. Run these as often as you like while working. warnings fatal, format, test. Run these as often as you like while working.
`make check` never writes files. A formatting failure means run `make format`
(both apps). The mutating loops are the explicit ones: `make format` and the
per-app `mix precommit`, which still formats as you work.
**Lens pass (every push, and before handing off).** `make verify` runs `check` **Lens pass (every push, and before handing off).** `make verify` runs `check`
first (cheapest), then per app: one suite run that exports its coverage, then first (cheapest), then per app: one suite run that exports its coverage, then
that app's sensors (sobelow, coverage, CRAP, mutation, as those yaks land), which that app's sensors (sobelow, coverage, CRAP, mutation, as those yaks land), which
+4 -2
View File
@@ -62,9 +62,11 @@ test:
test-elisp: test-elisp:
emacs --batch -Q -l org -l ox-md -l scripts/roam-export-blog.el -l scripts/roam-export-blog-test.el -f ert-run-tests-batch-and-exit emacs --batch -Q -l org -l ox-md -l scripts/roam-export-blog.el -l scripts/roam-export-blog-test.el -f ert-run-tests-batch-and-exit
# Format code # Format code in both apps. Mutating convenience target: `check` (and so
# `verify`) never writes. If a gate fails on formatting, run this.
format: format:
@make -C app format @$(MAKE) -C app MISE_BIN=$(MISE_BIN) format
@$(MAKE) -C blogex MISE_BIN=$(MISE_BIN) format
# Serve the app # Serve the app
serve: serve:
+14 -4
View File
@@ -3,10 +3,12 @@
MISE_BIN ?= mise MISE_BIN ?= mise
MISE_EXEC = $(MISE_BIN) exec -- MISE_EXEC = $(MISE_BIN) exec --
.PHONY: check precommit deps assets compile test test.coverage coverage crap format credo verify .PHONY: check precommit deps assets compile test test.coverage coverage crap format format.check credo verify
# Run all static analysis checks (no database required) # Run all static analysis checks (no database required). `format.check` only
check: credo format # reports: a gate that rewrites the files it judges can never fail. Fix
# formatting with `make format`.
check: credo format.check
# Precommit target for CI/pre-commit hooks # Precommit target for CI/pre-commit hooks
precommit: check compile precommit: check compile
@@ -62,10 +64,18 @@ crap:
@test -f cover/default.coverdata || { echo "crap: no exported coverage - run 'make test.coverage' first" >&2; exit 1; } @test -f cover/default.coverdata || { echo "crap: no exported coverage - run 'make test.coverage' first" >&2; exit 1; }
MIX_ENV=test $(MISE_EXEC) mix crap MIX_ENV=test $(MISE_EXEC) mix crap
# Format code # Format code. MUTATES the tree; deliberately not part of `check` (nor of the
# Lens pass), which must never write: a gate that fixes what it judges can never
# fail, and would dirty the tree a push is about to send. `make check` uses
# `format.check` below instead.
format: format:
$(MISE_EXEC) mix format $(MISE_EXEC) mix format
# Verify formatting without writing. Fails with the offending files, so the fix
# is explicit: run `make format` (or `make -C app format`).
format.check:
$(MISE_EXEC) mix format --check-formatted
# ============================================================================= # =============================================================================
# Playwright e2e browser tests # Playwright e2e browser tests
# ============================================================================= # =============================================================================
+14 -4
View File
@@ -3,15 +3,17 @@
MISE_BIN ?= mise MISE_BIN ?= mise
MISE_EXEC = $(MISE_BIN) exec -- MISE_EXEC = $(MISE_BIN) exec --
.PHONY: check precommit deps compile test test.coverage coverage crap format verify .PHONY: check precommit deps compile test test.coverage coverage crap format format.check verify
# Cheap static gate for this library (no database, no coverage). Runs from the # Cheap static gate for this library (no database, no coverage). Runs from the
# root `make check`, which loops app then blogex. # root `make check`, which loops app then blogex. `format.check` only reports:
# a gate that rewrites the files it judges can never fail. Fix formatting with
# `make format`.
# #
# Sensor slot: add `credo` once the "credo strict, tuned config (both apps)" # Sensor slot: add `credo` once the "credo strict, tuned config (both apps)"
# yak lands blogex's credo dep + .credo.exs. Do not list it before then — a # yak lands blogex's credo dep + .credo.exs. Do not list it before then — a
# gate that claims a check it did not run is worse than no gate. # gate that claims a check it did not run is worse than no gate.
check: compile format check: compile format.check
# Per-app precommit loop: same target name and alias shape as app/, so both # Per-app precommit loop: same target name and alias shape as app/, so both
# apps share one habit (compile --warning-as-errors, format, test). # apps share one habit (compile --warning-as-errors, format, test).
@@ -58,10 +60,18 @@ crap:
@test -f cover/default.coverdata || { echo "crap: no exported coverage - run 'make test.coverage' first" >&2; exit 1; } @test -f cover/default.coverdata || { echo "crap: no exported coverage - run 'make test.coverage' first" >&2; exit 1; }
MIX_ENV=test $(MISE_EXEC) mix crap MIX_ENV=test $(MISE_EXEC) mix crap
# Format code # Format code. MUTATES the tree; deliberately not part of `check` (nor of the
# Lens pass), which must never write: a gate that fixes what it judges can never
# fail, and would dirty the tree a push is about to send. `make check` uses
# `format.check` below instead.
format: format:
$(MISE_EXEC) mix format $(MISE_EXEC) mix format
# Verify formatting without writing. Fails with the offending files, so the fix
# is explicit: run `make format` (or `make -C blogex format`).
format.check:
$(MISE_EXEC) mix format --check-formatted
# ============================================================================= # =============================================================================
# Lens pass (heavy checks; root `make verify` runs this before every push) # Lens pass (heavy checks; root `make verify` runs this before every push)
# ============================================================================= # =============================================================================