@@ -208,89 +208,91 @@ def traverse(
208208 skip_command_line2 : bool ,
209209) -> tuple [cwl .CommandLineTool | cwl .ExpressionTool | cwl .Workflow , bool ]:
210210 """Convert the given process and any subprocesses."""
211- if not inside and isinstance (process , cwl .CommandLineTool ):
212- process = expand_stream_shortcuts (process )
213- wf_inputs = []
214- wf_outputs = []
215- step_inputs = []
216- step_outputs = []
217- if process .inputs :
218- for inp in process .inputs :
219- inp_id = inp .id .split ("#" )[- 1 ]
220- step_inputs .append (
221- cwl .WorkflowStepInput (
222- id = inp_id ,
223- source = inp_id ,
224- extension_fields = inp .extension_fields ,
225- loadingOptions = inp .loadingOptions ,
211+ match process :
212+ case cwl .CommandLineTool () if not inside :
213+ process = expand_stream_shortcuts (process )
214+ wf_inputs = []
215+ wf_outputs = []
216+ step_inputs = []
217+ step_outputs = []
218+ if process .inputs :
219+ for inp in process .inputs :
220+ inp_id = inp .id .split ("#" )[- 1 ]
221+ step_inputs .append (
222+ cwl .WorkflowStepInput (
223+ id = inp_id ,
224+ source = inp_id ,
225+ extension_fields = inp .extension_fields ,
226+ loadingOptions = inp .loadingOptions ,
227+ )
226228 )
227- )
228- wf_inputs . append (
229- cwl . InputParameter (
230- id = inp_id ,
231- label = inp .label ,
232- secondaryFiles = inp .secondaryFiles ,
233- streamable = inp .streamable ,
234- doc = inp .doc ,
235- format = inp .format ,
236- default = inp .default ,
237- type_ = inp .type_ ,
238- extension_fields = inp .extension_fields ,
239- loadingOptions = inp . loadingOptions ,
229+ wf_inputs . append (
230+ cwl . InputParameter (
231+ id = inp_id ,
232+ label = inp . label ,
233+ secondaryFiles = inp .secondaryFiles ,
234+ streamable = inp .streamable ,
235+ doc = inp .doc ,
236+ format = inp .format ,
237+ default = inp .default ,
238+ type_ = inp .type_ ,
239+ extension_fields = inp .extension_fields ,
240+ loadingOptions = inp .loadingOptions ,
241+ )
240242 )
241- )
242- if process .outputs :
243- for outp in process . outputs :
244- outp_id = outp . id . split ( "#" )[ - 1 ]
245- step_outputs .append (outp_id )
246- wf_outputs . append (
247- cwl . WorkflowOutputParameter (
248- id = outp_id ,
249- label = outp .label ,
250- secondaryFiles = outp .secondaryFiles ,
251- streamable = outp .streamable ,
252- doc = outp .doc ,
253- format = outp . format ,
254- outputSource = f"main/ { outp_id } " ,
255- type_ = outp .type_ ,
256- extension_fields = outp .extension_fields ,
257- loadingOptions = outp . loadingOptions ,
243+ if process . outputs :
244+ for outp in process .outputs :
245+ outp_id = outp . id . split ( "#" )[ - 1 ]
246+ step_outputs . append ( outp_id )
247+ wf_outputs .append (
248+ cwl . WorkflowOutputParameter (
249+ id = outp_id ,
250+ label = outp . label ,
251+ secondaryFiles = outp .secondaryFiles ,
252+ streamable = outp .streamable ,
253+ doc = outp .doc ,
254+ format = outp .format ,
255+ outputSource = f"main/ { outp_id } " ,
256+ type_ = outp . type_ ,
257+ extension_fields = outp .extension_fields ,
258+ loadingOptions = outp .loadingOptions ,
259+ )
258260 )
259- )
260- step = cwl .WorkflowStep (
261- id = "#main" ,
262- in_ = step_inputs ,
263- out = step_outputs ,
264- run = copy .deepcopy (process ),
265- )
266- workflow = cwl .Workflow (
267- inputs = wf_inputs ,
268- outputs = wf_outputs ,
269- steps = [step ],
270- cwlVersion = process .cwlVersion ,
271- )
272- result , modified = traverse_workflow (
273- workflow , replace_etool , skip_command_line1 , skip_command_line2
274- )
275- if modified :
276- return result , True
277- else :
261+ step = cwl .WorkflowStep (
262+ id = "#main" ,
263+ in_ = step_inputs ,
264+ out = step_outputs ,
265+ run = copy .deepcopy (process ),
266+ )
267+ workflow = cwl .Workflow (
268+ inputs = wf_inputs ,
269+ outputs = wf_outputs ,
270+ steps = [step ],
271+ cwlVersion = process .cwlVersion ,
272+ )
273+ result , modified = traverse_workflow (
274+ workflow , replace_etool , skip_command_line1 , skip_command_line2
275+ )
276+ if modified :
277+ return result , True
278+ else :
279+ return process , False
280+ case cwl .ExpressionTool () if replace_etool :
281+ expression = get_expression (process .expression , empty_inputs (process ), None )
282+ # Why call get_expression on an ExpressionTool?
283+ # It normalizes the form of $() CWL expressions into the ${} style
284+ if expression :
285+ process2 = copy .deepcopy (process )
286+ process2 .expression = expression
287+ else :
288+ process2 = process
289+ return etool_to_cltool (process2 ), True
290+ case cwl .Workflow ():
291+ return traverse_workflow (
292+ process , replace_etool , skip_command_line1 , skip_command_line2
293+ )
294+ case _:
278295 return process , False
279- if isinstance (process , cwl .ExpressionTool ) and replace_etool :
280- expression = get_expression (process .expression , empty_inputs (process ), None )
281- # Why call get_expression on an ExpressionTool?
282- # It normalizes the form of $() CWL expressions into the ${} style
283- if expression :
284- process2 = copy .deepcopy (process )
285- process2 .expression = expression
286- else :
287- process2 = process
288- return etool_to_cltool (process2 ), True
289- if isinstance (process , cwl .Workflow ):
290- return traverse_workflow (
291- process , replace_etool , skip_command_line1 , skip_command_line2
292- )
293- return process , False
294296
295297
296298def load_step (
@@ -668,8 +670,8 @@ def process_workflow_reqs_and_hints(
668670 iwdr : cwl .InitialWorkDirRequirement | None = None
669671 if workflow .requirements is not None :
670672 for req in cast (list [cwl .ProcessRequirement ], workflow .requirements ):
671- if req and isinstance ( req , cwl . EnvVarRequirement ) :
672- if req .envDef :
673+ match req :
674+ case cwl . EnvVarRequirement () if req .envDef :
673675 for index , envDef in enumerate (req .envDef ):
674676 if envDef .envValue :
675677 expression = get_expression (envDef .envValue , inputs , None )
@@ -699,36 +701,33 @@ def process_workflow_reqs_and_hints(
699701 newEnvDef .envValue = f"$(inputs._envDef{ index } )"
700702 envVarReq .envDef [index ] = newEnvDef
701703 generated_envVar_reqs .append ((etool_id , index ))
702- if req and isinstance (req , cwl .ResourceRequirement ):
703- for attr in cwl .ResourceRequirement .attrs :
704- this_attr = getattr (req , attr , None )
705- if this_attr :
706- expression = get_expression (this_attr , inputs , None )
707- if expression :
708- modified = True
709- target = cwl .InputParameter (id = None , type_ = "long" )
710- etool_id = (
711- "_expression_workflow_ResourceRequirement_{}" .format (
704+ case cwl .ResourceRequirement ():
705+ for attr in cwl .ResourceRequirement .attrs :
706+ this_attr = getattr (req , attr , None )
707+ if this_attr :
708+ expression = get_expression (this_attr , inputs , None )
709+ if expression :
710+ modified = True
711+ target = cwl .InputParameter (id = None , type_ = "long" )
712+ etool_id = "_expression_workflow_ResourceRequirement_{}" .format (
712713 attr
713714 )
714- )
715- replace_expr_with_etool (
716- expression ,
717- etool_id ,
718- workflow ,
719- target ,
720- None ,
721- replace_etool ,
722- )
723- if not resourceReq :
724- resourceReq = cwl .ResourceRequirement (
725- loadingOptions = workflow .loadingOptions ,
715+ replace_expr_with_etool (
716+ expression ,
717+ etool_id ,
718+ workflow ,
719+ target ,
720+ None ,
721+ replace_etool ,
726722 )
727- prop_reqs += (cwl .ResourceRequirement ,)
728- setattr (resourceReq , attr , f"$(inputs._{ attr } )" )
729- generated_res_reqs .append ((etool_id , attr ))
730- if req and isinstance (req , cwl .InitialWorkDirRequirement ):
731- if req .listing :
723+ if not resourceReq :
724+ resourceReq = cwl .ResourceRequirement (
725+ loadingOptions = workflow .loadingOptions ,
726+ )
727+ prop_reqs += (cwl .ResourceRequirement ,)
728+ setattr (resourceReq , attr , f"$(inputs._{ attr } )" )
729+ generated_res_reqs .append ((etool_id , attr ))
730+ case cwl .InitialWorkDirRequirement () if req .listing :
732731 if isinstance (req .listing , str ):
733732 expression = get_expression (req .listing , inputs , None )
734733 if expression :
@@ -991,8 +990,8 @@ def process_level_reqs(
991990 return False
992991 step_name = step .id .split ("#" , 1 )[- 1 ]
993992 for req_index , req in enumerate (process .requirements ):
994- if req and isinstance ( req , cwl . EnvVarRequirement ) :
995- if req .envDef :
993+ match req :
994+ case cwl . EnvVarRequirement () if req .envDef :
996995 for env_index , envDef in enumerate (req .envDef ):
997996 if envDef .envValue :
998997 expression = get_expression (envDef .envValue , inputs , None )
@@ -1015,33 +1014,35 @@ def process_level_reqs(
10151014 env_index
10161015 ].envValue = f"$(inputs._envDef{ env_index } )"
10171016 generated_envVar_reqs .append ((etool_id , env_index ))
1018- if req and isinstance (req , cwl .ResourceRequirement ):
1019- for attr in cwl .ResourceRequirement .attrs :
1020- this_attr = getattr (req , attr , None )
1021- if this_attr :
1022- expression = get_expression (this_attr , inputs , None )
1023- if expression :
1024- modified = True
1025- target = cwl .InputParameter (id = None , type_ = "long" )
1026- etool_id = "_expression_{}_ResourceRequirement_{}" .format (
1027- step_name , attr
1028- )
1029- replace_clt_hintreq_expr_with_etool (
1030- expression , etool_id , parent , target , step , replace_etool
1031- )
1032- setattr (
1033- target_process .requirements [req_index ],
1034- attr ,
1035- f"$(inputs._{ attr } )" ,
1036- )
1037- generated_res_reqs .append ((etool_id , attr ))
1038-
1039- if (
1040- not skip_command_line2
1041- and req
1042- and isinstance (req , cwl .InitialWorkDirRequirement )
1043- ):
1044- if req .listing :
1017+ case cwl .ResourceRequirement ():
1018+ for attr in cwl .ResourceRequirement .attrs :
1019+ this_attr = getattr (req , attr , None )
1020+ if this_attr :
1021+ expression = get_expression (this_attr , inputs , None )
1022+ if expression :
1023+ modified = True
1024+ target = cwl .InputParameter (id = None , type_ = "long" )
1025+ etool_id = "_expression_{}_ResourceRequirement_{}" .format (
1026+ step_name , attr
1027+ )
1028+ replace_clt_hintreq_expr_with_etool (
1029+ expression ,
1030+ etool_id ,
1031+ parent ,
1032+ target ,
1033+ step ,
1034+ replace_etool ,
1035+ )
1036+ setattr (
1037+ target_process .requirements [req_index ],
1038+ attr ,
1039+ f"$(inputs._{ attr } )" ,
1040+ )
1041+ generated_res_reqs .append ((etool_id , attr ))
1042+
1043+ case cwl .InitialWorkDirRequirement () if (
1044+ not skip_command_line2 and req .listing
1045+ ):
10451046 if isinstance (req .listing , str ):
10461047 expression = get_expression (req .listing , inputs , None )
10471048 if expression :
0 commit comments