From 4ab7724af24ff056f780b9a1f7f7dba629d7e5e1 Mon Sep 17 00:00:00 2001 From: JohnnyT Date: Wed, 23 Sep 2026 20:08:14 -0600 Subject: [PATCH] Enables the Docs and doc links gate stages mix quality now checks the package's docs before a publish would. The Docs stage runs mix docs and 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, a silent rewrite to a different extra. Both are opt-in in ex_quality and are set to enabled: :auto in .quality.exs, with that reason beside them. The doc links stage ships in ex_quality 0.15.0, so the dev dependency requirement moves from ~> 0.14 to ~> 0.15 with its other options unchanged, and mix deps.update ex_quality moves only ex_quality in mix.lock (0.14.0 to 0.15.0). This is a dependency requirement change; the package's own version does not move. Both stages run and pass on main's docs, so the gate starts green. The loop profile's stage list is unchanged and does not run them. No changelog fragment: changelog.d/README.md excludes quality gate changes. Refs: px-9ejw --- .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 c8a2fa3..f8a4599 100644 --- a/.quality.exs +++ b/.quality.exs @@ -3,8 +3,9 @@ # Two ways to run: # # mix quality - full gate: format, compile, credo --strict, -# dialyzer, dependency audit, full suite with -# coverage. Required green before every commit. +# dialyzer, dependency audit, docs, doc links, +# full suite with coverage. Required green +# before every commit. # # mix quality --profile loop - inner loop while implementing: skips dialyzer # and coverage, runs only the tests covering @@ -29,6 +30,21 @@ strict: true ], + # The two docs stages make this gate the pre-publish check for the package's + # docs. Docs runs `mix docs` and fails on any ExDoc warning. Doc links 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, a silent rewrite to a different + # extra. Both are opt-in in ex_quality; `:auto` runs them when :ex_doc is + # installed. + docs: [ + enabled: :auto + ], + + doc_links: [ + enabled: :auto + ], + profiles: [ loop: [ stages: [:format, :compile, :credo, :test], diff --git a/mix.exs b/mix.exs index 34c5c51..80207ea 100644 --- a/mix.exs +++ b/mix.exs @@ -12,7 +12,7 @@ defmodule Predicator.MixProject do {:ex_doc, "~> 0.40", only: :dev, runtime: false}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, {:excoveralls, "~> 0.18", only: :test}, - {:ex_quality, "~> 0.14", only: :dev, runtime: false}, + {:ex_quality, "~> 0.15", only: :dev, runtime: false}, {:benchee, "~> 1.3", only: :dev, runtime: false} ] diff --git a/mix.lock b/mix.lock index 5f2ba13..dc5e171 100644 --- a/mix.lock +++ b/mix.lock @@ -8,7 +8,7 @@ "earmark_parser": {:hex, :earmark_parser, "1.4.46", "67607a0532e810c6f630a515c548d0b24949643f168cc556303bee4cf96105c7", [:mix], [], "hexpm", "9c44636e8a1c68c62f526b2dcd85d941dbbcee7ab82cf64ba06ce28bef8e89f5"}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, "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.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, "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"},