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 @@
+