小ネタ:runnのカスタムランナーでFizzBuzzやってみた

runnにカスタムランナーという機能があるようなので、ものは試しとFizzBuzzやってみました
2024.03.01

ふむふむ。

Support Custom runner (using Include runner) by k1LoW · Pull Request #805 · k1LoW/runn

This change allows defining a runner with different syntax while using existing runners.

もともとあるrunnerを使ったカスタム構文を作れる、と。

やってみた

こういうときのお遊びといったら、FizzBuzzと相場が決まっています(髙野調べ)。

まず、カスタムrunnerを定義して呼び出すrunbookを作ります。

custom-practice.yaml

desc: Custom runners
runners:
  fizzbuzz:
    path: fizz-buzz.yaml
steps:
  -
    loop: 20
    fizzbuzz:
      num: "{{ i+1 }}"

20回ループしながら、1→20までの数字を fizzbuzz という名前で定義したカスタムランナーに、numという名前で渡します。

ポイントはこちら。

  • カスタムランナーは runners セクションのキーとして設定する
  • カスタムランナーの定義は別ファイル(今回はfizz-buzz.yaml)に切り出してインクルードする

次にカスタムランナーの定義であるfizz-buzz.yamlを作ります。

fizz-buzz.yaml

desc: FizzBuzz runner
vars:
  num: '{{ parent.nodes.num }}'
if: included
steps:
  -
    if: 'vars.num % 3 == 0 && vars.num % 5 != 0'
    dump: "'fizz'"
  -
    if: 'vars.num % 3 != 0 && vars.num % 5 == 0'
    dump: "'buzz'"
  -
    if: 'vars.num % 3 == 0 && vars.num % 5 == 0'
    dump: "'fizz-buzz'"
  -
    if: 'vars.num % 3 != 0 && vars.num % 5 != 0'
    dump: vars.num

ポイントはこちら

  • 引数は vars セクションにて、 parent.nodes のmapから、親ファイル(この場合custom-practice.yaml)のカスタムランナー実行時に指定した値を引っ張り出す
  • ステップを途中で止めて早期リターンするような機能はないので、愚直に全部に if で条件を指定する

実行結果がこちら。

$ runn run custom-practice.yaml
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizz-buzz
16
17
fizz
19
buzz
.

1 scenario, 0 skipped, 0 failures

ちゃんとFizzBuzzができていますね。

まとめ

今回はおふざけのようなカスタムランナーでしたが、記事の最初に紹介したPull Requestに含まれるファイルを見ると、結構柔軟に定義できるようです。 もうちょっとまともなものを作ったら、改めてご紹介しますね。