From bd148c1aa2d4222ce3469bcf2b7a3e5048e4b275 Mon Sep 17 00:00:00 2001 From: JohnnyT Date: Wed, 23 Sep 2026 20:17:48 -0600 Subject: [PATCH] Turns on the Docs and Doc links gate stages mix quality becomes the pre-publish check for this package's docs, locally and in CI. ex_quality 0.15 ships the Doc links stage; the dev dependency requirement moves from ~> 0.14 to ~> 0.15 with its options unchanged, and mix.lock moves ex_quality alone (0.14.0 to 0.15.0, via mix deps.update ex_quality). .quality.exs enables both stages at enabled: :auto, with the reason at the setting: the Docs stage fails on any ExDoc warning, and the Doc links stage fails on the link rules ExDoc accepts silently. No threshold moves. The full gate is green with both stages run and passing. No package version change; no changelog fragment (changelog.d/README.md excludes quality gate changes). Refs: sui-pk0h --- .quality.exs | 20 ++++++++++++++++++-- mix.exs | 2 +- mix.lock | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.quality.exs b/.quality.exs index c1c03fd..0589e63 100644 --- a/.quality.exs +++ b/.quality.exs @@ -3,8 +3,9 @@ # Two ways to run: # # mix quality - full gate: format, compile, credo, dialyzer, -# deps audit, doc coverage, full test suite -# with coverage. Run before every commit. +# deps audit, doc coverage, docs build, doc +# links, full test suite with coverage. Run +# before every commit. # # mix quality --profile loop - inner loop while implementing: skips dialyzer # and coverage, runs only the tests covering @@ -54,6 +55,21 @@ strict: true ], + # The two docs stages are opt-in in ex_quality, and both are on here so + # that this gate is the pre-publish check for the package's docs, locally + # and in CI. The Docs stage fails on any ExDoc warning. The Doc links stage + # fails on the link rules ExDoc accepts silently: a README relative link to + # a file not in the package files, a published relative link to a file that + # is not an extra, two extras sharing a basename, and a silent rewrite to a + # different extra. Each of those builds cleanly and breaks on HexDocs or + # hex.pm, so only a gate stage catches them before a publish. + docs: [ + enabled: :auto + ], + doc_links: [ + enabled: :auto + ], + profiles: [ loop: [ stages: [:format, :compile, :credo, :test], diff --git a/mix.exs b/mix.exs index baf4ff5..88f1692 100644 --- a/mix.exs +++ b/mix.exs @@ -126,7 +126,7 @@ defmodule StatifierUI.MixProject do {:phoenix_live_view, "~> 1.0", optional: true}, # Dev / test - {:ex_quality, "~> 0.14", only: :dev, runtime: false}, + {:ex_quality, "~> 0.15", only: :dev, runtime: false}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, {:excoveralls, "~> 0.18", only: :test}, diff --git a/mix.lock b/mix.lock index 948ceac..674e2cb 100644 --- a/mix.lock +++ b/mix.lock @@ -7,7 +7,7 @@ "earmark_parser": {:hex, :earmark_parser, "1.4.46", "67607a0532e810c6f630a515c548d0b24949643f168cc556303bee4cf96105c7", [:mix], [], "hexpm", "9c44636e8a1c68c62f526b2dcd85d941dbbcee7ab82cf64ba06ce28bef8e89f5"}, "erlex": {:hex, :erlex, "0.2.9", "7debbbaa9f4f368b8cd648983e0f1d7963028508e9c59e9d4ed504e94ef52a55", [:mix], [], "hexpm", "8cfffc0ec7159e6d73de2ab28a588064de80f88b2798d5cbe4482cbbc200178b"}, "ex_doc": {:hex, :ex_doc, "0.40.3", "4a972ffe64bc07dc605af487e98fc19b72a4185f55ca031b94c0552d6071c1d9", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "2756e357742fecd9749b489b85d67c9ce99c465f2e75728d9e6dc8d704b973de"}, - "ex_quality": {:hex, :ex_quality, "0.14.0", "702ed122c85c1d1f1dca2efab60871884e9ba6aefc492f334da51a8175543cc6", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ac8553e6b7a6a35ada03ef748530db2c5871d69427d74a634fd37afdeabf7e24"}, + "ex_quality": {:hex, :ex_quality, "0.15.0", "e5af847cd6f78c8bde25f8cf8e96c8e3e92ed768affe3711dca05065887771b6", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b1d8943973be502fd5c5210f5f96e88b1262ce813b6d50092315a613573deb08"}, "excoveralls": {:hex, :excoveralls, "0.18.5", "e229d0a65982613332ec30f07940038fe451a2e5b29bce2a5022165f0c9b157e", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "523fe8a15603f86d64852aab2abe8ddbd78e68579c8525ae765facc5eae01562"}, "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"},