CWL の requirements 一巡り: SchemaDefRequirement
この記事は CWL Advent Calendar 2020 の6日目の記事です。
Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]。
今回は CWL v1.2 で定義されている SchemaDefRequirement
について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。
対象読者
- CWL をかじったことがあるけど
requirements
はよくわからない人- つまり中級者以上が対象です。
- 初心者は CWL Advent Calendar 2020 の初日の記事へ Go!
例
Conformance test #198: tests/anon_enum_inside_array_inside_schemadef.cwl:
cwlVersion: v1.2
class: CommandLineTool
requirements:
SchemaDefRequirement:
types:
- name: vcf2maf_params
type: record
fields:
species:
- "null"
- type: enum
symbols: [homo_sapiens, mus_musculus]
ncbi_build:
- "null"
- type: enum
symbols: [GRCh37, GRCh38, GRCm38]
inputs:
first: vcf2maf_params
baseCommand: echo
arguments:
- prefix: species
valueFrom: $(inputs.first.species)
- prefix: ncbi_build
valueFrom: $(inputs.first.ncbi_build)
outputs:
result: stdout
SchemaDefRequirement
を用いることで、record 型 (多くのプログラミング言語で提供されている class
や struct
に相当するもの) および enum 型 (symbols
フィールドで指定した値しか取れない文字列型)を定義し、name
フィールドで付けた名前を使って inputs
フィールドや outputs
フィールド中から参照することができます。
上の例では、SchemaDefRequirement.types
内で species
と ncbi_build
フィールドを持つ vcf2maf_params
型を定義し、inputs.first
の型として利用しています。この例では一回しか参照していないためありがたみは薄いですが、入力と出力で同じ型が現れる場合など、複数回の参照が必要になる場合には有効です。
ただし record 型を用いると経験的に可読性が著しく落ちるため、本当に必要な場面以外では使用しないほうがいいでしょう。例えば git
などのサブコマンドを持つツール用の CWL 定義を書く際には役に立つかもしれませんが、大抵の場合は git log
や git commit
などの各サブコマンドに対してツール定義を書くほうが簡単で、かつユーザーからも利用しやすくなります。
Discussion