Skip to content
Open
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "VisualizationBase"
uuid = "19e8930c-b694-45c7-b48f-ae1a17da5712"
version = "0.1.1"
authors = ["ITensor developers <support@itensor.org> and contributors"]
version = "0.1.0"

[deps]
BackendSelection = "680c2d7c-f67a-4cc9-ae9c-da132b1447a5"
Expand Down
22 changes: 11 additions & 11 deletions docs/make.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@ using VisualizationBase: VisualizationBase
using Documenter: Documenter, DocMeta, deploydocs, makedocs

DocMeta.setdocmeta!(
VisualizationBase, :DocTestSetup, :(using VisualizationBase); recursive=true
VisualizationBase, :DocTestSetup, :(using VisualizationBase); recursive = true
)

include("make_index.jl")

makedocs(;
modules=[VisualizationBase],
authors="ITensor developers <support@itensor.org> and contributors",
sitename="VisualizationBase.jl",
format=Documenter.HTML(;
canonical="https://itensor.github.io/VisualizationBase.jl",
edit_link="main",
assets=["assets/favicon.ico", "assets/extras.css"],
),
pages=["Home" => "index.md", "Reference" => "reference.md"],
modules = [VisualizationBase],
authors = "ITensor developers <support@itensor.org> and contributors",
sitename = "VisualizationBase.jl",
format = Documenter.HTML(;
canonical = "https://itensor.github.io/VisualizationBase.jl",
edit_link = "main",
assets = ["assets/favicon.ico", "assets/extras.css"],
),
pages = ["Home" => "index.md", "Reference" => "reference.md"],
)

deploydocs(;
repo="github.com/ITensor/VisualizationBase.jl", devbranch="main", push_preview=true
repo = "github.com/ITensor/VisualizationBase.jl", devbranch = "main", push_preview = true
)
16 changes: 8 additions & 8 deletions docs/make_index.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@ using Literate: Literate
using VisualizationBase: VisualizationBase

function ccq_logo(content)
include_ccq_logo = """
include_ccq_logo = """
```@raw html
<img class="display-light-only" src="assets/CCQ.png" width="20%" alt="Flatiron Center for Computational Quantum Physics logo."/>
<img class="display-dark-only" src="assets/CCQ-dark.png" width="20%" alt="Flatiron Center for Computational Quantum Physics logo."/>
```
"""
content = replace(content, "{CCQ_LOGO}" => include_ccq_logo)
return content
content = replace(content, "{CCQ_LOGO}" => include_ccq_logo)
return content
end

Literate.markdown(
joinpath(pkgdir(VisualizationBase), "examples", "README.jl"),
joinpath(pkgdir(VisualizationBase), "docs", "src");
flavor=Literate.DocumenterFlavor(),
name="index",
postprocess=ccq_logo,
joinpath(pkgdir(VisualizationBase), "examples", "README.jl"),
joinpath(pkgdir(VisualizationBase), "docs", "src");
flavor = Literate.DocumenterFlavor(),
name = "index",
postprocess = ccq_logo,
)
16 changes: 8 additions & 8 deletions docs/make_readme.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@ using Literate: Literate
using VisualizationBase: VisualizationBase

function ccq_logo(content)
include_ccq_logo = """
include_ccq_logo = """
<picture>
<source media="(prefers-color-scheme: dark)" width="20%" srcset="docs/src/assets/CCQ-dark.png">
<img alt="Flatiron Center for Computational Quantum Physics logo." width="20%" src="docs/src/assets/CCQ.png">
</picture>
"""
content = replace(content, "{CCQ_LOGO}" => include_ccq_logo)
return content
content = replace(content, "{CCQ_LOGO}" => include_ccq_logo)
return content
end

Literate.markdown(
joinpath(pkgdir(VisualizationBase), "examples", "README.jl"),
joinpath(pkgdir(VisualizationBase));
flavor=Literate.CommonMarkFlavor(),
name="README",
postprocess=ccq_logo,
joinpath(pkgdir(VisualizationBase), "examples", "README.jl"),
joinpath(pkgdir(VisualizationBase));
flavor = Literate.CommonMarkFlavor(),
name = "README",
postprocess = ccq_logo,
)
2 changes: 1 addition & 1 deletion examples/README.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# # VisualizationBase.jl
#
#
# [![Stable](https://img.shields.io/badge/docs-stable-blue.svg)](https://itensor.github.io/VisualizationBase.jl/stable/)
# [![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://itensor.github.io/VisualizationBase.jl/dev/)
# [![Build Status](https://github.com/ITensor/VisualizationBase.jl/actions/workflows/Tests.yml/badge.svg?branch=main)](https://github.com/ITensor/VisualizationBase.jl/actions/workflows/Tests.yml?query=branch%3Amain)
Expand Down
84 changes: 42 additions & 42 deletions src/VisualizationBase.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,71 +5,71 @@ 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′)...)); $(esc(x)))
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′)...)); $(esc(x)))
end

function visualize(io::IO, x; backend=Backend"Default", name=nothing, kwargs...)
return visualize(io, to_backend(backend; kwargs...), x; name)
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)
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::AbstractBackend, x; name=nothing)
name = get(backend, :name, name)
if isnothing(name)
visualize_unnamed(io, backend, x)
function visualize(io::IO, backend::AbstractBackend, x; name = nothing)
name = get(backend, :name, name)
if isnothing(name)
visualize_unnamed(io, backend, x)
return nothing
end
visualize_named(io, backend, name, x)
return nothing
end
visualize_named(io, backend, name, x)
return nothing
end

function visualize(backend::Backend"Default", x; name=nothing)
io = get(backend, :io, stdout)
visualize(io, backend, x; name)
return nothing
function visualize(backend::Backend"Default", x; name = nothing)
io = get(backend, :io, stdout)
visualize(io, backend, x; name)
return nothing
end

function visualize_named(io::IO, backend::Backend"Default", name, x)
mime = get(backend, :mime, MIME"text/plain"())
println(io, name, " = ")
show_indented(io, mime, x)
println(io)
return nothing
mime = get(backend, :mime, MIME"text/plain"())
println(io, name, " = ")
show_indented(io, mime, x)
println(io)
return nothing
end

function visualize_unnamed(io::IO, ::Backend"Default", x)
show(io, MIME"text/plain"(), x)
println(io)
return nothing
show(io, MIME"text/plain"(), x)
println(io)
return nothing
end

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
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 to_backend(::Type{B}; kwargs...) where {B}
return B(; kwargs...)
return B(; kwargs...)
end
function to_backend(backend::Union{Symbol,String}; kwargs...)
return Backend(backend; kwargs...)
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
isempty(kwargs) ||
throw(ArgumentError("Keyword arguments must be passed as part of the backend object."))
return backend
end

end
80 changes: 41 additions & 39 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,60 +6,62 @@ using Suppressor: Suppressor
const pat = r"(?:--group=)(\w+)"
arg_id = findfirst(contains(pat), ARGS)
const GROUP = uppercase(
if isnothing(arg_id)
get(ENV, "GROUP", "ALL")
else
only(match(pat, ARGS[arg_id]).captures)
end,
if isnothing(arg_id)
get(ENV, "GROUP", "ALL")
else
only(match(pat, ARGS[arg_id]).captures)
end,
)

"match files of the form `test_*.jl`, but exclude `*setup*.jl`"
function istestfile(fn)
return endswith(fn, ".jl") && startswith(basename(fn), "test_") && !contains(fn, "setup")
return endswith(fn, ".jl") && startswith(basename(fn), "test_") && !contains(fn, "setup")
end
"match files of the form `*.jl`, but exclude `*_notest.jl` and `*setup*.jl`"
function isexamplefile(fn)
return endswith(fn, ".jl") && !endswith(fn, "_notest.jl") && !contains(fn, "setup")
return endswith(fn, ".jl") && !endswith(fn, "_notest.jl") && !contains(fn, "setup")
end

@time begin
# tests in groups based on folder structure
for testgroup in filter(isdir, readdir(@__DIR__))
if GROUP == "ALL" || GROUP == uppercase(testgroup)
groupdir = joinpath(@__DIR__, testgroup)
for file in filter(istestfile, readdir(groupdir))
filename = joinpath(groupdir, file)
@eval @safetestset $file begin
include($filename)
# tests in groups based on folder structure
for testgroup in filter(isdir, readdir(@__DIR__))
if GROUP == "ALL" || GROUP == uppercase(testgroup)
groupdir = joinpath(@__DIR__, testgroup)
for file in filter(istestfile, readdir(groupdir))
filename = joinpath(groupdir, file)
@eval @safetestset $file begin
include($filename)
end
end
end
end
end
end

# single files in top folder
for file in filter(istestfile, readdir(@__DIR__))
(file == basename(@__FILE__)) && continue # exclude this file to avoid infinite recursion
@eval @safetestset $file begin
include($file)
# single files in top folder
for file in filter(istestfile, readdir(@__DIR__))
(file == basename(@__FILE__)) && continue # exclude this file to avoid infinite recursion
@eval @safetestset $file begin
include($file)
end
end
end

# test examples
examplepath = joinpath(@__DIR__, "..", "examples")
for (root, _, files) in walkdir(examplepath)
contains(chopprefix(root, @__DIR__), "setup") && continue
for file in filter(isexamplefile, files)
filename = joinpath(root, file)
@eval begin
@safetestset $file begin
$(Expr(
:macrocall,
GlobalRef(Suppressor, Symbol("@suppress")),
LineNumberNode(@__LINE__, @__FILE__),
:(include($filename)),
))
# test examples
examplepath = joinpath(@__DIR__, "..", "examples")
for (root, _, files) in walkdir(examplepath)
contains(chopprefix(root, @__DIR__), "setup") && continue
for file in filter(isexamplefile, files)
filename = joinpath(root, file)
@eval begin
@safetestset $file begin
$(
Expr(
:macrocall,
GlobalRef(Suppressor, Symbol("@suppress")),
LineNumberNode(@__LINE__, @__FILE__),
:(include($filename)),
)
)
end
end
end
end
end
end
end
2 changes: 1 addition & 1 deletion test/test_aqua.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ using Aqua: Aqua
using Test: @testset

@testset "Code quality (Aqua.jl)" begin
Aqua.test_all(VisualizationBase)
Aqua.test_all(VisualizationBase)
end
20 changes: 10 additions & 10 deletions test/test_basics.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ using VisualizationBase: VisualizationBase, @visualize, visualize
using Test: @test, @testset

@testset "VisualizationBase" begin
x = [2, 3]
@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) ==
"y = \n 2-element Vector{Int64}:\n 2\n 3\n"
@test sprint((io, x) -> @visualize(x, io=io), x) ==
"x = \n 2-element Vector{Int64}:\n 2\n 3\n"
@test sprint((io, x) -> @visualize(x, io=io, name="y"), x) ==
"y = \n 2-element Vector{Int64}:\n 2\n 3\n"
x = [2, 3]
@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) ==
"y = \n 2-element Vector{Int64}:\n 2\n 3\n"
@test sprint((io, x) -> @visualize(x, io = io), x) ==
"x = \n 2-element Vector{Int64}:\n 2\n 3\n"
@test sprint((io, x) -> @visualize(x, io = io, name = "y"), x) ==
"y = \n 2-element Vector{Int64}:\n 2\n 3\n"
end