Slide 1

Slide 1 text

2022-10-18 #rubykaigi_after_talks Toward a happy symbiosis with RuboCop @ydah

Slide 2

Slide 2 text

• Name: Yudai T akada • GitHub: @ydah • T witter: @ydah_ • An Open Source Software programmer. • Software Engineer at ANDPAD, Inc. • Born and raised in Osaka. • Loves beer and coffee and heavy metal 🍻 ☕ 🤘 self.inspect

Slide 3

Slide 3 text

「建築・建設業に特化したクラウドサービス」 ANDPADは、現場の効率化から経営改善まで 一元管理できるシェアNo.1※クラウド型建設 プロジェクト管理サービスです。 ※「クラウド型施工管理サービスの市場動向とベンダーシェア」 (デロイト トーマツ ミック経済研究所調べ) We’re hiring!!!

Slide 4

Slide 4 text

RubyKaigi とても楽しかったです!!

Slide 5

Slide 5 text

ご飯も最高でした!!

Slide 6

Slide 6 text

Today’s talk

Slide 7

Slide 7 text

"Role models are important." - Officer Alex J. Murphy / RoboCop

Slide 8

Slide 8 text

In 2 sessions at RubyKaigi 2022 About RuboCop Day 2 : Make RuboCop super fast @koic Day 3 : The Better RuboCop World to enjoy Ruby @nay3

Slide 9

Slide 9 text

取り組んだこと at ANDPAD

Slide 10

Slide 10 text

• 当初は9割以上の cop が無効化された状態で運用が始まった • 無意味な cop がないか精査して、必要な cop だけを入れたかった • まともに選定していたのは導入時のみ(つらい) • 導入時に有効化された cop もそもそも少ない(つらい) • それ以来メンテが全くされていない(つらい) Background

Slide 11

Slide 11 text

• 一部の cop だけを有効化して使うのをやめて、全ての cop を有効化 • 但し、 Layout/LineLength や Metrics や Style の一部は無効化とした • .rubocop_todo.yml は 4500 行 • `--exclude-limit 100` で生成されており 43 cops が無効化されていた • TODOの解消は自動修正可能な cop から少しずつされていた • TODOとしてマークされていた違反が起因の障害が発生していた… Background

Slide 12

Slide 12 text

$ rubocop --auto-gen-config —exclude-limit 99999

Slide 13

Slide 13 text

Before: 4500 line After : 35000 line

Slide 14

Slide 14 text

Am I a destroyer or a demon ?

Slide 15

Slide 15 text

“ライダーの物語は時と共に消滅する運 命でした。しかしディケイドと戦う事で 人々の記憶に留まり、再び物語を紡ぐこ とができました。創造は破壊からしか生 まれなかった。そして破壊から生まれた ライダーの物語は、永遠となったのです。

Slide 16

Slide 16 text

戦っていく

Slide 17

Slide 17 text

3本の矢🏹

Slide 18

Slide 18 text

r7kamura/rubocop-todo-corrector • .rubocop_todo.yml を解消する Pull Request を GitHub Actions で自 動生成する Custom Action • 手動実行もできるけれど自動実行にすると世界が変わる • Approve するとマージされて次の Cop に対する TODO を autocorrect した Pull Request が自動生成される • まるで自分自身が GitHub Actions workflow に組み込まれる感覚に なれてよい(?)

Slide 19

Slide 19 text

ydah/rubocop-todo-regenerator • 特定のラベルを Pull Request につけると .rubocop_todo.yml を再生 成したコミットを積んでくれる Custom Action • 大きいRailsアプリだと .rubocop_todo.yml を再生成するのになかな か時間が掛かる • よく使うケースだと、 RuboCop のバージョンを上げるときに使ってます • `bundle update rubocop` して、必要に応じて新しく追加された Cop を無効化して、 Pull Request 作って、実行する。

Slide 20

Slide 20 text

3本目の矢

Slide 21

Slide 21 text

パッチを送る

Slide 22

Slide 22 text

期待通りに動かないところを 動くようにしていく

Slide 23

Slide 23 text

• https://github.com/rubocop/rubocop-performance/pull/285/ commits/7a4413bf6fd63655161102b932dd41af414d60f4 • 人生初の OSS へ送ったパッチ • エラーが発生するケースを見つけたので修正した Fix an error for Performance/MapCompact when using map(&:do_something).compact.first and there is a line break after map.compact and receiver

Slide 24

Slide 24 text

Add new Style/ObjectThen cop • https://github.com/rubocop/rubocop/pull/10526/commits/ a23e49b8da39e81a9cca771421137459fcd32739 • https://github.com/rubocop/ruby-style-guide/pull/895/ commits/255d4391dfc6c388d9934f461b3090d0bb2ef727 • 初めて追加した cop • Object#yield_self vs Object#then

Slide 25

Slide 25 text

• https://github.com/rubocop/rubocop/pull/10674/commits/ a83732be3767cd50f821aba4b3d01542ff6f6f86 • 社内で辛いと話されていたやつ • 最初は arguments forwarding からゆっくり剥がしていこうかと思っていた • そもそもこの cop が違反とみなすのは第一引数が arg の単純なセッターだけ で良いのでは?という話になったので、結果的に辛いと話されていたケースも 違反ではなくなった Fix a false positive for Naming/AccessorMethodName with type of the first argument is other than arg

Slide 26

Slide 26 text

• https://github.com/rubocop/rubocop/pull/10722/commits/ a24174a4ad2158fc8a6a6bed54953b011339f275 • rescue => StandardError を防ぐ cop • 弊社テックブログにも書いたやつ • https://tech.andpad.co.jp/entry/2022/08/25/100000 Add new Lint/ConstantOverwrittenInRescue cop

Slide 27

Slide 27 text

• Fix bugs • Improved documentations • Add configuration options • Create new cops • Trivial maintenance of Rake tasks In addition…

Slide 28

Slide 28 text

気がつくと

Slide 29

Slide 29 text

rubocop/rubocop 2022

Slide 30

Slide 30 text

rubocop/rubocop-rspec 2022

Slide 31

Slide 31 text

• Style/ObjectThen • Lint/ConstantOverwrittenInRescue • Lint/NonAtomicFileOperation • Rails/WhereMissing • Rails/FreezeTime • RSpec/ChangeByZero • RSpec/Capybara/SpecificFinders • RSpec/Capybara/SpecificMatcher Add new cops

Slide 32

Slide 32 text

気がついた

Slide 33

Slide 33 text

これは戦いではなく 「共生」なのでは?

Slide 34

Slide 34 text

共⽣とは 1. 共に同じところで⽣活すること。 2. 異種の⽣物が、相互に作⽤し合う状態で⽣活すること。 相利共⽣と⽚利共⽣があり、寄⽣も含めることがある。

Slide 35

Slide 35 text

大きなRailsアプリ = Rubyの大規模利用事例 からのフィードバック ”ふつうのRubyのコード、ふつうのRailsアプリ”にするための Linting, Formatting Symbiosis?

Slide 36

Slide 36 text

私は、これからもコードを書いていく。 ただ、「楽しいから。」 Rubyプログラミング is 楽しい

Slide 37

Slide 37 text

end