From cd665525795247215748067728f7be640fd5ce9d Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Thu, 25 Jun 2026 07:27:35 -0400 Subject: [PATCH 1/5] QA: run_qa v1.6 form + ExplicitImports Convert test/qa/qa.jl from the hand-rolled SafeTestsets + Aqua.test_all + JET.test_package layout to SciMLTesting 1.6's run_qa, and turn on the ExplicitImports checks (explicit_imports = true). - Aqua: piracies stays disabled and tracked via aqua_broken = (:piracies,) (was Aqua.test_all(...; piracies = false) + @test_broken false), issue #156. - JET: still runs (jet_kwargs = (; target_defined_modules = true)). - ExplicitImports (6 checks): - no_stale_explicit_imports: drop unused `coeff` from the Symbolics import. - all_qualified_accesses_via_owners / *_are_public / all_explicit_imports_are_public: ignore upstream non-public / re-exported names (Symbolics, SymbolicUtils, DataDrivenDiffEq, DataDrivenSparse) via per-check ei_kwargs ignore-lists. - no_implicit_imports: many heavy-`using` names across the Symbolics/DataDriven stacks; marked ei_broken = (:no_implicit_imports,) and tracked in issue #164 rather than a risky mass explicit-import refactor. qa env: add SciMLTesting (compat "1.6"), drop SafeTestsets (run_qa owns the testset); ExplicitImports comes in transitively via SciMLTesting; Aqua stays a direct dep (its ambiguities sub-check spawns a child process). Verified locally against released SciMLTesting 1.6.0 (Aqua 0.8.16, JET 0.9.18, ExplicitImports 1.15.0): Quality Assurance | 16 Pass, 2 Broken, 0 Fail/Error. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- src/SymbolicNumericIntegration.jl | 2 +- test/qa/Project.toml | 3 +- test/qa/qa.jl | 57 ++++++++++++++++++++++--------- 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/SymbolicNumericIntegration.jl b/src/SymbolicNumericIntegration.jl index 8795d82..1730e9f 100644 --- a/src/SymbolicNumericIntegration.jl +++ b/src/SymbolicNumericIntegration.jl @@ -5,7 +5,7 @@ using TermInterface: iscall using SymbolicUtils using SymbolicUtils: operation, arguments using Symbolics -using Symbolics: value, get_variables, expand_derivatives, coeff, Equation +using Symbolics: value, get_variables, expand_derivatives, Equation using SymbolicUtils.Rewriters using SymbolicUtils: issym, BasicSymbolic diff --git a/test/qa/Project.toml b/test/qa/Project.toml index de0ad49..41a0bfc 100644 --- a/test/qa/Project.toml +++ b/test/qa/Project.toml @@ -1,7 +1,7 @@ [deps] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" -SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" SymbolicNumericIntegration = "78aadeae-fbc0-11eb-17b6-c7ec0477ba9e" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -11,5 +11,6 @@ SymbolicNumericIntegration = {path = "../.."} [compat] Aqua = "0.8" JET = "0.9,0.10,0.11" +SciMLTesting = "1.6" Test = "1" julia = "1.10" diff --git a/test/qa/qa.jl b/test/qa/qa.jl index 9e2c6b3..f7e6b97 100644 --- a/test/qa/qa.jl +++ b/test/qa/qa.jl @@ -1,18 +1,41 @@ -using SafeTestsets +using SymbolicNumericIntegration, Test +using JET +using SciMLTesting -@safetestset "Aqua" begin - using SymbolicNumericIntegration - using Aqua - using Test - - Aqua.test_all(SymbolicNumericIntegration; piracies = false) - @test_broken false # Aqua piracy: Base.signbit(::Complex)/signbit(::SymbolicUtils.Sym) in src/integral.jl + DataDrivenSparse.active_set! in src/sparse.jl — see https://github.com/SciML/SymbolicNumericIntegration.jl/issues/156 -end - -@safetestset "JET" begin - using SymbolicNumericIntegration - using JET - using Test - - JET.test_package(SymbolicNumericIntegration; target_defined_modules = true) -end +run_qa( + SymbolicNumericIntegration; + explicit_imports = true, + jet_kwargs = (; target_defined_modules = true), + # Aqua piracy: Base.signbit(::Complex)/signbit(::SymbolicUtils.Sym) in + # src/integral.jl + DataDrivenSparse.active_set! in src/sparse.jl + # https://github.com/SciML/SymbolicNumericIntegration.jl/issues/156 + aqua_broken = (:piracies,), + ei_kwargs = (; + # Re-exports: accessed from the re-exporting module rather than the owner. + # coef -> StatsAPI (via DataDrivenSparse); scalarize/toexpr/unwrap -> + # SymbolicUtils[.Code] (via Symbolics). + all_qualified_accesses_via_owners = (; + ignore = (:coef, :scalarize, :toexpr, :unwrap), + ), + # Non-public names of upstream packages accessed via qualification. + # AbstractDataDrivenAlgorithm: DataDrivenDiffEq; active_set!, coef: + # DataDrivenSparse; Sym: SymbolicUtils; derivative, scalarize, toexpr, + # unwrap, value: Symbolics. + all_qualified_accesses_are_public = (; + ignore = ( + :AbstractDataDrivenAlgorithm, :Sym, :active_set!, :coef, + :derivative, :scalarize, :toexpr, :unwrap, :value, + ), + ), + # Non-public names explicitly imported from upstream packages. + # BasicSymbolic, issym: SymbolicUtils; get_variables, value: Symbolics. + all_explicit_imports_are_public = (; + ignore = (:BasicSymbolic, :issym, :get_variables, :value), + ), + ), + # Heavy `using` of the Symbolics/SymbolicUtils/DataDriven stacks (macros + + # module bindings used for qualified access) — tracked for a follow-up + # explicit-import pass rather than a risky mass refactor. + # https://github.com/SciML/SymbolicNumericIntegration.jl/issues/164 + ei_broken = (:no_implicit_imports,), +) From 2cded4597e6370b5381261c7e0b799051bb1c325 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Fri, 26 Jun 2026 17:13:30 -0400 Subject: [PATCH 2/5] QA: trim redundant public-API EI ignores after SciMLTesting 1.7 + base-lib make-public SciMLTesting 1.7 runs check_all_qualified_accesses_are_public and check_all_explicit_imports_are_public only on Julia >= 1.11. With the released Symbolics 7.29.0 / SymbolicUtils 4.36.0 now declaring several formerly-internal names public, the per-repo public-API ignore lists are largely redundant. Emptied both public-API ignore lists and re-verified on Julia 1.12 (>= 1.11, where the checks run) against the registered releases, then restored only the names still flagged as non-public: all_qualified_accesses_are_public: AbstractDataDrivenAlgorithm (DataDrivenDiffEq), Sym (SymbolicUtils), active_set!/coef (DataDrivenSparse), toexpr (Symbolics) all_explicit_imports_are_public: issym (SymbolicUtils) Removed (now public): derivative, scalarize, unwrap, value (all_qualified_accesses_are_public); BasicSymbolic, get_variables, value (all_explicit_imports_are_public). The all_qualified_accesses_via_owners ignore, aqua_broken, and ei_broken are left untouched. Verified: Julia 1.12 QA group green for both public checks; Julia 1.10 (lts) skips them per SciMLTesting 1.7. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- test/qa/qa.jl | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/qa/qa.jl b/test/qa/qa.jl index f7e6b97..b25438e 100644 --- a/test/qa/qa.jl +++ b/test/qa/qa.jl @@ -19,18 +19,16 @@ run_qa( ), # Non-public names of upstream packages accessed via qualification. # AbstractDataDrivenAlgorithm: DataDrivenDiffEq; active_set!, coef: - # DataDrivenSparse; Sym: SymbolicUtils; derivative, scalarize, toexpr, - # unwrap, value: Symbolics. + # DataDrivenSparse; Sym: SymbolicUtils; toexpr: Symbolics. all_qualified_accesses_are_public = (; ignore = ( - :AbstractDataDrivenAlgorithm, :Sym, :active_set!, :coef, - :derivative, :scalarize, :toexpr, :unwrap, :value, + :AbstractDataDrivenAlgorithm, :Sym, :active_set!, :coef, :toexpr, ), ), # Non-public names explicitly imported from upstream packages. - # BasicSymbolic, issym: SymbolicUtils; get_variables, value: Symbolics. + # issym: SymbolicUtils. all_explicit_imports_are_public = (; - ignore = (:BasicSymbolic, :issym, :get_variables, :value), + ignore = (:issym,), ), ), # Heavy `using` of the Symbolics/SymbolicUtils/DataDriven stacks (macros + From 882aed9f702267c42abfb82a722ae3f52aff2805 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sat, 27 Jun 2026 01:58:26 -0400 Subject: [PATCH 3/5] QA: require SciMLTesting >= 1.7 for gated public-API EI checks The public-API ExplicitImports checks (all_qualified_accesses_are_public / all_explicit_imports_are_public) are gated to Julia >= 1.11 starting in SciMLTesting 1.7. Bump the qa env compat floor so CI resolves the gating release rather than an older SciMLTesting that would skip those checks. Verified against the registered make-public releases (SciMLBase 3.27.0, SciMLTesting 1.7.0, Symbolics 7.29.0, SymbolicUtils 4.36.0): - Julia 1.12 (public-API checks run): 16 pass, 2 broken, 0 fail. The emptied public-API ignore lists flag exactly 6 survivors, all from packages outside the make-public scope and kept ALLOWED: AbstractDataDrivenAlgorithm (DataDrivenDiffEq); Sym, issym (SymbolicUtils); active_set!, coef (DataDrivenSparse); toexpr (Symbolics). - Julia 1.10 (public-API checks skipped via the 1.7 gate): 14 pass, 2 broken, 0 fail. This package has no SciMLBase/DiffEqBase dependency, so no caller migration applies; the restored ignore lists are unchanged from the prior commit. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- test/qa/Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/qa/Project.toml b/test/qa/Project.toml index 41a0bfc..4855676 100644 --- a/test/qa/Project.toml +++ b/test/qa/Project.toml @@ -11,6 +11,6 @@ SymbolicNumericIntegration = {path = "../.."} [compat] Aqua = "0.8" JET = "0.9,0.10,0.11" -SciMLTesting = "1.6" +SciMLTesting = "1.7" Test = "1" julia = "1.10" From b6fb9036c3304a3dbe269877c343364b9c89e002 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sun, 28 Jun 2026 06:25:55 -0400 Subject: [PATCH 4/5] QA: trim now-public ExplicitImports ignores Co-Authored-By: Chris Rackauckas --- test/qa/qa.jl | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/test/qa/qa.jl b/test/qa/qa.jl index b25438e..dec763a 100644 --- a/test/qa/qa.jl +++ b/test/qa/qa.jl @@ -19,17 +19,12 @@ run_qa( ), # Non-public names of upstream packages accessed via qualification. # AbstractDataDrivenAlgorithm: DataDrivenDiffEq; active_set!, coef: - # DataDrivenSparse; Sym: SymbolicUtils; toexpr: Symbolics. + # DataDrivenSparse; toexpr: Symbolics. all_qualified_accesses_are_public = (; ignore = ( - :AbstractDataDrivenAlgorithm, :Sym, :active_set!, :coef, :toexpr, + :AbstractDataDrivenAlgorithm, :active_set!, :coef, :toexpr, ), ), - # Non-public names explicitly imported from upstream packages. - # issym: SymbolicUtils. - all_explicit_imports_are_public = (; - ignore = (:issym,), - ), ), # Heavy `using` of the Symbolics/SymbolicUtils/DataDriven stacks (macros + # module bindings used for qualified access) — tracked for a follow-up From f7537ab348c3e2954b4678ce52e81d7414d5bedc Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sun, 28 Jun 2026 10:44:07 -0400 Subject: [PATCH 5/5] QA: thorough EI ignore re-clean (drop stale incl via_owners, migrate non-public re-exports) Co-Authored-By: Chris Rackauckas --- test/qa/qa.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/qa/qa.jl b/test/qa/qa.jl index dec763a..86b11b5 100644 --- a/test/qa/qa.jl +++ b/test/qa/qa.jl @@ -12,10 +12,10 @@ run_qa( aqua_broken = (:piracies,), ei_kwargs = (; # Re-exports: accessed from the re-exporting module rather than the owner. - # coef -> StatsAPI (via DataDrivenSparse); scalarize/toexpr/unwrap -> - # SymbolicUtils[.Code] (via Symbolics). + # coef -> StatsAPI (via DataDrivenSparse); toexpr -> SymbolicUtils.Code + # (via Symbolics). Neither owner is a SciML make-public target. all_qualified_accesses_via_owners = (; - ignore = (:coef, :scalarize, :toexpr, :unwrap), + ignore = (:coef, :toexpr), ), # Non-public names of upstream packages accessed via qualification. # AbstractDataDrivenAlgorithm: DataDrivenDiffEq; active_set!, coef: