From 768f45f0262e07f81f570d1494c101592cd4f5a3 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 25 Jun 2026 07:23:27 -0400 Subject: [PATCH 1/3] QA: run_qa v1.6 form + ExplicitImports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consolidate the scattered hand-rolled QA into a single SciMLTesting `run_qa` v1.6 QA group, wired via the run_tests folder model. - Add test/qa/qa.jl: `run_qa(CurveFit; explicit_imports = true, ...)` runs Aqua (test_all, all sub-checks pass) and the six ExplicitImports checks. The two public-API checks ignore upstream non-public names (SciMLBase, NonlinearSolveBase[.Utils], SciMLBase.ReturnCode, StatsAPI, CommonSolve, Base), documented inline by source package. No JET (matches the prior QA, which ran Aqua + EI only). No aqua_broken/jet_broken/ei_broken: every check is a real PASS. - Add test/qa/Project.toml: Aqua + SafeTestsets + SciMLTesting + Test + CurveFit (path source). ExplicitImports is transitive via SciMLTesting. SciMLTesting compat "1.6". - Remove test/nopre/ (the hand-rolled Aqua.test_all group) and test/explicit_imports.jl (raw EI checks in Core) — both subsumed by run_qa. - test_groups.toml: replace the `nopre` group with `QA` (in_all = false, versions 1/lts), matching the QA folder. - Root Project.toml: drop ExplicitImports from [extras]/[targets].test (only the removed Core file used it; QA gets it via SciMLTesting), bump SciMLTesting compat to "1.6", and raise the PrecompileTools floor "1" -> "1.1": CurveFit explicit-imports only the PrecompileTools macros (@compile_workload/ @setup_workload), and on 1.0.0 their expansion references the bare `PrecompileTools` module name -> UndefVarError on the Downgrade(lts) lane (verified locally; fixed at 1.1.0). Verified locally on Julia 1.10 vs released SciMLTesting 1.6.0: - QA via run_tests folder model (GROUP=QA): 17/17 pass (Aqua 11, EI 6), 0 fail/ error/broken. - Core via Pkg.test (GROUP=Core): all pass, exit 0 (root env resolves without ExplicitImports). Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- Project.toml | 8 +++----- test/explicit_imports.jl | 11 ----------- test/nopre/aqua.jl | 7 ------- test/{nopre => qa}/Project.toml | 2 +- test/qa/qa.jl | 29 +++++++++++++++++++++++++++++ test/test_groups.toml | 16 ++++++---------- 6 files changed, 39 insertions(+), 34 deletions(-) delete mode 100644 test/explicit_imports.jl delete mode 100644 test/nopre/aqua.jl rename test/{nopre => qa}/Project.toml (94%) create mode 100644 test/qa/qa.jl diff --git a/Project.toml b/Project.toml index 87e28cb..a2eb40b 100644 --- a/Project.toml +++ b/Project.toml @@ -29,7 +29,6 @@ CommonSolve = "0.2.6" ConcreteStructs = "0.2.3" DifferentiationInterface = "0.7.13" Distributions = "0.25.122" -ExplicitImports = "1.11.2" FastRationals = "0.3.0" ForwardDiff = "1.3.0" InverseFunctions = "0.1" @@ -38,21 +37,20 @@ LinearSolve = "3.15.0" Markdown = "1.10.0" NonlinearSolveBase = "2.25" NonlinearSolveFirstOrder = "2" -PrecompileTools = "1" +PrecompileTools = "1.1" RecursiveArrayTools = "3.33.0, 4.0" SafeTestsets = "0.1" SciMLBase = "2.90, 3.1" -SciMLTesting = "1" +SciMLTesting = "1.6" Setfield = "1.1.2" StatsAPI = "1.8.0" Test = "1.10" julia = "1.10" [extras] -ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "SafeTestsets", "SciMLTesting", "ExplicitImports"] +test = ["Test", "SafeTestsets", "SciMLTesting"] diff --git a/test/explicit_imports.jl b/test/explicit_imports.jl deleted file mode 100644 index ff17a15..0000000 --- a/test/explicit_imports.jl +++ /dev/null @@ -1,11 +0,0 @@ -using CurveFit -using Test -using ExplicitImports -using StatsAPI - -@testset "Explicit Imports" begin - @test check_no_implicit_imports(CurveFit) === nothing - @test check_no_stale_explicit_imports(CurveFit) === nothing - @test check_no_self_qualified_accesses(CurveFit) === nothing - @test check_all_qualified_accesses_via_owners(CurveFit) === nothing -end diff --git a/test/nopre/aqua.jl b/test/nopre/aqua.jl deleted file mode 100644 index 4f309bf..0000000 --- a/test/nopre/aqua.jl +++ /dev/null @@ -1,7 +0,0 @@ -using CurveFit -using Test -using Aqua - -@testset "Aqua tests" begin - Aqua.test_all(CurveFit) -end diff --git a/test/nopre/Project.toml b/test/qa/Project.toml similarity index 94% rename from test/nopre/Project.toml rename to test/qa/Project.toml index a6376b5..67bd801 100644 --- a/test/nopre/Project.toml +++ b/test/qa/Project.toml @@ -11,6 +11,6 @@ CurveFit = {path = "../.."} [compat] Aqua = "0.8.12" SafeTestsets = "0.1" -SciMLTesting = "1" +SciMLTesting = "1.6" Test = "1.10" julia = "1.10" diff --git a/test/qa/qa.jl b/test/qa/qa.jl new file mode 100644 index 0000000..5cac3b1 --- /dev/null +++ b/test/qa/qa.jl @@ -0,0 +1,29 @@ +using SciMLTesting, CurveFit, Test + +run_qa( + CurveFit; + explicit_imports = true, + ei_kwargs = (; + # Non-public names of upstream packages that CurveFit qualifies; ignored here + # and expected to become public as those base libraries declare their APIs. + all_explicit_imports_are_public = (; + ignore = ( + :AbstractLinearAlgorithm, :AbstractNonlinearAlgorithm, # SciMLBase + :init, :solve, :solve!, # CommonSolve + :coef, :confint, :dof, :dof_residual, :fitted, :nobs, # StatsAPI + :predict, :residuals, :rss, :stderror, :vcov, # StatsAPI + ), + ), + all_qualified_accesses_are_public = (; + ignore = ( + :AutoSpecializeCallable, :NonlinearSolvePolyAlgorithmCache, # NonlinearSolveBase + :Utils, :get_fu, :clean_sprint_struct, # NonlinearSolveBase(.Utils) + :Success, :T, :successful_retcode, # SciMLBase(.ReturnCode) + :init, :solve!, # CommonSolve + :coef, :confint, :dof, :dof_residual, :fitted, :nobs, # StatsAPI + :predict, :residuals, :rss, :stderror, :vcov, # StatsAPI + :rtoldefault, # Base + ), + ), + ), +) diff --git a/test/test_groups.toml b/test/test_groups.toml index a3ce918..7e41a25 100644 --- a/test/test_groups.toml +++ b/test/test_groups.toml @@ -3,21 +3,17 @@ # --root-matrix, and by SciMLTesting's run_tests() folder-discovery mode in # runtests.jl. Each table key is a GROUP value passed to runtests.jl. # -# "Core" -> the top-level test/*.jl files (the functional fits plus the -# ExplicitImports check). Runs on 1/lts/pre. -# "nopre" -> the test/nopre/ folder (Aqua), which is brittle on prereleases, -# so it runs only on 1/lts. `in_all = false` keeps it out of a -# local GROUP=All aggregate run. -# -# This replaces the former TestItemRunner tag split (GROUP=All ran every -# @testitem except :nopre; GROUP=nopre ran only the :nopre-tagged Aqua item): -# the same tests run under the same two (group x version) CI cells. +# "Core" -> the top-level test/*.jl files (the functional fits). Runs on +# 1/lts/pre. +# "QA" -> the test/qa/ folder (SciMLTesting run_qa: Aqua + ExplicitImports), +# which is brittle on prereleases, so it runs only on 1/lts. +# QA is always excluded from a local GROUP=All aggregate run. [Core] versions = ["1", "lts", "pre"] os = ["ubuntu-latest", "macOS-latest", "windows-latest"] -[nopre] +[QA] in_all = false versions = ["1", "lts"] os = ["ubuntu-latest", "macOS-latest", "windows-latest"] From 916dc0776a68c9c43eda4279473cc565a5cabcaf Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Fri, 26 Jun 2026 15:13:03 -0400 Subject: [PATCH 2/3] QA: drop now-public EI ignores (SciMLTesting 1.7 + base-lib make-public) SciMLTesting 1.7.0 runs the two public-API ExplicitImports checks (all_qualified_accesses_are_public, all_explicit_imports_are_public) only on Julia >= 1.11 and skips them on the LTS, and SciMLBase 3.24.0 / CommonSolve 0.2.9 / StatsAPI now declare the names CurveFit accessed as public. Empty both public-API ignore-lists and restore only the names still genuinely non-public against the registered releases, verified by running the QA group on Julia 1.12 (17/17 pass) and 1.10 (15/15 pass, public checks skipped): all_explicit_imports_are_public: AbstractLinearAlgorithm, AbstractNonlinearAlgorithm (SciMLBase) all_qualified_accesses_are_public: AutoSpecializeCallable, NonlinearSolvePolyAlgorithmCache, Utils, get_fu, clean_sprint_struct (NonlinearSolveBase[.Utils]); rtoldefault (Base) Dropped (now public): CommonSolve init/solve/solve!, SciMLBase.ReturnCode Success/T/successful_retcode, the StatsAPI coef..vcov block. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- test/qa/qa.jl | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/test/qa/qa.jl b/test/qa/qa.jl index 5cac3b1..7239fe4 100644 --- a/test/qa/qa.jl +++ b/test/qa/qa.jl @@ -4,25 +4,16 @@ run_qa( CurveFit; explicit_imports = true, ei_kwargs = (; - # Non-public names of upstream packages that CurveFit qualifies; ignored here - # and expected to become public as those base libraries declare their APIs. all_explicit_imports_are_public = (; ignore = ( :AbstractLinearAlgorithm, :AbstractNonlinearAlgorithm, # SciMLBase - :init, :solve, :solve!, # CommonSolve - :coef, :confint, :dof, :dof_residual, :fitted, :nobs, # StatsAPI - :predict, :residuals, :rss, :stderror, :vcov, # StatsAPI ), ), all_qualified_accesses_are_public = (; ignore = ( :AutoSpecializeCallable, :NonlinearSolvePolyAlgorithmCache, # NonlinearSolveBase :Utils, :get_fu, :clean_sprint_struct, # NonlinearSolveBase(.Utils) - :Success, :T, :successful_retcode, # SciMLBase(.ReturnCode) - :init, :solve!, # CommonSolve - :coef, :confint, :dof, :dof_residual, :fitted, :nobs, # StatsAPI - :predict, :residuals, :rss, :stderror, :vcov, # StatsAPI - :rtoldefault, # Base + :rtoldefault, # Base ), ), ), From 4f7b8ba04f7676fa1e7dee4c09b5f670fe54b75f Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Fri, 26 Jun 2026 23:45:38 -0400 Subject: [PATCH 3/3] QA: drop SciMLBase abstract-algorithm EI ignores (make-public 3.27.0) SciMLBase 3.27.0 declares the abstract algorithm types `@public` (AbstractNonlinearAlgorithm, AbstractLinearAlgorithm, ...), so CurveFit's two explicit imports of those names are now public. Empty the all_explicit_imports_are_public ignore-list entirely (it held only those two SciMLBase names) and raise the compat floors that pin the make-public releases: - SciMLBase 3.x floor 3.1 -> 3.27 (the version that declares the abstract algorithm types public; v2 branch 2.90 kept for un-migrated users) - SciMLTesting 1.6 -> 1.7 (root + test/qa), the release that gates the two public-API ExplicitImports checks to Julia >= 1.11 CurveFit's source imports the abstract algorithm types directly from SciMLBase already, so there is no DiffEqBase.X -> SciMLBase.X caller migration to do here. all_qualified_accesses_are_public retains only genuinely-still-non-public upstream names that the source qualifies: - NonlinearSolveBase: AutoSpecializeCallable, NonlinearSolvePolyAlgorithmCache, get_fu, and Utils(.clean_sprint_struct) (none @public/exported in 2.31.2) - Base.rtoldefault Verified against the registered releases (SciMLBase 3.27.0, SciMLTesting 1.7.0, NonlinearSolveBase 2.31.2, ExplicitImports 1.15.0, CommonSolve 0.2.9): - Julia 1.12 (public-API checks RUN): QA group 17/17 pass, 0 fail - Julia 1.10 (public-API checks skipped by SciMLTesting 1.7): 15/15 pass Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- Project.toml | 4 ++-- test/qa/Project.toml | 2 +- test/qa/qa.jl | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Project.toml b/Project.toml index a2eb40b..1f0ec84 100644 --- a/Project.toml +++ b/Project.toml @@ -40,8 +40,8 @@ NonlinearSolveFirstOrder = "2" PrecompileTools = "1.1" RecursiveArrayTools = "3.33.0, 4.0" SafeTestsets = "0.1" -SciMLBase = "2.90, 3.1" -SciMLTesting = "1.6" +SciMLBase = "2.90, 3.27" +SciMLTesting = "1.7" Setfield = "1.1.2" StatsAPI = "1.8.0" Test = "1.10" diff --git a/test/qa/Project.toml b/test/qa/Project.toml index 67bd801..8fcc767 100644 --- a/test/qa/Project.toml +++ b/test/qa/Project.toml @@ -11,6 +11,6 @@ CurveFit = {path = "../.."} [compat] Aqua = "0.8.12" SafeTestsets = "0.1" -SciMLTesting = "1.6" +SciMLTesting = "1.7" Test = "1.10" julia = "1.10" diff --git a/test/qa/qa.jl b/test/qa/qa.jl index 7239fe4..fe3b706 100644 --- a/test/qa/qa.jl +++ b/test/qa/qa.jl @@ -5,9 +5,7 @@ run_qa( explicit_imports = true, ei_kwargs = (; all_explicit_imports_are_public = (; - ignore = ( - :AbstractLinearAlgorithm, :AbstractNonlinearAlgorithm, # SciMLBase - ), + ignore = (), ), all_qualified_accesses_are_public = (; ignore = (