Skip to content

Propose some functions and macros for unitful integration. #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -5,12 +5,10 @@ version = "0.2.0"

[deps]
Requires = "ae029012-a4dd-5104-9daa-d747884805df"

[weakdeps]
SaferIntegers = "88634af6-177f-5301-88b8-7819386cfa38"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"

[extensions]
DynamicQuantitiesUnitfulExt = "Unitful"


[compat]
Requires = "1"
@@ -22,7 +20,8 @@ Ratios = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
SaferIntegers = "88634af6-177f-5301-88b8-7819386cfa38"
SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"

[targets]
test = ["Test", "Ratios", "SaferIntegers", "SafeTestsets", "Unitful"]
test = ["Test", "Ratios", "SaferIntegers", "SafeTestsets", "Documenter"]

1 change: 1 addition & 0 deletions docs/Project.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[deps]
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
2 changes: 2 additions & 0 deletions docs/make.jl
Original file line number Diff line number Diff line change
@@ -30,6 +30,8 @@ makedocs(;
authors="MilesCranmer <[email protected]> and contributors",
repo="https://github.com/SymbolicML/DynamicQuantities.jl/blob/{commit}{path}#{line}",
sitename="DynamicQuantities.jl",
clean = false,
doctest = true,
format=Documenter.HTML(;
prettyurls=get(ENV, "CI", "false") == "true",
canonical="https://symbolicml.org/DynamicQuantities.jl",
4 changes: 2 additions & 2 deletions docs/src/api.md
Original file line number Diff line number Diff line change
@@ -11,5 +11,5 @@ API Reference for [DynamicQuantities](https://github.com/SymbolicML/DynamicQuant

```@autodocs
Modules = [DynamicQuantities]
Order = [:type, :function]
```
Order = [:type, :function, :macro]
```
5 changes: 5 additions & 0 deletions ext/DynamicQuantitiesUnitfulExt.jl
Original file line number Diff line number Diff line change
@@ -62,4 +62,9 @@ function _map_dim_name_to_dynamic_units(::Type{Unitful.Dimension{D}}) where {D}
end


DynamicQuantities.dynquantity(u::Unitful.FreeUnits)=Base.convert(DynamicQuantities.Quantity,Unitful.upreferred(1u))
DynamicQuantities.dynquantity(q::Unitful.AbstractQuantity) = Base.convert(DynamicQuantities.Quantity,Unitful.upreferred(q))
DynamicQuantities.unitful(q::DynamicQuantities.Quantity) = Base.convert(Unitful.Quantity,q)
Unitful.uconvert(u::Unitful.FreeUnits,q::DynamicQuantities.Quantity) = Unitful.uconvert(u, Base.convert(Unitful.Quantity,q))

end
15 changes: 11 additions & 4 deletions src/DynamicQuantities.jl
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
module DynamicQuantities
import Unitful

export Quantity, Dimensions, DimensionError, ustrip, dimension, valid
export ulength, umass, utime, ucurrent, utemperature, uluminosity, uamount


export @q_str,@dynquantities, unitful,dynquantity



include("types.jl")
include("utils.jl")
include("math.jl")

import Requires: @init, @require
# import Requires: @init, @require
# if !isdefined(Base, :get_extension)
# @init @require Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" include("../ext/DynamicQuantitiesUnitfulExt.jl")
# end

if !isdefined(Base, :get_extension)
@init @require Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" include("../ext/DynamicQuantitiesUnitfulExt.jl")
end
include("../ext/DynamicQuantitiesUnitfulExt.jl")

end
81 changes: 81 additions & 0 deletions src/utils.jl
Original file line number Diff line number Diff line change
@@ -152,3 +152,84 @@ uluminosity(q::Quantity) = q.dimensions.luminosity
Get the amount dimension of a quantity (e.g., mol^(uamount)).
"""
uamount(q::Quantity) = q.dimensions.amount

"""
dynquantity(u)

Convert `Unitful.FreeUnits` or `Unitful.AbstractQuantity` to `DynamicQuantities.quantity`.

```jldoctest
julia> dynquantity(u"cm")
1//100 𝐋 ¹
```

```jldoctest
julia> 1u"cm"|> dynquantity
1//100 𝐋 ¹
````

"""
function dynquantity end

"""
unitful(q)

Make `Quantity` unitful.

```jldoctest
julia> DynamicQuantities.Quantity(3.0,length=3) |> unitful
3.0 m^3
```
"""
function unitful end

"""
uconvert(unit,q)

Convert `Quantity` to a certain unitful unit.

```jldoctest
julia> DynamicQuantities.Quantity(3.0,length=3) |> u"dm^3"
3000.0 dm^3
```
"""
function uconvert end

"""
@q_str(x)

Construct Quantity via string macro.

```jldoctest
julia> q"kHz"
1000 𝐓 ⁻¹
```

"""
macro q_str(x)
quote
DynamicQuantities.dynquantity($(Unitful).@u_str($(x)))
end
end


function _dynquantities(xs...)
code = Expr(:block)
for x in xs
push!(code.args, :($x = DynamicQuantities.dynquantity($Unitful.$x)))
end
code
end

"""
@dynquantities

Construct a list of quantity values
```jldoctest
julia> @dynquantities cm km Hz
1 𝐓 ⁻¹
```
"""
macro dynquantities(xs...)
esc(_dynquantities(xs...))
end
15 changes: 12 additions & 3 deletions test/runtests.jl
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
using SafeTestsets
using SafeTestsets, DynamicQuantities
import Ratios: SimpleRatio

@static if !hasmethod(round, Tuple{Int, SimpleRatio{Int}})
@eval Base.round(T, x::SimpleRatio) = round(T, x.num // x.den)
end


@safetestset "Unit tests" begin
include("unittests.jl")
end

@safetestset "Unitful.jl integration tests" begin
include("test_unitful.jl")
end

@safetestset "Unit tests" begin
include("unittests.jl")
@safetestset "doctests" begin
using Documenter, DynamicQuantities
DocMeta.setdocmeta!(DynamicQuantities, :DocTestSetup, :(using Unitful, DynamicQuantities); recursive=true)
Documenter.doctest(DynamicQuantities)
end