Makie.jl icon indicating copy to clipboard operation
Makie.jl copied to clipboard

Provide suggestions for unknown kwargs passed to blocks

Open DanielVandH opened this issue 5 months ago • 12 comments

Description

Fixes #4391. There might be a better way to do what I'm doing here, but at least it's something to test with instead of my code snippets on that issue.

Adds a check to block constructors to see if the passed kwargs are all valid. Reuses the InvalidAttributeError code. Some examples:

julia> fig = Figure(); ax = Axis(fig[1, 1], badkwarg = 1, badkwarg2 = 2, xlabel = "x")
ERROR: Invalid attributes badkwarg and badkwarg2 for block type Axis.

The available block attributes for Axis are:

alignmode           leftspinevisible    subtitlevisible  topspinevisible   xlabelpadding      xminorticksvisible  xticklabelfont      xzoomkey          ylabelrotation      yminortickwidth  yticklabelpad       yzoomlock  
aspect              limits              tellheight       valign            xlabelrotation     xminortickwidth     xticklabelpad       xzoomlock         ylabelsize          ypankey          yticklabelrotation  zoombutton 
autolimitaspect     panbutton           tellwidth        width             xlabelsize         xpankey             xticklabelrotation  yautolimitmargin  ylabelvisible       ypanlock         yticklabelsize
backgroundcolor     rightspinecolor     title            xautolimitmargin  xlabelvisible      xpanlock            xticklabelsize      yaxisposition     yminorgridcolor     yrectzoom        yticklabelspace
bottomspinecolor    rightspinevisible   titlealign       xaxisposition     xminorgridcolor    xrectzoom           xticklabelspace     ygridcolor        yminorgridstyle     yreversed        yticklabelsvisible
bottomspinevisible  spinewidth          titlecolor       xgridcolor        xminorgridstyle    xreversed           xticklabelsvisible  ygridstyle        yminorgridvisible   yscale           yticks
dim1_conversion     subtitle            titlefont        xgridstyle        xminorgridvisible  xscale              xticks              ygridvisible      yminorgridwidth     ytickalign       yticksize
dim2_conversion     subtitlecolor       titlegap         xgridvisible      xminorgridwidth    xtickalign          xticksize           ygridwidth        yminortickalign     ytickcolor       yticksmirrored
flip_ylabel         subtitlefont        titlelineheight  xgridwidth        xminortickalign    xtickcolor          xticksmirrored      ylabel            yminortickcolor     ytickformat      yticksvisible
halign              subtitlegap         titlesize        xlabel            xminortickcolor    xtickformat         xticksvisible       ylabelcolor       yminorticks         yticklabelalign  ytickwidth
height              subtitlelineheight  titlevisible     xlabelcolor       xminorticks        xticklabelalign     xtickwidth          ylabelfont        yminorticksize      yticklabelcolor  ytrimspine
leftspinecolor      subtitlesize        topspinecolor    xlabelfont        xminorticksize     xticklabelcolor     xtrimspine          ylabelpadding     yminorticksvisible  yticklabelfont   yzoomkey


Stacktrace:
 [1] _check_remaining_kwargs(T::Type{Axis}, kwdict::Dict{Symbol, Any})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:298
 [2] _block(T::Type{…}, fig_or_scene::Figure, args::Vector{…}, kwdict::Dict{…}, bbox::Nothing; kwdict_complete::Bool)
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:316
 [3] _block
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:303 [inlined]
 [4] #_block#1490
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:259 [inlined]
 [5] _block(::Type{Axis}, ::GridPosition; kwargs::@Kwargs{badkwarg::Int64, badkwarg2::Int64, xlabel::String})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:253
 [6] _block
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:246 [inlined]
 [7] #_#1488
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:237 [inlined]
 [8] top-level scope
   @ REPL[25]:1
Some type information was truncated. Use `show(err)` to see complete types.

julia> lines([2.0], [2.0], axis = (xlabel="x", bad = 1, bad2 = [2]))
ERROR: Invalid attributes bad and bad2 for block type Axis.

The available block attributes for Axis are:

alignmode           leftspinevisible    subtitlevisible  topspinevisible   xlabelpadding      xminorticksvisible  xticklabelfont      xzoomkey          ylabelrotation      yminortickwidth  yticklabelpad       yzoomlock  
aspect              limits              tellheight       valign            xlabelrotation     xminortickwidth     xticklabelpad       xzoomlock         ylabelsize          ypankey          yticklabelrotation  zoombutton 
autolimitaspect     panbutton           tellwidth        width             xlabelsize         xpankey             xticklabelrotation  yautolimitmargin  ylabelvisible       ypanlock         yticklabelsize
backgroundcolor     rightspinecolor     title            xautolimitmargin  xlabelvisible      xpanlock            xticklabelsize      yaxisposition     yminorgridcolor     yrectzoom        yticklabelspace
bottomspinecolor    rightspinevisible   titlealign       xaxisposition     xminorgridcolor    xrectzoom           xticklabelspace     ygridcolor        yminorgridstyle     yreversed        yticklabelsvisible
bottomspinevisible  spinewidth          titlecolor       xgridcolor        xminorgridstyle    xreversed           xticklabelsvisible  ygridstyle        yminorgridvisible   yscale           yticks
dim1_conversion     subtitle            titlefont        xgridstyle        xminorgridvisible  xscale              xticks              ygridvisible      yminorgridwidth     ytickalign       yticksize
dim2_conversion     subtitlecolor       titlegap         xgridvisible      xminorgridwidth    xtickalign          xticksize           ygridwidth        yminortickalign     ytickcolor       yticksmirrored
flip_ylabel         subtitlefont        titlelineheight  xgridwidth        xminortickalign    xtickcolor          xticksmirrored      ylabel            yminortickcolor     ytickformat      yticksvisible
halign              subtitlegap         titlesize        xlabel            xminortickcolor    xtickformat         xticksvisible       ylabelcolor       yminorticks         yticklabelalign  ytickwidth
height              subtitlelineheight  titlevisible     xlabelcolor       xminorticks        xticklabelalign     xtickwidth          ylabelfont        yminorticksize      yticklabelcolor  ytrimspine
leftspinecolor      subtitlesize        topspinecolor    xlabelfont        xminorticksize     xticklabelcolor     xtrimspine          ylabelpadding     yminorticksvisible  yticklabelfont   yzoomkey


Stacktrace:
 [1] _check_remaining_kwargs(T::Type{Axis}, kwdict::Dict{Symbol, Any})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:298
 [2] _block(T::Type{…}, fig_or_scene::Figure, args::Vector{…}, kwdict::Dict{…}, bbox::Nothing; kwdict_complete::Bool)
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:316
 [3] _block(T::Type{Axis}, fig_or_scene::Figure, args::Vector{Any}, kwdict::Dict{Symbol, Any}, bbox::Nothing)
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:303
 [4] create_axis_for_plot(figure::Figure, plot::Lines{Tuple{Vector{Point{2, Float64}}}}, attributes::Dict{Symbol, Any})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\figureplotting.jl:107
 [5] create_axis_like(plot::Lines{Tuple{Vector{Point{2, Float64}}}}, attributes::Dict{Symbol, Any}, ::Nothing)
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\figureplotting.jl:199
 [6] _create_plot(::Function, ::Dict{Symbol, Any}, ::Vector{Float64}, ::Vararg{Vector{Float64}})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\figureplotting.jl:317
 [7] lines(::Vector{Float64}, ::Vararg{Vector{…}}; kw::@Kwargs{axis::@NamedTuple{…}})
   @ MakieCore c:\Users\danjv\.julia\dev\Makie.jl\MakieCore\src\recipes.jl:449
 [8] top-level scope
   @ REPL[26]:1
Some type information was truncated. Use `show(err)` to see complete types.

julia> Label(fig[1,1], bad = 1)
ERROR: Invalid attribute bad for block type Label.

The available block attributes for Label are:

alignmode  color  font  fontsize  halign  height  justification  lineheight  padding  rotation  tellheight  tellwidth  text  valign  visible  width  word_wrap


Stacktrace:
 [1] _check_remaining_kwargs(T::Type{Label}, kwdict::Dict{Symbol, Any})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:298
 [2] _block(T::Type{…}, fig_or_scene::Figure, args::Vector{…}, kwdict::Dict{…}, bbox::Nothing; kwdict_complete::Bool)
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:316
 [3] _block
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:303 [inlined]
 [4] #_block#1490
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:259 [inlined]
 [5] _block(::Type{Label}, ::GridPosition; kwargs::@Kwargs{bad::Int64})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:253
 [6] _block
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:246 [inlined]
 [7] #_#1488
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:237 [inlined]
 [8] top-level scope
   @ REPL[27]:1
Some type information was truncated. Use `show(err)` to see complete types.

julia> Axis3(fig[1, 1], blah = "1")
ERROR: Invalid attribute blah for block type Axis3.

The available block attributes for Axis3 are:

alignmode        limits           titlegap          xlabel          xspinecolor_2    xticklabelsvisible  ygridcolor      ylabelvisible    yticklabelfont      zautolimitmargin  zlabelsize      zticklabelcolor
aspect           perspectiveness  titlesize         xlabelalign     xspinecolor_3    xticks              ygridvisible    yreversed        yticklabelpad       zgridcolor        zlabelvisible   zticklabelfont
azimuth          protrusions      titlevisible      xlabelcolor     xspinesvisible   xticksize           ygridwidth      yspinecolor_1    yticklabelsize      zgridvisible      zreversed       zticklabelpad
backgroundcolor  targetlimits     valign            xlabelfont      xspinewidth      xticksvisible       ylabel          yspinecolor_2    yticklabelsvisible  zgridwidth        zspinecolor_1   zticklabelsize
dim1_conversion  tellheight       viewmode          xlabeloffset    xtickcolor       xtickwidth          ylabelalign     yspinecolor_3    yticks              zlabel            zspinecolor_2   zticklabelsvisible
dim2_conversion  tellwidth        width             xlabelrotation  xtickformat      xypanelcolor        ylabelcolor     yspinesvisible   yticksize           zlabelalign       zspinecolor_3   zticks
dim3_conversion  title            xautolimitmargin  xlabelsize      xticklabelcolor  xypanelvisible      ylabelfont      yspinewidth      yticksvisible       zlabelcolor       zspinesvisible  zticksize
elevation        titlealign       xgridcolor        xlabelvisible   xticklabelfont   xzpanelcolor        ylabeloffset    ytickcolor       ytickwidth          zlabelfont        zspinewidth     zticksvisible
halign           titlecolor       xgridvisible      xreversed       xticklabelpad    xzpanelvisible      ylabelrotation  ytickformat      yzpanelcolor        zlabeloffset      ztickcolor      ztickwidth
height           titlefont        xgridwidth        xspinecolor_1   xticklabelsize   yautolimitmargin    ylabelsize      yticklabelcolor  yzpanelvisible      zlabelrotation    ztickformat


Stacktrace:
 [1] _check_remaining_kwargs(T::Type{Axis3}, kwdict::Dict{Symbol, Any})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:298
 [2] _block(T::Type{…}, fig_or_scene::Figure, args::Vector{…}, kwdict::Dict{…}, bbox::Nothing; kwdict_complete::Bool)
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:316
 [3] _block
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:303 [inlined]
 [4] #_block#1490
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:259 [inlined]
 [5] _block(::Type{Axis3}, ::GridPosition; kwargs::@Kwargs{blah::String})
   @ Makie c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:253
 [6] _block
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:246 [inlined]
 [7] #_#1488
   @ c:\Users\danjv\.julia\dev\Makie.jl\src\makielayout\blocks.jl:237 [inlined]
 [8] top-level scope
   @ REPL[28]:1
Some type information was truncated. Use `show(err)` to see complete types.

I wanted to get #4390 here too, but Figure isn't a block... the bad keyword arguments are just passed into Scene, e.g.

julia> Figure(bad=1).scene.theme[:bad]
Observable{Any}(1)

Not sure if that's a simple fix. I've never used themes. So, I won't address it here and keep it simple.

Type of change

  • [x] Bug fix (non-breaking change which fixes an issue)

Checklist

  • [x] Added an entry in CHANGELOG.md (for new features and breaking changes)
  • [x] Added unit tests for new algorithms, conversion methods, etc.

DanielVandH avatar Sep 20 '24 22:09 DanielVandH