Fix tool request API for multiple select parameters with defaults.

This commit is contained in:
John Chilton
2025-12-10 09:44:08 -05:00
parent aab6c4ee64
commit 374cfe7a30
6 changed files with 62 additions and 5 deletions
+2 -2
View File
@@ -289,7 +289,7 @@ def encode_test(
test_collection = cast(JsonTestCollectionDefDict, value)
return adapt_collections(test_collection).model_dump()
elif isinstance(parameter, SelectParameterModel):
if parameter.multiple and value is not None:
if parameter.multiple and value is not None and isinstance(value, (str,)):
return [v.strip() for v in value.split(",")]
else:
return VISITOR_NO_REPLACEMENT
@@ -359,7 +359,7 @@ def _fill_default_for(tool_state: Dict[str, Any], parameter: ToolParameterT) ->
if not parameter.multiple:
tool_state[parameter_name] = parameter.default_value
else:
tool_state[parameter_name] = None
tool_state[parameter_name] = parameter.default_values
elif isinstance(parameter, DrillDownParameterModel):
if parameter_name not in tool_state:
if parameter.multiple:
@@ -1175,6 +1175,7 @@ class SelectParameterModel(BaseGalaxyToolParameterModelDefinition):
@property
def default_value(self) -> Optional[str]:
assert not self.multiple
if self.options:
for option in self.options:
if option.selected:
@@ -1185,6 +1186,13 @@ class SelectParameterModel(BaseGalaxyToolParameterModelDefinition):
return None
@property
def default_values(self) -> Optional[List[str]]:
assert self.multiple
if self.options:
return [option.value for option in self.options if option.selected]
return None
@property
def request_requires_value(self) -> bool:
# API will allow an empty value and just grab the first static option
+11
View File
@@ -681,6 +681,17 @@ def test_select_multiple_does_not_select_first_by_default(
).with_contents_stripped("None")
@requires_tool_id("gx_select_multiple_one_default")
def test_select_multiple_does_default_to_select_values_marked_as_selected(
required_tools: list[RequiredTool], tool_input_format: DescribeToolInputs
):
empty = tool_input_format.when.any({})
for required_tool in required_tools:
required_tool.execute.with_inputs(empty).assert_has_single_job.with_output("output").with_contents_stripped(
"--ex3"
)
@requires_tool_id("gx_text")
@requires_tool_id("gx_text_optional_false")
def test_null_to_text_tools(required_tools: list[RequiredTool], tool_input_format: DescribeToolInputs):
@@ -0,0 +1,35 @@
<tool id="gx_select_multiple_one_default" name="gx_select_multiple_one_default" version="1.0.0">
<command><![CDATA[
echo '$parameter' >> '$output'
]]></command>
<inputs>
<param name="parameter" type="select" multiple="true">
<option value="--ex1">Ex1</option>
<option value="ex2">Ex2</option>
<option value="--ex3" selected="true">Ex3</option>
<option value="--ex4">Ex4</option>
<option value="ex5">Ex5</option>
</param>
</inputs>
<outputs>
<data name="output" format="txt" />
</outputs>
<tests>
<test>
<param name="parameter" value="ex2" />
<output name="output">
<assert_contents>
<has_line line="ex2" />
</assert_contents>
</output>
</test>
<test>
<!-- these parameters are not implicitly optional and don't select top option -->
<output name="output">
<assert_contents>
<has_line line="--ex3" />
</assert_contents>
</output>
</test>
</tests>
</tool>
@@ -59,6 +59,7 @@ echo $drop_select >> '$out_file1' &&
<has_line line="booltrue" />
<has_line line="12456" />
<has_line line="6.789" />
<has_line line="a_check" />
<has_line line="This is a line of text." />
</assert_contents>
</output>
@@ -232,12 +232,14 @@ def test_fill_defaults():
with_defaults = fill_state_for({}, "parameters/gx_select_optional")
assert with_defaults["parameter"] is None
# Not ideal but matching current behavior
with_defaults = fill_state_for({}, "parameters/gx_select_multiple")
assert with_defaults["parameter"] is None
assert with_defaults["parameter"] == []
with_defaults = fill_state_for({}, "parameters/gx_select_multiple_optional")
assert with_defaults["parameter"] is None
assert with_defaults["parameter"] == []
with_defaults = fill_state_for({}, "parameters/gx_select_multiple_one_default")
assert with_defaults["parameter"] == ["--ex3"]
# Do not fill in dynamic defaults... these require a Galaxy runtime.
with_defaults = fill_state_for({}, "remove_value", partial=True)