Skip to content

Commit 60d57f5

Browse files
committed
CLI runtime overrides
1 parent a675670 commit 60d57f5

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

WDL/CLI.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -877,20 +877,26 @@ def runner_input(
877877
name, s_value = buf
878878

879879
# find corresponding input declaration
880-
try:
881-
decl = available_inputs[name]
882-
except KeyError:
880+
decl = available_inputs.get(name)
881+
882+
if not decl:
883+
# allow arbitrary runtime/hints overrides
884+
nmparts = name.split(".")
885+
runtime_idx = next(
886+
(i for i, term in enumerate(nmparts) if term in ("runtime", "hints")), -1
887+
)
888+
if runtime_idx >= 0 and len(nmparts) > (runtime_idx + 1):
889+
decl = available_inputs.get(".".join(nmparts[:runtime_idx] + ["_runtime"]))
890+
891+
if not decl:
883892
runner_input_help(target)
884893
raise Error.InputError(f"No such input to {target.name}: {buf[0]}")
885894

886895
# create a Value based on the expected type
887896
v = runner_input_value(s_value, decl.type, downloadable, root)
888897

889898
# insert value into input_env
890-
try:
891-
existing = input_env[name]
892-
except KeyError:
893-
existing = None
899+
existing = input_env.get(name)
894900
if existing:
895901
if isinstance(v, Value.Array):
896902
assert isinstance(existing, Value.Array) and v.type.coerces(existing.type)
@@ -1053,6 +1059,17 @@ def runner_input_value(s_value, ty, downloadable, root):
10531059
return Value.Array(
10541060
ty.item_type, [runner_input_value(s_value, ty.item_type, downloadable, root)]
10551061
)
1062+
if isinstance(ty, Type.Any):
1063+
# infer dynamically-typed runtime/hints overrides
1064+
try:
1065+
return Value.Int(int(s_value))
1066+
except ValueError:
1067+
pass
1068+
try:
1069+
return Value.Float(float(s_value))
1070+
except ValueError:
1071+
pass
1072+
return Value.String(s_value)
10561073
raise Error.InputError(
10571074
"No command-line support yet for inputs of type {}; workaround: specify in JSON file with --input".format(
10581075
str(ty)

WDL/Env.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ def resolve_binding(self, name: str) -> Binding[T]:
105105
return b
106106
raise KeyError()
107107

108+
def get(self, name: str, default: Optional[T] = None) -> Optional[T]:
109+
"""
110+
Look up a bound value by name, returning the default value or ``None`` if there's no such
111+
binding.
112+
"""
113+
try:
114+
return self.resolve_binding(name).value
115+
except KeyError:
116+
return default
117+
108118
def resolve(self, name: str) -> T:
109119
"""
110120
Look up a bound value by name. Equivalently, ``env[name]``

tests/runner.t

Lines changed: 13 additions & 4 deletions
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 72
14+
plan tests 74
1515

1616
$miniwdl run_self_test
1717
is "$?" "0" "run_self_test"
@@ -202,7 +202,7 @@ is "$?" "0" "failer2000 try3 iwuzhere"
202202

203203

204204
cat << 'EOF' > multitask.wdl
205-
version 1.0
205+
version development
206206
workflow multi {
207207
call first
208208
}
@@ -219,16 +219,20 @@ task first {
219219
task second {
220220
command {
221221
echo -n two
222+
cp /etc/issue issue
222223
}
223224
output {
224225
String msg = read_string(stdout())
226+
File issue = "issue"
225227
}
226228
}
227229
EOF
228230

229-
$miniwdl run multitask.wdl --task second
231+
$miniwdl run multitask.wdl runtime.docker=ubuntu:20.10 --task second
230232
is "$?" "0" "multitask"
231233
is "$(jq -r '.["second.msg"]' _LAST/outputs.json)" "two" "multitask stdout & _LAST"
234+
grep -q 20.10 _LAST/out/issue/issue
235+
is "$?" "0" "override runtime.docker"
232236

233237
cat << 'EOF' > mv_input_file.wdl
234238
version 1.0
@@ -261,28 +265,33 @@ workflow w {
261265
}
262266
output {
263267
Int dsz = round(size(t.files))
268+
File issue = t.issue
264269
}
265270
}
266271
task t {
267272
input {
268273
Directory d
269274
}
270275
command <<<
276+
cp /etc/issue issue
271277
mkdir outdir
272278
find ~{d} -type f | xargs -i{} cp {} outdir/
273279
>>>
274280
output {
275281
Array[File] files = glob("outdir/*")
282+
File issue = "issue"
276283
}
277284
}
278285
EOF
279286

280287
mkdir -p indir/subdir
281288
echo alice > indir/alice.txt
282289
echo bob > indir/subdir/bob.txt
283-
$miniwdl run dir_io.wdl d=indir
290+
$miniwdl run dir_io.wdl d=indir t.runtime.docker=ubuntu:20.10
284291
is "$?" "0" "directory input"
285292
is `jq -r '.["w.dsz"]' _LAST/outputs.json` "10" "use of directory input"
293+
grep -q 20.10 _LAST/out/issue/issue
294+
is "$?" "0" "override t.runtime.docker"
286295

287296
cat << 'EOF' > uri_inputs.json
288297
{

0 commit comments

Comments
 (0)