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を無効化しない雰囲気」の方を大切にした。