diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py index e832ea8677b..037ee416164 100644 --- a/lib/galaxy/tools/__init__.py +++ b/lib/galaxy/tools/__init__.py @@ -3478,7 +3478,9 @@ class ExpressionTool(Tool): output.extension if output.extension not in ("data", "expression.json") else copy_object.extension ) require_metadata_regeneration = copy_object.extension != new_ext + visible = output.visible output.copy_from(copy_object, include_metadata=not require_metadata_regeneration) + output.visible = visible output.extension = new_ext if require_metadata_regeneration: if app.config.enable_celery_tasks: diff --git a/lib/galaxy/tools/parameters/__init__.py b/lib/galaxy/tools/parameters/__init__.py index d64c13421bf..4a931195227 100644 --- a/lib/galaxy/tools/parameters/__init__.py +++ b/lib/galaxy/tools/parameters/__init__.py @@ -38,7 +38,7 @@ from .grouping import ( ) from .workflow_utils import ( is_runtime_value, - NO_REPLACEMENT, + NoReplacement, runtime_to_json, ) from .wrapped import flat_to_nested_state @@ -184,33 +184,33 @@ def visit_input_values( new_value = callback(**args) # is this good enough ? feels very ugh - if new_value == [no_replacement_value]: + if isinstance(new_value, list) and len(new_value) == 1 and isinstance(new_value[0], NoReplacement): # Single unspecified value in multiple="true" input with a single null input, pretend it's a singular value new_value = no_replacement_value if isinstance(new_value, list): # Maybe mixed input, I guess tool defaults don't really make sense here ? # Would e.g. be default dataset in multiple="true" input, you wouldn't expect the default to be inserted # if other inputs are connected and provided. - new_value = [item if not item == no_replacement_value else None for item in new_value] + new_value = [item if not isinstance(item, NoReplacement) else None for item in new_value] if no_replacement_value is REPLACE_ON_TRUTHY: replace = bool(new_value) else: - replace = new_value != no_replacement_value + replace = not isinstance(new_value, NoReplacement) and new_value != no_replacement_value if replace: input_values[input.name] = new_value elif replace_optional_connections: - # Only used in workflow context - has_default = hasattr(input, "value") - if new_value is value is NO_REPLACEMENT or is_runtime_value(value): - # NO_REPLACEMENT means value was connected but left unspecified - if has_default: - # Use default if we have one + # Only used in workflow context. + # If we reach here the callback returned no_replacement_value, + # meaning the connected step did not produce a value (e.g. an + # omitted optional parameter_input). Only replace sentinel + # values (ConnectedValue, RuntimeValue, NO_REPLACEMENT) with + # the tool parameter's own default — preserve valid tool-state + # values for unconnected inputs. + if isinstance(value, NoReplacement) or is_runtime_value(value): + if hasattr(input, "value"): input_values[input.name] = input.value else: - # Should fail if input is not optional and does not have default value - # Effectively however depends on parameter implementation. - # We might want to raise an exception here, instead of depending on a tool parameter value error. input_values[input.name] = None def get_current_case(input, input_values): diff --git a/lib/galaxy/webapps/galaxy/services/datasets.py b/lib/galaxy/webapps/galaxy/services/datasets.py index 4a4ae9b6e51..d607a51c2f9 100644 --- a/lib/galaxy/webapps/galaxy/services/datasets.py +++ b/lib/galaxy/webapps/galaxy/services/datasets.py @@ -732,13 +732,19 @@ class DatasetsService(ServiceBase, UsesVisualizationMixin): """ hda = self.hda_manager.get_accessible(history_content_id, trans.user) self.hda_manager.ensure_dataset_on_disk(trans, hda) - file_ext = hda.metadata.spec.get(metadata_file).get("file_ext", metadata_file) + metadata_spec = hda.metadata.spec.get(metadata_file) + if metadata_spec is None: + raise galaxy_exceptions.RequestParameterInvalidException(f"Unknown metadata file: {metadata_file}") + file_ext = metadata_spec.get("file_ext", metadata_file) fname = "".join(c in util.FILENAME_VALID_CHARS and c or "_" for c in hda.name)[0:150] headers = {} headers["Content-Type"] = "application/octet-stream" headers["Content-Disposition"] = f'attachment; filename="Galaxy{hda.hid}-[{fname}].{file_ext}"' mf = hda.metadata.get(metadata_file) - assert mf + if mf is None: + raise galaxy_exceptions.RequestParameterInvalidException( + f"Metadata file {metadata_file} is not set for this dataset" + ) file_path = mf.get_file_name() if open_file: return open(file_path, "rb"), headers diff --git a/lib/galaxy_test/api/test_workflows.py b/lib/galaxy_test/api/test_workflows.py index c2f17681e91..28bfc6b6ddc 100644 --- a/lib/galaxy_test/api/test_workflows.py +++ b/lib/galaxy_test/api/test_workflows.py @@ -9577,6 +9577,56 @@ steps: len(copied_collections_with_tags) > 0 ), f"Should find copied collection with tags {collection_tags} in new history" + def test_pick_value_output_visible_with_hidden_inputs(self): + """Test that pick_value output doesn't inherit hidden state from inputs.""" + with self.dataset_populator.test_history() as history_id: + summary = self._run_workflow( + """class: GalaxyWorkflow +inputs: + input_dataset: + type: data +outputs: + pick_out: + outputSource: pick_value/data_param +steps: + cat_skipped: + tool_id: cat1 + in: + input1: input_dataset + when: $(false) + pick_value: + tool_id: pick_value + tool_state: + style_cond: + pick_style: first + type_cond: + param_type: data + pick_from: + - __index__: 0 + value: + __class__: RuntimeValue + - __index__: 1 + value: + __class__: RuntimeValue + in: + style_cond|type_cond|pick_from_0|value: + source: cat_skipped/out_file1 + style_cond|type_cond|pick_from_1|value: + source: input_dataset +""", + test_data="""input_dataset: + value: 1.bed + type: File +""", + history_id=history_id, + ) + invocation_details = self.workflow_populator.get_invocation(summary.invocation_id, step_details=True) + pick_value_hda = invocation_details["outputs"]["pick_out"] + dataset_details = self.dataset_populator.get_history_dataset_details( + history_id=history_id, content_id=pick_value_hda["id"] + ) + assert dataset_details["visible"], "pick_value output should be visible even when inputs are hidden" + class TestAdminWorkflowsApi(BaseWorkflowsApiTestCase): require_admin_user = True diff --git a/lib/galaxy_test/workflow/optional_text_to_bool.gxwf-tests.yml b/lib/galaxy_test/workflow/optional_text_to_bool.gxwf-tests.yml new file mode 100644 index 00000000000..0bf59f44d0b --- /dev/null +++ b/lib/galaxy_test/workflow/optional_text_to_bool.gxwf-tests.yml @@ -0,0 +1,27 @@ +- doc: | + Test that omitting an optional text parameter connected to an expression + tool that converts text to boolean produces false, correctly skipping + the conditional downstream step. + job: + required_input: + type: File + value: 1.fasta + outputs: + out: + asserts: + has_text: + text: "null" +- doc: | + Test that providing an optional text parameter connected to an expression + tool that converts text to boolean produces true, so the conditional + downstream step runs. + job: + required_input: + type: File + value: 1.fasta + optional_text: some_value + outputs: + out: + asserts: + has_size: + min: 1 diff --git a/lib/galaxy_test/workflow/optional_text_to_bool.gxwf.yml b/lib/galaxy_test/workflow/optional_text_to_bool.gxwf.yml new file mode 100644 index 00000000000..d0f0957a184 --- /dev/null +++ b/lib/galaxy_test/workflow/optional_text_to_bool.gxwf.yml @@ -0,0 +1,29 @@ +class: GalaxyWorkflow +doc: | + Test that an omitted optional text parameter connected to an expression + tool (text→boolean conversion, like map_param_value) produces false, + allowing conditional (when) steps to be correctly skipped. + Regression test for https://github.com/galaxyproject/iwc/pull/1128 +inputs: + required_input: + type: data + optional_text: + type: text + optional: true +outputs: + out: + outputSource: cat/out_file1 +steps: + text_to_bool: + tool_id: expression_text_to_bool + in: + text_input: + source: optional_text + cat: + tool_id: cat + in: + input1: + source: required_input + when: + source: text_to_bool/bool_out + when: $(inputs.when) diff --git a/packages/app/setup.cfg b/packages/app/setup.cfg index ce26b3a1365..c898e71d5b6 100644 --- a/packages/app/setup.cfg +++ b/packages/app/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/auth/setup.cfg b/packages/auth/setup.cfg index 52b15f3f685..2e26c40f52b 100644 --- a/packages/auth/setup.cfg +++ b/packages/auth/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/config/setup.cfg b/packages/config/setup.cfg index cf94cf36a9c..6ffeee7bbaa 100644 --- a/packages/config/setup.cfg +++ b/packages/config/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/data/setup.cfg b/packages/data/setup.cfg index fcb1ea8edf1..4533bebc580 100644 --- a/packages/data/setup.cfg +++ b/packages/data/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/files/setup.cfg b/packages/files/setup.cfg index ee8be1989d7..6cfdcff63ac 100644 --- a/packages/files/setup.cfg +++ b/packages/files/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/job_execution/setup.cfg b/packages/job_execution/setup.cfg index 85adeb00cc9..d92848830cd 100644 --- a/packages/job_execution/setup.cfg +++ b/packages/job_execution/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/job_metrics/setup.cfg b/packages/job_metrics/setup.cfg index 42baa3f31fb..5b83bd3ad47 100644 --- a/packages/job_metrics/setup.cfg +++ b/packages/job_metrics/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/meta/setup.cfg b/packages/meta/setup.cfg index ef763719fa9..def355320a6 100644 --- a/packages/meta/setup.cfg +++ b/packages/meta/setup.cfg @@ -6,7 +6,6 @@ classifiers = Environment :: Console Intended Audience :: Developers Intended Audience :: Science/Research - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/navigation/setup.cfg b/packages/navigation/setup.cfg index ce6fb3803a6..6019998750a 100644 --- a/packages/navigation/setup.cfg +++ b/packages/navigation/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/objectstore/setup.cfg b/packages/objectstore/setup.cfg index 825793d2d64..f5d8f4e747d 100644 --- a/packages/objectstore/setup.cfg +++ b/packages/objectstore/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/schema/setup.cfg b/packages/schema/setup.cfg index 4cf440a8512..7d97b718723 100644 --- a/packages/schema/setup.cfg +++ b/packages/schema/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/selenium/setup.cfg b/packages/selenium/setup.cfg index 66ed9c5bd4b..7a4299f1eb7 100644 --- a/packages/selenium/setup.cfg +++ b/packages/selenium/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/test_api/setup.cfg b/packages/test_api/setup.cfg index 45ea7939f5a..1aff5510df9 100644 --- a/packages/test_api/setup.cfg +++ b/packages/test_api/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/test_base/setup.cfg b/packages/test_base/setup.cfg index 3f6407957c7..6763eeacd71 100644 --- a/packages/test_base/setup.cfg +++ b/packages/test_base/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/test_driver/setup.cfg b/packages/test_driver/setup.cfg index d8fb9aabdf3..0fd1b5ffa6b 100644 --- a/packages/test_driver/setup.cfg +++ b/packages/test_driver/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/test_selenium/setup.cfg b/packages/test_selenium/setup.cfg index 1b9d0947e9c..d78fbf2e036 100644 --- a/packages/test_selenium/setup.cfg +++ b/packages/test_selenium/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/tool_shed/setup.cfg b/packages/tool_shed/setup.cfg index 46e5ac1d75e..c4a98d7e54e 100644 --- a/packages/tool_shed/setup.cfg +++ b/packages/tool_shed/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/tool_shed_schema/setup.cfg b/packages/tool_shed_schema/setup.cfg index 98582307110..0e9687c8584 100644 --- a/packages/tool_shed_schema/setup.cfg +++ b/packages/tool_shed_schema/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/tool_util/setup.cfg b/packages/tool_util/setup.cfg index 2b14a43d502..71a4af47260 100644 --- a/packages/tool_util/setup.cfg +++ b/packages/tool_util/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/tool_util_models/setup.cfg b/packages/tool_util_models/setup.cfg index 017524363aa..bb8603dfb34 100644 --- a/packages/tool_util_models/setup.cfg +++ b/packages/tool_util_models/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/tours/setup.cfg b/packages/tours/setup.cfg index 85163c6a575..eafd1b54792 100644 --- a/packages/tours/setup.cfg +++ b/packages/tours/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/util/setup.cfg b/packages/util/setup.cfg index 62e4029cb81..9d4b8d23b27 100644 --- a/packages/util/setup.cfg +++ b/packages/util/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/web_apps/setup.cfg b/packages/web_apps/setup.cfg index 3a5ea24c349..a26989aaa36 100644 --- a/packages/web_apps/setup.cfg +++ b/packages/web_apps/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/web_client/setup.cfg b/packages/web_client/setup.cfg index 766a918f1c3..92fad7ea766 100644 --- a/packages/web_client/setup.cfg +++ b/packages/web_client/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/web_framework/setup.cfg b/packages/web_framework/setup.cfg index 8b5efc7075f..8672bfdd2c7 100644 --- a/packages/web_framework/setup.cfg +++ b/packages/web_framework/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/packages/web_stack/setup.cfg b/packages/web_stack/setup.cfg index 6a0b0a7d457..84a77ef8e5c 100644 --- a/packages/web_stack/setup.cfg +++ b/packages/web_stack/setup.cfg @@ -5,7 +5,6 @@ classifiers = Development Status :: 5 - Production/Stable Environment :: Console Intended Audience :: Developers - License :: OSI Approved :: MIT License Natural Language :: English Operating System :: POSIX Programming Language :: Python :: 3 diff --git a/test/functional/tools/expression_text_to_bool.xml b/test/functional/tools/expression_text_to_bool.xml new file mode 100644 index 00000000000..26a27f1c9ae --- /dev/null +++ b/test/functional/tools/expression_text_to_bool.xml @@ -0,0 +1,27 @@ + + + { + var value = $job.text_input; + if (value == "false" || value == "False") { + return {'bool_out': false}; + } + return {'bool_out': !!value}; + } + + + + + + + + + + + + + + + + + + diff --git a/test/functional/tools/sample_tool_conf.xml b/test/functional/tools/sample_tool_conf.xml index df1a030afa7..9ef2f882925 100644 --- a/test/functional/tools/sample_tool_conf.xml +++ b/test/functional/tools/sample_tool_conf.xml @@ -230,6 +230,7 @@ +