Skip to content

Commit cb7425a

Browse files
committed
Improve InitialWorkDirRequirement
but disable for Galaxy
1 parent dcb3e1b commit cb7425a

File tree

1 file changed

+34
-19
lines changed

1 file changed

+34
-19
lines changed

cwl_utils/etools_to_clt.py

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from schema_salad.utils import json_dumps
1313

1414
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
1616
# as Galaxy will use cwltool which can handle expression which might appear there
1717

1818
def 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

960973
def 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

Comments
 (0)