JuliaIO / JuliaIO/FileIO.jl

Confusing error when saving the wrong thing

Open
#347 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Julia
Stars
228
Forks
81
Avg merge
1d 29m
Merged PRs (30d)
1

Description

julia> using CairoMakie

julia> fig = lines(rand(10));

julia> save("test.png", fig) # works
CairoScreen{Cairo.CairoSurfaceBase{UInt32}} with surface:
Cairo.CairoSurfaceBase{UInt32}(Ptr{Nothing} @0x00007fef60cecfa0, 800.0, 600.0)

julia> save("test.png", (fig, )) # wrong argument gives confusing errors
Errors encountered while save FileIO.File{FileIO.DataFormat{:PNG}, String}("test.png").
All errors:
===========================================
ImageIO writer error: neither save nor fileio_save is defined
  due to MethodError(ImageIO.save, (FileIO.File{FileIO.DataFormat{:PNG}, String}("test.png"), (Scene (800px, 600px):
  18 Plots:
    ├ Combined{Makie.poly, Tuple{Vector{Vector{Point{2, Float32}}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ MakieCore.Text{Tuple{String}}
    ├ Lines{Tuple{Vector{Point{2, Float32}}}}
    ├ MakieCore.Text{Tuple{Vector{Tuple{AbstractString, Point{2, Float32}}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ MakieCore.Text{Tuple{String}}
    ├ Lines{Tuple{Vector{Point{2, Float32}}}}
    ├ MakieCore.Text{Tuple{Vector{Tuple{AbstractString, Point{2, Float32}}}}}
    ├ Lines{Tuple{Vector{Point{2, Float32}}}}
    ├ Lines{Tuple{Vector{Point{2, Float32}}}}
    └ MakieCore.Text{Tuple{String}}
  1 Child Scene:
    └ Scene (724px, 541px),)), 0x0000000000007aad)
  Will try next loader.

===========================================
ArgumentError: Package QuartzImageIO [dca85d43-d64c-5e67-8c65-017450d5d020] is required but does not seem to be installed:
 - Run `Pkg.instantiate()` to install all recorded dependencies.

===========================================
ArgumentError: Package ImageMagick [6218d12a-5da1-5696-b52f-db25d2ecc6d1] is required but does not seem to be installed:
 - Run `Pkg.instantiate()` to install all recorded dependencies.

===========================================
ArgumentError: Argument does not support conversion to png.
===========================================

Fatal error:
ERROR: ImageIO writer error: neither save nor fileio_save is defined
  due to MethodError(ImageIO.save, (FileIO.File{FileIO.DataFormat{:PNG}, String}("test.png"), (Scene (800px, 600px):
  18 Plots:
    ├ Combined{Makie.poly, Tuple{Vector{Vector{Point{2, Float32}}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ MakieCore.Text{Tuple{String}}
    ├ Lines{Tuple{Vector{Point{2, Float32}}}}
    ├ MakieCore.Text{Tuple{Vector{Tuple{AbstractString, Point{2, Float32}}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ LineSegments{Tuple{Vector{Point{2, Float32}}}}
    ├ MakieCore.Text{Tuple{String}}
    ├ Lines{Tuple{Vector{Point{2, Float32}}}}
    ├ MakieCore.Text{Tuple{Vector{Tuple{AbstractString, Point{2, Float32}}}}}
    ├ Lines{Tuple{Vector{Point{2, Float32}}}}
    ├ Lines{Tuple{Vector{Point{2, Float32}}}}
    └ MakieCore.Text{Tuple{String}}
  1 Child Scene:
    └ Scene (724px, 541px),)), 0x0000000000007aad)
  Will try next loader.

Stacktrace:
  [1] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
  [2] invokelatest
    @ ./essentials.jl:714 [inlined]
  [3] action(call::Symbol, libraries::Vector{Union{Base.PkgId, Module}}, file::FileIO.Formatted, args::Tuple{Makie.FigureAxisPlot}; options::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ FileIO ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:217
  [4] action
    @ ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:197 [inlined]
  [5] action(call::Symbol, libraries::Vector{Union{Base.PkgId, Module}}, sym::Symbol, file::String, args::Tuple{Makie.FigureAxisPlot}; options::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ FileIO ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:185
  [6] action
    @ ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:185 [inlined]
  [7] #save#20
    @ ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:129 [inlined]
  [8] save(file::String, args::Tuple{Makie.FigureAxisPlot})
    @ FileIO ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:126
  [9] top-level scope
    @ REPL[23]:1
 [10] eval
    @ ./boot.jl:373 [inlined]
 [11] eval_user_input(ast::Any, backend::REPL.REPLBackend)
    @ REPL /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:150
 [12] repl_backend_loop(backend::REPL.REPLBackend)
    @ REPL /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:241
 [13] start_repl_backend(backend::REPL.REPLBackend, consumer::Any)
    @ REPL /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:226
 [14] run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool)
    @ REPL /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:359
 [15] run_repl(repl::REPL.AbstractREPL, consumer::Any)
    @ REPL /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:346
 [16] (::Base.var"#919#921"{Bool, Bool, Bool})(REPL::Module)
    @ Base ./client.jl:394
 [17] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
 [18] invokelatest
    @ ./essentials.jl:714 [inlined]
 [19] run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool)
    @ Base ./client.jl:379
 [20] exec_options(opts::Base.JLOptions)
    @ Base ./client.jl:309
 [21] _start()
    @ Base ./client.jl:495
Stacktrace:
 [1] handle_error(e::FileIO.WriterError, q::Base.PkgId, bt::Vector{Union{Ptr{Nothing}, Base.InterpreterIP}})
   @ FileIO ~/.julia/packages/FileIO/JA3Vl/src/error_handling.jl:61
 [2] handle_exceptions(exceptions::Vector{Tuple{Any, Union{Base.PkgId, Module}, Vector}}, action::String)
   @ FileIO ~/.julia/packages/FileIO/JA3Vl/src/error_handling.jl:56
 [3] action(call::Symbol, libraries::Vector{Union{Base.PkgId, Module}}, file::FileIO.Formatted, args::Tuple{Makie.FigureAxisPlot}; options::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
   @ FileIO ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:226
 [4] action
   @ ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:197 [inlined]
 [5] action(call::Symbol, libraries::Vector{Union{Base.PkgId, Module}}, sym::Symbol, file::String, args::Tuple{Makie.FigureAxisPlot}; options::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
   @ FileIO ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:185
 [6] action
   @ ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:185 [inlined]
 [7] #save#20
   @ ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:129 [inlined]
 [8] save(file::String, args::Tuple{Makie.FigureAxisPlot})
   @ FileIO ~/.julia/packages/FileIO/JA3Vl/src/loadsave.jl:126
 [9] top-level scope
   @ REPL[23]:1

As you can see, save("test.png", fig) works correctly (so in particular, no additional packages need to be installed to save a PNG). However, if you get the second argument wrong (here I pass a tuple containing the figure instead of the figure), the error seems to suggest installing other packages, etc.

I think the right information is there (there's some MethodErrors and Argument does not support conversion to png) but there's also a bunch of what feels to be misleading information, e.g.

ArgumentError: Package QuartzImageIO [dca85d43-d64c-5e67-8c65-017450d5d020] is required but does not seem to be installed:
 - Run `Pkg.instantiate()` to install all recorded dependencies.

seems to be telling me to run Pkg.instantiate() to try to fix the problem, or maybe add QuartzImageIO.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the tuple case from the issue, then inspect FileIO's action path in src/loadsave.jl and error handling in src/error_handling.jl. Compare it with the successful figure save and make the reported failure distinguish the invalid argument from unavailable image loaders without misleading installation guidance; rerun the reproduction to verify the resulting error.

Written by the indexing model from the issue text.

Assessment

Tech stack
julia
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.