Open20

読者コミュニティ|runnチュートリアル

katzumikatzumi

Chapter.17 へのご質問

https://x.com/masaru_b_cl/status/1761039897035764105?s=20

以下調査スレになります

katzumikatzumi

runn v0.91.0で実行

なぜ v0.91.0 だったか?といういのは、チュートリアル作成時点のバージョンだから。。

 % SESSION="miserarenaiyo" runn run day16/json-template.yml --debug
Run "スクラップ記事を登録します" on "JSONテンプレートを利用してデータの柔軟性を高めましょう".steps.postScrap
Run "スクラップ記事を登録します" on "JSONリクエストを送信するシナリオ".steps.postScrap
-----START HTTP REQUEST-----
POST /api/scraps HTTP/1.1
Host: zenn.dev
Content-Type: application/json
Cookie: _zenn_session=miserarenaiyo

{"title":"タイトル - \u003cno value\u003e"}
-----END HTTP REQUEST-----
-----START HTTP RESPONSE-----
HTTP/2.0 200 OK
Cache-Control: max-age=0, private, must-revalidate
Cf-Cache-Status: DYNAMIC
Cf-Ray: 85a405071b40f5af-NRT
Content-Type: application/json; charset=utf-8
Date: Sat, 24 Feb 2024 01:43:47 GMT
Etag: W/"d55430c4e8e10af703e3b44271da2634"

.. snip ..

X-Runtime: 0.235849
X-Xss-Protection: 0


-----END HTTP RESPONSE-----
Run "test" on "JSONテンプレートを利用してデータの柔軟性を高めましょう".steps.deleteScrap
.

1 scenario, 0 skipped, 0 failures

これはOK

katzumikatzumi

runn最新化&チュートリアル実行

  • runn最新化
    ローカルインストールされているバージョンが古かったのでバージョンアップ
 $ go install github.com/k1LoW/runn/cmd/runn@latest
go: downloading github.com/k1LoW/runn v0.99.3
go: github.com/k1LoW/runn@v0.99.3 requires go >= 1.21.7; switching to go1.21.7
go: downloading go1.21.7 (darwin/arm64)
.. snip ..

$ runn --version
runn version 0.99.3
  • 実行
$ SESSION="miserarenaiyo" runn run day16/json-template.yml --verbose
=== JSONテンプレートを利用してデータの柔軟性を高めましょう (day16/json-template.yml)
    --- スクラップ記事を登録します (postScrap) ... ok
        === JSONリクエストを送信するシナリオ (day16/post-scrap.yml)
            --- スクラップ記事を登録します (postScrap) ... ok
    --- スクラップ記事をアーカイブします (archiveScrap) ... ok
    --- スクラップ記事を削除します (deleteScrap) ... ok


1 scenario, 0 skipped, 0 failures

こっちも大丈夫そう

katzumikatzumi

あ。エラーになるのでなくFakerの値がおかしいのかな?

katzumikatzumi

\u003cno value\u003e はオブジェクトを強制的に文字列化しているっぽいので値の取り回しを考える必要がありそう

katzumikatzumi

チュートリアルのrunbookに誤りがあったので修正

https://github.com/k2tzumi/runn-tutorial/pull/6

json展開のタイミングでinclude元のrunbookのvarsを参照していたので値がなく no value と言われていました。
一旦bindしてからその値を参照するように修正

  • 実行結果
% SESSION="miserarenaiyo" runn run day16/json-template.yml --debug
Run "UUIDs are numbered in the image of a session." on "JSONテンプレートを利用してデータの柔軟性を高めましょう".steps.bindUuid
Run "bind" on "JSONテンプレートを利用してデータの柔軟性を高めましょう".steps.bindUuid

Run "スクラップ記事を登録します" on "JSONテンプレートを利用してデータの柔軟性を高めましょう".steps.postScrap
Run "スクラップ記事を登録します" on "JSONリクエストを送信するシナリオ".steps.postScrap
-----START HTTP REQUEST-----
POST /api/scraps HTTP/1.1
Host: zenn.dev
Content-Type: application/json
Cookie: _zenn_session=miserarenaiyo

{"title":"タイトル - 9b5ddde5-06f0-4868-977b-66d061219fb7"}
-----END HTTP REQUEST-----
.. snip ..
katzumikatzumi

少し捕捉です。

テンプレートの記述方法 {{.vars.title_suffix }} が間違ってたという訳ではなくjsonを展開するrunbook無いのvarsにtitle_suffixを指定してなかったのが問題でした。
varsでは逆にfakerが利用できないので一旦bindするように見直ししたという感じになります。

髙野 将髙野 将

jsonを展開するrunbook無いのvarsにtitle_suffixを指定してなかったのが問題でした。

なるほど。

「ということは……」と思い、テンプレートをロードするrunbook(今回はjson-template.yml)のvarsセクションにて変数 title_suffix を定義して、値に例えば"test"などを指定することで、テンプレートにtitle_suffixが埋め込まれ、titleが"タイトル - test"とセットされたリクエストが送られることを確認しました。

{
  "title": "タイトル - test"
}

varsでは逆にfakerが利用できないので一旦bindするように見直ししたという感じになります。

こちらは、「今のrunnおよびrunbookの仕様では」そうなっているということですね。了解です。

これを受け、チュートリアル修正の提案です。

https://github.com/k2tzumi/runn-tutorial/blob/main/day16/scrap.json.template

のテンプレートでは、あくまでtitle_suffixで埋め込む

{
  "title": "タイトル - {{.title_suffix }}"
}

ようにしたうえで、

https://github.com/k2tzumi/runn-tutorial/blob/main/day16/json-template.yml#L11-L12

のbindで束縛する名前もtitle_suffix

  bindUUid:
    desc: "ダミーのUUIDを発行してtitle_suffixという変数名でアクセス可能とする"
    bind:
      title_suffix: faker.UUID()

にしたほうが、より「テンプレート」としての文脈に適した内容になるのでは?と感じました。
(uuid という変数名はHowを表しており、Whatな命名になっていない)

なお、

の箇所の修正が漏れていたことも合わせてお知らせします。

髙野 将髙野 将

Chapter.21 antonmedv/expr で使える記法のリンク先が切れている

https://zenn.dev/katzumi/books/runn-tutorial/viewer/db-runner

の以下の箇所のリンク先URLが、大文字・小文字の違いでリンク切れになっているようです。

髙野 将髙野 将

Chapter.21 init-db.ymlのshowTablesにて「 include されなかった 場合にのみ実行」する条件をシングルクォーテーションで囲わないとエラーになった

https://zenn.dev/katzumi/books/runn-tutorial/viewer/db-runner

に記載の

https://github.com/k2tzumi/runn-tutorial/blob/main/day20/init-db.yml#L27-L34

の箇所をそのまま実行すると、以下のようなエラーとなりました。

$ runn run day20/init-db.yml
Error: failed to append step (day20/init-db.yml): invalid if condition: <nil>

https://github.com/k1LoW/runn?tab=readme-ov-file#stepsif-stepskeyif

このあたりを参考に、以下のように ' でくくるようにすると、問題なく実行できました。

  showTables:
    desc: "テーブル一覧を確認する"
    if: '!included' # <- ⭐ここ
  1. ! による否定の指定は「式」としての評価になるため、シングルクォーテーションでくくる必要がある?
  2. もしくは「今」そうなっているだけで本来は括らなくても良いようにしたい

のいずれかかなと思っていますので、一旦はワークアラウンド的に対処して使ってみます。

Ken’ichiro OyamaKen’ichiro Oyama

if: !included が良くない理由は ! がYAML側のシンタックスに引っ張られるからですね。おそらくTagとして解釈されていそうです。

髙野 将髙野 将

! がYAML側のシンタックスに引っ張られるから

なるほどですね

であれば、 !<boolean> というシンタックスは視認性も良くないので、included==falseのほうがいいかもと思いました

yu fujiokayu fujioka

チュートリアルコードの見直し

チュートリアルを通した際、手元で通らなかったテストが3つあったので対処した内容を Issue, PR で報告しました。
https://github.com/k2tzumi/runn-tutorial/issues/11

お手隙にご確認いただけると嬉しいです🙏

katzumikatzumi

ご指摘ありがとうございました!
取り込みさせて頂きました!