Upgrade to Pro — share decks privately, control downloads, hide ads and more …

rbs-inlineを導入してYARDからRBSに移行する

 rbs-inlineを導入してYARDからRBSに移行する

RubyKaigi 2024 follow up での発表資料です。 w/ https://x.com/soutaro
https://rhc.connpass.com/event/320709/

元ネタ
https://speakerdeck.com/soutaro/embedding-it-into-ruby-code

## スライド内のリンク
前編:YARD から rbs-inline に移行しました
https://tech.timee.co.jp/entry/2024/08/22/183127

後編:YARD から rbs-inline に移行しました
https://tech.timee.co.jp/entry/2024/08/23/180201

Shintani Teppei

August 31, 2024
Tweet

More Decks by Shintani Teppei

Other Decks in Programming

Transcript

  1. 構文の変更 # @rbs (Integer id, group: Group) -> String? def

    foo(id, group:) end #: (Integer id, group: Group) -> String? def foo(id, group:) end # @rbs id: Integer # @rbs group: Group # @rbs return: String? def foo(id, group:) end
  2. 構文の変更 attr_reader :id #: Integer path = nil #: Pathname?

    • Steepの構文と衝突するんだけど、Steepの方を直した ◦ attr_readerについている注釈は無視 [rbs-inline] idというattributeの型はInteger [Steep] attr_readerメソッドの返り値の型はInteger [Steep] nilという式の型はPathname?
  3. singletonクラス、ブロックで定義されるクラス class Foo class <<self def foo end end end

    module Foo extend ActiveSupport::Concern class_methods do # 暗黙にClassMethodsモジュールを定義 def foo end end end
  4. singletonクラス、ブロックで定義されるクラス class Foo class <<self def foo end end end

    module Foo extend ActiveSupport::Concern class_methods do # 暗黙にClassMethodsモジュールを定義 def foo end end end # module ClassMethods
  5. Data/Structのサポート Account = Data.define( :id, #: Integer :email #: String

    ) class Account # @rbs () -> Integer def foo = 123 end class Account < Data attr_reader id(): Integer attr_reader email(): String def self.new: (Integer id, String email) -> instance | (id: Integer, email: String) -> instance end class Account def foo: () -> Integer end • 定数に代入するパターンで、ブロックがないものだけサポート • メソッドを追加したいときはclassを改めて書く
  6. Data/Structのサポート Account = Data.define( :id, #: Integer :email #: String

    ) class Account # @rbs () -> Integer def foo = 123 end class Account < Data attr_reader id(): Integer attr_reader email(): String def self.new: (Integer id, String email) -> instance | (id: Integer, email: String) -> instance end class Account def foo: () -> Integer end • 定数に代入するパターンで、ブロックがないものだけサポート • メソッドを追加したいときはclassを改めて書く
  7. Data/Structのサポート Account = Data.define( :id, #: Integer :email #: String

    ) class Account # @rbs () -> Integer def foo = 123 end class Account < Data attr_reader id(): Integer attr_reader email(): String def self.new: (Integer id, String email) -> instance | (id: Integer, email: String) -> instance end class Account def foo: () -> Integer end • 定数に代入するパターンで、ブロックがないものだけサポート • メソッドを追加したいときはclassを改めて書く
  8. Data/Structのサポート Account = Data.define( :id, #: Integer :email #: String

    ) class Account # @rbs () -> Integer def foo = 123 end class Account < Data attr_reader id(): Integer attr_reader email(): String def self.new: (Integer id, String email) -> instance | (id: Integer, email: String) -> instance end class Account def foo: () -> Integer end • 定数に代入するパターンで、ブロックがないものだけサポート • メソッドを追加したいときはclassを改めて書く
  9. Data/Structのサポート Account = Data.define( :id, #: Integer :email #: String

    ) class Account # @rbs () -> Integer def foo = 123 end class Account < Data attr_reader id(): Integer attr_reader email(): String def self.new: (Integer id, String email) -> instance | (id: Integer, email: String) -> instance end class Account def foo: () -> Integer end • 定数に代入するパターンで、ブロックがないものだけサポート • メソッドを追加したいときはclassを改めて書く class Account < Data.define( :id, #: Integer :email #: String ) def foo = 123 end
  10. 1. 具体的な移行の流れ 時間が足りないので割愛。ブログにまとめているので見てね。 変換スクリプトも公開してます。 前編:YARD から rbs-inline に移行しました - Timee

    Product Team Blog 後編:YARD から rbs-inline に移行しました - Timee Product Team Blog ここで一番重要なのは タイミーは rbs-inline を本番で利用している ということ
  11. Data, Struct サポート YARD コメントから RBS を生成する sord gem を削除したところ、Data.define,

    Struct.new によって定義されたクラスの型定義が見つからないエラーが発生。
  12. Data, Struct サポート YARD コメントから RBS を生成する sord gem を削除したところ、Data.define,

    Struct.new によって定義されたクラスの型定義が見つからないエラーが発生。 rbs-inline が untyped として生成していたことが原因。sord はきちんとクラス として生成していた。
  13. Q&A Q. rbs-inline の記法は YARD likeな記法と RBS likeな記法があるがどっちを   使っている?ルールはあるか?

    A. YARDからの移行の都合でYARD likeが絶対数としては多い。既存のYARD likeを見ながら書いていくので、YARD likeが多い感じはある。 ルールは作っていない。将来的に策定する可能性はあるが、現状は様子を見 ている。