diff --git a/lib/galaxy/tools/parameters/dynamic_options.py b/lib/galaxy/tools/parameters/dynamic_options.py index 14360f3c666..ef4cbabd063 100644 --- a/lib/galaxy/tools/parameters/dynamic_options.py +++ b/lib/galaxy/tools/parameters/dynamic_options.py @@ -14,10 +14,6 @@ from galaxy.model import ( MetadataFile, User, ) -from galaxy.tools.wrappers import ( - DatasetFilenameWrapper, - DatasetListWrapper, -) from galaxy.util import string_as_bool from . import validation @@ -467,6 +463,8 @@ class RemoveValueFilter(Filter): self.separator = elem.get("separator", ",") def filter_options(self, options, trans, other_values): + from galaxy.tools.wrappers import DatasetFilenameWrapper + if trans is not None and trans.workflow_building_mode: return options @@ -803,6 +801,11 @@ def _get_ref_data(other_values, ref_name): - a KeyError is raised if no such element exists - a ValueError is raised if the element is not of the type DatasetFilenameWrapper, HistoryDatasetAssociation, DatasetListWrapper, HistoryDatasetCollectionAssociation, list """ + from galaxy.tools.wrappers import ( + DatasetFilenameWrapper, + DatasetListWrapper, + ) + ref = other_values[ref_name] if not isinstance( ref, diff --git a/lib/galaxy/tools/wrappers.py b/lib/galaxy/tools/wrappers.py index ecc26378775..528bee38085 100644 --- a/lib/galaxy/tools/wrappers.py +++ b/lib/galaxy/tools/wrappers.py @@ -27,13 +27,18 @@ from galaxy.model import ( HasTags, HistoryDatasetCollectionAssociation, ) +from galaxy.model.metadata import FileParameter from galaxy.model.none_like import NoneDataset from galaxy.security.object_wrapper import wrap_with_safe_string +from galaxy.tools.parameters.basic import BooleanToolParameter from galaxy.tools.parameters.wrapped_json import ( data_collection_input_to_staging_path_and_source_path, data_input_to_staging_path_and_source_path, ) -from galaxy.util import filesystem_safe_string +from galaxy.util import ( + filesystem_safe_string, + string_as_bool, +) if TYPE_CHECKING: from galaxy.datatypes.registry import Registry @@ -121,25 +126,29 @@ class InputValueWrapper(ToolParameterValueWrapper): self.value = value self._other_values: Dict[str, str] = other_values or {} - def _get_cast_value(self, other: Any) -> Union[str, int, float, bool, None]: - if self.input.type == "boolean" and isinstance(other, str): - return str(self) + def _get_cast_values(self, other: Any) -> Tuple[Union[str, int, float, bool, None], Any]: + if isinstance(self.input, BooleanToolParameter) and isinstance(other, str): + if other in (self.input.truevalue, self.input.falsevalue): + return str(self), other + else: + return bool(self), string_as_bool(other) # For backward compatibility, allow `$wrapper != ""` for optional non-text param if self.input.optional and self.value is None: if isinstance(other, str): - return str(self) + return str(self), other else: - return None + return None, other cast_table = { "text": str, "integer": int, "float": float, "boolean": bool, } - return cast(Union[str, int, float, bool], cast_table.get(self.input.type, str)(self)) + return cast(Union[str, int, float, bool], cast_table.get(self.input.type, str)(self)), other def __eq__(self, other: Any) -> bool: - return bool(self._get_cast_value(other) == other) + casted_self, casted_other = self._get_cast_values(other) + return casted_self == casted_other def __ne__(self, other: Any) -> bool: return not self == other @@ -162,7 +171,8 @@ class InputValueWrapper(ToolParameterValueWrapper): return getattr(self.value, key) def __gt__(self, other: Any) -> bool: - return bool(self._get_cast_value(other) > other) + casted_self, casted_other = self._get_cast_values(other) + return casted_self > casted_other def __int__(self) -> int: return int(float(self)) @@ -290,7 +300,6 @@ class DatasetFilenameWrapper(ToolParameterValueWrapper): if rval is None: rval = self.metadata.spec[name].no_value metadata_param = self.metadata.spec[name].param - from galaxy.model.metadata import FileParameter rval = metadata_param.to_safe_string(rval) if isinstance(metadata_param, FileParameter) and self.compute_environment: diff --git a/test/unit/app/tools/test_wrappers.py b/test/unit/app/tools/test_wrappers.py index d094aaec5a3..c9a20f12e39 100644 --- a/test/unit/app/tools/test_wrappers.py +++ b/test/unit/app/tools/test_wrappers.py @@ -160,10 +160,12 @@ def test_input_value_wrapper_comparison(tool): assert bool(wrapper) is True, wrapper assert str(wrapper) == "truevalue" assert wrapper == "truevalue" + assert wrapper == "true" wrapper = valuewrapper(tool, False, "boolean") assert bool(wrapper) is False, wrapper assert str(wrapper) == "falsevalue" assert wrapper == "falsevalue" + assert wrapper == "false" @with_mock_tool