blogex: CRAP scores as a Lens sensor (ex_crap)

Same wiring as app: `crap` reads the export from `test.coverage`, runs in
MIX_ENV=test, and refuses to score when the export is absent.

Baseline at the default threshold (30): 12 files, 59 functions, worst score
6.00. Nothing to fix; blogex's CRAP ceiling is its coverage ceiling, which the
behavior-test yaks already own.
This commit is contained in:
Willem van den Ende
2026-10-26 21:32:39 +00:00
parent 2ba0b7bc48
commit 2ccbe28774
3 changed files with 21 additions and 3 deletions
+17 -2
View File
@@ -3,7 +3,7 @@
MISE_BIN ?= mise
MISE_EXEC = $(MISE_BIN) exec --
.PHONY: check precommit deps compile test test.coverage coverage format verify
.PHONY: check precommit deps compile test test.coverage coverage crap format verify
# Cheap static gate for this library (no database, no coverage). Runs from the
# root `make check`, which loops app then blogex.
@@ -44,6 +44,20 @@ coverage:
@test -f cover/default.coverdata || { echo "coverage: no exported coverage - run 'make test.coverage' first" >&2; exit 1; }
$(MISE_EXEC) mix test.coverage
# Enforce CRAP scores (complexity x coverage) from the same export. No test run.
# Runs in MIX_ENV=test because that is the environment the export came from:
# running in dev would compile a second build and score against a different set
# of modules. The guard is load-bearing for the same reason as `coverage`:
# ex_crap falls back to 0% coverage when the export is missing, which would
# report scores that are pessimistic instead of absent - a false failure is
# less bad than a false pass, but neither is acceptable in the Lens pass.
#
# Threshold is ex_crap's default (30); whether to ratchet it down is an open
# decision tracked in the "ratchets, deferred decisions, handoff practice" yak.
crap:
@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
# Format code
format:
$(MISE_EXEC) mix format
@@ -58,6 +72,7 @@ format:
# - coverage (yak: coverage floors + framework-glue exclusions policy)
# WIRED below (test.coverage + coverage).
# - crap (yak: CRAP scores with ex_crap (both apps))
# WIRED below (crap); reuses the coverage export.
# - mutation (yak: mutation testing with muex — a sensor, not a gate)
#
# The suite runs FIRST: it is what produces the coverage export that the
@@ -65,7 +80,7 @@ format:
# `mix test --cover --export-coverage` exports instead of printing a summary,
# and reporting through `mix test.coverage` keeps it to one suite run.) Sensors
# still run cheapest-first among themselves.
VERIFY_SENSORS := coverage
VERIFY_SENSORS := coverage crap
verify:
@echo "==> verify(blogex): suite (coverage exported), then sensors [$(VERIFY_SENSORS)]"