diff --git a/lib/galaxy/tools/actions/__init__.py b/lib/galaxy/tools/actions/__init__.py
index 31c7eb76526c..1606a4b607f1 100644
--- a/lib/galaxy/tools/actions/__init__.py
+++ b/lib/galaxy/tools/actions/__init__.py
@@ -22,6 +22,7 @@
AuthenticationRequired,
ItemAccessibilityException,
RequestParameterInvalidException,
+ ToolInputsNotReadyException,
)
from galaxy.job_execution.actions.post import ActionBox
from galaxy.managers.context import ProvidesHistoryContext
@@ -1156,8 +1157,14 @@ def get_ext_or_implicit_ext(hda):
# objects, and their type is the target_ext, so this should be correct even if there
# are multiple ImplicitlyConvertedDatasetAssociation objects (meaning 2 datasets had been converted
# to produce a dataset with the required datatype)
- return hda.implicitly_converted_parent_datasets[0].type
- return hda.ext
+ ext = hda.implicitly_converted_parent_datasets[0].type
+ else:
+ ext = hda.ext
+ if ext == "expression.json" and hda.dataset.state not in model.Dataset.terminal_states:
+ raise ToolInputsNotReadyException(
+ "Tool uses expression tool output to determine extension, can only succeed once input is terminal."
+ )
+ return ext
def determine_output_format(
@@ -1192,6 +1199,8 @@ def determine_output_format(
try:
input_dataset = input_datasets[output.format_source]
ext = get_ext_or_implicit_ext(input_dataset)
+ except ToolInputsNotReadyException:
+ raise
except Exception:
pass
elif format_source is not None:
@@ -1231,6 +1240,8 @@ def determine_output_format(
break
input_dataset = input_element.element_object
ext = get_ext_or_implicit_ext(input_dataset)
+ except ToolInputsNotReadyException:
+ raise
except Exception as e:
log.debug("Exception while trying to determine format_source: %s", e)
diff --git a/lib/galaxy_test/api/test_workflows.py b/lib/galaxy_test/api/test_workflows.py
index f3d0084cb470..77822202053a 100644
--- a/lib/galaxy_test/api/test_workflows.py
+++ b/lib/galaxy_test/api/test_workflows.py
@@ -2157,6 +2157,38 @@ def test_run_workflow_pick_value_bam_pja(self):
assert dataset_details["metadata_bam_index"]
assert dataset_details["file_ext"] == "bam"
+ def test_expression_tool_output_in_format_source(self):
+ with self.dataset_populator.test_history() as history_id:
+ self._run_workflow(
+ """class: GalaxyWorkflow
+inputs:
+ input:
+ type: data
+steps:
+ skip:
+ tool_id: cat_data_and_sleep
+ in:
+ input1: input
+ when: $(false)
+ pick_larger:
+ tool_id: expression_pick_larger_file
+ in:
+ input1: skip/out_file1
+ input2: input
+ format_source:
+ tool_id: cat_data_and_sleep
+ in:
+ input1: pick_larger/larger_file
+test_data:
+ input:
+ value: 1.fastqsanger.gz
+ type: File
+ file_type: fastqsanger.gz
+""",
+ history_id=history_id,
+ )
+ self.dataset_populator.wait_for_history(history_id=history_id, assert_ok=True)
+
def test_run_workflow_simple_conditional_step(self):
with self.dataset_populator.test_history() as history_id:
summary = self._run_workflow(
diff --git a/test/functional/tools/expression_pick_larger_file.xml b/test/functional/tools/expression_pick_larger_file.xml
index daed2d9175ea..e624ed302f26 100644
--- a/test/functional/tools/expression_pick_larger_file.xml
+++ b/test/functional/tools/expression_pick_larger_file.xml
@@ -20,7 +20,7 @@
-
+