From a49252aaa063e172309d73a9fc72b835e42f5cb1 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sat, 1 Aug 2026 04:40:43 -0400 Subject: [PATCH] Put the package extensions under QA `run_qa` -> ExplicitImports skips any extension whose module does not exist, and an extension module only exists once its trigger weakdep is loaded. The QA environment loaded none of them, so all five extensions were unscanned. Add the weakdeps to `test/qa/Project.toml` (with compat mirroring the root Project.toml) and `using` them in `test/qa/qa.jl`. The newly-scanned extensions produced two real findings: * `no_implicit_imports` -- every extension did `using SomePackage` and then used names from it implicitly. Fixed at the source with explicit imports. * `all_qualified_accesses_are_public` -- 18 accesses, all of them an extension reaching into its own parent package (the `try_*` stubs it adds methods to, the `_*_loaded` flags its `__init__` sets, and the `is_*`/`detect_*` predicates it dispatches on). None have a public spelling, so they are ignored as one commented group. `SemiseparableMatrices` is a weakdep with no `[extensions]` entry, so it has no extension module to scan and is not added to the QA environment. Co-Authored-By: Chris Rackauckas --- ext/BandedMatricesExt.jl | 4 ++-- ext/BlockBandedMatricesExt.jl | 5 ++--- ext/FastAlmostBandedMatricesExt.jl | 6 +++--- ext/SpecialMatricesExt.jl | 4 ++-- ext/ToeplitzMatricesExt.jl | 4 ++-- test/qa/Project.toml | 10 ++++++++++ test/qa/qa.jl | 31 +++++++++++++++++++++++++++++- 7 files changed, 51 insertions(+), 13 deletions(-) diff --git a/ext/BandedMatricesExt.jl b/ext/BandedMatricesExt.jl index 1ff6a12..eb9f51b 100644 --- a/ext/BandedMatricesExt.jl +++ b/ext/BandedMatricesExt.jl @@ -1,7 +1,7 @@ module BandedMatricesExt -using SparseMatrixIdentification -using BandedMatrices +using SparseMatrixIdentification: SparseMatrixIdentification +using BandedMatrices: BandedMatrix function __init__() return SparseMatrixIdentification._bandedmatrices_loaded[] = true diff --git a/ext/BlockBandedMatricesExt.jl b/ext/BlockBandedMatricesExt.jl index ba04884..c6fb2a5 100644 --- a/ext/BlockBandedMatricesExt.jl +++ b/ext/BlockBandedMatricesExt.jl @@ -1,8 +1,7 @@ module BlockBandedMatricesExt -using SparseMatrixIdentification -using BlockBandedMatrices -using BandedMatrices +using SparseMatrixIdentification: SparseMatrixIdentification +using BlockBandedMatrices: BlockBandedMatrix function __init__() return SparseMatrixIdentification._blockbandedmatrices_loaded[] = true diff --git a/ext/FastAlmostBandedMatricesExt.jl b/ext/FastAlmostBandedMatricesExt.jl index 9e4377a..7aa19d5 100644 --- a/ext/FastAlmostBandedMatricesExt.jl +++ b/ext/FastAlmostBandedMatricesExt.jl @@ -1,8 +1,8 @@ module FastAlmostBandedMatricesExt -using SparseMatrixIdentification -using FastAlmostBandedMatrices -using BandedMatrices +using SparseMatrixIdentification: SparseMatrixIdentification +using FastAlmostBandedMatrices: AlmostBandedMatrix +using BandedMatrices: BandedMatrix function __init__() return SparseMatrixIdentification._fastalmostbandedmatrices_loaded[] = true diff --git a/ext/SpecialMatricesExt.jl b/ext/SpecialMatricesExt.jl index 6a9bf91..ef9d971 100644 --- a/ext/SpecialMatricesExt.jl +++ b/ext/SpecialMatricesExt.jl @@ -1,7 +1,7 @@ module SpecialMatricesExt -using SparseMatrixIdentification -using SpecialMatrices +using SparseMatrixIdentification: SparseMatrixIdentification +using SpecialMatrices: Cauchy, Hilbert, Strang, Vandermonde function __init__() return SparseMatrixIdentification._specialmatrices_loaded[] = true diff --git a/ext/ToeplitzMatricesExt.jl b/ext/ToeplitzMatricesExt.jl index f9fcc01..9ba2bae 100644 --- a/ext/ToeplitzMatricesExt.jl +++ b/ext/ToeplitzMatricesExt.jl @@ -1,7 +1,7 @@ module ToeplitzMatricesExt -using SparseMatrixIdentification -using ToeplitzMatrices +using SparseMatrixIdentification: SparseMatrixIdentification +using ToeplitzMatrices: Toeplitz function __init__() return SparseMatrixIdentification._toeplitzmatrices_loaded[] = true diff --git a/test/qa/Project.toml b/test/qa/Project.toml index b31d0b9..6a277b3 100644 --- a/test/qa/Project.toml +++ b/test/qa/Project.toml @@ -1,13 +1,23 @@ [deps] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +BandedMatrices = "aae01518-5342-5314-be14-df237901396f" +BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" +FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" SparseMatrixIdentification = "2607229e-3272-44a7-bc4a-cd97a328dfbf" +SpecialMatrices = "928aab9d-ef52-54ac-8ca1-acd7ca42c160" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +ToeplitzMatrices = "c751599d-da0a-543b-9d20-d0a503d91d24" [compat] Aqua = "0.8" +BandedMatrices = "1.10.2" +BlockBandedMatrices = "0.13.4" +FastAlmostBandedMatrices = "0.1.5" JET = "0.9,0.10,0.11" SciMLTesting = "2.4" +SpecialMatrices = "3.1.0" Test = "1" +ToeplitzMatrices = "0.8.5" julia = "1.10" diff --git a/test/qa/qa.jl b/test/qa/qa.jl index ae7bd58..7e74b85 100644 --- a/test/qa/qa.jl +++ b/test/qa/qa.jl @@ -1,4 +1,33 @@ using SciMLTesting, SparseMatrixIdentification using JET -run_qa(SparseMatrixIdentification) +# ExplicitImports only sees an extension module once its trigger packages are loaded +# (`Base.get_extension` returns `nothing` otherwise), so load every weakdep here to put +# the extensions under QA. The `SemiseparableMatrices` weakdep has no `[extensions]` +# entry, so there is no extension module for it to scan. +using BandedMatrices, BlockBandedMatrices, FastAlmostBandedMatrices +using SpecialMatrices, ToeplitzMatrices + +run_qa( + SparseMatrixIdentification; + ei_kwargs = (; + all_qualified_accesses_are_public = (; + # Owner: SparseMatrixIdentification itself. Every one of these is the + # package's own internals reached from its own extension modules, which is + # the only way an extension can hook into its parent: the `try_*` stubs are + # the methods each extension adds, the `_*_loaded` `Ref`s are the flags the + # extension's `__init__` flips, and the `is_*`/`detect_*` predicates are the + # structure detectors the extension dispatches on. None of them are declared + # `public`, and there is no public spelling to use instead. + ignore = ( + :_bandedmatrices_loaded, :_blockbandedmatrices_loaded, + :_fastalmostbandedmatrices_loaded, :_specialmatrices_loaded, + :_toeplitzmatrices_loaded, + :try_almostbanded, :try_banded, :try_blockbanded, + :try_special_matrices, :try_toeplitz, + :detect_block_size, :is_almost_banded, :is_banded, :is_cauchy, + :is_hilbert, :is_strang, :is_toeplitz, :is_vandermonde, + ), + ), + ), +)