Skip to content

Commit af02d98

Browse files
ChrisRackauckas-ClaudeChrisRackauckasclaude
authored
QA: run_qa v1.6 form + ExplicitImports (#147)
* QA: run_qa v1.6 form + ExplicitImports Convert the hand-rolled test/qa/qa.jl (Aqua.test_all + a JET report-count check) to the SciMLTesting 1.6 run_qa form with ExplicitImports enabled. - qa.jl: single run_qa(MultiScaleArrays; explicit_imports = true, ...) call. Aqua + ExplicitImports come from SciMLTesting's own deps; JET is opted in via `using JET`. The two tracked-broken Aqua sub-checks (ambiguities, deps_compat; #142) are preserved via aqua_broken, which disables them in Aqua.test_all and emits @test_broken placeholders. JET stays a hard check (the prior alg_needs_extra_process finding no longer fires). - ExplicitImports findings resolved (preference FIX > IGNORE > BROKEN, 0 hard FAILs): * no_stale_explicit_imports: FIXED — dropped unused Base imports `/`, print_matrix, vec from src/MultiScaleArrays.jl. * no_implicit_imports: FIXED — made the 7 implicit imports explicit (using DiffEqBase: DiffEqBase; using LinearAlgebra: LinearAlgebra, ldiv!; using FiniteDiff: FiniteDiff; using Statistics: Statistics; using SciMLBase: full_cache, rand_cache). * all_explicit_imports_via_owners: passes. * all_qualified_accesses_via_owners / all_qualified_accesses_are_public / all_explicit_imports_are_public: IGNORED other packages' non-owner / non-public names via ei_kwargs (Base.Broadcast, DiffEqBase re-exports of SciMLBase, ForwardDiff, FiniteDiff, OrdinaryDiffEq* caches, RAT.chain), each grouped by source package. - test/qa/Project.toml: SciMLTesting compat -> "1.6"; dropped ExplicitImports (transitive), Aqua (ambiguities is disabled so the child-proc isn't needed; Aqua still loads transitively via SciMLTesting), SafeTestsets and Test (transitive / stdlib). Keep JET (opted in). - Project.toml: SciMLTesting compat -> "1.6". Verified locally against released SciMLTesting 1.6.0 (Pkg resolves it; no dev-from-branch). QA group: 13 Pass, 2 Broken, 0 Fail/Error on both Julia 1.10 (lts) and 1.11 (the "1" lane). Core group passes on 1.10 (import changes are behavior-preserving). Ignore until reviewed by @ChrisRackauckas. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * QA: trim now-public ExplicitImports ignores Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> * QA: migrate re-export-gap accesses to public owners + drop now-public ignores Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> * QA: thorough EI ignore re-clean (drop stale incl via_owners, migrate non-public re-exports) Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> --------- Co-authored-by: Chris Rackauckas <accounts@chrisrackauckas.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 65111dc commit af02d98

5 files changed

Lines changed: 79 additions & 56 deletions

File tree

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ OrdinaryDiffEqDifferentiation = "3"
3737
OrdinaryDiffEqRosenbrock = "2"
3838
RecursiveArrayTools = "4"
3939
SafeTestsets = "0.1, 1"
40-
SciMLBase = "3"
41-
SciMLTesting = "1"
40+
SciMLBase = "3.28.1"
41+
SciMLTesting = "1.6"
4242
SparseDiffTools = "2"
4343
Statistics = "1"
4444
StochasticDiffEq = "7"

src/MultiScaleArrays.jl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ __precompile__()
33
module MultiScaleArrays
44

55
import Base: length, push!, deleteat!, getindex, setindex!, eachindex, ndims,
6-
size, print_matrix, similar, hcat, vcat,
7-
==, *, +, /, -, show, vec, reshape
6+
size, similar, hcat, vcat,
7+
==, *, +, -, show, reshape
88

99
import RecursiveArrayTools: recursivecopy, recursivecopy!
1010

@@ -171,10 +171,14 @@ module MultiScaleArrays
171171
abstract type AbstractMultiScaleArrayLeaf{B} <: AbstractMultiScaleArray{B} end
172172
abstract type AbstractMultiScaleArrayHead{B} <: AbstractMultiScaleArray{B} end
173173

174-
using DiffEqBase, Statistics, LinearAlgebra, FiniteDiff
174+
using DiffEqBase: DiffEqBase
175+
using Statistics: Statistics
176+
using LinearAlgebra: LinearAlgebra, ldiv!
177+
using FiniteDiff: FiniteDiff
175178
import OrdinaryDiffEq, OrdinaryDiffEqCore, OrdinaryDiffEqRosenbrock, StochasticDiffEq, ForwardDiff
176179
import OrdinaryDiffEqDifferentiation
177180
import SciMLBase
181+
using SciMLBase: full_cache, rand_cache
178182
import DifferentiationInterface as DI
179183

180184
Base.show(io::IO, x::AbstractMultiScaleArray) = invoke(show, Tuple{IO, Any}, io, x)

src/diffeq.jl

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
function remove_node!(integrator::DiffEqBase.DEIntegrator, I...)
1+
function remove_node!(integrator::SciMLBase.DEIntegrator, I...)
22
idxs = getindices(integrator.u, I...)
33
for c in full_cache(integrator)
44
remove_node!(c, I...)
55
end
6-
if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
6+
if SciMLBase.is_diagonal_noise(integrator.sol.prob)
77
for c in DiffEqBase.ratenoise_cache(integrator)
88
remove_node!(c, I...)
99
end
1010
end
1111
return remove_node_non_user_cache!(integrator, idxs, I...) # required to do noise correctly
1212
end
1313

14-
function add_node!(integrator::DiffEqBase.DEIntegrator, x, I...)
14+
function add_node!(integrator::SciMLBase.DEIntegrator, x, I...)
1515
cur_len = length(integrator.u)
1616
add_len = length(x)
1717
last_idx = length(integrator.u[I...].nodes)
@@ -20,7 +20,7 @@ function add_node!(integrator::DiffEqBase.DEIntegrator, x, I...)
2020
for c in full_cache(integrator)
2121
add_node!(c, recursivecopy(x), I...)
2222
end
23-
if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
23+
if SciMLBase.is_diagonal_noise(integrator.sol.prob)
2424
for c in DiffEqBase.ratenoise_cache(integrator)
2525
add_node!(c, recursivecopy(x), I...)
2626
end
@@ -29,7 +29,7 @@ function add_node!(integrator::DiffEqBase.DEIntegrator, x, I...)
2929
return add_node_non_user_cache!(integrator, idxs, x, I...) # required to do noise correctly
3030
end
3131

32-
function add_node!(integrator::DiffEqBase.DEIntegrator, x)
32+
function add_node!(integrator::SciMLBase.DEIntegrator, x)
3333
cur_len = length(integrator.u)
3434
add_len = length(x)
3535
last_idx = length(integrator.u.nodes)
@@ -38,7 +38,7 @@ function add_node!(integrator::DiffEqBase.DEIntegrator, x)
3838
for c in full_cache(integrator)
3939
add_node!(c, recursivecopy(x))
4040
end
41-
if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
41+
if SciMLBase.is_diagonal_noise(integrator.sol.prob)
4242
for c in DiffEqBase.ratenoise_cache(integrator)
4343
add_node!(c, recursivecopy(x))
4444
end
@@ -49,51 +49,51 @@ end
4949
reshape(m::AbstractMultiScaleArray, i::Int...) = m
5050

5151
function remove_node_non_user_cache!(
52-
integrator::DiffEqBase.AbstractODEIntegrator, idxs::AbstractUnitRange,
52+
integrator::SciMLBase.AbstractODEIntegrator, idxs::AbstractUnitRange,
5353
node...
5454
)
5555
return remove_node_non_user_cache!(integrator, integrator.cache, idxs, node...)
5656
end
5757

5858
function remove_node_non_user_cache!(
59-
integrator::DiffEqBase.AbstractODEIntegrator,
59+
integrator::SciMLBase.AbstractODEIntegrator,
6060
cache::OrdinaryDiffEqCore.OrdinaryDiffEqCache, idxs::AbstractUnitRange,
6161
node...
6262
)
6363
return nothing
6464
end
6565

6666
function add_node_non_user_cache!(
67-
integrator::DiffEqBase.AbstractODEIntegrator, idxs::AbstractUnitRange,
67+
integrator::SciMLBase.AbstractODEIntegrator, idxs::AbstractUnitRange,
6868
x::AbstractArray
6969
)
7070
return add_node_non_user_cache!(integrator, integrator.cache, idxs, x)
7171
end
7272

7373
function add_node_non_user_cache!(
74-
integrator::DiffEqBase.AbstractODEIntegrator, idxs::AbstractUnitRange,
74+
integrator::SciMLBase.AbstractODEIntegrator, idxs::AbstractUnitRange,
7575
x::AbstractArray, node...
7676
)
7777
return add_node_non_user_cache!(integrator, integrator.cache, idxs, x, node...)
7878
end
7979

8080
function add_node_non_user_cache!(
81-
integrator::DiffEqBase.AbstractODEIntegrator,
81+
integrator::SciMLBase.AbstractODEIntegrator,
8282
cache::OrdinaryDiffEqCore.OrdinaryDiffEqCache, idxs::AbstractUnitRange,
8383
x::AbstractArray
8484
)
8585
return nothing
8686
end
8787
function add_node_non_user_cache!(
88-
integrator::DiffEqBase.AbstractODEIntegrator,
88+
integrator::SciMLBase.AbstractODEIntegrator,
8989
cache::OrdinaryDiffEqCore.OrdinaryDiffEqCache, idxs::AbstractUnitRange,
9090
x::AbstractArray, node...
9191
)
9292
return nothing
9393
end
9494

9595
function add_node_non_user_cache!(
96-
integrator::DiffEqBase.AbstractODEIntegrator,
96+
integrator::SciMLBase.AbstractODEIntegrator,
9797
cache::OrdinaryDiffEqRosenbrock.RosenbrockMutableCache, idxs::AbstractUnitRange,
9898
x::AbstractArray
9999
)
@@ -106,7 +106,7 @@ function add_node_non_user_cache!(
106106
end
107107

108108
function add_node_non_user_cache!(
109-
integrator::DiffEqBase.AbstractODEIntegrator,
109+
integrator::SciMLBase.AbstractODEIntegrator,
110110
cache::OrdinaryDiffEqRosenbrock.RosenbrockMutableCache, idxs::AbstractUnitRange,
111111
x::AbstractArray, node...
112112
)
@@ -119,7 +119,7 @@ function add_node_non_user_cache!(
119119
end
120120

121121
function remove_node_non_user_cache!(
122-
integrator::DiffEqBase.AbstractODEIntegrator,
122+
integrator::SciMLBase.AbstractODEIntegrator,
123123
cache::OrdinaryDiffEqRosenbrock.RosenbrockMutableCache, idxs::AbstractUnitRange,
124124
node...
125125
)
@@ -251,21 +251,21 @@ function remove_node_grad_config!(cache, grad_config::FiniteDiff.GradientCache,
251251
end
252252

253253
function add_node_non_user_cache!(
254-
integrator::DiffEqBase.AbstractSDEIntegrator, idxs, x,
254+
integrator::SciMLBase.AbstractSDEIntegrator, idxs, x,
255255
node...
256256
)
257257
#addat_non_user_cache!(integrator, idxs)
258-
return if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
258+
return if SciMLBase.is_diagonal_noise(integrator.sol.prob)
259259
add_node_noise!(integrator, idxs, x, node...)
260260
for c in rand_cache(integrator)
261261
add_node!(c, copy(x), node...)
262262
end
263263
end
264264
end
265265

266-
function add_node_non_user_cache!(integrator::DiffEqBase.AbstractSDEIntegrator, idxs, x)
266+
function add_node_non_user_cache!(integrator::SciMLBase.AbstractSDEIntegrator, idxs, x)
267267
#addat_non_user_cache!(integrator, idxs)
268-
return if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
268+
return if SciMLBase.is_diagonal_noise(integrator.sol.prob)
269269
add_node_noise!(integrator, idxs, x)
270270
for c in rand_cache(integrator)
271271
add_node!(c, copy(x))
@@ -274,11 +274,11 @@ function add_node_non_user_cache!(integrator::DiffEqBase.AbstractSDEIntegrator,
274274
end
275275

276276
function remove_node_non_user_cache!(
277-
integrator::DiffEqBase.AbstractSDEIntegrator, idxs,
277+
integrator::SciMLBase.AbstractSDEIntegrator, idxs,
278278
node...
279279
)
280280
#deleteat_non_user_cache!(integrator, idxs)
281-
return if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
281+
return if SciMLBase.is_diagonal_noise(integrator.sol.prob)
282282
remove_node_noise!(integrator, node...)
283283
for c in rand_cache(integrator)
284284
remove_node!(c, node...)
@@ -291,12 +291,12 @@ end
291291
# the integrator-typed methods above no longer dispatch. Route through the cache
292292
# type instead — the SDE-side caches still subtype `StochasticDiffEqMutableCache`.
293293
function add_node_non_user_cache!(
294-
integrator::DiffEqBase.AbstractODEIntegrator,
294+
integrator::SciMLBase.AbstractODEIntegrator,
295295
cache::StochasticDiffEq.StochasticDiffEqMutableCache,
296296
idxs::AbstractUnitRange,
297297
x::AbstractArray, node...
298298
)
299-
if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
299+
if SciMLBase.is_diagonal_noise(integrator.sol.prob)
300300
add_node_noise!(integrator, idxs, x, node...)
301301
for c in rand_cache(integrator)
302302
add_node!(c, copy(x), node...)
@@ -306,12 +306,12 @@ function add_node_non_user_cache!(
306306
end
307307

308308
function add_node_non_user_cache!(
309-
integrator::DiffEqBase.AbstractODEIntegrator,
309+
integrator::SciMLBase.AbstractODEIntegrator,
310310
cache::StochasticDiffEq.StochasticDiffEqMutableCache,
311311
idxs::AbstractUnitRange,
312312
x::AbstractArray
313313
)
314-
if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
314+
if SciMLBase.is_diagonal_noise(integrator.sol.prob)
315315
add_node_noise!(integrator, idxs, x)
316316
for c in rand_cache(integrator)
317317
add_node!(c, copy(x))
@@ -321,12 +321,12 @@ function add_node_non_user_cache!(
321321
end
322322

323323
function remove_node_non_user_cache!(
324-
integrator::DiffEqBase.AbstractODEIntegrator,
324+
integrator::SciMLBase.AbstractODEIntegrator,
325325
cache::StochasticDiffEq.StochasticDiffEqMutableCache,
326326
idxs::AbstractUnitRange,
327327
node...
328328
)
329-
if DiffEqBase.is_diagonal_noise(integrator.sol.prob)
329+
if SciMLBase.is_diagonal_noise(integrator.sol.prob)
330330
remove_node_noise!(integrator, node...)
331331
for c in rand_cache(integrator)
332332
remove_node!(c, node...)

test/qa/Project.toml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
[deps]
2-
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
32
JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b"
43
MultiScaleArrays = "f9640e96-87f6-5992-9c3b-0743c6a49ffa"
5-
SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f"
64
SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283"
7-
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
85

96
[sources]
107
MultiScaleArrays = {path = "../.."}
118

129
[compat]
13-
Aqua = "0.8"
1410
JET = "0.9, 0.10, 0.11"
15-
SafeTestsets = "0.1, 1"
16-
SciMLTesting = "1"
17-
Test = "1"
11+
SciMLTesting = "1.7"
1812
julia = "1.10"

test/qa/qa.jl

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,44 @@
1-
using MultiScaleArrays, Aqua, JET
1+
using SciMLTesting, MultiScaleArrays, JET
22
using Test
33

4-
# Findings tracked in https://github.com/SciML/MultiScaleArrays.jl/issues/142.
5-
# The failing Aqua checks are marked @test_broken so the QA group is green;
6-
# remove the markers (and re-enable the disabled Aqua.test_all checks) once fixed.
7-
@testset "Aqua" begin
8-
Aqua.test_all(MultiScaleArrays; ambiguities = false, deps_compat = false)
9-
@test_broken false # Aqua ambiguities: 5 (construct/shape_construction.jl, ldiv!/math.jl) — see https://github.com/SciML/MultiScaleArrays.jl/issues/142
10-
@test_broken false # Aqua deps_compat: LinearAlgebra and Random lack [compat] entries — see https://github.com/SciML/MultiScaleArrays.jl/issues/142
11-
end
12-
13-
# This is the JET check that ran (and passed) under the old standalone QA.yml
14-
# before CI was centralized; centralization dropped it. Restored verbatim and
15-
# enforced. The target_modules filter scopes reports to MultiScaleArrays itself.
16-
@testset "JET" begin
17-
report = JET.report_package(MultiScaleArrays; target_modules = (MultiScaleArrays,))
18-
@test length(JET.get_reports(report)) == 0
19-
end
4+
# Aqua `ambiguities` and `deps_compat` are tracked-broken in
5+
# https://github.com/SciML/MultiScaleArrays.jl/issues/142 (5 `construct`/`ldiv!`
6+
# ambiguities; LinearAlgebra and Random lack `[compat]` entries). They are disabled
7+
# in `Aqua.test_all` and recorded as `@test_broken` placeholders via `aqua_broken`;
8+
# remove them from `aqua_broken` once the issue is resolved.
9+
#
10+
# JET runs as a hard check (the previous `alg_needs_extra_process` finding no longer
11+
# fires). The ExplicitImports `ignore` lists cover non-public accesses to other
12+
# packages' names (internals that become public as those base libraries declare
13+
# `public`); each ignored name is grouped by its source package. Every entry below
14+
# was verified to still flag with the lists emptied.
15+
run_qa(
16+
MultiScaleArrays;
17+
explicit_imports = true,
18+
aqua_broken = (:ambiguities, :deps_compat),
19+
ei_kwargs = (;
20+
all_qualified_accesses_are_public = (;
21+
ignore = (
22+
# Base.Broadcast internals
23+
:AbstractArrayStyle, :Broadcasted, :DefaultArrayStyle,
24+
:_broadcast_getindex_eltype,
25+
# ForwardDiff internals
26+
:DerivativeConfig, :Dual, :Tag,
27+
# FiniteDiff internals
28+
:GradientCache, :JacobianCache,
29+
# OrdinaryDiffEqCore / OrdinaryDiffEqRosenbrock cache types
30+
:OrdinaryDiffEqCache, :RosenbrockMutableCache,
31+
# OrdinaryDiffEqDifferentiation internals
32+
:resize_grad_config!, :resize_jac_config!,
33+
# Base internals
34+
:typename,
35+
),
36+
),
37+
all_explicit_imports_are_public = (;
38+
ignore = (
39+
# non-public RecursiveArrayTools name used in level_iterations.jl
40+
:chain,
41+
),
42+
),
43+
),
44+
)

0 commit comments

Comments
 (0)