1212from schema_salad .utils import json_dumps
1313
1414SKIP_COMMAND_LINE = True # don't process CommandLineTool.inputs...inputBinding and CommandLineTool.arguments sections
15- SKIP_COMMAND_LINE2 = True # don't process CommandLineTool.outputEval
15+ SKIP_COMMAND_LINE2 = True # don't process CommandLineTool.outputEval or CommandLineTool.requirements...InitialWorkDirRequirement
1616# as Galaxy will use cwltool which can handle expression which might appear there
1717
1818def main ():
@@ -555,16 +555,16 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
555555 generated_iwdr_reqs : List [Tuple [str , Union [int , str ], Any ]] = []
556556 generated_envVar_reqs : List [Tuple [str , Union [int , str ]]] = []
557557 step_name = step .id .split ('#' ,1 )[1 ]
558- for req in process .requirements :
558+ for req_index , req in enumerate ( process .requirements ) :
559559 if req and isinstance (req , cwl .EnvVarRequirement ):
560560 if req .envDef :
561- for index , envDef in enumerate (req .envDef ):
561+ for env_index , envDef in enumerate (req .envDef ):
562562 if envDef .envValue :
563563 expression = get_expression (envDef .envValue , inputs , None )
564564 if expression :
565565 modified = True
566566 target = cwl .InputParameter (None , None , None , None , None , None , None , None , "string" )
567- etool_id = "_expression_{}_EnvVarRequirement_{}" .format (step_name , index )
567+ etool_id = "_expression_{}_EnvVarRequirement_{}" .format (step_name , env_index )
568568 replace_expr_with_etool (
569569 expression ,
570570 etool_id ,
@@ -573,7 +573,7 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
573573 None ,
574574 replace_etool ,
575575 process )
576- envDef .envValue = "$(inputs._envDef{})" .format (index )
576+ target_process . requirements [ req_index ][ env_index ] .envValue = "$(inputs._envDef{})" .format (index )
577577 generated_envVar_reqs .append ((etool_id , index ))
578578 if req and isinstance (req , cwl .ResourceRequirement ):
579579 for attr in cwl .ResourceRequirement .attrs :
@@ -591,10 +591,10 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
591591 target ,
592592 step ,
593593 replace_etool )
594- setattr (req , attr , "$(inputs._{})" .format (attr ))
594+ setattr (target_process . requirements [ req_index ] , attr , "$(inputs._{})" .format (attr ))
595595 generated_res_reqs .append ((etool_id , attr ))
596596
597- if req and isinstance (req , cwl .InitialWorkDirRequirement ):
597+ if not SKIP_COMMAND_LINE2 and req and isinstance (req , cwl .InitialWorkDirRequirement ):
598598 if req .listing :
599599 if isinstance (req .listing , str ):
600600 expression = get_expression (req .listing , inputs , None )
@@ -611,17 +611,17 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
611611 None ,
612612 replace_etool ,
613613 process )
614- req .listing = "$(inputs._iwdr_listing)" ,
614+ target_process . requirements [ req_index ] .listing = "$(inputs._iwdr_listing)" ,
615615 step .in_ .append (cwl .WorkflowStepInput ("{}/result" .format (etool_id ), None , "_iwdr_listing" , None , None ))
616616 add_input_to_process (target_process , "_iwdr_listing" , target_type , process .loadingOptions )
617617 else :
618- for index , entry in enumerate (req .listing ):
618+ for listing_index , entry in enumerate (req .listing ):
619619 expression = get_expression (entry , inputs , None )
620620 if expression :
621621 modified = True
622622 target_type = cwl .InputArraySchema (['File' , 'Directory' ], 'array' , None , None )
623623 target = cwl .InputParameter (None , None , None , None , None , None , None , None , target_type )
624- etool_id = "_expression_{}_InitialWorkDirRequirement_{}" .format (step_name , index )
624+ etool_id = "_expression_{}_InitialWorkDirRequirement_{}" .format (step_name , listing_index )
625625 replace_expr_with_etool (
626626 expression ,
627627 etool_id ,
@@ -630,26 +630,38 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
630630 None ,
631631 replace_etool ,
632632 process )
633- req . listing [index ] = "$(inputs._iwdr_listing_{}" .format (index )
634- generated_iwdr_reqs .append ((etool_id , index , target_type ))
633+ target_process . requirements [ req_index ]. listing [listing_index ] = "$(inputs._iwdr_listing_{}" .format (listing_index )
634+ generated_iwdr_reqs .append ((etool_id , listing_index , target_type ))
635635 elif isinstance (entry , cwl .Dirent ):
636636 if entry .entry :
637637 expression = get_expression (entry .entry , inputs , None )
638638 if expression :
639639 modified = True
640+ entryname_expr = get_expression (entry .entryname , inputs , None )
641+ entryname = entry .entryname if entryname_expr else '"{}"' .format (entry .entryname )
640642 target_type = ["File" , "Directory" ]
641643 target = cwl .InputParameter (None , None , None , None , None , None , None , None , target_type )
642- etool_id = "_expression_{}_InitialWorkDirRequirement_{}" .format (step_name , index )
643- expression = '${return {"class": "File", "basename": "' + entry .entryname + '", "contents": (function(){' + expression [2 :- 1 ]+ '})() }; }'
644+ etool_id = "_expression_{}_InitialWorkDirRequirement_{}" .format (step_name , listing_index )
645+
646+ expression = "${var result; var entryname = " + entryname + "; var entry = " + entry .entry [2 :- 1 ] + """;
647+ if (typeof entry === 'string' || entry instanceof String) {
648+ result = {"class": "File", "basename": entryname, "contents": entry} ;
649+ if (typeof entryname === 'string' || entryname instanceof String) {
650+ result.basename = entryname ;
651+ }
652+ } else {
653+ result = entry ;
654+ }
655+ return result; }"""
644656 replace_clt_hintreq_expr_with_etool (
645657 expression ,
646658 etool_id ,
647659 parent ,
648660 target ,
649661 step ,
650662 replace_etool )
651- entry . entry = "$(inputs._iwdr_listing_{}" .format (index )
652- generated_iwdr_reqs .append ((etool_id , index , target_type ))
663+ target_process . requirements [ req_index ]. listing [ listing_index ]. entry = "$(inputs._iwdr_listing_{}) " .format (listing_index )
664+ generated_iwdr_reqs .append ((etool_id , listing_index , target_type ))
653665 elif entry .entryname :
654666 expression = get_expression (entry .entryname , inputs , None )
655667 if expression :
@@ -664,7 +676,7 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
664676 None ,
665677 replace_etool ,
666678 process )
667- entry . entryname = "$(inputs._iwdr_listing_{}" .format (index )
679+ target_process . requirements [ req_index ]. listing [ listing_index ]. entryname = "$(inputs._iwdr_listing_{}) " .format (index )
668680 generated_iwdr_reqs .append ((etool_id , index , "string" ))
669681 for entry in generated_envVar_reqs :
670682 name = "_envDef{}" .format (entry [1 ])
@@ -675,7 +687,7 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
675687 step .in_ .append (cwl .WorkflowStepInput ("{}/result" .format (entry [0 ]), None , name , None , None ))
676688 add_input_to_process (target_process , name , "long" , process .loadingOptions )
677689 for entry in generated_iwdr_reqs :
678- name = "_iwdr_listing_{}" .format (index )
690+ name = "_iwdr_listing_{}" .format (entry [ 1 ] )
679691 step .in_ .append (cwl .WorkflowStepInput ("{}/result" .format (entry [0 ]), None , name , None , None ))
680692 add_input_to_process (target_process , name , entry [2 ], process .loadingOptions )
681693 return modified
@@ -938,7 +950,7 @@ def replace_clt_hintreq_expr_with_etool(expr: str,
938950 step : cwl .WorkflowStep ,
939951 replace_etool = False ,
940952 self_name : Optional [str ]= None ,
941- ) -> None :
953+ ) -> cwl . ExpressionTool :
942954 # Same as replace_step_clt_expr_with_etool or different?
943955 etool_inputs = cltool_inputs_to_etool_inputs (step .run )
944956 etool = generate_etool_from_expr2 (expr , target , etool_inputs , self_name , step .run , [workflow ])
@@ -955,6 +967,7 @@ def replace_clt_hintreq_expr_with_etool(expr: str,
955967 name ,
956968 wf_step_inputs ,
957969 [cwl .WorkflowStepOutput ("result" )], None , None , None , None , etool , None , None ))
970+ return etool
958971
959972
960973def cltool_inputs_to_etool_inputs (tool : cwl .CommandLineTool ) -> List [cwl .InputParameter ]:
@@ -1017,8 +1030,10 @@ def generate_etool_from_expr2(expr: str,
10171030 if process :
10181031 if process .hints :
10191032 hints = copy .deepcopy (process .hints )
1033+ hints [:] = [x for x in hints if not isinstance (x , cwl .InitialWorkDirRequirement )]
10201034 if process .requirements :
10211035 reqs .extend (copy .deepcopy (process .requirements ))
1036+ reqs [:] = [x for x in reqs if not isinstance (x , cwl .InitialWorkDirRequirement )]
10221037 return cwl .ExpressionTool (
10231038 None , inputs , outputs , reqs , None ,
10241039 None , None , "v1.0" , expression )
0 commit comments