Skip to content

Commit eab5b73

Browse files
committed
[WDL 1.2] override task requirements in inputs
1 parent d840557 commit eab5b73

File tree

6 files changed

+84
-17
lines changed

6 files changed

+84
-17
lines changed

WDL/CLI.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,11 +1035,21 @@ def runner_input(
10351035
decl = available_inputs.get(name)
10361036

10371037
if not decl:
1038-
# allow arbitrary runtime overrides
1038+
# allow arbitrary runtime overrides (or "requirements" in WDL 1.2)
10391039
nmparts = name.split(".")
1040-
runtime_idx = next((i for i, term in enumerate(nmparts) if term in ("runtime",)), -1)
1041-
if runtime_idx >= 0 and len(nmparts) > (runtime_idx + 1):
1042-
decl = available_inputs.get(".".join(nmparts[:runtime_idx] + ["_runtime"]))
1040+
for override in (
1041+
"requirements",
1042+
"runtime",
1043+
):
1044+
runtime_idx = next(
1045+
(i for i, term in enumerate(nmparts) if term == override),
1046+
-1,
1047+
)
1048+
if runtime_idx >= 0 and len(nmparts) > (runtime_idx + 1):
1049+
if decl := available_inputs.get(
1050+
".".join(nmparts[:runtime_idx] + ["_" + override])
1051+
):
1052+
break
10431053

10441054
if not decl:
10451055
runner_input_help(target)

WDL/Tree.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,8 @@ def available_inputs(self) -> Env.Bindings[Decl]:
338338
if self.effective_wdl_version not in ("draft-2", "1.0"):
339339
# synthetic placeholder to expose runtime overrides
340340
ans = ans.bind("_runtime", Decl(self.pos, Type.Any(), "_runtime"))
341+
if self.effective_wdl_version not in ("1.1",):
342+
ans = ans.bind("_requirements", Decl(self.pos, Type.Any(), "_requirements"))
341343

342344
for decl in reversed(self.inputs if self.inputs is not None else self.postinputs):
343345
ans = ans.bind(decl.name, decl)

WDL/__init__.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -244,17 +244,29 @@ def values_from_json(
244244
else:
245245
key2parts = key2.split(".")
246246

247-
runtime_idx = next(
248-
(i for i, term in enumerate(key2parts) if term in ("runtime",)), -1
249-
)
247+
for override in (
248+
"requirements",
249+
"runtime",
250+
):
251+
runtime_idx = next(
252+
(i for i, term in enumerate(key2parts) if term == override),
253+
-1,
254+
)
255+
if (
256+
runtime_idx >= 0
257+
and len(key2parts) > (runtime_idx + 1)
258+
and ".".join(key2parts[:runtime_idx] + ["_" + override]) in available
259+
):
260+
# allow arbitrary keys for runtime
261+
ty = Type.Any()
262+
250263
if (
251-
runtime_idx >= 0
252-
and len(key2parts) > (runtime_idx + 1)
253-
and ".".join(key2parts[:runtime_idx] + ["_runtime"]) in available
264+
not ty
265+
and len(key2parts) == 3
266+
and key2parts[0]
267+
and key2parts[1]
268+
and key2parts[2]
254269
):
255-
# allow arbitrary keys for runtime
256-
ty = Type.Any()
257-
elif len(key2parts) == 3 and key2parts[0] and key2parts[1] and key2parts[2]:
258270
# attempt to simplify <call>.<subworkflow>.<input> from old Cromwell JSON
259271
key2 = ".".join([key2parts[0], key2parts[2]])
260272
if key2 in available:

WDL/runtime/task.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,8 @@ def _eval_task_runtime(
501501
runtime_values[key] = expr.eval(env, stdlib)
502502
for b in inputs.enter_namespace("runtime"):
503503
runtime_values[b.name] = b.value # input overrides
504+
for b in inputs.enter_namespace("requirements"):
505+
runtime_values[b.name] = b.value
504506
logger.debug(_("runtime values", **dict((key, str(v)) for key, v in runtime_values.items())))
505507

506508
# have container implementation validate & postprocess into container.runtime_values

tests/runner.t

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ source tests/bash-tap/bash-tap-bootstrap
1111
export PYTHONPATH="$SOURCE_DIR:$PYTHONPATH"
1212
miniwdl="python3 -m WDL"
1313

14-
plan tests 97
14+
plan tests 99
1515

1616
$miniwdl run_self_test
1717
is "$?" "0" "run_self_test"
@@ -372,6 +372,10 @@ is "$?" "0" "directory input"
372372
is `jq -r '.["w.dsz"]' _LAST/outputs.json` "10" "use of directory input"
373373
grep -q 20.10 _LAST/out/issue/issue
374374
is "$?" "0" "override t.runtime.docker"
375+
$miniwdl run dir_io.wdl d=indir t.requirements.docker=ubuntu:24.04
376+
is "$?" "0" "directory input 2"
377+
grep -q 24.04 _LAST/out/issue/issue
378+
is "$?" "0" "override t.requirements.docker"
375379

376380
cat << 'EOF' > uri_inputs.json
377381
{

tests/test_7runner.py

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ def test_runtime_override(self):
751751
input {
752752
String who
753753
}
754-
call t {
754+
call t as tc {
755755
input:
756756
who = who
757757
}
@@ -775,9 +775,46 @@ def test_runtime_override(self):
775775
"""
776776
outp = self._run(wdl, {
777777
"who": "Alice",
778-
"t.runtime.container": ["ubuntu:20.10"]
778+
"tc.runtime.container": ["ubuntu:20.10"]
779+
})
780+
assert "20.10" in outp["tc.issue"]
781+
782+
outp = self._run(wdl, {
783+
"who": "Alice",
784+
"tc.requirements.container": ["ubuntu:24.04"]
785+
})
786+
assert "24.04" in outp["tc.issue"]
787+
788+
def test_task_named_requirements(self):
789+
# "requirements" became a keyword in WDL 1.2, so before that a task or one of its inputs
790+
# could be named "requirements" -- ensure that still works as expected
791+
wdl = """
792+
version 1.1
793+
workflow w {
794+
call requirements
795+
}
796+
task requirements {
797+
input {
798+
Int requirements = 21
799+
}
800+
command {}
801+
output {
802+
Int result = requirements
803+
}
804+
runtime {
805+
docker: "ubuntu:24.04"
806+
}
807+
}
808+
"""
809+
outp = self._run(wdl, {
810+
"requirements.requirements": 42
779811
})
780-
assert "20.10" in outp["t.issue"]
812+
assert outp["requirements.result"] == 42
813+
814+
with self.assertRaises(WDL.Error.InputError):
815+
outp = self._run(wdl, {
816+
"requirements.requirements": "bogus"
817+
})
781818

782819

783820
class MiscRegressionTests(RunnerTestCase):

0 commit comments

Comments
 (0)