Fix Prompt#validate_arguments! crash when arguments are nil
`Prompt#validate_arguments!` called `required_args` which does `arguments_value.filter_map`, crashing with `NoMethodError` when `arguments_value` is `nil` (the default for prompts without declared arguments). Additionally, passing `nil` as args caused a crash on `args.keys`. Fix by defaulting `arguments_value` to `[]` and guarding against `nil` args.
This commit is contained in:
parent
76ab822ad7
commit
ef5c76373b
2 changed files with 50 additions and 4 deletions
|
|
@ -21,7 +21,7 @@ module MCP
|
||||||
title: title_value,
|
title: title_value,
|
||||||
description: description_value,
|
description: description_value,
|
||||||
icons: icons_value&.then { |icons| icons.empty? ? nil : icons.map(&:to_h) },
|
icons: icons_value&.then { |icons| icons.empty? ? nil : icons.map(&:to_h) },
|
||||||
arguments: arguments_value&.map(&:to_h),
|
arguments: arguments_value.empty? ? nil : arguments_value.map(&:to_h),
|
||||||
_meta: meta_value,
|
_meta: meta_value,
|
||||||
}.compact
|
}.compact
|
||||||
end
|
end
|
||||||
|
|
@ -32,7 +32,7 @@ module MCP
|
||||||
subclass.instance_variable_set(:@title_value, nil)
|
subclass.instance_variable_set(:@title_value, nil)
|
||||||
subclass.instance_variable_set(:@description_value, nil)
|
subclass.instance_variable_set(:@description_value, nil)
|
||||||
subclass.instance_variable_set(:@icons_value, nil)
|
subclass.instance_variable_set(:@icons_value, nil)
|
||||||
subclass.instance_variable_set(:@arguments_value, nil)
|
subclass.instance_variable_set(:@arguments_value, [])
|
||||||
subclass.instance_variable_set(:@meta_value, nil)
|
subclass.instance_variable_set(:@meta_value, nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -76,7 +76,7 @@ module MCP
|
||||||
if value == NOT_SET
|
if value == NOT_SET
|
||||||
@arguments_value
|
@arguments_value
|
||||||
else
|
else
|
||||||
@arguments_value = value
|
@arguments_value = Array(value)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -103,6 +103,7 @@ module MCP
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_arguments!(args)
|
def validate_arguments!(args)
|
||||||
|
args ||= {}
|
||||||
missing = required_args - args.keys
|
missing = required_args - args.keys
|
||||||
return if missing.empty?
|
return if missing.empty?
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ module MCP
|
||||||
assert_equal expected, FullPrompt.to_h
|
assert_equal expected, FullPrompt.to_h
|
||||||
end
|
end
|
||||||
|
|
||||||
test "#to_h handles nil arguments value" do
|
test "#to_h omits arguments key when arguments are not declared" do
|
||||||
class NoArgumentsPrompt < Prompt
|
class NoArgumentsPrompt < Prompt
|
||||||
description "No arguments prompt"
|
description "No arguments prompt"
|
||||||
end
|
end
|
||||||
|
|
@ -196,6 +196,51 @@ module MCP
|
||||||
assert_equal expected, prompt.to_h
|
assert_equal expected, prompt.to_h
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "#validate_arguments! does not raise when arguments are not declared" do
|
||||||
|
prompt_class = Class.new(Prompt) do
|
||||||
|
prompt_name "no_args_prompt"
|
||||||
|
description "A prompt with no arguments"
|
||||||
|
# NOTE: no `arguments` declaration at all
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_nothing_raised do
|
||||||
|
prompt_class.validate_arguments!({})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "#validate_arguments! handles nil args" do
|
||||||
|
prompt_class = Class.new(Prompt) do
|
||||||
|
prompt_name "no_args_prompt"
|
||||||
|
description "A prompt with no arguments"
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_nothing_raised do
|
||||||
|
prompt_class.validate_arguments!(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "#validate_arguments! does not raise when arguments is explicitly set to nil" do
|
||||||
|
prompt_class = Class.new(Prompt) do
|
||||||
|
prompt_name "nil_args_prompt"
|
||||||
|
description "A prompt with nil arguments"
|
||||||
|
arguments nil
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_nothing_raised do
|
||||||
|
prompt_class.validate_arguments!({})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "#to_h omits arguments key when arguments is empty" do
|
||||||
|
prompt = Prompt.define(
|
||||||
|
name: "no_args_prompt",
|
||||||
|
description: "a prompt without arguments",
|
||||||
|
arguments: [],
|
||||||
|
)
|
||||||
|
|
||||||
|
refute prompt.to_h.key?(:arguments)
|
||||||
|
end
|
||||||
|
|
||||||
test "#to_h does not have `:icons` key when icons is empty" do
|
test "#to_h does not have `:icons` key when icons is empty" do
|
||||||
prompt = Prompt.define(
|
prompt = Prompt.define(
|
||||||
name: "prompt_without_icons",
|
name: "prompt_without_icons",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue