12
12
from schema_salad .utils import json_dumps
13
13
14
14
SKIP_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
16
16
# as Galaxy will use cwltool which can handle expression which might appear there
17
17
18
18
def main ():
@@ -555,16 +555,16 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
555
555
generated_iwdr_reqs : List [Tuple [str , Union [int , str ], Any ]] = []
556
556
generated_envVar_reqs : List [Tuple [str , Union [int , str ]]] = []
557
557
step_name = step .id .split ('#' ,1 )[1 ]
558
- for req in process .requirements :
558
+ for req_index , req in enumerate ( process .requirements ) :
559
559
if req and isinstance (req , cwl .EnvVarRequirement ):
560
560
if req .envDef :
561
- for index , envDef in enumerate (req .envDef ):
561
+ for env_index , envDef in enumerate (req .envDef ):
562
562
if envDef .envValue :
563
563
expression = get_expression (envDef .envValue , inputs , None )
564
564
if expression :
565
565
modified = True
566
566
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 )
568
568
replace_expr_with_etool (
569
569
expression ,
570
570
etool_id ,
@@ -573,7 +573,7 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
573
573
None ,
574
574
replace_etool ,
575
575
process )
576
- envDef .envValue = "$(inputs._envDef{})" .format (index )
576
+ target_process . requirements [ req_index ][ env_index ] .envValue = "$(inputs._envDef{})" .format (index )
577
577
generated_envVar_reqs .append ((etool_id , index ))
578
578
if req and isinstance (req , cwl .ResourceRequirement ):
579
579
for attr in cwl .ResourceRequirement .attrs :
@@ -591,10 +591,10 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
591
591
target ,
592
592
step ,
593
593
replace_etool )
594
- setattr (req , attr , "$(inputs._{})" .format (attr ))
594
+ setattr (target_process . requirements [ req_index ] , attr , "$(inputs._{})" .format (attr ))
595
595
generated_res_reqs .append ((etool_id , attr ))
596
596
597
- if req and isinstance (req , cwl .InitialWorkDirRequirement ):
597
+ if not SKIP_COMMAND_LINE2 and req and isinstance (req , cwl .InitialWorkDirRequirement ):
598
598
if req .listing :
599
599
if isinstance (req .listing , str ):
600
600
expression = get_expression (req .listing , inputs , None )
@@ -611,17 +611,17 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
611
611
None ,
612
612
replace_etool ,
613
613
process )
614
- req .listing = "$(inputs._iwdr_listing)" ,
614
+ target_process . requirements [ req_index ] .listing = "$(inputs._iwdr_listing)" ,
615
615
step .in_ .append (cwl .WorkflowStepInput ("{}/result" .format (etool_id ), None , "_iwdr_listing" , None , None ))
616
616
add_input_to_process (target_process , "_iwdr_listing" , target_type , process .loadingOptions )
617
617
else :
618
- for index , entry in enumerate (req .listing ):
618
+ for listing_index , entry in enumerate (req .listing ):
619
619
expression = get_expression (entry , inputs , None )
620
620
if expression :
621
621
modified = True
622
622
target_type = cwl .InputArraySchema (['File' , 'Directory' ], 'array' , None , None )
623
623
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 )
625
625
replace_expr_with_etool (
626
626
expression ,
627
627
etool_id ,
@@ -630,26 +630,38 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
630
630
None ,
631
631
replace_etool ,
632
632
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 ))
635
635
elif isinstance (entry , cwl .Dirent ):
636
636
if entry .entry :
637
637
expression = get_expression (entry .entry , inputs , None )
638
638
if expression :
639
639
modified = True
640
+ entryname_expr = get_expression (entry .entryname , inputs , None )
641
+ entryname = entry .entryname if entryname_expr else '"{}"' .format (entry .entryname )
640
642
target_type = ["File" , "Directory" ]
641
643
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; }"""
644
656
replace_clt_hintreq_expr_with_etool (
645
657
expression ,
646
658
etool_id ,
647
659
parent ,
648
660
target ,
649
661
step ,
650
662
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 ))
653
665
elif entry .entryname :
654
666
expression = get_expression (entry .entryname , inputs , None )
655
667
if expression :
@@ -664,7 +676,7 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
664
676
None ,
665
677
replace_etool ,
666
678
process )
667
- entry . entryname = "$(inputs._iwdr_listing_{}" .format (index )
679
+ target_process . requirements [ req_index ]. listing [ listing_index ]. entryname = "$(inputs._iwdr_listing_{}) " .format (index )
668
680
generated_iwdr_reqs .append ((etool_id , index , "string" ))
669
681
for entry in generated_envVar_reqs :
670
682
name = "_envDef{}" .format (entry [1 ])
@@ -675,7 +687,7 @@ def process_level_reqs(process: cwl.Process, step: cwl.WorkflowStep, parent: cwl
675
687
step .in_ .append (cwl .WorkflowStepInput ("{}/result" .format (entry [0 ]), None , name , None , None ))
676
688
add_input_to_process (target_process , name , "long" , process .loadingOptions )
677
689
for entry in generated_iwdr_reqs :
678
- name = "_iwdr_listing_{}" .format (index )
690
+ name = "_iwdr_listing_{}" .format (entry [ 1 ] )
679
691
step .in_ .append (cwl .WorkflowStepInput ("{}/result" .format (entry [0 ]), None , name , None , None ))
680
692
add_input_to_process (target_process , name , entry [2 ], process .loadingOptions )
681
693
return modified
@@ -938,7 +950,7 @@ def replace_clt_hintreq_expr_with_etool(expr: str,
938
950
step : cwl .WorkflowStep ,
939
951
replace_etool = False ,
940
952
self_name : Optional [str ]= None ,
941
- ) -> None :
953
+ ) -> cwl . ExpressionTool :
942
954
# Same as replace_step_clt_expr_with_etool or different?
943
955
etool_inputs = cltool_inputs_to_etool_inputs (step .run )
944
956
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,
955
967
name ,
956
968
wf_step_inputs ,
957
969
[cwl .WorkflowStepOutput ("result" )], None , None , None , None , etool , None , None ))
970
+ return etool
958
971
959
972
960
973
def cltool_inputs_to_etool_inputs (tool : cwl .CommandLineTool ) -> List [cwl .InputParameter ]:
@@ -1017,8 +1030,10 @@ def generate_etool_from_expr2(expr: str,
1017
1030
if process :
1018
1031
if process .hints :
1019
1032
hints = copy .deepcopy (process .hints )
1033
+ hints [:] = [x for x in hints if not isinstance (x , cwl .InitialWorkDirRequirement )]
1020
1034
if process .requirements :
1021
1035
reqs .extend (copy .deepcopy (process .requirements ))
1036
+ reqs [:] = [x for x in reqs if not isinstance (x , cwl .InitialWorkDirRequirement )]
1022
1037
return cwl .ExpressionTool (
1023
1038
None , inputs , outputs , reqs , None ,
1024
1039
None , None , "v1.0" , expression )
0 commit comments