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

Types teaches success, what will we do?

Fu-ga
September 11, 2022

Types teaches success, what will we do?

at RubyKaigi 2022

Fu-ga

September 11, 2022
Tweet

More Decks by Fu-ga

Other Decks in Technology

Transcript

  1. RubyKaigi 2022 @Mie Center for the Arts
    Types Teaches success,
    what will we do?
    2022.09.08(Thu) Fu-ga / ESM, Inc.

    View Slide

  2. Fu-ga
    @fugakkbn
      Ruby on Rails engineer
      Work at ESM, Inc.
      gem_rbs_collection contributor
      Interested in “Types” related
    technologies for Ruby

    View Slide

  3. ×

    View Slide

  4. View Slide

  5. 🦐🍛

    View Slide

  6. View Slide

  7. Speakers
    from ESM
    #rubykaigiB
    DAY1 14:10-14:40
    @fugakkbn
    DAY2 11:30-12:00
    @koic
    DAY3 14:50-15:20
    @ima1zumi

    View Slide

  8. RubyKaigi 2022 @Mie Center for the Arts
    Types Teaches success,
    what will we do?
    2022.09.08(Thu) Fu-ga / ESM, Inc.

    View Slide

  9. https://unsplash.com/photos/4V1dC_eoCwg

    View Slide

  10. Are Ruby
    type declarations
    in your project?

    View Slide

  11. Are Ruby
    type declarations
    in your project?
    🙋‍♂️

    View Slide

  12. Few…🤔

    View Slide

  13. https://unsplash.com/photos/4V1dC_eoCwg

    View Slide

  14. Are you using
    TypeScript
    in your project?

    View Slide

  15. Are you using
    TypeScript
    in your project?
    🙋‍♂️

    View Slide

  16. A lot!😆

    View Slide

  17. Feedback by types
    ✓Code complements
    ✓Type of arguments of
    method call
    ✓Suggestion of possible
    errors

    View Slide

  18. Improve convenience of development tools
    Improved developer experience
    Improved development efficiency
    Prevention of bugs🐛

    View Slide

  19. Types
    Types
    teaches
    teaches
    Success!
    Success!
    https://unsplash.com/photos/Ua-agENjmI4

    View Slide

  20. We want to
    benefit
    from types
    in Ruby
    https://unsplash.com/photos/nxy9wFUiksg

    View Slide

  21. We can now write static types in Ruby
    RBS, Steep
    Starting with Ruby 3.0, those are bundled with Ruby 💎
    Can start small
    No impact on runtime
    No loss of writing comfort
    Product code and type definitions are separated

    View Slide

  22. So why is it so difficult?
    One reason comes to mind

    View Slide

  23. https://rubygems.org

    View Slide

  24. https://rubygems.org/stats

    View Slide

  25. https://rubygems.org/stats

    View Slide

  26. View Slide

  27. View Slide

  28. Directory with type
    definitions for gems

    View Slide

  29. View Slide

  30. View Slide

  31. 44 / about 173,000 😢

    View Slide

  32. Most gem type definitions are missing
    ✓Many projects rely on third-party gems
    ✓About 173,000 gems registered at
    rubygems.org
    ✓In contrast, gem_rbs_collection still has
    only about 40 gem type definitions😢

    View Slide

  33. https://unsplash.com/photos/JrZ1yE1PjQ0

    View Slide

  34. Proposal

    View Slide

  35. Proposal
    Let’s contribute to
    gem_rbs_collection!

    View Slide

  36. Centralized repository
    for gem type definitions
    ”DefinitelyTyped" in TypeScript
    More type definitions here are expected to
    make it easier to implement into projects.

    View Slide

  37. So...
    Step by step instructions
    on how to contribute to
    gem_rbs_collection
    Today's Theme

    View Slide

  38. Notice
      I ’m a contributor and not the maintainer of
      gem_rbs_collection
      I'll speak based on my experience so far, but it
      may differ from the maintainer's intentions
    RBS syntax is not discussed.

    View Slide

  39. https://github.com/ruby/rbs/blob/master/docs/syntax.md

    View Slide

  40. Steps to
    Steps to
    contribute to
    contribute to
    gem_rbs_collection
    gem_rbs_collection

    View Slide

  41. One
    Add or modify existing
    type definitions
    Two
    Add new gem type
    definitions

    View Slide

  42. One
    Add or modify existing
    type definitions
    Two
    Add new gem type
    definitions

    View Slide

  43. Steps to
    contribute
    Finding
    Finding missing or incorrect type
    definitions
    Check
    Check for mismatch between type
    definition and implementation
    Fix
    Fix the appropriate rbs file
    Patch
    Open a Pull Request

    View Slide

  44. View Slide

  45. View Slide

  46. View Slide

  47. View Slide

  48. 🤔

    View Slide

  49. View Slide

  50. View Slide

  51. Receive block!

    View Slide

  52. View Slide

  53. View Slide

  54. Not able to
    receive block

    View Slide

  55. View Slide

  56. Pull Request: Add #count type definitions to activerecord

    View Slide

  57. View Slide

  58. Just this

    View Slide

  59. Steps to
    contribute
    Finding
    Finding missing or incorrect type
    definitions
    Check
    Check for discrepancies between
    errors and implementation
    Fix
    Fix the appropriate rbs file
    Patch
    Open a Pull Request

    View Slide

  60. One
    Add or modify existing
    type definitions
    Two
    Add new gem type
    definitions

    View Slide

  61. One
    Add or modify existing
    type definitions
    Two
    Add new gem type
    definitions

    View Slide

  62. Two more cases
    ✓Automatic and exhaustive generation
    ✓Add only some of them

    View Slide

  63. Two more cases
    ✓Automatic and exhaustive generation
    ✓Add only some of them
    These steps are almost identical,
    differing only in the way
    the RBS is defined

    View Slide

  64. https://github.com/ruby/gem_rbs_collection/blob/main/docs/CONTRIBUTING.md

    View Slide

  65. https://github.com/ruby/gem_rbs_collection/blob/main/docs/CONTRIBUTING.md
    Steps are
    shown here

    View Slide

  66. Step.1
    Setup environment

    View Slide

  67. View Slide

  68. Run `bundle install`

    View Slide

  69. Step.2
    Generate a boilerplate

    View Slide

  70. View Slide

  71. View Slide

  72. View Slide

  73. View Slide

  74. View Slide

  75. View Slide

  76. View Slide

  77. View Slide

  78. Step.3, 4
    Write RBS files & tests

    View Slide

  79. Assumption:
    Not necessarily all APIs
    need to have type definitions

    View Slide

  80. "
    Writing high-quality type
    definitions are difficult.
    Focus on examples available
    through the README or docs of
    the gem. Focus on the APIs your
    app is using.
    https://github.com/ruby/gem_rbs_collection/blob/main/docs/CONTRIBUTING.md

    View Slide

  81. Partitive
    Exhaustive

    View Slide

  82. Partitive

    View Slide

  83. for example
    amatsuda/active_decorator

    View Slide

  84. View Slide

  85. View Slide

  86. Pull Request: RBS for ActiveDecorator gem

    View Slide

  87. View Slide

  88. View Slide

  89. View Slide

  90. View Slide

  91. View Slide

  92. View Slide

  93. View Slide

  94. View Slide

  95. View Slide

  96. Merged!
    Merged!

    View Slide

  97. Partitive
    Exhaustive

    View Slide

  98. Exhaustive

    View Slide

  99. for example
    brainspec/enumerize

    View Slide

  100. View Slide

  101. View Slide

  102. Command to
    generate RBS

    View Slide

  103. source files

    View Slide

  104. destination
    file

    View Slide

  105. View Slide

  106. Most are
    `untyped`

    View Slide

  107. View Slide

  108. View Slide

  109. PATCH IT!
    PATCH IT!

    View Slide

  110. View Slide

  111. View Slide

  112. ~~~~~~~~~~~~~~~~~~~~~~~~~~

    View Slide

  113. ~~~~~~~~~~~~~~~~~~~~~~~~~~
    Write all?🤔
    Write all?🤔

    View Slide

  114. "
    Writing high-quality type
    definitions are difficult.
    Focus on examples available
    through the README or docs of
    the gem. Focus on the APIs your
    app is using.
    https://github.com/ruby/gem_rbs_collection/blob/main/docs/CONTRIBUTING.md

    View Slide

  115. Pull Request: Add RBS for Enumerize gem

    View Slide

  116. View Slide

  117. Partitive
    Exhaustive

    View Slide

  118. Partitive
    Exhaustive
    How should we use
    How should we use
    them differently?
    them differently?

    View Slide

  119. ✓If you want a tight type
    definition for a particular
    method
    ✓If you want RBS for now
    👉Partitive
    👉Exhaustive

    View Slide

  120. Step.5
    Open a Pull Request

    View Slide

  121. Before that...

    View Slide

  122. View Slide

  123. View Slide

  124. rbs validate
    steep check

    View Slide

  125. And then
    Open your Pull Request!😄

    View Slide

  126. F Y I 💁‍♂️
    For your information

    View Slide

  127. FYI
    REMOVE manifest.yml
    The file manifest.yml is necessary if there are
    dependencies that are not described in Gemfile.lock or
    gemspec. If there are no dependencies, remove it before
    opening PR
    NOT ALL GEMS ARE COVERED
    Standard and built-in library RBS files are available in the
    ruby/rbs repository

    View Slide

  128. View Slide

  129. View Slide

  130. View Slide

  131. View Slide

  132. View Slide

  133. View Slide

  134. View Slide

  135. View Slide

  136. View Slide

  137. View Slide

  138. https://unsplash.com/photos/4V1dC_eoCwg

    View Slide

  139. WHAT
    WANTED
    TO TELL
    Let's actively use
    RBS, Steep and
    share our knowledges
    I hope that
    the Ruby type ecosystem
    will develop further

    View Slide

  140. View Slide