1
/
5

RubyKaigi2022 参加記 #11 - RBS generation framework using Rack architecture (Day 3)

Photo by K8 on Unsplash

こんにちは!Wantedly でプロジェクトマネージャ兼バックエンドエンジニアをしている鴛海です。

今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、Wantedly のエンジニアも参加しています。

WantedlyはRubyKaigi2022にプラチナプランとして協賛し、技術書と開発に役立つHandbookをブースでプレゼントしています #rubykaigi | Wantedly, Inc.
こんにちは!Wantedlyで技術イベント企画まわりを担当しています竹内みずき (@amanda__mt)です! いよいよ本日から3日間、 RubyKaigi 2022 が開催されますね!私たちはこの度プラチナスポンサーとして協賛させていただき、三重県現地にて参加する運びとなりました。 直近2年間はほぼすべてのカンファレンスやイベントがオンラインでの開催となり、今回は久しぶりの ...
https://www.wantedly.com/companies/wantedly/post_articles/430335

この記事は 3日目の「RBS generation framework using Rack architecture」を紹介します。

RBS generation framework using Rack architecture

事前予習ブログ:

"RBS generation framework using Rack architecture"の予習記事 - READYFOR Tech Blog
システム基盤部の栗原です。 RubyKaigi2022楽しみですね。READYFORからは、私栗原から発表させていただくことになりました。 https://rubykaigi.org/2022/presentations/_ksss_.html 今回は皆様によりトークを楽しんでいただく為に、予習となる要素を集めました。 ...
https://tech.readyfor.jp/entry/2022/09/01/122706

スライド:

この発表は 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 は自分で生成してみようと思います。

Wantedly, Inc.'s job postings

Weekly ranking

Show other rankings
Invitation from Wantedly, Inc.
If this story triggered your interest, have a chat with the team?