Skip to content

Commit 965b005

Browse files
joa-quimclaude
andauthored
kwargs protection: grid processing modules (#1921)
Split entry points from main logic in grid module wrappers so that kwargs are converted to Dict{Symbol,Any} via init_module in thin wrappers before calling the main function. Affected modules: grdblend, grdconvert, grdedit, grdfft, grdfill, grdgradient, grdhisteq, grdinterpolate, grdpaste, grdvolume, greenspline, nearneighbor, surface, triangulate, xyz2grd. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 5b0da01 commit 965b005

15 files changed

Lines changed: 99 additions & 64 deletions

src/grdblend.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,12 @@ Parameters
3939
- $(opt_n)
4040
- $(opt_r)
4141
"""
42-
function grdblend(cmd0::String="", arg1=nothing, arg2=nothing; kwargs...)
42+
function grdblend(cmd0::String="", arg1=nothing, arg2=nothing; kw...)
43+
d = init_module(false, kw...)[1]
44+
grdblend(cmd0, arg1, arg2, d)
45+
end
46+
function grdblend(cmd0::String, arg1, arg2, d::Dict{Symbol, Any})
4347

44-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
4548
cmd, = parse_common_opts(d, "", [:G :I :R :V_params :f :n :r])
4649
cmd = parse_these_opts(cmd, d, [[:C :clobber], [:N :nodata], [:Q :headless], [:W :no_blend], [:Z :scale]])
4750

src/grdconvert.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
44
"""
55
# ---------------------------------------------------------------------------------------------------
6-
function grdconvert(cmd0::AbstractString; kwargs...)::Union{Nothing, GMTgrid, String}
7-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
6+
function grdconvert(cmd0::AbstractString; kw...)::Union{Nothing, GMTgrid, String}
7+
d = init_module(false, kw...)[1]
8+
grdconvert(cmd0, d)
9+
end
10+
function grdconvert(cmd0::AbstractString, d::Dict{Symbol, Any})::Union{Nothing, GMTgrid, String}
811
cmd::String, opt_R::String = parse_R(d, "")
912
cmd, = parse_common_opts(d, cmd, [:G :V_params :f])
1013
cmd = parse_these_opts(cmd, d, [[:C :cmdhist], [:N :no_header], [:Z :scale]])

src/grdedit.jl

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,18 @@ Parameters
4848
- $(_opt_f)
4949
- $(opt_swap_xy)
5050
"""
51-
grdedit(cmd0::String; kwargs...) = grdedit_helper(cmd0, nothing; kwargs...)
52-
grdedit(arg1; kwargs...) = grdedit_helper("", arg1; kwargs...)
51+
grdedit(cmd0::String; kw...) = grdedit_helper(cmd0, nothing; kw...)
52+
grdedit(arg1; kw...) = grdedit_helper("", arg1; kw...)
5353

5454
# ---------------------------------------------------------------------------------------------------
55-
function grdedit_helper(cmd0::String, arg1; kwargs...)
55+
function grdedit_helper(cmd0::String, arg1; kw...)
56+
(isa(arg1, GMTgrid) && length(kw) == 0) && (arg1.range[5:6] .= extrema(arg1); return arg1) # Update the z_min|max
57+
d = init_module(false, kw...)[1]
58+
grdedit_helper(cmd0, arg1, d)
59+
end
60+
function grdedit_helper(cmd0::String, arg1, d::Dict{Symbol, Any})
5661

57-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
5862
arg2 = nothing
59-
(isa(arg1, GMTgrid) && length(kwargs) == 0) && (arg1.range[5:6] .= extrema(arg1); return arg1) # Update the z_min|max
6063

6164
cmd, = parse_common_opts(d, "", [:G :R :V_params :bi :di :e :f :w :yx])
6265
cmd = parse_J(d, cmd, default=" ")[1] # No default J here.

src/grdfft.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@ Parameters
4545
- $(opt_V)
4646
- $(_opt_f)
4747
"""
48-
function grdfft(cmd0::String="", arg1=nothing, arg2=nothing; kwargs...)
49-
50-
(cmd0 == "" && arg1 === nothing && arg2 === nothing && length(kwargs) == 0) && return gmt("grdfft")
51-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
48+
function grdfft(cmd0::String="", arg1=nothing, arg2=nothing; kw...)
49+
(cmd0 == "" && arg1 === nothing && arg2 === nothing && length(kw) == 0) && return gmt("grdfft")
50+
d = init_module(false, kw...)[1]
51+
grdfft(cmd0, arg1, arg2, d)
52+
end
53+
function grdfft(cmd0::String, arg1, arg2, d::Dict{Symbol, Any})
5254

5355
cmd, = parse_common_opts(d, "", [:G :V_params :f])
5456
is_geog = contains(cmd, " -fg")

src/grdfill.jl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@ Parameters
2828
- $(opt_V)
2929
- $(_opt_f)
3030
"""
31-
grdfill(cmd0::String; kwargs...) = grdfill_helper(cmd0, nothing; kwargs...)
32-
grdfill(arg1; kwargs...) = grdfill_helper("", arg1; kwargs...)
31+
grdfill(cmd0::String; kw...) = grdfill_helper(cmd0, nothing; kw...)
32+
grdfill(arg1; kw...) = grdfill_helper("", arg1; kw...)
3333

3434
# ---------------------------------------------------------------------------------------------------
35-
function grdfill_helper(cmd0::String, arg1; kwargs...)
35+
function grdfill_helper(cmd0::String, arg1; kw...)
36+
d = init_module(false, kw...)[1]
37+
grdfill_helper(cmd0, arg1, d)
38+
end
39+
function grdfill_helper(cmd0::String, arg1, d::Dict{Symbol, Any})
3640

37-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
3841
cmd, = parse_common_opts(d, "", [:G :R :V_params :f])
3942
cmd = parse_these_opts(cmd, d, [[:A :mode :algo], [:L :list], [:N :nodata :hole]])
4043

src/grdgradient.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ Parameters
3838
3939
To see the full documentation type: ``@? grdgradient``
4040
"""
41-
function grdgradient(cmd0::String; kwargs...)
42-
d, cmd = grdgrad_helper(;kwargs...)
41+
function grdgradient(cmd0::String; kw...)
42+
d, cmd = grdgrad_helper(;kw...)
4343
common_grd(d, cmd0, cmd, "grdgradient ", nothing) # Finish build cmd and run it
4444
end
4545

46-
function grdgradient(arg1; kwargs...)
47-
d, cmd = grdgrad_helper(;kwargs...)
46+
function grdgradient(arg1; kw...)
47+
d, cmd = grdgrad_helper(;kw...)
4848
common_grd(d, "", cmd, "grdgradient ", arg1) # Finish build cmd and run it
4949
end
5050

src/grdhisteq.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ Parameters
3030
3131
To see the full documentation type: ``@? grdhisteq``
3232
"""
33-
function grdhisteq(cmd0::String; kwargs...)
34-
d, cmd = grdhisteq_helper(; kwargs...)
33+
function grdhisteq(cmd0::String; kw...)
34+
d, cmd = grdhisteq_helper(; kw...)
3535
common_grd(d, cmd0, cmd, "grdhisteq ") # Finish build cmd and run it
3636
end
3737

3838
# ---------------------------------------------------------------------------------------------------
39-
function grdhisteq(arg1; kwargs...)
40-
d, cmd = grdhisteq_helper(; kwargs...)
39+
function grdhisteq(arg1; kw...)
40+
d, cmd = grdhisteq_helper(; kw...)
4141
common_grd(d, "", cmd, "grdhisteq ", arg1) # Finish build cmd and run it
4242
end
4343

src/grdinterpolate.jl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,16 @@ or use `allcols=true`.
5959
6060
To see the full documentation type: ``@? grdinterpolate``
6161
"""
62-
grdinterpolate(cmd0::String; kwargs...) = grdinterp_helper(cmd0, nothing; kwargs...)
63-
grdinterpolate(arg1; kwargs...) = grdinterp_helper("", arg1; kwargs...)
62+
grdinterpolate(cmd0::String; kw...) = grdinterp_helper(cmd0, nothing; kw...)
63+
grdinterpolate(arg1; kw...) = grdinterp_helper("", arg1; kw...)
6464

65-
function grdinterp_helper(cmd0::String, arg1; allcols::Bool=false, gdal=false, kwargs...)
65+
function grdinterp_helper(cmd0::String, arg1; allcols::Bool=false, gdal=false, kw...)
66+
d = init_module(false, kw...)[1]
67+
grdinterp_helper(cmd0, arg1, allcols, gdal, d)
68+
end
69+
function grdinterp_helper(cmd0::String, arg1, allcols::Bool, gdal, d::Dict{Symbol, Any})
6670

6771
arg2 = nothing
68-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
6972

7073
cmd = parse_common_opts(d, "", [:R :V_params :bi :bo :di :e :f :g :h :i :n :o :q :s :yx])[1]
7174
cmd = parse_these_opts(cmd, d, [[:G :outfile :outgrid], [:Z :levels]])

src/grdpaste.jl

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ Parameters
1818
1919
To see the full documentation type: ``@? grdpaste``
2020
"""
21-
function grdpaste(G1::GItype, G2::GItype; kwargs...)
22-
21+
function grdpaste(G1::GItype, G2::GItype; kw...)
2322
(GMTver < v"6.5.0") && (@warn("This module doesn't work for the installed GMT version. Run 'upGMT(true)' to update it."); return nothing)
2423
(G1.layout != "" && G1.layout[2] == 'R') && error("Pasting row oriented grids (such those produced by GDAL) is not implemented.")
25-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
24+
d = init_module(false, kw...)[1]
25+
grdpaste(G1, G2, d)
26+
end
27+
function grdpaste(G1::GItype, G2::GItype, d::Dict{Symbol, Any})
2628
cmd, = parse_common_opts(d, "", [:G :V_params :f])
2729
cmd *= " -S"
2830
side::GMTdataset = common_grd(d, "grdpaste " * cmd, G1, G2) # Finish build cmd and run it
@@ -47,13 +49,16 @@ function grdpaste(G1::GItype, G2::GItype; kwargs...)
4749
end
4850

4951
# ---------------------------------------------------------------------------------------------------
50-
grdpaste(G1::String, G2::GItype; kwargs...) = grdpaste(gmtread(G1), G2; kwargs...)
51-
grdpaste(G1::GItype, G2::String; kwargs...) = grdpaste(G1, gmtread(G2); kwargs...)
52+
grdpaste(G1::String, G2::GItype; kw...) = grdpaste(gmtread(G1), G2; kw...)
53+
grdpaste(G1::GItype, G2::String; kw...) = grdpaste(G1, gmtread(G2); kw...)
5254

5355
# ---------------------------------------------------------------------------------------------------
54-
function grdpaste(G1::String, G2::String; kwargs...)
56+
function grdpaste(G1::String, G2::String; kw...)
5557
# This method lets pass two file names and either return the pasted grid or save in on disk.
56-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
58+
d = init_module(false, kw...)[1]
59+
grdpaste(G1, G2, d)
60+
end
61+
function grdpaste(G1::String, G2::String, d::Dict{Symbol, Any})
5762
cmd, = parse_common_opts(d, "", [:G :V_params :f])
5863
cmd != "" && (cmd = " " * cmd)
5964
gmt("grdpaste " * G1 * " " * G2 * cmd)

src/grdvolume.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@ Parameters
2828
2929
To see the full documentation type: ``@? grdvolume``
3030
"""
31-
function grdvolume(cmd0::String="", arg1=nothing; kwargs...)
31+
function grdvolume(cmd0::String="", arg1=nothing; kw...)
32+
d = init_module(false, kw...)[1]
33+
grdvolume(cmd0, arg1, d)
34+
end
35+
function grdvolume(cmd0::String, arg1, d::Dict{Symbol, Any})
3236

33-
d = init_module(false, kwargs...)[1] # Also checks if the user wants ONLY the HELP mode
3437
cmd, = parse_common_opts(d, "", [:R :V_params :f :o])
3538
cmd = parse_these_opts(cmd, d, [[:C :cont :contour], [:D :diff :difference], [:L :base_level :baselevel], [:S :unit], [:T :find_max :findmax], [:Z :scale]])
3639
common_grd(d, cmd0, cmd, "grdvolume ", arg1) # Finish build cmd and run it

0 commit comments

Comments
 (0)