From 84e6b609b7d95f683153ad6ae6a909a4eb324b02 Mon Sep 17 00:00:00 2001 From: mtfishman Date: Wed, 21 May 2025 13:22:25 -0400 Subject: [PATCH 1/3] Initialize implementation of visualize --- Project.toml | 4 +++ src/VisualizationBase.jl | 72 +++++++++++++++++++++++++++++++++++++++- test/Project.toml | 2 ++ test/test_basics.jl | 12 +++++-- 4 files changed, 87 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index bbf7ed3..975593a 100644 --- a/Project.toml +++ b/Project.toml @@ -3,5 +3,9 @@ uuid = "19e8930c-b694-45c7-b48f-ae1a17da5712" authors = ["ITensor developers and contributors"] version = "0.1.0" +[deps] +BackendSelection = "680c2d7c-f67a-4cc9-ae9c-da132b1447a5" + [compat] +BackendSelection = "0.1.5" julia = "1.10" diff --git a/src/VisualizationBase.jl b/src/VisualizationBase.jl index 7242c1e..ac1f973 100644 --- a/src/VisualizationBase.jl +++ b/src/VisualizationBase.jl @@ -1,5 +1,75 @@ module VisualizationBase -# Write your package code here. +using BackendSelection: @Backend_str, AbstractBackend, Backend + +export @visualize, visualize + +macro visualize(x, kwargs...) + all(kwarg -> Meta.isexpr(kwarg, :(=)), kwargs) || + throw(ArgumentError("All keyword arguments must be of the form `kw=value`.")) + kwargs′ = if all(kwarg -> kwarg.args[1] ≠ :name, kwargs) + (kwargs..., :(name=$(string(x)))) + else + kwargs + end + return :(visualize($(esc(x)); $(esc.(kwargs′)...))) +end + +function visualize(io::IO, x; backend=Backend"Default", name=nothing, kwargs...) + return visualize(io, to_backend(backend; kwargs...), x; name) +end + +function visualize(x; backend=Backend"Default", name=nothing, io::IO=stdout, kwargs...) + return visualize(io, to_backend(backend; kwargs...), x; name) +end + +function visualize(io::IO, backend::Backend"Default", x; name=nothing) + name = get(backend, :name, name) + if !isnothing(name) + return show_named(io, MIME"text/plain"(), name => x) + end + return show(io, MIME"text/plain"(), x) +end + +function visualize(backend::Backend"Default", x; name=nothing) + io = get(backend, :io, stdout) + return visualize(io, backend, x; name) +end + +function show_named(io::IO, mime, (name, x)) + println(io, name, " = ") + return show_indented(io, mime, x) +end +function show_named(io::IO, named_x) + return show_named(io, MIME"text/plain"(), named_x) +end +function show_named(named_x) + return show_named(stdout, named_x) +end + +function show_indented(io::IO, mime, x; indent=" ") + str = sprint(show, mime, x) + str = join((indent * s for s in split(str, '\n')), '\n') + print(io, str) + return nothing +end +function show_indented(io::IO, x; kwargs...) + return show_indented(io, MIME"text/plain"(), x; indent) +end +function show_indented(x; kwargs...) + return show_indented(stdout, x; kwargs...) +end + +function to_backend(::Type{B}; kwargs...) where {B} + return B(; kwargs...) +end +function to_backend(backend::Union{Symbol,String}; kwargs...) + return Backend(backend; kwargs...) +end +function to_backend(backend::AbstractBackend; kwargs...) + isempty(kwargs) || + throw(ArgumentError("Keyword arguments must be passed as part of the backend object.")) + return backend +end end diff --git a/test/Project.toml b/test/Project.toml index 4a2f3ab..17789c4 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,8 +1,10 @@ [deps] Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +BackendSelection = "680c2d7c-f67a-4cc9-ae9c-da132b1447a5" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +TestExtras = "5ed8adda-3752-4e41-b88a-e8b09835ee3a" VisualizationBase = "19e8930c-b694-45c7-b48f-ae1a17da5712" [compat] diff --git a/test/test_basics.jl b/test/test_basics.jl index 2c4019f..4fd1370 100644 --- a/test/test_basics.jl +++ b/test/test_basics.jl @@ -1,6 +1,14 @@ -using VisualizationBase: VisualizationBase +using VisualizationBase: VisualizationBase, visualize using Test: @test, @testset +using TestExtras: @constinferred @testset "VisualizationBase" begin - # Tests go here. + x = [2, 3] + @test sprint(visualize, x) == sprint(show, MIME"text/plain"(), x) + @test sprint((io, x) -> visualize(io, x; name="y"), x) == + sprint(VisualizationBase.show_named, "y" => x) + @test sprint((io, x) -> @visualize(x, io=io), x) == + sprint(VisualizationBase.show_named, "x" => x) + @test sprint((io, x) -> @visualize(x, io=io, name="y"), x) == + sprint(VisualizationBase.show_named, "y" => x) end From 53c3f47ab61f740ec61f594d283c442e02c24ebb Mon Sep 17 00:00:00 2001 From: mtfishman Date: Wed, 21 May 2025 13:25:41 -0400 Subject: [PATCH 2/3] Fix tests --- test/Project.toml | 2 +- test/test_basics.jl | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/test/Project.toml b/test/Project.toml index 17789c4..71752c7 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -4,11 +4,11 @@ BackendSelection = "680c2d7c-f67a-4cc9-ae9c-da132b1447a5" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -TestExtras = "5ed8adda-3752-4e41-b88a-e8b09835ee3a" VisualizationBase = "19e8930c-b694-45c7-b48f-ae1a17da5712" [compat] Aqua = "0.8" +BackendSelection = "0.1" SafeTestsets = "0.1" Suppressor = "0.2" Test = "1.10" diff --git a/test/test_basics.jl b/test/test_basics.jl index 4fd1370..d315c55 100644 --- a/test/test_basics.jl +++ b/test/test_basics.jl @@ -1,6 +1,5 @@ -using VisualizationBase: VisualizationBase, visualize +using VisualizationBase: VisualizationBase, @visualize, visualize using Test: @test, @testset -using TestExtras: @constinferred @testset "VisualizationBase" begin x = [2, 3] From 92149f65c9c89894901786cc8a1281c508abb840 Mon Sep 17 00:00:00 2001 From: mtfishman Date: Wed, 21 May 2025 14:41:24 -0400 Subject: [PATCH 3/3] Add examples, better tests --- README.md | 9 ++++++--- examples/README.jl | 8 ++++++-- src/VisualizationBase.jl | 40 ++++++++++++++++++++-------------------- test/test_basics.jl | 10 ++++++---- 4 files changed, 38 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index eec39c2..7b6c239 100644 --- a/README.md +++ b/README.md @@ -42,10 +42,13 @@ julia> Pkg.add("VisualizationBase") ## Examples ````julia -using VisualizationBase: VisualizationBase -```` +using VisualizationBase: @visualize +using Test: @test -Examples go here. +x = [2, 3] +y = @visualize x +@test x === y +```` --- diff --git a/examples/README.jl b/examples/README.jl index f0763e1..e103b12 100644 --- a/examples/README.jl +++ b/examples/README.jl @@ -43,5 +43,9 @@ julia> Pkg.add("VisualizationBase") # ## Examples -using VisualizationBase: VisualizationBase -# Examples go here. +using VisualizationBase: @visualize +using Test: @test + +x = [2, 3] +y = @visualize x +@test x === y diff --git a/src/VisualizationBase.jl b/src/VisualizationBase.jl index ac1f973..fd7cb85 100644 --- a/src/VisualizationBase.jl +++ b/src/VisualizationBase.jl @@ -12,7 +12,7 @@ macro visualize(x, kwargs...) else kwargs end - return :(visualize($(esc(x)); $(esc.(kwargs′)...))) + return :(visualize($(esc(x)); $(esc.(kwargs′)...)); $(esc(x))) end function visualize(io::IO, x; backend=Backend"Default", name=nothing, kwargs...) @@ -23,42 +23,42 @@ function visualize(x; backend=Backend"Default", name=nothing, io::IO=stdout, kwa return visualize(io, to_backend(backend; kwargs...), x; name) end -function visualize(io::IO, backend::Backend"Default", x; name=nothing) +function visualize(io::IO, backend::AbstractBackend, x; name=nothing) name = get(backend, :name, name) - if !isnothing(name) - return show_named(io, MIME"text/plain"(), name => x) + if isnothing(name) + visualize_unnamed(io, backend, x) + return nothing end - return show(io, MIME"text/plain"(), x) + visualize_named(io, backend, name, x) + return nothing end function visualize(backend::Backend"Default", x; name=nothing) io = get(backend, :io, stdout) - return visualize(io, backend, x; name) + visualize(io, backend, x; name) + return nothing end -function show_named(io::IO, mime, (name, x)) +function visualize_named(io::IO, backend::Backend"Default", name, x) + mime = get(backend, :mime, MIME"text/plain"()) println(io, name, " = ") - return show_indented(io, mime, x) -end -function show_named(io::IO, named_x) - return show_named(io, MIME"text/plain"(), named_x) + show_indented(io, mime, x) + println(io) + return nothing end -function show_named(named_x) - return show_named(stdout, named_x) + +function visualize_unnamed(io::IO, ::Backend"Default", x) + show(io, MIME"text/plain"(), x) + println(io) + return nothing end -function show_indented(io::IO, mime, x; indent=" ") +function show_indented(io::IO, mime::MIME, x; indent=" ") str = sprint(show, mime, x) str = join((indent * s for s in split(str, '\n')), '\n') print(io, str) return nothing end -function show_indented(io::IO, x; kwargs...) - return show_indented(io, MIME"text/plain"(), x; indent) -end -function show_indented(x; kwargs...) - return show_indented(stdout, x; kwargs...) -end function to_backend(::Type{B}; kwargs...) where {B} return B(; kwargs...) diff --git a/test/test_basics.jl b/test/test_basics.jl index d315c55..3613907 100644 --- a/test/test_basics.jl +++ b/test/test_basics.jl @@ -3,11 +3,13 @@ using Test: @test, @testset @testset "VisualizationBase" begin x = [2, 3] - @test sprint(visualize, x) == sprint(show, MIME"text/plain"(), x) + @test sprint(visualize, x) == + "2-element Vector{Int64}:\n 2\n 3\n" == + sprint((io, x) -> display(TextDisplay(io), x), x) @test sprint((io, x) -> visualize(io, x; name="y"), x) == - sprint(VisualizationBase.show_named, "y" => x) + "y = \n 2-element Vector{Int64}:\n 2\n 3\n" @test sprint((io, x) -> @visualize(x, io=io), x) == - sprint(VisualizationBase.show_named, "x" => x) + "x = \n 2-element Vector{Int64}:\n 2\n 3\n" @test sprint((io, x) -> @visualize(x, io=io, name="y"), x) == - sprint(VisualizationBase.show_named, "y" => x) + "y = \n 2-element Vector{Int64}:\n 2\n 3\n" end