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