Skip to content

Commit 1c03d17

Browse files
committed
fix Julia v1.10: hasmethod(f, t)
1 parent 979ad39 commit 1c03d17

7 files changed

+33
-28
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "Pipelines"
22
uuid = "ef544631-5c6f-4e9b-994c-12e7a4cd724c"
33
authors = ["Jiacheng Chuan <[email protected]>"]
4-
version = "0.10.4"
4+
version = "0.10.5"
55

66
[deps]
77
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"

docs/src/changelog.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Change Log
22

3+
## v0.10.5
4+
5+
- Compat: Julia v1.10: `hasmethod(f, t)` in Julia v1.10 changed its behavior. It affects Program function check. Use `length(methods(f, t))` instead.
6+
37
## v0.10.4
48

59
- Compat: Julia v1.9: init(): change the if statement of printing Base.stdxxx was changed when initiating Pipelines.jl: now detects WindowsRawSocket.

src/CmdProgram.jl

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ mutable struct CmdProgram <: Program
1616

1717
function CmdProgram(name, id_file, info_before, info_after, cmd_dependencies, arg_inputs, validate_inputs, prerequisites, cmd, infer_outputs, arg_outputs, validate_outputs, wrap_up, arg_forward)
1818

19-
check_function_methods(validate_inputs, (Dict, ), "validate_inputs")
20-
check_function_methods(prerequisites, (Dict, Dict), "prerequisites")
21-
check_function_methods(infer_outputs, (Dict, ), "infer_outputs")
22-
check_function_methods(validate_outputs, (Dict, ), "validate_outputs")
23-
check_function_methods(wrap_up, (Dict, Dict), "wrap_up")
19+
check_function_methods(validate_inputs, (Dict{String}, ), "validate_inputs")
20+
check_function_methods(prerequisites, (Dict{String}, Dict{String}), "prerequisites")
21+
check_function_methods(infer_outputs, (Dict{String}, ), "infer_outputs")
22+
check_function_methods(validate_outputs, (Dict{String}, ), "validate_outputs")
23+
check_function_methods(wrap_up, (Dict{String}, Dict{String}), "wrap_up")
2424

2525
arg_forward = parse_arg_forward(arg_forward)
2626
check_arg_forward(arg_forward, arg_inputs, arg_outputs)

src/JuliaProgram.jl

+12-12
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ mutable struct JuliaProgram <: Program
1616

1717
function JuliaProgram(name, id_file, info_before, info_after, cmd_dependencies, arg_inputs, validate_inputs, prerequisites, main, infer_outputs, arg_outputs, validate_outputs, wrap_up, arg_forward)
1818

19-
check_function_methods(validate_inputs, (Dict, ), "validate_inputs")
20-
check_function_methods(prerequisites, (Dict, Dict), "prerequisites")
21-
check_function_methods(main, (Dict, Dict), "main")
22-
check_function_methods(infer_outputs, (Dict, ), "infer_outputs")
23-
check_function_methods(validate_outputs, (Dict, ), "validate_outputs")
24-
check_function_methods(wrap_up, (Dict, Dict), "wrap_up")
19+
check_function_methods(validate_inputs, (Dict{String}, ), "validate_inputs")
20+
check_function_methods(prerequisites, (Dict{String}, Dict{String}), "prerequisites")
21+
check_function_methods(main, (Dict{String}, Dict{String}), "main")
22+
check_function_methods(infer_outputs, (Dict{String}, ), "infer_outputs")
23+
check_function_methods(validate_outputs, (Dict{String}, ), "validate_outputs")
24+
check_function_methods(wrap_up, (Dict{String}, Dict{String}), "wrap_up")
2525

2626
arg_forward = parse_arg_forward(arg_forward)
2727
check_arg_forward(arg_forward, arg_inputs, arg_outputs)
@@ -143,18 +143,18 @@ function JuliaProgram(;
143143
)
144144
# inputs, input_types, default_inputs = parse_default(inputs)
145145
# outputs, output_types, default_outputs = parse_default(outputs)
146-
arg_inputs = parse_arg(inputs)
147-
arg_outputs = parse_arg(outputs)
148-
inputs = String[arg.name for arg in arg_inputs]
149-
outputs = String[arg.name for arg in arg_outputs]
146+
arg_inputs = parse_arg(inputs)::Vector{Arg}
147+
arg_outputs = parse_arg(outputs)::Vector{Arg}
148+
inputs = String[arg.name for arg in arg_inputs]::Vector{String}
149+
outputs = String[arg.name for arg in arg_outputs]::Vector{String}
150150

151151
validate_inputs = quote_function(validate_inputs, inputs; mod = mod)
152152
infer_outputs = quote_function(infer_outputs, inputs; mod = mod)
153153
prerequisites = quote_function(prerequisites, inputs, outputs; mod = mod)
154154
validate_outputs = quote_function(validate_outputs, outputs; mod = mod)
155155
wrap_up = quote_function(wrap_up, inputs, outputs; mod = mod)
156156

157-
main = quote_function(main, inputs, outputs; specific_return = :(outputs), mod = mod)
157+
main_func = quote_function(main, inputs, outputs; specific_return = :(outputs), mod = mod)
158158

159159
JuliaProgram(
160160
name,
@@ -165,7 +165,7 @@ function JuliaProgram(;
165165
arg_inputs,
166166
validate_inputs,
167167
prerequisites,
168-
main,
168+
main_func,
169169
infer_outputs,
170170
arg_outputs,
171171
validate_outputs,

src/Program.jl

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ end
3131

3232

3333
function check_function_methods(f::Function, t::Tuple, name = string(f))
34-
if !hasmethod(f, t)
34+
if length(methods(f, t)) == 0
35+
# if !hasmethod(f, t) # cannot be used in julia v1.10. Behavior changed.
3536
error("Program: function `$name` does not have the required method: $t. See more at the documents of `JuliaProgram` or `CmdProgram`.")
3637
end
3738
end

src/quote_function.jl

+4-4
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,12 @@ end
144144
function quote_function(expr::Expr, inputs::Vector{String}; specific_return = nothing, mod::Module = @__MODULE__)
145145
expr = dictreplace_all!(expr, inputs, :inputs)
146146
if isnothing(specific_return)
147-
@eval mod function(inputs)
147+
@eval mod function(inputs::Dict{String})
148148
$expr
149149
end
150150
else
151151
specific_return = dictreplace_all!(specific_return, inputs, :inputs)
152-
@eval mod function(inputs)
152+
@eval mod function(inputs::Dict{String})
153153
$expr
154154
$specific_return
155155
end
@@ -159,13 +159,13 @@ function quote_function(expr::Expr, inputs::Vector{String}, outputs::Vector{Stri
159159
expr = dictreplace_all!(expr, inputs, :inputs)
160160
expr = dictreplace_all!(expr, outputs, :outputs)
161161
if isnothing(specific_return)
162-
@eval mod function(inputs, outputs)
162+
@eval mod function(inputs::Dict{String}, outputs::Dict{String})
163163
$expr
164164
end
165165
else
166166
specific_return = dictreplace_all!(specific_return, inputs, :inputs)
167167
specific_return = dictreplace_all!(specific_return, outputs, :outputs)
168-
@eval mod function(inputs, outputs)
168+
@eval mod function(inputs::Dict{String}, outputs::Dict{String})
169169
$expr
170170
$specific_return
171171
end

test/test_Arg.jl

+5-5
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
end
3535

3636
@testset "Arg forward" begin
37-
@test_throws ErrorException JuliaProgram(
37+
@test_throws "cannot use the reserved name" JuliaProgram(
3838
id_file = "id_file",
3939
inputs = [
4040
"a",
@@ -45,7 +45,7 @@ end
4545
"c" => "<a>.<b>"
4646
],
4747
main = quote
48-
c = "$a.$b.$name.$thread"
48+
c = "$a.$b.$NAME.$thread"
4949
end,
5050
arg_forward = "NAME" => "name"
5151
)
@@ -60,7 +60,7 @@ end
6060
"c" => "<a>.<b>"
6161
],
6262
main = quote
63-
c = "$a.$b.$name.$thread"
63+
c = "$a.$b.$NAME.$thread"
6464
end,
6565
arg_forward = "NAME" => "name"
6666
)
@@ -77,7 +77,7 @@ end
7777
"c" => "<a>.<b>"
7878
],
7979
main = quote
80-
c = "$a.$b.$name.$thread"
80+
c = "$a.$b.$NAME.$thread"
8181
end,
8282
arg_forward = ["NAME" => "name", :thread => :ncpu]
8383
)
@@ -93,7 +93,7 @@ end
9393
"c" => "<a>.<b>"
9494
],
9595
main = quote
96-
c = "$a.$b.$name.$thread"
96+
c = "$a.$b.$NAME.$thread"
9797
end,
9898
arg_forward = Dict("NAME" => "name", :thread => :ncpu)
9999
)

0 commit comments

Comments
 (0)