1313 List ,
1414 Optional ,
1515 TYPE_CHECKING ,
16+ Union ,
1617)
1718
1819from 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,8 +381,38 @@ 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
408+ # now place the the inputX datasets hacked in for multiple inputs into the deferred
409+ # object array also. This is so messy. I think in this case - we only need these for
410+ # Pulsar staging up which uses the hackier input_datasets flat dict.
411+ for key , value in input_datasets .items ():
412+ if key not in deferred_objects and value is not None and value .state == model .Dataset .states .DEFERRED :
413+ if self ._should_materialize_deferred_input (key , value ):
414+ deferred_objects [key ] = value
415+
365416 return deferred_objects
366417
367418 def _should_materialize_deferred_input (self , input_name : str , input_value : DeferrableObjectsT ) -> bool :
0 commit comments