diff --git a/Project.toml b/Project.toml index 77f515b7..37c51bc8 100644 --- a/Project.toml +++ b/Project.toml @@ -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"] + diff --git a/docs/Project.toml b/docs/Project.toml index 14f45c27..386c65a2 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -1,3 +1,4 @@ [deps] Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" +Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" diff --git a/docs/make.jl b/docs/make.jl index c0d62263..efb1982e 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -30,6 +30,8 @@ makedocs(; authors="MilesCranmer 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", diff --git a/docs/src/api.md b/docs/src/api.md index 6cab9efe..403440d1 100644 --- a/docs/src/api.md +++ b/docs/src/api.md @@ -11,5 +11,5 @@ API Reference for [DynamicQuantities](https://github.com/SymbolicML/DynamicQuant ```@autodocs Modules = [DynamicQuantities] -Order = [:type, :function] -``` \ No newline at end of file +Order = [:type, :function, :macro] +``` diff --git a/ext/DynamicQuantitiesUnitfulExt.jl b/ext/DynamicQuantitiesUnitfulExt.jl index 0d14d1c8..3d4e9e38 100644 --- a/ext/DynamicQuantitiesUnitfulExt.jl +++ b/ext/DynamicQuantitiesUnitfulExt.jl @@ -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 diff --git a/src/DynamicQuantities.jl b/src/DynamicQuantities.jl index c62cbc0c..6e069469 100644 --- a/src/DynamicQuantities.jl +++ b/src/DynamicQuantities.jl @@ -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 diff --git a/src/utils.jl b/src/utils.jl index 5aa903b0..078bc7b8 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -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 diff --git a/test/runtests.jl b/test/runtests.jl index 212af775..464ccb6a 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -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 + +