$30 off During Our Annual Pro Sale. View Details »

Railsの型ファイル自動生成における課題と解決

ksss
October 28, 2023

 Railsの型ファイル自動生成における課題と解決

Kaigi on Rails 2023 at 浅草橋ヒューリックホール&カンファレンス

ksss

October 28, 2023
Tweet

More Decks by ksss

Other Decks in Programming

Transcript

  1. ˜.*9*
    RailsͷܕϑΝΠϧࣗಈੜ੒ʹ͓͚Δ


    ՝୊ͱղܾ


    ,BJHJPO3BJMT%BZ

    View Slide

  2. Kaigi on Rails 2023


    day 2

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. ˜.*9*
    ܀ݪ༐थ
    @ksss
    Kurihara Yuki
    Railsྺ9೥
    ΈͯͶϓϩμΫτ։ൃ෦ॴଐ

    View Slide

  7. ˜.*9*
    7
    https://github.com/ruby/rbs/graphs/contributors

    View Slide

  8. View Slide

  9. ˜.*9*
    9

    View Slide

  10. ˜.*9*
    10
    Rails×ܕ
    RBS

    View Slide

  11. ˜.*9*
    11
    ՝୊
    RailsΞϓϦ΁


    खܰʹܕΛಋೖ


    ͍ͨ͠

    View Slide

  12. ˜.*9*
    12
    ղܾ orthoses-rails

    View Slide

  13. ˜.*9*
    13
    orthoses-rails
    $ bundle add orthoses-rails —require false
    $ bin/rails generate orthoses:rails:install
    $ bin/rails orthoses:rails
    $ bundle exec rbs collection init


    $ bundle exec rbs collection install

    View Slide

  14. ˜.*9*
    14
    orthoses-rails
    ActionMailer
    ActiveModel
    ActiveRecord
    ActiveStorage
    ActiveSupport

    View Slide

  15. ˜.*9*
    15
    .rb .rbs

    View Slide

  16. ˜.*9*
    16
    ܗ੒ظ


    Forming
    ࠞཚظ
    Storming
    ౷Ұظ


    Norming
    ػೳظ


    Performing
    ͜͜·Ͱ ͜Ε͔Β
    Rails×ܕͷੈք

    View Slide

  17. ˜.*9*
    17
    ՝୊ RBSΛಋೖͨ͠ͷ
    ʹ୭΋࢖ͬͯͳ͍

    View Slide

  18. ˜.*9*
    18
    ղܾ
    ੜ੒ͨ͠3#4Λ
    DPNNJU͢Δɻ
    RBSϋϯζΦϯΛ
    ෳ਺ճ࣮ࢪɻ

    View Slide

  19. View Slide

  20. ˜.*9*
    20
    ՝୊
    ΞϓϦέʔγϣϯ
    ίʔυͷ


    ܕ͕͍͍ͭͯͳ͍

    View Slide

  21. ˜.*9*
    21
    ղܾ શ෦खͰ3#4Λॻ͘
    ՝୊: ΞϓϦ
    έʔγϣϯ
    ίʔυͷ
    ܕ͕͍ͭͯ
    ͍ͳ͍

    View Slide

  22. View Slide

  23. ˜.*9*
    23
    ղܾ ࣗಈੜ੒
    ՝୊: ΞϓϦ
    έʔγϣϯ
    ίʔυͷ
    ܕ͕͍ͭͯ
    ͍ͳ͍

    View Slide

  24. ˜.*9*
    24
    ղܾ rbs prototype rb
    ՝୊: ΞϓϦ
    έʔγϣϯ
    ίʔυͷ
    ܕ͕͍ͭͯ
    ͍ͳ͍

    View Slide

  25. ˜.*9*
    25
    ՝୊
    ՝୊: Ξϓ
    Ϧέʔγϣ
    ϯίʔυͷ


    ܕ͕͍ͭͯ
    ͍ͳ͍
    ղܾ: rbs
    prototype rb
    eval, define_method
    ActiveSupport::Concern
    Array, Hash, Enumerable
    delegate

    View Slide

  26. ˜.*9*
    26
    rbs prototype rb
    eval
    ActiveSupport::


    Concern
    Generics
    delegate

    View Slide

  27. ˜.*9*
    27
    ղܾ rbs prototype runtime
    ՝୊: Ξϓ
    Ϧέʔγϣ
    ϯίʔυͷ


    ܕ͕͍ͭͯ
    ͍ͳ͍
    ղܾ: rbs
    prototype rb
    ՝୊: ͍Ζ
    ͍ΖඇରԠ

    View Slide

  28. ˜.*9*
    28
    rbs prototype rb
    rbs prototype
    runtime
    eval
    ActiveSupport::


    Concern
    Generics
    delegate

    View Slide

  29. ˜.*9*
    29
    ՝୊
    ՝୊: Ξϓ
    Ϧέʔγϣ
    ϯίʔυͷ


    ܕ͕͍ͭͯ
    ͍ͳ͍
    ղܾ: rbs
    prototype rb
    ՝୊: ͍Ζ
    ͍ΖඇରԠ
    ղܾ: rbs
    prototype
    runtime
    autoloadඇରԠ
    ஗͍

    View Slide

  30. ˜.*9*
    30
    ղܾ
    ՝୊: Ξϓ
    Ϧέʔγϣ
    ϯίʔυͷ


    ܕ͕͍ͭͯ
    ͍ͳ͍
    ղܾ: rbs
    prototype rb
    ՝୊: ͍Ζ
    ͍ΖඇରԠ
    ղܾ: rbs
    prototype
    runtime
    Pull Request
    ՝୊: ͍Ζ
    ͍Ζ໰୊͕

    View Slide

  31. ˜.*9*
    31
    rbs prototype rb
    rbs prototype
    runtime
    eval
    ActiveSupport::


    Concern
    Generics
    delegate
    autoload
    Speed

    View Slide

  32. ˜.*9*
    32
    ՝୊
    ՝୊: Ξϓ
    Ϧέʔγϣ
    ϯίʔυͷ


    ܕ͕͍ͭͯ
    ͍ͳ͍
    ղܾ: rbs
    prototype rb
    ՝୊: ͍Ζ
    ͍ΖඇରԠ
    ղܾ: rbs
    prototype
    runtime
    ActiveRecord Plugins
    ΋ͬͱػೳΛʂ
    untyped
    Gemͷܕ

    View Slide

  33. View Slide

  34. ˜.*9*
    34
    ͜͜Ͱ ൒෼

    View Slide

  35. View Slide

  36. ˜.*9*
    36
    ղܾ orthoses

    View Slide

  37. https://speakerdeck.com/ksss/rbs-generation-framework-using-rack-architecture

    View Slide

  38. https://speakerdeck.com/ksss/rbs-generation-framework-using-rack-architecture
    Orthoses::Builder.new do


    use Orthoses::CreateFileByName


    use Orthoses::Mid, option: true


    use Orthoses::Tap do |store|


    store["Foo"] << "def foo: () -> void"


    end


    use Orthoses::Mixin


    run -> { require '...' }


    end

    View Slide

  39. ˜.*9*
    39
    orthoses
    More Feature
    Extending
    Customizing
    Filtering
    Split files
    Deduping

    View Slide

  40. ˜.*9*
    rbs prototype rb
    rbs prototype
    runtime
    orthoses
    eval
    ActiveSupport::


    Concern
    Generics
    delegate
    autoload
    Speed
    Extensibility

    View Slide

  41. ˜.*9*
    41
    ՝୊ “orthoses”


    ͕ಡΊͳ͍

    View Slide

  42. ˜.*9*
    42
    ղܾ

    View Slide

  43. ˜.*9*
    43
    ՝୊ rakeͷΤϥʔ͕Θ͔
    Γʹ͍͘

    View Slide

  44. View Slide

  45. View Slide

  46. View Slide

  47. ˜.*9*
    47
    ղܾ #detailed_message

    View Slide

  48. ˜.*9*
    48
    ՝୊ rakeλεΫͷσ
    όοά͕೉͍͠

    View Slide

  49. $ bundle exec rdbg -c -- bin/rails orthoses:rails

    View Slide

  50. ˜.*9*
    50
    ղܾ RAKE_DEBUG=1

    View Slide

  51. $ RAKE_DEBUG=1 bin/rails orthoses:rails

    View Slide

  52. ˜.*9*
    52
    ՝୊ YARDͷࢿ࢈Λ


    ྲྀ༻͍ͨ͠

    View Slide

  53. ˜.*9*
    53
    ղܾ orthoses-yard

    View Slide

  54. ˜.*9*
    54
    orthoses-yard
    # @param [String] str


    # @return [Integer]


    def str_to_i(str)


    str.to_i


    end
    def str_to_i: (String str) -> Integer
    .rb
    .rbs

    View Slide

  55. खॻ͖


    ͷน

    View Slide

  56. खॻ͖


    ͷน
    orthoses-yard

    View Slide

  57. ˜.*9*
    57
    ՝୊
    YARDΛؒҧ͑Δ


    ͱ


    RBS΋ؒҧ͏

    View Slide

  58. ˜.*9*
    58
    YARD͸ҙ֎ͱ೉͍͠
    # @param [String|Symbol]
    # @param [Hash] h
    # @param [String] s


    def foo(str)
    ʁ
    ʁ
    ʁ

    View Slide

  59. ˜.*9*
    59
    YARD͸ҙ֎ͱ೉͍͠
    # @param [String|Symbol]
    # @param [Hash] h
    # @param [String] s


    def foo(str)
    SyntaxError
    Hash[Symbol | String]
    def foo: (untyped str) -> untyped

    View Slide

  60. ˜.*9*
    60
    I have a rubocop

    View Slide

  61. ˜.*9*
    61
    and I have a yard

    View Slide

  62. ˜.*9*
    62

    View Slide

  63. ˜.*9*
    63
    rubocop-yard
    ղܾ

    View Slide

  64. ˜.*9*
    64
    rubocop-yard

    View Slide

  65. ˜.*9*
    65
    rubocop-yard

    View Slide

  66. ˜.*9*
    66
    rubocop-yard

    View Slide

  67. ˜.*9*
    67
    rubocop-yard

    View Slide

  68. खॻ͖


    ͷน
    orthoses-yard
    rubocop-yard

    View Slide

  69. ˜.*9*
    69
    ·ͱΊ
    orthoses
    use Orthoses::LoadRBS
    use Orthoses::YARD
    use Orthoses::RBSPrototypeRuntime
    use Orthoses::Rails
    Rails×ܕͷੈք΁ͷఏҊ
    use Your::Middleware

    View Slide

  70. ˜.*9*
    70

    View Slide