diff --git a/lib/galaxy/tool_util/xsd/galaxy.xsd b/lib/galaxy/tool_util/xsd/galaxy.xsd index cdae18ce6541..4c13022d51f4 100644 --- a/lib/galaxy/tool_util/xsd/galaxy.xsd +++ b/lib/galaxy/tool_util/xsd/galaxy.xsd @@ -76,6 +76,10 @@ List of behavior changes associated with profile versions: - Do not use user preferences to store credentials for tools anymore. Use the new `` tag in the `` section of the tool XML instead. +### 26.0 + +- Optional data parameters without a selected dataset are now empty lists, i.e. ``[]``. For smaller profiles it was ``[None]`` + ### Examples A normal tool: diff --git a/lib/galaxy/tools/evaluation.py b/lib/galaxy/tools/evaluation.py index 595144cce6ee..6596381eff50 100644 --- a/lib/galaxy/tools/evaluation.py +++ b/lib/galaxy/tools/evaluation.py @@ -466,7 +466,7 @@ def __populate_wrappers(self, param_dict, input_datasets, job_working_directory) def wrap_input(input_values, input): value = input_values[input.name] if isinstance(input, DataToolParameter) and input.multiple: - dataset_instances = DatasetListWrapper.to_dataset_instances(value) + dataset_instances = DatasetListWrapper.to_dataset_instances(value, self.tool.profile) input_values[input.name] = DatasetListWrapper( job_working_directory, dataset_instances, @@ -510,9 +510,7 @@ def wrap_input(input_values, input): input, value, other_values=param_dict, compute_environment=self.compute_environment ) else: - input_values[input.name] = InputValueWrapper( - input, value, param_dict, profile=self.tool and self.tool.profile or None - ) + input_values[input.name] = InputValueWrapper(input, value, param_dict) # HACK: only wrap if check_values is not false, this deals with external # tools where the inputs don't even get passed through. These diff --git a/lib/galaxy/tools/parameters/wrapped.py b/lib/galaxy/tools/parameters/wrapped.py index 0853c3c8f2dc..c8d071ecc7b9 100644 --- a/lib/galaxy/tools/parameters/wrapped.py +++ b/lib/galaxy/tools/parameters/wrapped.py @@ -118,7 +118,7 @@ def wrap_values(self, inputs: "ToolInputsT", input_values: dict, skip_missing_va values = value self.wrap_values(input.inputs, values, skip_missing_values=skip_missing_values) elif isinstance(input, DataToolParameter) and input.multiple: - dataset_instances = DatasetListWrapper.to_dataset_instances(value) + dataset_instances = DatasetListWrapper.to_dataset_instances(value, self.tool.profile) input_values[input.name] = DatasetListWrapper( None, dataset_instances, @@ -148,7 +148,7 @@ def wrap_values(self, inputs: "ToolInputsT", input_values: dict, skip_missing_va ) else: assert isinstance(input, ToolParameter) - input_values[input.name] = InputValueWrapper(input, value, incoming, tool.profile) + input_values[input.name] = InputValueWrapper(input, value, incoming) def make_dict_copy(from_dict: dict): diff --git a/lib/galaxy/tools/wrappers.py b/lib/galaxy/tools/wrappers.py index 6fd46ccc5b30..10ed116adf5f 100644 --- a/lib/galaxy/tools/wrappers.py +++ b/lib/galaxy/tools/wrappers.py @@ -18,6 +18,7 @@ Union, ) +from packaging.version import Version from typing_extensions import ( Self, TypeAlias, @@ -129,7 +130,6 @@ def __init__( input: "ToolParameter", value: Optional[str], other_values: Optional[dict[str, str]] = None, - profile: Optional[float] = None, ) -> None: self.input = input if value is None and input.type == "text": @@ -284,6 +284,11 @@ def __iter__(self) -> Iterable[str]: raise Exception("Tried to iterate over a non-multiple parameter.") return self.value.__iter__() + def __len__(self) -> int: + if not self.input.multiple: + raise Exception("Non-multiple parameter has no len().") + return self.value.__len__() + class DatasetFilenameWrapper(ToolParameterValueWrapper): """ @@ -593,13 +598,15 @@ def to_wrapper( @staticmethod def to_dataset_instances( dataset_instance_sources: Any, + profile: Optional[float], ) -> list[Union[None, DatasetInstance]]: dataset_instances: list[Optional[DatasetInstance]] = [] if not isinstance(dataset_instance_sources, list): dataset_instance_sources = [dataset_instance_sources] for dataset_instance_source in dataset_instance_sources: if dataset_instance_source is None: - dataset_instances.append(dataset_instance_source) + if profile is None or Version(str(profile)) < Version("26.0"): + dataset_instances.append(dataset_instance_source) elif getattr(dataset_instance_source, "history_content_type", None) == "dataset": dataset_instances.append(dataset_instance_source) elif getattr(dataset_instance_source, "hda", None): diff --git a/test/functional/tools/multi_len.xml b/test/functional/tools/multi_len.xml new file mode 100644 index 000000000000..1b38d8768502 --- /dev/null +++ b/test/functional/tools/multi_len.xml @@ -0,0 +1,73 @@ + + test len() parameters allowing multiple + '$output' && +echo '|select_ex_optional| = #echo len($select_ex_optional) #' >> '$output' && +#for i, e in enumerate($select_ex_optional) + && echo "select_ex_optional: element $i is $e" +#end for + +echo '|data_ex| = #echo len($data_ex) #' >> '$output' && +echo '|data_ex_optional| = #echo len($data_ex_optional) #' >> '$output' + +#for i, e in enumerate($data_ex_optional) + && echo "data_ex_optional: element $i is $e" +#end for + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/functional/tools/multi_len_legacy.xml b/test/functional/tools/multi_len_legacy.xml new file mode 100644 index 000000000000..68f55d5e70d9 --- /dev/null +++ b/test/functional/tools/multi_len_legacy.xml @@ -0,0 +1,73 @@ + + test len() parameters allowing multiple for 25.1 + '$output' && +echo '|select_ex_optional| = #echo len($select_ex_optional) #' >> '$output' && +#for i, e in enumerate($select_ex_optional) + && echo "select_ex_optional: element $i is $e" +#end for + +echo '|data_ex| = #echo len($data_ex) #' >> '$output' && +echo '|data_ex_optional| = #echo len($data_ex_optional) #' >> '$output' +#for i, e in enumerate($data_ex_optional) + && echo "data_ex_optional: element $i is $e" +#end for + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/functional/tools/sample_tool_conf.xml b/test/functional/tools/sample_tool_conf.xml index e1d5e36e5bcb..390a84f456a4 100644 --- a/test/functional/tools/sample_tool_conf.xml +++ b/test/functional/tools/sample_tool_conf.xml @@ -27,6 +27,8 @@ + +