Skip to content

Commit 6b93f97

Browse files
committed
Fix upreferred validation
1 parent 12308de commit 6b93f97

File tree

5 files changed

+66
-15
lines changed

5 files changed

+66
-15
lines changed

.github/workflows/CI.yml

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,31 @@ jobs:
3232
arch: ${{ matrix.arch }}
3333
- uses: julia-actions/cache@v1
3434
- uses: julia-actions/julia-buildpkg@v1
35-
- uses: julia-actions/julia-runtest@v1
36-
- uses: julia-actions/julia-uploadcoveralls@v1
37-
env:
38-
COVERALLS_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
35+
- name: "Run tests"
36+
run: |
37+
julia --color=yes --project=. -e 'import Pkg; Pkg.add("Coverage")'
38+
julia --color=yes --threads=auto --check-bounds=yes --depwarn=yes --code-coverage=user --project=. -e 'import Pkg; Pkg.test(coverage=true)'
39+
DQ_TEST_UPREFERRED=true julia --color=yes --threads=auto --check-bounds=yes --depwarn=yes --code-coverage=user --project=. -e 'import Pkg; Pkg.test(coverage=true)'
40+
julia --color=yes --project=. coverage.jl
41+
- name: "Coveralls"
42+
uses: coverallsapp/github-action@v2
43+
with:
44+
github-token: ${{ secrets.GITHUB_TOKEN }}
45+
file: lcov.info
46+
parallel: true
47+
flag-name: julia-${{ matrix.version }}-${{ matrix.os }}-${{ matrix.arch }}
48+
49+
coveralls:
50+
name: Indicate completion to coveralls
51+
runs-on: ubuntu-latest
52+
needs: test
53+
steps:
54+
- name: Finish
55+
uses: coverallsapp/github-action@v2
56+
with:
57+
github-token: ${{ secrets.GITHUB_TOKEN }}
58+
parallel-finished: true
59+
3960
docs:
4061
name: Documentation
4162
runs-on: ubuntu-latest

ext/DynamicQuantitiesUnitfulExt.jl

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,28 @@ else
1010
import ..Unitful: @u_str
1111
end
1212

13-
# This lets the user override the preferred units:
14-
function unitful_equivalences()
15-
si_units = (length=u"m", mass=u"kg", time=u"s", current=u"A", temperature=u"K", luminosity=u"cd", amount=u"mol")
13+
function get_si_units()
14+
return (length=u"m", mass=u"kg", time=u"s", current=u"A", temperature=u"K", luminosity=u"cd", amount=u"mol")
15+
end
16+
17+
function validate_upreferred()
18+
si_units = get_si_units()
1619
for k in keys(si_units)
1720
if Unitful.upreferred(si_units[k]) !== si_units[k]
1821
error("Found custom `Unitful.preferunits`. This is not supported when interfacing Unitful and DynamicQuantities: you must leave the default `Unitful.upreferred`, which is the SI base units.")
1922
end
2023
end
24+
return true
25+
end
26+
27+
function unitful_equivalences()
28+
si_units = get_si_units()
2129
return NamedTuple((k => si_units[k] for k in keys(si_units)))
2230
end
2331

2432
Base.convert(::Type{Unitful.Quantity}, x::DynamicQuantities.Quantity) =
2533
let
34+
validate_upreferred()
2635
cumulator = DynamicQuantities.ustrip(x)
2736
dims = DynamicQuantities.dimension(x)
2837
equiv = unitful_equivalences()
@@ -42,9 +51,10 @@ Base.convert(::Type{DynamicQuantities.Quantity{T,D}}, x::Unitful.Quantity) where
4251
return DynamicQuantities.Quantity(convert(T, value), dimension)
4352
end
4453

45-
Base.convert(::Type{DynamicQuantities.Dimensions}, d::Unitful.Dimensions) = convert(DynamicQuantities.Dimensions{DynamicQuantities.DEFAULT_DIM_TYPE}, d)
54+
Base.convert(::Type{DynamicQuantities.Dimensions}, d::Unitful.Dimensions) = convert(DynamicQuantities.DEFAULT_DIM_TYPE, d)
4655
Base.convert(::Type{DynamicQuantities.Dimensions{R}}, d::Unitful.Dimensions{D}) where {R,D} =
4756
let
57+
validate_upreferred()
4858
cumulator = DynamicQuantities.Dimensions{R}()
4959
for dim in D
5060
dim_symbol = _map_dim_name_to_dynamic_units(typeof(dim))

test/runtests.jl

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@ import Ratios: SimpleRatio
55
@eval Base.round(T, x::SimpleRatio) = round(T, x.num // x.den)
66
end
77

8-
@safetestset "Unitful.jl integration tests" begin
9-
include("test_unitful.jl")
10-
end
11-
12-
@safetestset "Unit tests" begin
13-
include("unittests.jl")
14-
end
8+
if parse(Bool, get(ENV, "DQ_TEST_UPREFERRED", "false"))
9+
@safetestset "Test upreferred disallowed" begin
10+
include("test_ban_upreferred.jl")
11+
end
12+
else
13+
@safetestset "Unitful.jl integration tests" begin
14+
include("test_unitful.jl")
15+
end
16+
@safetestset "Unit tests" begin
17+
include("unittests.jl")
18+
end
19+
end

test/test_ban_upreferred.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
### These are tests we need to run with a fresh Julia runtime
2+
3+
import Unitful
4+
import Unitful: @u_str
5+
Unitful.preferunits(u"km")
6+
using Test
7+
import DynamicQuantities
8+
9+
x_unitful = 1.5u"km"
10+
x_dq = DynamicQuantities.Quantity(1500.0, length=1)
11+
12+
@test_throws ErrorException convert(DynamicQuantities.Quantity, x_unitful)
13+
@test_throws ErrorException convert(Unitful.Quantity, x_dq)

test/test_unitful.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ for T in [DEFAULT_VALUE_TYPE, Float16, Float32, Float64], R in [DEFAULT_DIM_BASE
2222

2323
@test isapprox(convert(DynamicQuantities.Quantity{T,D}, x_unitful), x; atol=1e-6)
2424
@test risapprox(convert(Unitful.Quantity, convert(DynamicQuantities.Quantity{T,D}, x_unitful)), Unitful.upreferred(x_unitful); atol=1e-6)
25+
26+
@test typeof(convert(DynamicQuantities.Dimensions, Unitful.dimension(x_unitful))) == DynamicQuantities.Dimensions{DEFAULT_DIM_BASE_TYPE}
2527
end

0 commit comments

Comments
 (0)