At Ginza Rails #43 https://ginza-rails.connpass.com/event/242685/
スライドトップと してご利用ください マネーフォワード事業本部 山田 太郎 © Money Forward, Inc.RBS and Rails, Present and Future Masataka Pocke Kuwabara © Money Forward, Inc.2022-03-25 銀座Rails#43
View Slide
● Money Forward Osaka Office ● Live in Okayama ● A maintainer of RBS I’m Masataka PockeKuwabara GitHub: @pocke © Money Forward, Inc.
© Money Forward, Inc.● I work since Feb. 15 2022 ● 50% for developing a Rails app, 50% fordeveloping OSS (RBS) ● Currently I'm working on updating Ruby 3.1and introducing Steep to the Rails app. I joined Money Forward, inc!
© Money Forward, Inc.● ruby/gem_rbs_collection#124: [activesupport] Remove Class#subclasses ● ruby/rbs#905: Remove CharScanner due to no longer used ● ruby/rbs#907: Reduce memory usage of RBS::Buffer ● kpumuk/meta-tags#237: Separate RBS files to _internal directory to avoid exposing RBS ● ruby/rbs#914: Accept Numeric by Integer#{upto,downto} ● ruby/rbs#919: Fix bin/sort for constants ● rbs/pull#921: Add manifest.yaml for rbs gem ● ruby/rbs#926: Fix bin/sort (WIP) ● pocke/rbs_rails#212: CI against Ruby 3.1 ● pocke/rbs_rails#213: Bundle update to update rbs and steep ● pocke/rbs_rails#214: Documentation update ● pocke/rbs_rails#215: Fix spec ● pocke/rbs_rails#216: Generate dependency types of relations ● pocke/rbs_rails#217: Add rails generator to generate rbs.rake● pocke/rbs_rails#218: Do not expose polyfil RBSs My works
Okayama
© Money Forward, Inc. #okayama in our slack (1/2)
© Money Forward, Inc. I really recommend Kakioko (OysterOkonomiyaki)🦪🦪🦪 Go to Hinase (日生)!!!!!
© Money Forward, Inc.Agenda
© Money Forward, Inc.● What is RBS ● RBS and Rails (Present) ● RBS and Rails (Future) Agenda
© Money Forward, Inc.What is RBS
© Money Forward, Inc.● "RBS is a language to describe thestructure of Ruby programs." ○ https://github.com/ruby/rbs#rbs ● Type Language for Ruby ● RBS is available since Ruby 2.6 ○ But I highly recommend Ruby 2.7+ RBS is …
© Money Forward, Inc.class Stringdef gsub: (String | Regexp pat, String rep) -> StringendRBS Syntax Seehttps://github.com/ruby/rbs/blob/master/docs/rbs_by_example.md as a tutorial,https://github.com/ruby/rbs/blob/master/docs/syntax.mdas a reference.
© Money Forward, Inc.● ruby/rbs ● ruby/gem_rbs_collection ● ruby/typeprof ● soutaro/steep ● pocke/rbs_rails Today I do not talk about Sorbet tools Related Projects
Type Checkers Language © Money Forward, Inc.Related Projects ruby/ rbs ruby/ gem_rbs_ collection soutaro/ steep ruby/ typeprof Tool pocke/ rbs_rails Use Generate
© Money Forward, Inc.● You can use it with `gem install rbs` ● Defines RBS language ● Provides RBS loader for other tools ● Provides tools to support using RBS ● Contains core and stdlib's RBS files ruby/rbs
© Money Forward, Inc.● Provides gems' RBSs, such as activesupportgem ● Similar with DefinitelyTyped for TypeScript ● Contributions are welcome! ○ https://github.com/ruby/gem_rbs_collection/blob/main/docs/CONTRIBUTING.md ruby/gem_rbs_collection
© Money Forward, Inc.● A type checker for Ruby ruby/typeprof
© Money Forward, Inc.● A type checker for Ruby soutaro/steep
© Money Forward, Inc.Difference between Steep andTypeProf https://www.slideshare.net/mametter/typeprof-for-ide-enrich-development-experience-without-annotations
© Money Forward, Inc.● RBS files generator for Ruby on Rails ● It focuses on generating methods generatedby Rails. pocke/rbs_rails
© Money Forward, Inc.RBS and Rails(Present)
© Money Forward, Inc.How to introduce RBSto Rails app 1. Add gems to Gemfile 2. Setup rbs collection 3. Setup RBS Rails 4. Setup Steep 5. Run🚀
© Money Forward, Inc.● Add rbs, steep, and rbs_rails gems to Gemfile ● Then run `bundle install` Add gems to Gemfile
© Money Forward, Inc.● rbs collection setups dependencies' RBSs. ○ See my talk at RubyKaigi Takeout 2021https://rubykaigi.org/2021-takeout/presentations/p_ck_.html ● Run the following commands ○ `rbs collection init` ○ `rbs collection install` Setup rbs collection
© Money Forward, Inc.● Run `rails g rbs_rails:install` ● Then, run `rake rbs_rails:all` to generateRBSs for AR models Setup RBS Rails
© Money Forward, Inc.● Run `steep init` ● Edit Steepfile ● Run `steep check` Setup & run Steep
© Money Forward, Inc.● Use `steep langserver` ○ https://github.com/soutaro/steep-vscode ○ https://github.com/emacs-lsp/lsp-mode ○ https://github.com/prabirshrestha/vim-lsp Using steep from editor
Now we can use type checkingwith Steep! Is it ready toproduction? © Money Forward, Inc.
No © Money Forward, Inc.
© Money Forward, Inc.Currently I got 410 type errors on our Rails app,and it does not analyze whole of code.
© Money Forward, Inc.● More accurate type checking ○ Generating RBS ○ Enhance RBS Rails ○ Write more RBSs in gem_rbs_collection ○ Support meta-programming in RBS ● Introducing RBS to a team smoothly ○ Run Steep on CI ○ Improve performance ○ Generating RBS "continuously" ○ Share knowledge to team Issues
© Money Forward, Inc.RBS and Rails(Future)
© Money Forward, Inc.● More accurate type checking ○ Generating RBS ○ Enhance RBS Rails ○ Write more RBSs in gem_rbs_collection ○ Support meta-programming in RBS ● Introducing RBS to a team smoothly ○ Run Steep on CI ○ Improve performance ○ Generating RBS "continuously" ○ Share knowledge to team Issues (again)
© Money Forward, Inc.Generating RBS(continuously) 1. Current Behavior 2. Problem 3. Goal
© Money Forward, Inc.● There are three command to generate RBS ○ `rbs prototype rb` ○ `rbs prototype runtime` ○ `typeprof` (I don't talk today) Generating RBS: Current Behavior
© Money Forward, Inc.● It parses `.rb` file, and generate RBS ○ `rbs prototype rb path/to/file.rb` ● 👍 Easy to run, easy to guess what will be generated ● 👎 Not good at meta-programming ○ e.g. eval, define_method, etc... rbs prototype rb
© Money Forward, Inc.● It executes Ruby program, then extract methodinformation with meta-programming ○ `rbs prototype runtime KlassName` ● 👍 Good at meta-programming ● 👎 It may raise an error, generate dirty RBSs. ● 👎 User needs to specify class name. rbs prototype runtime
© Money Forward, Inc.● I recommend using `rbs prototype rb` ● But it is not the "Silver Bullet" Why? Current state of generating RBS
© Money Forward, Inc.● `rbs prototype rb` is not good at meta programming ● It may generate RBS does not work standalone ○ e.g. on `class C < D`, it generates C but doesn't generateD. ● We still get type errors even if it runs with generatedRBSs ● It is not aware of existing RBSs Problems
© Money Forward, Inc.● For meta-programming ○ → It should be based on `prototype runtime` ● To work standalone ○ → Fix bugs, generate dependency types ● To avoid type errors ○ → Generate more lenient types ● To be aware of existing RBSs ○ `rbs subtract` may solve this issue Goals
© Money Forward, Inc.Supportmeta-programming
© Money Forward, Inc.● takahasim-san wrote an article about this problemfew days ago (Japanese). ○ Rails + RBS & Steepを試してみて困ったところとか感想とか - Qiita ● e.g. different self in lambda ○ validate :foobar, if: -> { new_record? } Support meta-programming
© Money Forward, Inc.Conclusion
© Money Forward, Inc.● We can start introducing RBS easily, but itstill has many problems. ● I'm working on generating RBS. It shouldgenerate RBSs that work out of the box. ● Go to Hinase, Eat Kakioko🦪🦪🦪 Conclusion
©Money Forward, Inc.We are hiring!