diff --git a/lib/galaxy/tools/wrappers.py b/lib/galaxy/tools/wrappers.py index 3f1b3eabf85..2d02f791347 100644 --- a/lib/galaxy/tools/wrappers.py +++ b/lib/galaxy/tools/wrappers.py @@ -77,8 +77,11 @@ class InputValueWrapper(ToolParameterValueWrapper): if self.input.type == 'boolean' and isinstance(other, string_types): return str(self) # For backward compatibility, allow `$wrapper != ""` for optional non-text param - if self.input.optional and self.value is None and isinstance(other, string_types): - return str(self) + if self.input.optional and self.value is None: + if isinstance(other, string_types): + return str(self) + else: + return None cast = { 'text': str, 'integer': int, diff --git a/test/unit/tools/test_wrappers.py b/test/unit/tools/test_wrappers.py index 105f31e0e8e..b57030b805b 100644 --- a/test/unit/tools/test_wrappers.py +++ b/test/unit/tools/test_wrappers.py @@ -109,15 +109,19 @@ def test_raw_object_wrapper(): assert not false_wrapper -def valuewrapper(tool, value, paramtype): +def valuewrapper(tool, value, paramtype, optional=False): if paramtype == "integer": - parameter = IntegerToolParameter(tool, XML('')) + optional = 'optional="true"' if optional else 'value="10"' + parameter = IntegerToolParameter(tool, XML('' % optional)) elif paramtype == "text": - parameter = TextToolParameter(tool, XML('')) + optional = 'optional="true"' if optional else 'value="foo"' + parameter = TextToolParameter(tool, XML('' % optional)) elif paramtype == "float": - parameter = FloatToolParameter(tool, XML('')) + optional = 'optional="true"' if optional else 'value="10.0"' + parameter = FloatToolParameter(tool, XML('' % optional)) elif paramtype == "boolean": - parameter = BooleanToolParameter(tool, XML('')) + optional = 'optional="true"' if optional else 'value=""' + parameter = BooleanToolParameter(tool, XML('' % optional)) return InputValueWrapper(parameter, value) @@ -144,19 +148,24 @@ def test_input_value_wrapper_comparison(tool): @with_mock_tool def test_input_value_wrapper_comparison_optional(tool): - parameter = IntegerToolParameter(tool, XML('')) - wrapper = InputValueWrapper(parameter, None) + wrapper = valuewrapper(tool, None, 'integer', optional=True) assert not wrapper with pytest.raises(ValueError): int(wrapper) assert str(wrapper) == "" assert wrapper == "" # for backward-compatibility - parameter = IntegerToolParameter(tool, XML('')) - wrapper = InputValueWrapper(parameter, 0) + wrapper = valuewrapper(tool, 0, 'integer', optional=True) assert wrapper == 0 assert int(wrapper) == 0 assert str(wrapper) assert wrapper != "" # for backward-compatibility, the correct way to check if an optional integer param is not empty is to use str(wrapper) + wrapper = valuewrapper(tool, None, 'integer', optional=True) + assert wrapper != 1 + assert str(wrapper) == "" + assert wrapper == None # noqa: E711 + wrapper = valuewrapper(tool, None, "boolean") + assert bool(wrapper) is False, wrapper + assert str(wrapper) == 'falsevalue' @with_mock_tool