Permalink
Newer
Older
100644 543 lines (428 sloc) 13.2 KB
Jan 11, 2016 @scottfrazer readme updates
1 # Workflow Description Language (WDL)
Aug 28, 2012 @scottfrazer Update README.md
2
Apr 22, 2016 @geoffjentry Pointers to site in the intro
3 WDL is a workflow language meant to be read and written by humans. Broader documentation is provided
4 by the [WDL website](https://software.broadinstitute.org/wdl/). Any questions or issues can be discussed at
5 our [support forum](http://gatkforums.broadinstitute.org/wdl).
Aug 28, 2012 @scottfrazer Update README.md
6
Nov 24, 2015 @scottfrazer README changes
7 * [Draft 1 Language Specification](https://github.com/broadinstitute/wdl/blob/master/SPEC.md) (closed)
8 * [Draft 2 Language Specification](https://github.com/broadinstitute/wdl/blob/develop/SPEC.md) (open)
Nov 24, 2015 @scottfrazer README changes
9
Feb 9, 2016 @scottfrazer update README
10 Library and engine support is provided by
Nov 16, 2015 @scottfrazer README / python documentation updates
11
Feb 9, 2016 @scottfrazer update README
12 * [Java parser](java) which provides only a parser to convert a WDL string into an AST
13 * [wdl4s](http://github.com/broadinstitute/wdl4s) provides Scala bindings for WDL and uses the above Java parser
14 * [PyWDL](https://github.com/broadinstitute/pywdl) provides Python bindings for WDL
15 * [Cromwell](http://github.com/broadinstitute/cromwell) is an engine for running WDL workflows. This uses [wdl4s](http://github.com/broadinstitute/wdl4s)
Aug 28, 2012 @scottfrazer Update README.md
16
Feb 9, 2016 @scottfrazer docs
17 # Table of Contents
18
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
19 <!---toc start-->
20
Jan 11, 2016 @scottfrazer readme updates
21 * [Workflow Description Language (WDL)](#workflow-description-language-wdl)
22 * [Overview](#overview)
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
23 * [Getting Started with WDL](#getting-started-with-wdl)
24 * [Hello World WDL](#hello-world-wdl)
25 * [Modifying Task Outputs](#modifying-task-outputs)
26 * [Referencing Files on Disk](#referencing-files-on-disk)
27 * [Using Globs to Specify Output](#using-globs-to-specify-output)
28 * [Using String Interpolation](#using-string-interpolation)
29 * [Aliasing Calls](#aliasing-calls)
30 * [Specifying Inputs and Using Declarations](#specifying-inputs-and-using-declarations)
31 * [Using Files as Inputs](#using-files-as-inputs)
Jan 11, 2016 @scottfrazer readme updates
32 * [Scatter/Gather](#scattergather)
33
34 <!---toc end-->
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
35
36 # Overview
May 1, 2015 update README
37
38 The Workflow Description Language is a domain specific language for describing tasks and workflows.
39
40 An example WDL file that describes three tasks to run UNIX commands (in this case, `ps`, `grep`, and `wc`) and then link them together in a workflow would look like this:
Nov 27, 2012 @scottfrazer Updating README
41
Jan 11, 2016 @scottfrazer readme updates
42 ```wdl
May 1, 2015 update README
43 task ps {
Mar 15, 2015 @scottfrazer Basic README
44 command {
May 1, 2015 update README
45 ps
Aug 28, 2012 @scottfrazer moving README
46 }
May 1, 2015 update README
47 output {
May 20, 2015 @scottfrazer Update README.md
48 File procs = stdout()
Aug 28, 2012 @scottfrazer moving README
49 }
May 1, 2015 update README
50 }
51
52 task cgrep {
Sep 4, 2015 @scottfrazer readme
53 String pattern
54 File in_file
May 1, 2015 update README
55 command {
Sep 4, 2015 @scottfrazer readme
56 grep '${pattern}' ${in_file} | wc -l
May 1, 2015 update README
57 }
58 output {
Nov 16, 2015 @scottfrazer README / python documentation updates
59 Int count = read_int(stdout())
May 1, 2015 update README
60 }
61 }
62
63 task wc {
Sep 4, 2015 @scottfrazer readme
64 File in_file
May 1, 2015 update README
65 command {
Sep 4, 2015 @scottfrazer readme
66 cat ${in_file} | wc -l
May 1, 2015 update README
67 }
68 output {
Nov 16, 2015 @scottfrazer README / python documentation updates
69 Int count = read_int(stdout())
May 1, 2015 update README
70 }
71 }
72
73 workflow three_step {
74 call ps
75 call cgrep {
76 input: in_file=ps.procs
77 }
78 call wc {
79 input: in_file=ps.procs
Aug 28, 2012 @scottfrazer moving README
80 }
81 }
82 ```
83
May 1, 2015 update README
84 WDL aims to be able to describe tasks with abstract commands which have inputs. Abstract commands are a template with parts of the command left for the user to provide a value for. In the example above, the `task wc` declaration defines a task with one input (`in_file` of type file) and one output (`count` of type int).
Aug 28, 2012 @scottfrazer moving README
85
May 1, 2015 update README
86 Once tasks are defined, WDL allows you to construct a workflow of these tasks. Since each task defines its inputs and outputs explicitly, you can wire together one task's output to be another task's input and create a dependency graph. An execution engine can then collect the set of inputs it needs from the user to run each task in the workflow up front and then run the tasks in the right order.
Aug 28, 2012 @scottfrazer moving README
87
Nov 16, 2015 @scottfrazer README / python documentation updates
88 WDL also lets you define more advanced structures, like the ability to call a task in parallel (referred to as 'scattering'). In the example below, the `wc` task is being called n-times where n is the length of the `Array[String] str_array` variable. Each element of the `str_array` is used as the value of the `str` parameter in the call to the `wc` task.
Aug 28, 2012 @scottfrazer moving README
89
May 1, 2015 update README
90 ```
91 task wc {
Sep 4, 2015 @scottfrazer readme
92 String str
May 1, 2015 update README
93 command {
94 echo "${str}" | wc -c
95 }
96 output {
Nov 16, 2015 @scottfrazer README / python documentation updates
97 Int count = read_int(stdout()) - 1
May 1, 2015 update README
98 }
99 }
Mar 16, 2015 readme
100
May 1, 2015 update README
101 workflow wf {
May 6, 2015 change types from lower case to upper-case first letter
102 Array[String] str_array
May 1, 2015 update README
103 scatter(s in str_array) {
Sep 4, 2015 @scottfrazer readme
104 call wc {
105 input: str=s
106 }
May 1, 2015 update README
107 }
108 }
109 ```
Mar 16, 2015 readme
110
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
111 # Getting Started with WDL
112
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
113 We'll use [Cromwell](https://github.com/broadinstitute/cromwell) and [wdltool](https://github.com/broadinstitute/wdltool) to run these examples but you can use any WDL engine of your choice.
114
115 If you don't already have a reference to the Cromwell JAR file, one can be [downloaded](https://github.com/broadinstitute/cromwell/releases)
116
117 If you don't already have a reference to the wdltool JAR file, one can be [downloaded](https://github.com/broadinstitute/wdltool/releases)
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
118
119 ## Hello World WDL
120
121 Create a WDL simple file and save it as `hello.wdl`, for example:
122
Jan 11, 2016 @scottfrazer readme updates
123 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
124 task hello {
125 String name
126
127 command {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
128 echo 'Hello ${name}!'
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
129 }
130 output {
131 File response = stdout()
132 }
133 }
134
135 workflow test {
136 call hello
137 }
138 ```
139
140 Generate a template `hello.json` file with the `inputs` subcommand:
141
142 ```
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
143 $ java -jar wdltool.jar inputs hello.wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
144 {
145 "test.hello.name": "String"
146 }
147 ```
148
149 WDL has a concept of fully-qualified names. In the above output, `test.hello.name` is a fully-qualified name which should be read as: the `name` input on the `hello` call within workflow `test`. Fully-qualified names are used to unambiguously refer to specific elements of a workflow. All inputs are specified by fully-qualified names and all outputs are returned as fully-qualified names.
150
151 Modify this and save it to `hello.json`:
152
153 ```
154 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
155 "test.hello.name": "World"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
156 }
157 ```
158
159 Then, use the `run` subcommand to run the workflow:
160
161 ```
162 $ java -jar cromwell.jar run hello.wdl hello.json
163 ... truncated ...
164 {
165 "test.hello.response": "/home/user/test/c1d15098-bb57-4a0e-bc52-3a8887f7b439/call-hello/stdout8818073565713629828.tmp"
166 }
167 ```
168
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
169 Since the `hello` task returns a `File`, the result is a file that contains the string "Hello World!" in it.
170
171 ```
172 $ cat /home/user/test/c1d15098-bb57-4a0e-bc52-3a8887f7b439/call-hello/stdout8818073565713629828.tmp
173 hello world!
174 ```
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
175
176 ## Modifying Task Outputs
177
178 Currently the `hello` task returns a `File` with the greeting in it, but what if we wanted to return a `String` instead?
179 This can be done by utilizing the `read_string()` function:
180
Jan 11, 2016 @scottfrazer readme updates
181 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
182 task hello {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
183 String name
184
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
185 command {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
186 echo 'Hello ${name}!'
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
187 }
188 output {
189 String response = read_string(stdout())
190 }
191 }
192
193 workflow test {
194 call hello
195 }
196 ```
197
198 Now when this is run, we get the string output for `test.hello.response`:
199
200 ```
201 $ java -jar cromwell.jar run hello.wdl hello.json
202 ... truncated ...
203 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
204 "test.hello.response": "Hello World!"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
205 }
206 ```
207
Jun 30, 2016 @vdauwera Fixed broken link
208 `read_string` is a function in the [standard library](https://github.com/broadinstitute/wdl/blob/develop/SPEC.md#standard-library), which provides other useful functions for converting outputs to WDL data types.
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
209
210 ## Referencing Files on Disk
211
212 So far we've only been dealing with the standard output of a command, but what if it writes a file to disk? Consider this example:
213
Jan 11, 2016 @scottfrazer readme updates
214 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
215 task hello {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
216 String name
217
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
218 command {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
219 echo 'Hello ${name}!' > test.out
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
220 }
221 output {
Feb 1, 2016 @denis-yuen Fixes needed to run tutorial
222 String response = read_string("test.out")
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
223 }
224 }
225
226 workflow test {
227 call hello
228 }
229 ```
230
231 Now when this is run, we get the string output for `test.hello.response`:
232
233 ```
234 $ java -jar cromwell.jar run hello.wdl hello.json
235 ... truncated ...
236 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
237 "test.hello.response": "Hello World!"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
238 }
239 ```
240
Oct 25, 2016 @jmthibault79 correct URL
241 `read_string` is a function in the [standard library](https://github.com/broadinstitute/wdl/blob/develop/SPEC.md#standard-library), which provides other useful functions for converting outputs to WDL data types.
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
242
243 ## Using Globs to Specify Output
244
245 We can use the glob() function to read multiple files at once:
246
Jan 11, 2016 @scottfrazer readme updates
247 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
248 task globber {
249 command <<<
250 for i in `seq 1 5`
251 do
252 mkdir out-$i
253 echo "globbing is my number $i best hobby" > out-$i/$i.txt
254 done
255 >>>
256 output {
257 Array[File] outFiles = glob("out-*/*.txt")
258 }
259 }
260
261 workflow test {
262 call globber
263 }
264 ```
265
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
266 Now when this is run, the `outFiles` output array will contain all files
267 found by evaluating the specified glob.
268
269 ```
270 $ java -jar cromwell.jar run globber.wdl -
271 ... truncated ...
272 {
273 "test.globber.outFiles": ["/home/user/test/dee60566-267b-4f33-a1dd-0b199e6292b8/call-globber/out-3/3.txt", "/home/user/test/dee60566-267b-4f33-a1dd-0b199e6292b8/call-globber/out-5/5.txt", "/home/user/test/dee60566-267b-4f33-a1dd-0b199e6292b8/call-globber/out-2/2.txt", "/home/user/test/dee60566-267b-4f33-a1dd-0b199e6292b8/call-globber/out-4/4.txt", "/home/user/test/dee60566-267b-4f33-a1dd-0b199e6292b8/call-globber/out-1/1.txt"]
274 }
275 ```
276
277 This workflow has no inputs, so a "-" was passed to Cromwell for the inputs file.
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
278
279 ## Using String Interpolation
280
281 Sometimes, an output file is named as a function of one of its inputs.
282
Jan 11, 2016 @scottfrazer readme updates
283 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
284 task hello {
Feb 1, 2016 @denis-yuen Fixes needed to run tutorial
285 String name
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
286
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
287 command {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
288 echo 'Hello ${name}!' > ${name}.txt
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
289 }
290 output {
291 String response = read_string("${name}.txt")
292 }
293 }
294
295 workflow test {
296 call hello
297 }
298 ```
299
300 Here the inputs and outputs are exactly the same as previous examples, however the intermediate output file name of this task is named differently for every invocation.
301
302 ## Aliasing Calls
303
304 Say we wanted to call the `hello` task twice. Simply adding two `call hello` statements to the body of `workflow test` would result in non-unique fully-qualified names. To resolve this issue, `call` statements can be aliased using an `as` clause:
305
Jan 11, 2016 @scottfrazer readme updates
306 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
307 task hello {
Feb 1, 2016 @denis-yuen Fixes needed to run tutorial
308 String name
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
309
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
310 command {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
311 echo 'Hello ${name}!'
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
312 }
313 output {
314 String response = read_string(stdout())
315 }
316 }
317
318 workflow test {
319 call hello
320 call hello as hello2
321 }
322 ```
323
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
324 Now, we need to specify a value for `test.hello2.name` in the hello.json file:
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
325
326 ```
327 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
328 "test.hello.name": "World",
329 "test.hello2.name": "Boston"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
330 }
331 ```
332
333 Running this workflow now produces two outputs:
334
335 ```
336 $ java -jar cromwell.jar run hello.wdl hello.json
337 ... truncated ...
338 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
339 "test.hello.response": "Hello World!",
340 "test.hello2.response": "Hello Boston!"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
341 }
342 ```
343
344 ## Specifying Inputs and Using Declarations
345
346 A `call` can have an optional section to define inputs. As seen below, the key/value pairs represent the name of the input on the left-hand side and the expression for the input's value on the right-hand side:
347
Jan 11, 2016 @scottfrazer readme updates
348 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
349 task hello {
350 String name
351 String salutation
352
353 command {
354 echo '${salutation} ${name}!'
355 }
356 output {
357 String response = read_string(stdout())
358 }
359 }
360
361 workflow test {
362 call hello {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
363 input: salutation="Greetings"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
364 }
365 call hello as hello2
366 }
367 ```
368
369 Now, the `hello.json` would require three inputs:
370
371 ```
372 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
373 "test.hello.name": "World",
374 "test.hello2.name": "Boston",
375 "test.hello2.salutation": "Hello"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
376 }
377 ```
378
379 Running this workflow still gives us the two greetings we expect:
380
381 ```
382 $ java -jar cromwell.jar run hello.wdl hello.json
383 ... truncated ...
384 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
385 "test.hello.response": "Greetings World!",
386 "test.hello2.response": "Hello Boston!"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
387 }
388 ```
389
390 What if we wanted to parameterize the greeting and make it used for all invocations of task `hello`? In this situation, a declaration can be used:
391
Jan 11, 2016 @scottfrazer readme updates
392 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
393 task hello {
Feb 1, 2016 @denis-yuen Fixes needed to run tutorial
394 String salutation
395 String name
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
396
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
397 command {
398 echo '${salutation}, ${name}!'
399 }
400 output {
401 String response = read_string(stdout())
402 }
403 }
404
405 workflow test {
406 String greeting
407 call hello {
408 input: salutation=greeting
409 }
410 call hello as hello2 {
411 input: salutation=greeting + " and nice to meet you"
412 }
413 }
414 ```
415
416 `String greeting` is referenced to satisfy the "salutation" parameter to both invocations of the `hello` task.
417
418 The inputs required to run this would be:
419
420 ```
421 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
422 "test.hello.name": "World",
423 "test.hello2.name": "Boston",
424 "test.greeting": "Hello"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
425 }
426 ```
427
428 And this would produce the following outputs when run
429
430 ```
431 $ java -jar cromwell.jar run hello.wdl hello.json
432 ... truncated ...
433 {
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
434 "test.hello.response": "Hello, World!",
435 "test.hello2.response": "Hello and nice to meet you, Boston!"
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
436 }
437 ```
438
439 ## Using Files as Inputs
440
441 So far every example has used the default type of `String` for every input. Passing files along to tasks is simply a matter of defining the input type as `File`:
442
Jan 11, 2016 @scottfrazer readme updates
443 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
444 task grep {
445 File file
446
447 command {
448 grep -c '^...$' ${file}
449 }
450 output {
451 Int count = read_int(stdout())
452 }
453 }
454
455 workflow test {
456 call grep
457 }
458 ```
459
460 The `read_int()` function here would read the contents of its parameter, and interpret the first line as an integer and return that value as a WDL `Int` type.
461
462 If I specified a file called `test_file` with the contents of:
463
464 ```
465 foo
466 bar
467 baz
468 quux
469 ```
470
471 And then the inputs JSON file would be:
472
473 ```
474 {
475 "test.grep.file": "test_file"
476 }
477 ```
478
479 The result of running this would be:
480
481 ```
482 $ java -jar cromwell.jar run grep.wdl grep.json
483 ... truncated ...
484 {
485 "test.grep.count": 3
486 }
487 ```
488
489 ## Scatter/Gather
490
491 Scatter blocks can be used to run the same call multiple times but only varying a specific parameter on each invocation. Consider the following example:
492
Jan 11, 2016 @scottfrazer readme updates
493 ```wdl
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
494 task prepare {
495 command <<<
496 python -c "print('one\ntwo\nthree\nfour')"
497 >>>
498 output {
499 Array[String] array = read_lines(stdout())
500 }
501 }
502
503 task analysis {
504 String str
505 command <<<
506 python -c "print('_${str}_')"
507 >>>
508 output {
509 String out = read_string(stdout())
510 }
511 }
512
513 task gather {
514 Array[String] array
515 command <<<
516 echo ${sep=' ' array}
517 >>>
518 output {
519 String str = read_string(stdout())
520 }
521 }
522
523 workflow example {
524 call prepare
525 scatter (x in prepare.array) {
526 call analysis {input: str=x}
527 }
528 call gather {input: array=analysis.out}
529 }
530 ```
531
532 This example calls the `analysis` task once for each element in the array that the `prepare` task outputs. The resulting outputs of this workflow would be:
May 1, 2015 update README
533
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
534 ```
Apr 14, 2016 @mbookman Corrects "inputs" command reference, which moved from Cromwell to wdl…
535 $ java -jar cromwell.jar run scatter.wdl -
536 ... truncated ...
Dec 26, 2015 @geoffjentry initial copying of cromwell's scala wdl bindings
537 {
538 "example.analysis.out": ["_one_", "_two_", "_three_", "_four_"],
539 "example.gather.str": "_one_ _two_ _three_ _four_",
540 "example.prepare.array": ["one", "two", "three", "four"]
541 }
542 ```