RubyKaigi 2022 Day 1 Types teaches success, what will we do?
TypeScriptユーザーは多い
Rubyの型機能
部分的に型をつけていくことができる
プロダクトコードとは別に型をつけられる
なぜRubyの型は使われないのか?
RubyGems.org
17万個
gemの型定義が集約されているリポジトリ
TypeScriptにおけるDefinitelyTypedみたいな存在
44個
もっとgem_rbs_collectionにコントリビューションしよう!
gem_rbs_collectionへのコントリビューション方法
RBSのsyntax.mdを熟読する
CONTRIBUTIONG.mdを熟読する
ひとつめ
すでに存在するgemの型定義を追加修正する
Find
steep checkでエラーが出る
ActiveRecord::Calculations.count
ブロックは受け取れませんよというエラー
Check
gem_rbs_collectionの中身を見る
ActiveRecord::Calculations.count
ブロックを受け取れるのにgem_rbs_collectionでは定義されてなかった
Patch
Send
ふたつめ
さらにふたつの場合がある
自動生成する
必要な部分だけ手動で追加する
いずれにせよすべてのAPIの型定義を書く必要はない
自分が必要なAPIにフォーカスすればよい
ステップ
セットアップ
gem_rbs_collection/bin/setup
ボイラープレート作成
gem_rbs_collection/bin/init_new_gem xxx
対話的に質問に答える
バージョンごとに型定義ボイラープレートが生成
RBSファイルを書く
テストを書く
RBS
部分的手動定義
gemを決める
自分のプロジェクトでどのAPIが使われているのか調べる
そのAPIの型定義を書く
その型定義のテストを書く
型定義のテストはRSpecのようなテストとは違う
定義したとおりにAPIが呼び出せることを検証するテストを書く
部分的に型定義するので、無の型定義を追加する必要な場合あり
全体的自動定義
rbs prototype rb #{source_path}.rb #{out_path}-generated.rbs
500行くらい生成される
ほとんどがuntypedになる
steep checkを実行
エラーになる
エラー箇所にパッチをあてる
patch.rbs
エラーが出なくなるまでsteep checkを実行してパッチを修正するのを繰り返す
エラーが出なくなったらテストを書く
自分が必要な箇所だけテストを書けばOK
使い分け
このgemのこのAPIの方がほしいという場合は部分的手動定義
プロジェクトでsteep checkが動かない場合は網羅的に定義が必要なので全体的自動定義
Pull requestを立てる
補足
標準ライブラリ、組み込みライブラリはRBSリポジトリで管理しているのでそちらを参照
生成されるmanifest.ymlは削除する
動的言語ならではのハマりがある
RBSではメソッドの動的生成には対応していない
Workaroundが必要になるのでREADME.mdを追加する