Torihaji's Growth Diary

Little by little, no hurry.

rubocopを途中導入する。Rails 7.2.2

はじめに

ある程度開発を進めていって、rubocop入れたいなとなった時に

とりあえずgem入れればいいんでしょ、とまではなったが

じゃあここからどうすればという自分に向けて。

まず

gemを入れましょう。

group :development do

gem 'rubocop', require: false

end

Gemfileに上記を追記。

developmentに入れるのは、developmentしか使わないから。

require: falseにするのはアプリの読み込み時にrubocopを含ませないようにすることでアプリの起動速度を向上させるため。

application.rbにおいて Bundler.require(*Rails.groups)とある。

これによって起動時に全てのgemを読み込んでる。これに入らないようにするため。

正直rubocopをfalseにしたところで下がった速度を体感できるのかは謎。

ただ先人がそうしているし、わざわざ悪くなることがわかっていることをたった数文字で回避できるならそうした方が良い。

その後

ここからはある程度開発を進めて、というのを前提にします。

となったときはまず以下コマンド。

bundle exec rubocop --auto-gen-config

これをすることでrubocop.ymlとrubocop-todo.ymlが作成される

rubocop.ymlは色々な制限を記載するところ。

何も記載していなければdefaultのルールが適用される。

rubocop.todo.ymlは、これからやるべきことが記載されている。

もう少し詳しくいうと、先ほどのコマンドでrubocopは一度あなたのコードを全て走査する。

そしてdefaultのルールと照らし合わせて、パスしなかったものをカウントして

一旦 そのルールに引っかからないようにあえて緩くしたルールを作成する。

そして全てやったのちにそのゆるいルール集であるtodo.ymlをrubocop.ymlに継承させる。

事実、rubocp.ymlの一番上にinherit from " todo.yml"みたいな記述があるはず。

そうすることでrubocop -a とか走らせた時に過剰に修正されることを防ぎ、段階的にコードルールに合うように

修正していくことが可能となる。

例えば

# Offense count: 5
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
Metrics/AbcSize:
  Max: 31

というのはメソッドの複雑さを測るルールだが、defaultは17であり、実際これだけ走らせると31くらいが

アプリ内でもっとも多いそうな。ちなみにこれに反しているものだけは5個あるそうだが本当にそうか確かめるには次のようにする。

まず、rubocop.ymlに継承されているinherit fromをコメントアウトする。

その後に以下コマンド。

rubocop --only Metrics/AbcSize

そうするとこのルールに反しているものだけが出力される。

app/controllers/api/auth/email_controller.rb:18:7: C: Metrics/AbcSize: Assignment Branch Condition size for signup is too high. [<5, 16, 7> 18.17/17]
      def signup ...
      ^^^^^^^^^^
app/controllers/api/auth/oauth_controller.rb:21:3: C: Metrics/AbcSize: Assignment Branch Condition size for handle_github_auth is too high. [<6, 24, 8> 26/17]
  def handle_github_auth ...
  ^^^^^^^^^^^^^^^^^^^^^^
app/controllers/api/auth/oauth_controller.rb:64:3: C: Metrics/AbcSize: Assignment Branch Condition size for handle_google_auth is too high. [<6, 24, 8> 26/17]
  def handle_google_auth ...
  ^^^^^^^^^^^^^^^^^^^^^^
app/controllers/api/auth/oauth_controller.rb:122:3: C: Metrics/AbcSize: Assignment Branch Condition size for fetch_github_access_token is too high. [<10, 28, 5> 30.15/17]
  def fetch_github_access_token(code) ...
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/controllers/api/auth/oauth_controller.rb:159:3: C: Metrics/AbcSize: Assignment Branch Condition size for get_google_access_token is too high. [<10, 28, 5> 30.15/17]
  def get_google_access_token(code) ...

ということでやっぱりスコアが30.5だからそれに引っかからないようにするために 31と設定してくれたらしい。

もちろん、17は低すぎるとあれば rubocop.ymlに defaultの17ではなく、20と設定すれば良い。

大切なのは、default値に合うようにtodo.ymlにあることを治すことではなく、

自分のプロダクトの状況に合わせて最適なルールを作成することである。

todo.ymlはそれに気づくきっかけを与えてくれるものだ。

もちろん、今後はtodo.ymlを1つずつ潰していって、最終的に0行になることを目指していくべきではあるが、

重要なことは別にある。

そして色々修正していったら再度 auto-gen-configを叩いてどのくらい減ったかを試してみても良い。

あと一気にやろうとせず、今日は1つだけというスタンスだと挫折することがない。

終わりに

という感じで以上。

自分はかなりあった。まだ認証だけしか作ってないのにかなりの量だったのでゆっくりやっていきたい。

あと意外とすんなりできたので、思い込みは良くないなと感じた。