こんにちは!Wantedly でプロジェクトマネージャ兼バックエンドエンジニアをしている鴛海です。
今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、Wantedly のエンジニアも参加しています。
この記事は 3日目の「RBS generation framework using Rack architecture」を紹介します。
RBS generation framework using Rack architecture
事前予習ブログ:
スライド:
この発表は RBS 自動生成ツールである orthoses の紹介が行われました。
Wantedly は発表を行った ksss さんの GitHub Sponsor をさせていただいています。スライドの中でも紹介していただきありがとうございました!(スライド 17ページ)
まず発表の中で RBS エコシステムの現状の課題が述べられました。
- Needs a lot of Type
- Needs accuracy
- Needs expandability
- Needs flexibility
これらを解決するために Rack architecture を参考に型情報を生成するようにしたのが orthoses です。Rack architecture はアプリケーションの周りにミドルウェアを挟むようなアーキテクチャですが、型情報の生成でもこのようなアーキテクチャを使って前述の問題を解決しようということです。
orthoses の README の example ではこのようなコードになっています。 Orthoses::Builder.new の中を見ると、RBS のファイル置き場やヘッダを設定して ( Orthoses::CreateFileByName
)、対象とするファイルパスを設定し(
Orthoses::Filter
)、自分で作ったミドルウェアを挟んだり (
YourCustom::Middleware
)、Mixin の定義や Constant の型情報を付けたり ( Orthoses::Mixin, Orthoses::Constant
)、 Foo クラスから再帰的に読み込む (
Orthoses::Walk
)と、分かりやすく拡張性の高い書き方ができることが分かります。
require 'orthoses'
namespace :rbs do
desc "build RBS to sig/out"
task :build do
Orthoses::Builder.new do
use Orthoses::CreateFileByName
base_dir: Rails.root.join("sig/out"),
header: "# !!! GENERATED CODE !!!"
use Orthoses::Filter do |name, _content|
path, _lineno = Object.const_source_location(name)
return false unless path
%r{app/models}.match?(path)
end
use YourCustom::Middleware
use Orthoses::Mixin
use Orthoses::Constant
use Orthoses::Walk,
root: "Foo"
run -> {
# load library or application
}
end.call
end
end
ref: https://github.com/ksss/orthoses#usage
orthoses を Rails で使えるように拡張した orthoses-rails も作られており、こちらでは Active Record のアソシエーションやスコープから型情報を生成することができます。
最後にこれからの課題として、様々 gem の RBS を生成して gem_rbs_collection を充実させることや、Rails アプリで利用できる範囲を拡充すること、もっと利用しやすくすることがあるとのことでした。そのためにこの課題に取り組む人を探しているそうです。
感想
RBS などの型情報を付けたいと思いつつもコストが高くてなかなかできていない現状なのでこのような自動生成ツールが整備されていくとありがたいなと思いました。よく使う gem の RBS は自分で生成してみようと思います。