読者コミュニティ|runnチュートリアル
本の感想や質問をお気軽にコメントしてください。
チュートリアルコードの見直しはIssue登録をお願いします
Chapter.17 へのご質問
以下調査スレになります
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
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
こっちも大丈夫そう
あ。エラーになるのでなくFakerの値がおかしいのかな?
\u003cno value\u003e
はオブジェクトを強制的に文字列化しているっぽいので値の取り回しを考える必要がありそう
チュートリアルのrunbookに誤りがあったので修正
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 ..
bookの方も新しいチュートリアル内容で更新しました
コードが反映されるのはいつなんだろう。。
(ブランチ指定のURLじゃなくてコミットIDでURLを設定すべきだろうか。。)
少し捕捉です。
テンプレートの記述方法 {{.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の仕様では」そうなっているということですね。了解です。
これを受け、チュートリアル修正の提案です。
のテンプレートでは、あくまでtitle_suffix
で埋め込む
{
"title": "タイトル - {{.title_suffix }}"
}
ようにしたうえで、
のbindで束縛する名前もtitle_suffix
bindUUid:
desc: "ダミーのUUIDを発行してtitle_suffixという変数名でアクセス可能とする"
bind:
title_suffix: faker.UUID()
にしたほうが、より「テンプレート」としての文脈に適した内容になるのでは?と感じました。
(uuid
という変数名はHowを表しており、Whatな命名になっていない)
なお、
の箇所の修正が漏れていたことも合わせてお知らせします。
適切な提案内容ありがとうございます!
そのまま取り込ませて頂きました :bow:
Chapter.21 antonmedv/expr で使える記法のリンク先が切れている
の以下の箇所のリンク先URLが、大文字・小文字の違いでリンク切れになっているようです。
こういう指摘を頂けると本当に助かります!!
showTables
にて「 include されなかった 場合にのみ実行」する条件をシングルクォーテーションで囲わないとエラーになった
Chapter.21 init-db.ymlの
に記載の
の箇所をそのまま実行すると、以下のようなエラーとなりました。
$ runn run day20/init-db.yml
Error: failed to append step (day20/init-db.yml): invalid if condition: <nil>
このあたりを参考に、以下のように '
でくくるようにすると、問題なく実行できました。
showTables:
desc: "テーブル一覧を確認する"
if: '!included' # <- ⭐ここ
-
!
による否定の指定は「式」としての評価になるため、シングルクォーテーションでくくる必要がある? - もしくは「今」そうなっているだけで本来は括らなくても良いようにしたい
のいずれかかなと思っていますので、一旦はワークアラウンド的に対処して使ってみます。
ちょっと原因まではわかっていませんが、 included == false
に見直しました
if: !included
が良くない理由は !
がYAML側のシンタックスに引っ張られるからですね。おそらくTagとして解釈されていそうです。
!
がYAML側のシンタックスに引っ張られるから
なるほどですね
であれば、 !<boolean>
というシンタックスは視認性も良くないので、included==false
のほうがいいかもと思いました
Yamlのalias機能追加の影響ですかねー。
なんか横並びで '&' とか挙動が変わっていて注意が必要そうと思いました。