Skip to content

Commit 24f0183

Browse files
Remove UnitfulUnitCheck internal interface - use ModelingToolkit functions directly
As requested, removed all references to the internal UnitfulUnitCheck interface. Users should now call ModelingToolkit functions directly: - ModelingToolkit.get_unit() instead of UnitfulUnitCheck.get_unit() - ModelingToolkit.equivalent() instead of UnitfulUnitCheck.equivalent() - ModelingToolkit.validate() instead of UnitfulUnitCheck.validate() - etc. The extension automatically provides Unitful-specific functionality when Unitful is imported, with no need for an intermediate interface. Changes: - Remove UnitfulUnitCheck constant from extension - Update all test references to use ModelingToolkit.* directly - Clean up module comments 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent b24913f commit 24f0183

File tree

3 files changed

+38
-60
lines changed

3 files changed

+38
-60
lines changed

ext/ModelingToolkitUnitfulExt.jl

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,6 @@ const t_unitful = let
7676
end
7777
const D_unitful = MT.Differential(t_unitful)
7878

79-
# For backward compatibility - provide UnitfulUnitCheck module interface
80-
# Extensions can access all the main package functions through MT
81-
const UnitfulUnitCheck = (
82-
equivalent = MT.equivalent,
83-
unitless = Unitful.unit(1),
84-
get_unit = MT.get_unit,
85-
get_literal_unit = MT.get_literal_unit,
86-
safe_get_unit = MT.safe_get_unit,
87-
validate = MT.validate,
88-
screen_unit = MT.screen_unit,
89-
ValidationError = ValidationError
90-
)
79+
# Extension loaded - all Unitful-specific functionality is now available
9180

9281
end # module

src/ModelingToolkit.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,6 @@ PrecompileTools.@compile_workload begin
376376
end
377377
end
378378

379-
# UnitfulUnitCheck will be available when the extension loads
379+
# Unitful-specific functionality is available when the ModelingToolkitUnitfulExt extension loads
380380

381381
end # module

test/units.jl

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,55 @@ using ModelingToolkit, OrdinaryDiffEq, JumpProcesses, Unitful
22
using Test
33
MT = ModelingToolkit
44

5-
# Create UnitfulUnitCheck compatibility interface
6-
# With the extension, all functions are accessible directly from ModelingToolkit
7-
const unitless_unit = ModelingToolkit.DQ.Quantity(1.0) # Use DQ unitless consistently
8-
UMT = (
9-
equivalent = ModelingToolkit.equivalent,
10-
unitless = unitless_unit,
11-
get_unit = ModelingToolkit.get_unit,
12-
get_literal_unit = ModelingToolkit.get_literal_unit,
13-
safe_get_unit = ModelingToolkit.safe_get_unit,
14-
validate = ModelingToolkit.validate,
15-
screen_unit = ModelingToolkit.screen_unit,
16-
ValidationError = ModelingToolkit.ValidationError,
17-
SciMLBase = SciMLBase
18-
)
5+
# All unit functions are now directly available from ModelingToolkit
6+
# Extension automatically loads when Unitful is imported
7+
const unitless = ModelingToolkit.DQ.Quantity(1.0)
198
@independent_variables t [unit = u"ms"]
209
@parameters τ [unit = u"ms"] γ
2110
@variables E(t) [unit = u"kJ"] P(t) [unit = u"MW"]
2211
D = Differential(t)
2312

2413
#This is how equivalent works:
25-
@test UMT.equivalent(u"MW", u"kJ/ms")
26-
@test !UMT.equivalent(u"m", u"cm")
27-
@test UMT.equivalent(UMT.get_unit(P^γ), UMT.get_unit((E / τ)^γ))
14+
@test ModelingToolkit.equivalent(u"MW", u"kJ/ms")
15+
@test !ModelingToolkit.equivalent(u"m", u"cm")
16+
@test ModelingToolkit.equivalent(ModelingToolkit.get_unit(P^γ), ModelingToolkit.get_unit((E / τ)^γ))
2817

2918
# Basic access
30-
@test UMT.get_unit(t) == u"ms"
31-
@test UMT.get_unit(E) == u"kJ"
32-
@test UMT.get_unit(τ) == u"ms"
33-
@test UMT.get_unit(γ) == UMT.unitless
34-
@test UMT.get_unit(0.5) == UMT.unitless
35-
@test UMT.get_unit(UMT.SciMLBase.NullParameters()) == UMT.unitless
19+
@test ModelingToolkit.get_unit(t) == u"ms"
20+
@test ModelingToolkit.get_unit(E) == u"kJ"
21+
@test ModelingToolkit.get_unit(τ) == u"ms"
22+
@test ModelingToolkit.get_unit(γ) == unitless
23+
@test ModelingToolkit.get_unit(0.5) == unitless
24+
@test ModelingToolkit.get_unit(ModelingToolkit.SciMLBase.NullParameters()) == unitless
3625

3726
# Prohibited unit types
3827
@parameters β [unit = u"°"] α [unit = u"°C"] γ [unit = 1u"s"]
39-
@test_throws UMT.ValidationError UMT.get_unit(β)
40-
@test_throws UMT.ValidationError UMT.get_unit(α)
41-
@test_throws UMT.ValidationError UMT.get_unit(γ)
28+
@test_throws ModelingToolkit.ValidationError ModelingToolkit.get_unit(β)
29+
@test_throws ModelingToolkit.ValidationError ModelingToolkit.get_unit(α)
30+
@test_throws ModelingToolkit.ValidationError ModelingToolkit.get_unit(γ)
4231

4332
# Non-trivial equivalence & operators
44-
@test UMT.get_unit^-1) == u"ms^-1"
45-
@test UMT.equivalent(UMT.get_unit(D(E)), u"MW")
46-
@test UMT.equivalent(UMT.get_unit(E / τ), u"MW")
47-
@test UMT.get_unit(2 * P) == u"MW"
48-
@test UMT.get_unit(t / τ) == UMT.unitless
49-
@test UMT.equivalent(UMT.get_unit(P - E / τ), u"MW")
50-
@test UMT.equivalent(UMT.get_unit(D(D(E))), u"MW/ms")
51-
@test UMT.get_unit(ifelse(t > t, P, E / τ)) == u"MW"
52-
@test UMT.get_unit(1.0^(t / τ)) == UMT.unitless
53-
@test UMT.get_unit(exp(t / τ)) == UMT.unitless
54-
@test UMT.get_unit(sin(t / τ)) == UMT.unitless
55-
@test UMT.get_unit(sin(1 * u"rad")) == UMT.unitless
56-
@test UMT.get_unit(t^2) == u"ms^2"
33+
@test ModelingToolkit.get_unit^-1) == u"ms^-1"
34+
@test ModelingToolkit.equivalent(ModelingToolkit.get_unit(D(E)), u"MW")
35+
@test ModelingToolkit.equivalent(ModelingToolkit.get_unit(E / τ), u"MW")
36+
@test ModelingToolkit.get_unit(2 * P) == u"MW"
37+
@test ModelingToolkit.get_unit(t / τ) == unitless
38+
@test ModelingToolkit.equivalent(ModelingToolkit.get_unit(P - E / τ), u"MW")
39+
@test ModelingToolkit.equivalent(ModelingToolkit.get_unit(D(D(E))), u"MW/ms")
40+
@test ModelingToolkit.get_unit(ifelse(t > t, P, E / τ)) == u"MW"
41+
@test ModelingToolkit.get_unit(1.0^(t / τ)) == unitless
42+
@test ModelingToolkit.get_unit(exp(t / τ)) == unitless
43+
@test ModelingToolkit.get_unit(sin(t / τ)) == unitless
44+
@test ModelingToolkit.get_unit(sin(1 * u"rad")) == unitless
45+
@test ModelingToolkit.get_unit(t^2) == u"ms^2"
5746

5847
eqs = [D(E) ~ P - E / τ
5948
0 ~ P]
60-
@test UMT.validate(eqs)
49+
@test ModelingToolkit.validate(eqs)
6150
@named sys = System(eqs, t)
6251

63-
@test !UMT.validate(D(D(E)) ~ P)
64-
@test !UMT.validate(0 ~ P + E * τ)
52+
@test !ModelingToolkit.validate(D(D(E)) ~ P)
53+
@test !ModelingToolkit.validate(0 ~ P + E * τ)
6554

6655
# Disabling unit validation/checks selectively
6756
@test_throws MT.ArgumentError System(eqs, t, [E, P, t], [τ], name = :sys)
@@ -102,9 +91,9 @@ end
10291
good_eqs = [connect(p1, p2)]
10392
bad_eqs = [connect(p1, p2, op)]
10493
bad_length_eqs = [connect(op, lp)]
105-
@test UMT.validate(good_eqs)
106-
@test !UMT.validate(bad_eqs)
107-
@test !UMT.validate(bad_length_eqs)
94+
@test ModelingToolkit.validate(good_eqs)
95+
@test !ModelingToolkit.validate(bad_eqs)
96+
@test !ModelingToolkit.validate(bad_length_eqs)
10897
@named sys = System(good_eqs, t, [], [])
10998
@test_throws MT.ValidationError System(bad_eqs, t, [], []; name = :sys)
11099

@@ -144,7 +133,7 @@ noiseeqs = [0.1u"MW" 0.1u"MW"
144133
# Invalid noise matrix
145134
noiseeqs = [0.1u"MW" 0.1u"MW"
146135
0.1u"MW" 0.1u"s"]
147-
@test !UMT.validate(eqs, noiseeqs)
136+
@test !ModelingToolkit.validate(eqs, noiseeqs)
148137

149138
# Non-trivial simplifications
150139
@independent_variables t [unit = u"s"]
@@ -236,7 +225,7 @@ end
236225
@test ModelingToolkit.getdefault(sys.a) [0.01, 0.03]
237226

238227
@variables x(t)
239-
@test ModelingToolkit.get_unit(sin(x)) == ModelingToolkit.unitless
228+
@test ModelingToolkit.get_unit(sin(x)) == unitless
240229

241230
@mtkmodel ExpressionParametersTest begin
242231
@parameters begin

0 commit comments

Comments
 (0)