🐓

CWL の requirements 一巡り: InlineJavascriptRequirement

2020/12/04に公開
3

この記事は CWL Advent Calendar 2020 の5日目の記事です。

Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]

今回は CWL v1.2 で定義されている InlineJavascriptRequirement について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。

対象読者

Conformance test #14: tests/null-expression1-tool.cwl:

#!/usr/bin/env cwl-runner

class: ExpressionTool
requirements:
  - class: InlineJavascriptRequirement
cwlVersion: v1.2

inputs:
  i1:
    type: Any
    default: "the-default"

outputs:
  output: int

expression: "$({'output': (inputs.i1 == 'the-default' ? 1 : 2)})"

InlineJavascriptRequirementrequirements に記述されている場合、$()${} で囲まれた部分は JavaScript のコードとして解釈されます[2][3]

上の例だと、

  • 入力パラメータ i1 が与えられていない場合には "the-default"inputs.i1 として評価され(入力パラメータの値は inputs.パラメータ名 で参照できます)、expression フィールドの Javascript の expression が 1 に評価されます。その結果、この ExpressionTool の出力パラメータ outputs.output として 1 が返ります。
  • i1 として "the-default" 以外が渡された場合には、outputs.output として 2 が返ります。

InlineJavascriptRequirement は非常に強力ですが、読者に大きな負担がかかる可能性があるため、outputBinding.glob などの代替手段がある場合にはそちらを使ったほうがいいでしょう。

おまけ

Zenn のコードブロックが CWL に対応していなくて悲しみ

脚注
  1. つまり、Process requiremens を含むワークフローやツール定義は、全ての CWL 準拠のワークフロー実行処理系で動かせるわけではありません。詳細は別記事を参照してください。 ↩︎

  2. これに似たややこしい仕様に Parameter references があります。$() が JavaScript として解釈されるか Parameter references として解釈されるかは InlineJavascriptRequirement の有無でしか判断できないため、人が書いた CWL を読む時には注意しましょう。 ↩︎

  3. JavaScript の実行には Node.js が必要です。いくつかの処理系では、DockerRequirementInlineJavascriptRequirement の両方が指定された場合には node コンテナ をダウンロードして実行しようとするため、若干の注意が必要です。 ↩︎

Discussion

catnosecatnose

本筋から外れてしまうコメントで恐縮ですが、Zennのコードブロックにはprism.jsが使われており、現状の対応言語はprism.jsの対応言語という感じです…。

CWLはコードブロックの言語をyamlにするとわりといい感じに見えるのですかね?cwlが指定されたときにyamlのハイライトをあてるようなことは現時点でも対応可能なのですが…

Tomoya TanjoTomoya Tanjo

コメントありがとうございます。

Zennのコードブロックにはprism.jsが使われており、現状の対応言語はprism.jsの対応言語という感じです…。

なるほど。了解しました。

CWLはコードブロックの言語をyamlにするとわりといい感じに見えるのですかね?

はい。CWL の文法自体は、YAML に cwlVersion などの専用の語彙が追加されたものとして定義されています。

cwlが指定されたときにyamlのハイライトをあてるようなことは現時点でも対応可能なのですが…

お願いします!