Skip to content

Commit da575fe

Browse files
committed
Fix deferred datasets in multi-data parameters.
1 parent 505ac8d commit da575fe

File tree

3 files changed

+71
-6
lines changed

3 files changed

+71
-6
lines changed

lib/galaxy/job_execution/datasets.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,25 @@
77
ABCMeta,
88
abstractmethod,
99
)
10-
from typing import Union
10+
from typing import (
11+
List,
12+
Union,
13+
)
1114

1215
from galaxy.model import (
1316
DatasetCollectionElement,
1417
DatasetInstance,
1518
HistoryDatasetCollectionAssociation,
1619
)
1720

18-
DeferrableObjectsT = Union[DatasetInstance, HistoryDatasetCollectionAssociation, DatasetCollectionElement]
21+
DeferrableObjectsT = Union[
22+
DatasetInstance,
23+
HistoryDatasetCollectionAssociation,
24+
DatasetCollectionElement,
25+
List[DatasetInstance],
26+
List[Union[HistoryDatasetCollectionAssociation, DatasetCollectionElement]],
27+
List[Union[DatasetInstance, HistoryDatasetCollectionAssociation, DatasetCollectionElement]],
28+
]
1929

2030

2131
def dataset_path_rewrites(dataset_paths):

lib/galaxy/tools/evaluation.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
List,
1414
Optional,
1515
TYPE_CHECKING,
16+
Union,
1617
)
1718

1819
from packaging.version import Version
@@ -287,6 +288,30 @@ def _materialize_objects(
287288
assert isinstance(value, (model.HistoryDatasetAssociation, model.LibraryDatasetDatasetAssociation))
288289
undeferred = dataset_materializer.ensure_materialized(value)
289290
undeferred_objects[key] = undeferred
291+
elif isinstance(value, list):
292+
undeferred_list: List[
293+
Union[
294+
model.DatasetInstance, model.HistoryDatasetCollectionAssociation, model.DatasetCollectionElement
295+
]
296+
] = []
297+
for potentially_deferred in value:
298+
if isinstance(potentially_deferred, model.DatasetInstance):
299+
if potentially_deferred.state != model.Dataset.states.DEFERRED:
300+
undeferred_list.append(potentially_deferred)
301+
else:
302+
assert isinstance(
303+
potentially_deferred,
304+
(model.HistoryDatasetAssociation, model.LibraryDatasetDatasetAssociation),
305+
)
306+
undeferred = dataset_materializer.ensure_materialized(potentially_deferred)
307+
undeferred_list.append(undeferred)
308+
elif isinstance(
309+
potentially_deferred,
310+
(model.HistoryDatasetCollectionAssociation, model.DatasetCollectionElement),
311+
):
312+
undeferred_collection = materialize_collection_input(potentially_deferred, dataset_materializer)
313+
undeferred_list.append(undeferred_collection)
314+
undeferred_objects[key] = undeferred_list
290315
else:
291316
undeferred_collection = materialize_collection_input(value, dataset_materializer)
292317
undeferred_objects[key] = undeferred_collection
@@ -348,10 +373,6 @@ def _deferred_objects(
348373
Walk input datasets and collections and find inputs that need to be materialized.
349374
"""
350375
deferred_objects: Dict[str, DeferrableObjectsT] = {}
351-
for key, value in input_datasets.items():
352-
if value is not None and value.state == model.Dataset.states.DEFERRED:
353-
if self._should_materialize_deferred_input(key, value):
354-
deferred_objects[key] = value
355376

356377
def find_deferred_collections(input, value, context, prefixed_name=None, **kwargs):
357378
if (
@@ -360,6 +381,28 @@ def find_deferred_collections(input, value, context, prefixed_name=None, **kwarg
360381
):
361382
deferred_objects[prefixed_name] = value
362383

384+
def find_deferred_datasets(input, value, context, prefixed_name=None, **kwargs):
385+
if isinstance(input, DataToolParameter):
386+
if isinstance(value, model.DatasetInstance) and value.state == model.Dataset.states.DEFERRED:
387+
deferred_objects[prefixed_name] = value
388+
elif isinstance(value, list):
389+
# handle single list reduction as a collection input
390+
if (
391+
value
392+
and len(value) == 1
393+
and isinstance(
394+
value[0], (model.HistoryDatasetCollectionAssociation, model.DatasetCollectionElement)
395+
)
396+
):
397+
deferred_objects[prefixed_name] = value
398+
return
399+
400+
for v in value:
401+
if self._should_materialize_deferred_input(prefixed_name, v):
402+
deferred_objects[prefixed_name] = value
403+
break
404+
405+
visit_input_values(self.tool.inputs, incoming, find_deferred_datasets)
363406
visit_input_values(self.tool.inputs, incoming, find_deferred_collections)
364407

365408
return deferred_objects

lib/galaxy_test/api/test_tool_execute.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,3 +633,15 @@ def test_deferred_with_metadata_options_filter(required_tool: RequiredTool, targ
633633
"ref_names": "chrM",
634634
}
635635
required_tool.execute.with_inputs(inputs).assert_has_single_job.with_single_output.with_contents_stripped("chrM")
636+
637+
638+
@requires_tool_id("cat_list")
639+
def test_deferred_multi_input(required_tool: RequiredTool, target_history: TargetHistory):
640+
has_src_dict_bed = target_history.with_deferred_dataset_for_test_file("1.bed", ext="bed")
641+
has_src_dict_txt = target_history.with_deferred_dataset_for_test_file("1.txt", ext="txt")
642+
inputs = {
643+
"input1": [has_src_dict_bed.src_dict, has_src_dict_txt.src_dict],
644+
}
645+
output = required_tool.execute.with_inputs(inputs).assert_has_single_job.with_single_output
646+
output.assert_contains("chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 -")
647+
output.assert_contains("chr1 4225 19670")

0 commit comments

Comments
 (0)