From 4c10d8b13692561c817ed386645a9ab8563eb191 Mon Sep 17 00:00:00 2001 From: Yingbo Ma Date: Fri, 16 Jul 2021 21:23:42 -0400 Subject: [PATCH 1/9] Round-trip printing --- src/display.jl | 32 +++++++++----------------------- src/logarithm.jl | 8 ++++---- src/types.jl | 2 +- 3 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/display.jl b/src/display.jl index 249ad93f..f3029f1a 100644 --- a/src/display.jl +++ b/src/display.jl @@ -44,10 +44,6 @@ function prefix(x::Unit) end end -function show(io::IO, x::Unit{N,D}) where {N,D} - show(io, FreeUnits{(x,), D, nothing}()) -end - abstract type BracketStyle end struct NoBrackets <: BracketStyle end @@ -89,7 +85,7 @@ brackets are not printed. """ function showval(io::IO, x::Number, brackets::Bool=true) brackets && print_opening_bracket(io, x) - show(io, x) + show(io, MIME"text/plain"(), x) brackets && print_closing_bracket(io, x) end @@ -107,20 +103,10 @@ has_unit_spacing(u) = true has_unit_spacing(u::Units{(Unit{:Degree, NoDims}(0, 1//1),), NoDims}) = false """ - show(io::IO, x::Quantity) + show(io::IO, mime::MIME"text/plain", x::Quantity) Show a unitful quantity by calling [`showval`](@ref) on the numeric value, appending a space, and then calling `show` on a units object `U()`. """ -function show(io::IO, x::Quantity) - if isunitless(unit(x)) - showval(io, x.val, false) - else - showval(io, x.val, true) - has_unit_spacing(unit(x)) && print(io, ' ') - show(io, unit(x)) - end -end - function show(io::IO, mime::MIME"text/plain", x::Quantity) if isunitless(unit(x)) showval(io, mime, x.val, false) @@ -131,30 +117,30 @@ function show(io::IO, mime::MIME"text/plain", x::Quantity) end end -function show(io::IO, r::Union{StepRange{T},StepRangeLen{T}}) where T<:Quantity +function show(io::IO, mime::MIME"text/plain", r::Union{StepRange{T},StepRangeLen{T}}) where T<:Quantity a,s,b = first(r), step(r), last(r) U = unit(a) print(io, '(') if ustrip(U, s) == 1 - show(io, ustrip(U, a):ustrip(U, b)) + show(io, mime, ustrip(U, a):ustrip(U, b)) else - show(io, ustrip(U, a):ustrip(U, s):ustrip(U, b)) + show(io, mime, ustrip(U, a):ustrip(U, s):ustrip(U, b)) end print(io, ')') has_unit_spacing(U) && print(io,' ') - show(io, U) + show(io, mime, U) end -function show(io::IO, x::typeof(NoDims)) +function show(io::IO, ::MIME"text/plain", x::typeof(NoDims)) print(io, "NoDims") end """ - show(io::IO, x::Unitlike) + show(io::IO, ::MIME"text/plain", x::Unitlike) Call [`Unitful.showrep`](@ref) on each object in the tuple that is the type variable of a [`Unitful.Units`](@ref) or [`Unitful.Dimensions`](@ref) object. """ -function show(io::IO, x::Unitlike) +function show(io::IO, ::MIME"text/plain", x::Unitlike) showoperators = get(io, :showoperators, false) first = "" sep = showoperators ? "*" : " " diff --git a/src/logarithm.jl b/src/logarithm.jl index 58d76beb..a9d9daa4 100644 --- a/src/logarithm.jl +++ b/src/logarithm.jl @@ -84,11 +84,11 @@ tolog(L,x) = (1+isrootpower(L)) * prefactor(L()) * (logfn(L()))(x) fromlog(L,S,x) = unwrap(S) * expfn(L())( x / ((1+isrootpower(S))*prefactor(L())) ) fromlog(L,x) = expfn(L())( x / ((1+isrootpower(L))*prefactor(L())) ) -function Base.show(io::IO, x::MixedUnits{T,U}) where {T,U} +function Base.show(io::IO, mime::MIME"text/plain", x::MixedUnits{T,U}) where {T,U} print(io, abbr(x)) if x.units != NoUnits print(io, " ") - show(io, x.units) + show(io, mime, x.units) end end @@ -312,11 +312,11 @@ function Base.promote_rule(::Type{G}, ::Type{N}) where {L,S,T1, G<:Gain{L,S,T1}, end Base.promote_rule(A::Type{G}, B::Type{L}) where {G<:Gain, L2, L<:Level{L2}} = LogScaled{L2} -function Base.show(io::IO, x::Gain) +function Base.show(io::IO, mime::MIME"text/plain", x::Gain) print(io, x.val, " ", abbr(x)) nothing end -function Base.show(io::IO, x::Level) +function Base.show(io::IO, mime::MIME"text/plain", x::Level) print(io, ustrip(x), " ", abbr(x)) nothing end diff --git a/src/types.jl b/src/types.jl index 05b76f61..2d87469e 100644 --- a/src/types.jl +++ b/src/types.jl @@ -273,7 +273,7 @@ struct IsRootPowerRatio{S,T} val::T end IsRootPowerRatio{S}(x) where {S} = IsRootPowerRatio{S, typeof(x)}(x) -Base.show(io::IO, x::IsRootPowerRatio{S}) where {S} = +Base.show(io::IO, ::MIME"text/plain", x::IsRootPowerRatio{S}) where {S} = print(io, ifelse(S, "root-power ratio", "power ratio"), " with reference ", x.val) const PowerRatio{T} = IsRootPowerRatio{false,T} const RootPowerRatio{T} = IsRootPowerRatio{true,T} From 2a9717f2d28018df23bd99e0ceb42e7b51f4c32c Mon Sep 17 00:00:00 2001 From: anand jain Date: Sat, 17 Jul 2021 14:52:22 -0400 Subject: [PATCH 2/9] update tests --- test/runtests.jl | 52 +++++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 3e96550c..90de937c 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1291,21 +1291,21 @@ end withenv("UNITFUL_FANCY_EXPONENTS" => false) do @static if VERSION ā‰„ v"1.6.0-DEV.770" @test string(typeof(1.0m/s)) == - "Quantity{Float64, š‹ š“^-1, FreeUnits{(m, s^-1), š‹ š“^-1, nothing}}" + "Quantity{Float64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}}" @test string(typeof(m/s)) == - "FreeUnits{(m, s^-1), š‹ š“^-1, nothing}" + "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}" else @test string(typeof(1.0m/s)) == - "Quantity{Float64,š‹ š“^-1,FreeUnits{(m, s^-1),š‹ š“^-1,nothing}}" + "Quantity{Float64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}}" @test string(typeof(m/s)) == - "FreeUnits{(m, s^-1),š‹ š“^-1,nothing}" + "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}" end - @test string(dimension(1u"m/s")) == "š‹ š“^-1" - @test string(NoDims) == "NoDims" + @test string(dimension(1u"m/s")) == "Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}()" + @test string(NoDims) == "Unitful.Dimensions{()}()" end @testset ":fancy_exponent IOContext property" begin - @test sprint(io -> show(IOContext(io, :fancy_exponent => true), u"m/s")) == "m sā»Ā¹" - @test sprint(io -> show(IOContext(io, :fancy_exponent => false), u"m/s")) == "m s^-1" + @test sprint(io -> show(IOContext(io, :fancy_exponent => true), u"m/s")) == "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}()" + @test sprint(io -> show(IOContext(io, :fancy_exponent => false), u"m/s")) == "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}()" end end @@ -1315,31 +1315,37 @@ Base.show(io::IO, ::MIME"text/plain", ::Foo) = print(io, "42.0") @testset "Show quantities" begin withenv("UNITFUL_FANCY_EXPONENTS" => false) do - @test repr(1.0 * u"m * s * kg^-1") == "1.0 m s kg^-1" + @test repr(1.0 * u"m * s * kg^-1") == "Quantity{Float64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Mass}(-1//1), Unitful.Dimension{:Time}(1//1))}(), FreeUnits{(Unitful.Unit{:Gram, Unitful.Dimensions{(Unitful.Dimension{:Mass}(1//1),)}()}(3, -1//1), Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, 1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Mass}(-1//1), Unitful.Dimension{:Time}(1//1))}(), nothing}}(1.0)" @test repr("text/plain", 1.0 * u"m * s * kg^-1") == "1.0 m s kg^-1" - @test repr(Foo() * u"m * s * kg^-1") == "1 m s kg^-1" + @test repr(Foo() * u"m * s * kg^-1") == "Quantity{Foo, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Mass}(-1//1), Unitful.Dimension{:Time}(1//1))}(), FreeUnits{(Unitful.Unit{:Gram, Unitful.Dimensions{(Unitful.Dimension{:Mass}(1//1),)}()}(3, -1//1), Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, 1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Mass}(-1//1), Unitful.Dimension{:Time}(1//1))}(), nothing}}(1)" @test repr("text/plain", Foo() * u"m * s * kg^-1") == "42.0 m s kg^-1" # Complex quantities - @test repr((1+2im) * u"m/s") == "(1 + 2im) m s^-1" + @test repr((1+2im) * u"m/s") == "Quantity{Complex{Int64}, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}}(1 + 2im)" @test repr("text/plain", (1+2im) * u"m/s") == "(1 + 2im) m s^-1" # Angular degree printing #253 - @test sprint(show, 1.0Ā°) == "1.0Ā°" + @test sprint(show, 1.0Ā°) == "Quantity{Float64, Unitful.Dimensions{()}(), FreeUnits{(Unitful.Unit{:Degree, Unitful.Dimensions{()}()}(0, 1//1),), Unitful.Dimensions{()}(), nothing}}(1.0)" @test repr("text/plain", 1.0Ā°) == "1.0Ā°" # Concise printing of ranges - @test repr((1:10)*u"kg/m^3") == "(1:10) kg m^-3" - @test repr((1.0:0.1:10.0)*u"kg/m^3") == "(1.0:0.1:10.0) kg m^-3" - @test repr((1:10)*Ā°) == "(1:10)Ā°" + @test repr("text/plain", (1:10)*u"kg/m^3") == "(1:10) kg m^-3" + @test repr("text/plain", (1.0:0.1:10.0)*u"kg/m^3") == "(1.0:0.1:10.0) kg m^-3" + @test repr("text/plain", (1:10)*Ā°) == "(1:10)Ā°" end withenv("UNITFUL_FANCY_EXPONENTS" => true) do - @test repr(1.0 * u"m * s * kg^(-1//2)") == "1.0 m s kgā»Ā¹įŸĀ²" + @test repr("text/plain", 1.0 * u"m * s * kg^(-1//2)") == "1.0 m s kgā»Ā¹įŸĀ²" end withenv("UNITFUL_FANCY_EXPONENTS" => nothing) do - @test repr(1.0 * u"m * s * kg^(-1//2)") == + @test repr("text/plain", 1.0 * u"m * s * kg^(-1//2)") == (Sys.isapple() ? "1.0 m s kgā»Ā¹įŸĀ²" : "1.0 m s kg^-1/2") end + + @testset "roundtripping show" begin + u = u"m/s" + u2 = eval(Meta.parse(repr(u))) + @test u == u2 + end end @testset "DimensionError message" begin @@ -1349,11 +1355,11 @@ end String(take!(b)) end @test errorstr(DimensionError(1u"m",2)) == - "DimensionError: 1 m and 2 are not dimensionally compatible." + "DimensionError: Quantity{Int64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1),), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), nothing}}(1) and 2 are not dimensionally compatible." @test errorstr(DimensionError(1u"m",NoDims)) == - "DimensionError: 1 m and NoDims are not dimensionally compatible." + "DimensionError: Quantity{Int64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1),), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), nothing}}(1) and Unitful.Dimensions{()}() are not dimensionally compatible." @test errorstr(DimensionError(u"m",2)) == - "DimensionError: m and 2 are not dimensionally compatible." + "DimensionError: FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1),), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), nothing}() and 2 are not dimensionally compatible." end @testset "Logarithmic quantities" begin @@ -1673,12 +1679,12 @@ end @testset "> Display" begin withenv("UNITFUL_FANCY_EXPONENTS" => false) do - @test repr(3u"dB/Hz") == "[3 dB] Hz^-1" + @test repr(3u"dB/Hz") == "Quantity{Gain{LogInfo{:Decibel, 10, 10}, :?, Int64}, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}(), FreeUnits{(Unitful.Unit{:Hertz, Unitful.Dimensions{(Unitful.Dimension{:Time}(-1//1),)}()}(0, -1//1),), Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}(), nothing}}(Gain{LogInfo{:Decibel, 10, 10}, :?, Int64}(3))" @test repr("text/plain", 3u"dB/Hz") == "[3 dB] Hz^-1" end @test Unitful.abbr(3u"dBm") == "dBm" - @test Unitful.abbr(@dB 3V/1.241V) == "dB (1.241 V)" - @test string(360Ā°) == "360Ā°" + @test Unitful.abbr(@dB 3V/1.241V) == "dB (Quantity{Float64, Unitful.Dimensions{(Unitful.Dimension{:Current}(-1//1), Unitful.Dimension{:Length}(2//1), Unitful.Dimension{:Mass}(1//1), Unitful.Dimension{:Time}(-3//1))}(), FreeUnits{(Unitful.Unit{:Volt, Unitful.Dimensions{(Unitful.Dimension{:Current}(-1//1), Unitful.Dimension{:Length}(2//1), Unitful.Dimension{:Mass}(1//1), Unitful.Dimension{:Time}(-3//1))}()}(0, 1//1),), Unitful.Dimensions{(Unitful.Dimension{:Current}(-1//1), Unitful.Dimension{:Length}(2//1), Unitful.Dimension{:Mass}(1//1), Unitful.Dimension{:Time}(-3//1))}(), nothing}}(1.241))" + @test repr("text/plain", 360Ā°) == "360Ā°" end @testset "> Thanks for signing up for Log Facts!" begin From 89099f97d0cb17ab7b50dec2bb2aa79c5e25e0c2 Mon Sep 17 00:00:00 2001 From: anand jain Date: Sun, 25 Jul 2021 13:43:43 -0400 Subject: [PATCH 3/9] fix dimerror display, overload print, fix test --- src/display.jl | 9 +++++++++ src/utils.jl | 4 ++-- test/runtests.jl | 22 +++++++++++++++------- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/display.jl b/src/display.jl index f3029f1a..20b8168e 100644 --- a/src/display.jl +++ b/src/display.jl @@ -227,3 +227,12 @@ superscript(i::Integer) = map(repr(i)) do c c == '0' ? '\u2070' : error("unexpected character") end + +Base.print(io::IO, x::Quantity) = show(io, "text/plain", x) +Base.print(io::IO, x::Dimension) = show(io, "text/plain", x) +Base.print(io::IO, x::Unit) = show(io, "text/plain", x) +Base.print(io::IO, x::Union{StepRange{T},StepRangeLen{T}}) where T<:Quantity = show(io, "text/plain", x) +Base.print(io::IO, x::typeof(NoDims)) = show(io, "text/plain", x) +Base.print(io::IO, x::Unitlike) = show(io, "text/plain", x) +Base.print(io::IO, x::MixedUnits{T,U}) where {T,U} = show(io, "text/plain", x) +Base.print(io::IO, x::FreeUnits{N,D,A}) where {N,D,A} = show(io, "text/plain", x) diff --git a/src/utils.jl b/src/utils.jl index 0f343342..f3368576 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -236,7 +236,7 @@ struct DimensionError <: Exception end Base.showerror(io::IO, e::DimensionError) = - print(io, "DimensionError: $(e.x) and $(e.y) are not dimensionally compatible."); + print(io, "DimensionError: $(string(e.x)) and $(string(e.y)) are not dimensionally compatible."); """ struct AffineError <: Exception @@ -246,4 +246,4 @@ struct AffineError <: Exception x end -Base.showerror(io::IO, e::AffineError) = print(io, "AffineError: $(e.x)") +Base.showerror(io::IO, e::AffineError) = print(io, "AffineError: $(string(e.x))") diff --git a/test/runtests.jl b/test/runtests.jl index 90de937c..4cd61cca 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1291,7 +1291,7 @@ end withenv("UNITFUL_FANCY_EXPONENTS" => false) do @static if VERSION ā‰„ v"1.6.0-DEV.770" @test string(typeof(1.0m/s)) == - "Quantity{Float64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}}" + "Quantity{Float64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}}" @test string(typeof(m/s)) == "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}" else @@ -1300,8 +1300,8 @@ end @test string(typeof(m/s)) == "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}" end - @test string(dimension(1u"m/s")) == "Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}()" - @test string(NoDims) == "Unitful.Dimensions{()}()" + @test string(dimension(1u"m/s")) == "š‹ š“^-1" + @test string(NoDims) == "NoDims" end @testset ":fancy_exponent IOContext property" begin @test sprint(io -> show(IOContext(io, :fancy_exponent => true), u"m/s")) == "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}()" @@ -1345,6 +1345,14 @@ Base.show(io::IO, ::MIME"text/plain", ::Foo) = print(io, "42.0") u = u"m/s" u2 = eval(Meta.parse(repr(u))) @test u == u2 + + q = Quantity(5, u"m") + q2 = eval(Meta.parse(repr(q))) + @test q == q2 + + d = u"šŒ*š‹/š“^2" + d2 = eval(Meta.parse(repr(d))) + @test d == d2 end end @@ -1355,11 +1363,11 @@ end String(take!(b)) end @test errorstr(DimensionError(1u"m",2)) == - "DimensionError: Quantity{Int64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1),), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), nothing}}(1) and 2 are not dimensionally compatible." + "DimensionError: 1 m and 2 are not dimensionally compatible." @test errorstr(DimensionError(1u"m",NoDims)) == - "DimensionError: Quantity{Int64, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1),), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), nothing}}(1) and Unitful.Dimensions{()}() are not dimensionally compatible." + "DimensionError: 1 m and NoDims are not dimensionally compatible." @test errorstr(DimensionError(u"m",2)) == - "DimensionError: FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1),), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}(), nothing}() and 2 are not dimensionally compatible." + "DimensionError: m and 2 are not dimensionally compatible." end @testset "Logarithmic quantities" begin @@ -1683,7 +1691,7 @@ end @test repr("text/plain", 3u"dB/Hz") == "[3 dB] Hz^-1" end @test Unitful.abbr(3u"dBm") == "dBm" - @test Unitful.abbr(@dB 3V/1.241V) == "dB (Quantity{Float64, Unitful.Dimensions{(Unitful.Dimension{:Current}(-1//1), Unitful.Dimension{:Length}(2//1), Unitful.Dimension{:Mass}(1//1), Unitful.Dimension{:Time}(-3//1))}(), FreeUnits{(Unitful.Unit{:Volt, Unitful.Dimensions{(Unitful.Dimension{:Current}(-1//1), Unitful.Dimension{:Length}(2//1), Unitful.Dimension{:Mass}(1//1), Unitful.Dimension{:Time}(-3//1))}()}(0, 1//1),), Unitful.Dimensions{(Unitful.Dimension{:Current}(-1//1), Unitful.Dimension{:Length}(2//1), Unitful.Dimension{:Mass}(1//1), Unitful.Dimension{:Time}(-3//1))}(), nothing}}(1.241))" + @test Unitful.abbr(@dB 3V/1.241V) == "dB (1.241 V)" @test repr("text/plain", 360Ā°) == "360Ā°" end From ad7c1141716da96f6b91c191850b3be5826ab46e Mon Sep 17 00:00:00 2001 From: anand jain <33790004+anandijain@users.noreply.github.com> Date: Mon, 26 Jul 2021 14:50:41 -0400 Subject: [PATCH 4/9] Update src/display.jl Co-authored-by: Sebastian Stock <42280794+sostock@users.noreply.github.com> --- src/display.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/display.jl b/src/display.jl index 20b8168e..cf470d7c 100644 --- a/src/display.jl +++ b/src/display.jl @@ -228,7 +228,7 @@ superscript(i::Integer) = map(repr(i)) do c error("unexpected character") end -Base.print(io::IO, x::Quantity) = show(io, "text/plain", x) +Base.print(io::IO, x::AbstractQuantity) = show(io, "text/plain", x) Base.print(io::IO, x::Dimension) = show(io, "text/plain", x) Base.print(io::IO, x::Unit) = show(io, "text/plain", x) Base.print(io::IO, x::Union{StepRange{T},StepRangeLen{T}}) where T<:Quantity = show(io, "text/plain", x) From 06f7df14f26a479b0b7bebd9d98e7c8e40acf626 Mon Sep 17 00:00:00 2001 From: anand jain <33790004+anandijain@users.noreply.github.com> Date: Mon, 26 Jul 2021 14:50:47 -0400 Subject: [PATCH 5/9] Update src/display.jl Co-authored-by: Sebastian Stock <42280794+sostock@users.noreply.github.com> --- src/display.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/display.jl b/src/display.jl index cf470d7c..ebe88d66 100644 --- a/src/display.jl +++ b/src/display.jl @@ -232,7 +232,7 @@ Base.print(io::IO, x::AbstractQuantity) = show(io, "text/plain", x) Base.print(io::IO, x::Dimension) = show(io, "text/plain", x) Base.print(io::IO, x::Unit) = show(io, "text/plain", x) Base.print(io::IO, x::Union{StepRange{T},StepRangeLen{T}}) where T<:Quantity = show(io, "text/plain", x) -Base.print(io::IO, x::typeof(NoDims)) = show(io, "text/plain", x) Base.print(io::IO, x::Unitlike) = show(io, "text/plain", x) -Base.print(io::IO, x::MixedUnits{T,U}) where {T,U} = show(io, "text/plain", x) -Base.print(io::IO, x::FreeUnits{N,D,A}) where {N,D,A} = show(io, "text/plain", x) +Base.print(io::IO, x::MixedUnits) = show(io, "text/plain", x) +Base.print(io::IO, x::LogScaled) = show(io, "text/plain", x) +Base.print(io::IO, x::IsRootPowerRatio) = show(io, "text/plain", x) From a6093e0a3720ac33d65126e3c4c960224c3cf3c2 Mon Sep 17 00:00:00 2001 From: anand jain <33790004+anandijain@users.noreply.github.com> Date: Mon, 26 Jul 2021 14:51:54 -0400 Subject: [PATCH 6/9] Update test/runtests.jl Co-authored-by: Sebastian Stock <42280794+sostock@users.noreply.github.com> --- test/runtests.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 4cd61cca..50b9d8fe 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1304,8 +1304,8 @@ end @test string(NoDims) == "NoDims" end @testset ":fancy_exponent IOContext property" begin - @test sprint(io -> show(IOContext(io, :fancy_exponent => true), u"m/s")) == "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}()" - @test sprint(io -> show(IOContext(io, :fancy_exponent => false), u"m/s")) == "FreeUnits{(Unitful.Unit{:Meter, Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1),)}()}(0, 1//1), Unitful.Unit{:Second, Unitful.Dimensions{(Unitful.Dimension{:Time}(1//1),)}()}(0, -1//1)), Unitful.Dimensions{(Unitful.Dimension{:Length}(1//1), Unitful.Dimension{:Time}(-1//1))}(), nothing}()" + @test sprint(print, u"m/s", context = :fancy_exponent => true) == "m sā»Ā¹" + @test sprint(print, u"m/s", context = :fancy_exponent => false) == "m s^-1" end end From 318149c9ace32d453ccae0d5dd2158d57f27bc51 Mon Sep 17 00:00:00 2001 From: anand jain <33790004+anandijain@users.noreply.github.com> Date: Mon, 26 Jul 2021 14:52:00 -0400 Subject: [PATCH 7/9] Update test/runtests.jl Co-authored-by: Sebastian Stock <42280794+sostock@users.noreply.github.com> --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index 50b9d8fe..b5f40287 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1692,7 +1692,7 @@ end end @test Unitful.abbr(3u"dBm") == "dBm" @test Unitful.abbr(@dB 3V/1.241V) == "dB (1.241 V)" - @test repr("text/plain", 360Ā°) == "360Ā°" + @test string(360Ā°) == "360Ā°" end @testset "> Thanks for signing up for Log Facts!" begin From 7cd386296065ef92823c2d52db0eef316bf72841 Mon Sep 17 00:00:00 2001 From: anand jain <33790004+anandijain@users.noreply.github.com> Date: Mon, 26 Jul 2021 14:52:56 -0400 Subject: [PATCH 8/9] Update src/utils.jl Co-authored-by: Sebastian Stock <42280794+sostock@users.noreply.github.com> --- src/utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.jl b/src/utils.jl index f3368576..526effe8 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -236,7 +236,7 @@ struct DimensionError <: Exception end Base.showerror(io::IO, e::DimensionError) = - print(io, "DimensionError: $(string(e.x)) and $(string(e.y)) are not dimensionally compatible."); + print(io, "DimensionError: ", e.x, " and ", e.y, " are not dimensionally compatible."); """ struct AffineError <: Exception From 9caac72127824c451c450adaba596754a62d14b1 Mon Sep 17 00:00:00 2001 From: anand jain <33790004+anandijain@users.noreply.github.com> Date: Mon, 26 Jul 2021 14:53:01 -0400 Subject: [PATCH 9/9] Update src/utils.jl Co-authored-by: Sebastian Stock <42280794+sostock@users.noreply.github.com> --- src/utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.jl b/src/utils.jl index 526effe8..28eba172 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -246,4 +246,4 @@ struct AffineError <: Exception x end -Base.showerror(io::IO, e::AffineError) = print(io, "AffineError: $(string(e.x))") +Base.showerror(io::IO, e::AffineError) = print(io, "AffineError: ", e.x)