rubocopを0.47系から0.48系に上げたときのメモ

やったことある人はわかると思うが、rubocopを0.47系から0.48系に上げると、新しいcopがいっぱい入っていて、めちゃめちゃ怒られる。ついつい「全部 Enabled: false にしてしまえ!」と思いたくなるが、コードの品質を守ってくれる味方だと思ってしっかり対応していきたい。

以下、今担当しているプロダクトでrubocop0.48系に上げたときに苦労したり判断したりしたやつリスト。

Lint/AmbiguousBlockAssociation

これは無効化した。

Railsガイドに、特にscopeとして以下のような書き方がなされているが、これが怒られる。

scope :published, -> { where(published: true) }

Railsっぽさを曲げてまでこのcopをONにする必要は無いと判断。非RailsプロジェクトならONにしてもいいかもしれない。

Security/YAMLLoad

YAML.load ではなく YAML.safe_load を使うように強制される。

これはセキュリティ事情だし、良いのだが、既存のYAMLファイルを読めなくなる場合があるので注意。特に、safe_loadにするとYAMLのalias構文が効かなくなる(?)ので、困るときは普通に困る。

更にいうと、こいつはauto correct対象(!)なので注意

僕のプロジェクトでは、ONのままとした。

ただし、読み込むYAMLがアプリケーションの一部としてリポジトリに組み込まれ、設定としてYAML.loadされる場合に限り、rubocop:disableコメントによる無効化を可とした。

Metrics/BlockLength

これは活用したいcop。ただし、DSLとしてブロックを書く場合に、ブロックが長くなってしまうのは当たり前なので、適用範囲外を適切に追加。基準は「DSLとしてブロックを書くところ」。

Metrics/BlockLength:
  Exclude:
    - Gemfile
    - spec/**/*
    - lib/tasks/**/*

これはググってみても、同じ対応をしている人が何人か観測された。

Style/EmptyMethod

空のメソッドの書き方を、2種類のスタイルのどちらかに強制することができる。 Railsだと、ControllerをCallbackを活用して実装していれば、何もしないメソッドが現れることはよくある。

def style1; end

def style2
end

これは好みだなぁ、という所感。既存コードが上のstyle2のパターンだったので、そちらを強制するようにした。

Style/EmptyMethod:
  EnforcedStyle: expanded

Style/PercentLiteralDelimiters, Style/WordArray, Style/SymbolArray

文字列やシンボルの配列をリテラルのみで作成するときに、原則bracketを使った%記法を使うように強制される。

%w[string array]
%i[symbol array]

別になんでも良いと思うのだけど、統一されていることは良いことだし、どの記号を使うかと言われたら一番配列っぽいbracketを使うのも悪くないとは思うので、ONにしたままとした。

既存コードはauto correctで直してしまった。

Style/EmptyLineAfterMagicComment

僕のプロジェクトは# frozen_string_literal: trueをちゃんと書いていたが、このcopにより、その下に1行空行を挟めと怒られた。

ちょっとイラっとした。

でも冷静に、これをOFFにする積極的な理由は見つからなかったので、受け入れた。ほぼ全てのファイルに「空行追加」の変更がされるというひどいPullRequestになってしまったが、「そんな簡単にcopを無効化しない雰囲気」の方を大切にした。