rubocop で ディレクトリごとにルールを変える

May 20, 2020
rubocop ruby

rails と rspec でアプリケーション書いてる時に度々困ることがあるんですけど、

例えば、

# app/models/user.rb

def hoge
  fuga = cars.find_by(...)
           .method_a(...)
           .method_b(...)
end
# spec/models/user_spec.rb

it do
  ecpext { user.hoge }
    .to change { user.reload.name }.from("aaa").to("bbb")
    .and change { ... }
    .and change { ... }
end

みたいな感じで書くんですよね。 で、これを rubocop さんに見てもらうと怒られちゃうんですよ。

種類としては Layout/MultilineMethodCallIndentation になるんですけど、
app は indented_relative_to_receiver に従っていて、
spec は indented に従っていることになります。

こんな感じで、ディレクトリによって rubocop のルール変えたいことがあったので、対応したときのメモになります。

対応

こうする

sample-app
  ├ app
  ├ spec
  │  ├ .rubocop.yml
  │  └ ...
  ├ ...
  └ .rubocop.yml
# sample-app/.rubocop.yml

# アプリ全体での設定はここに書く
Layout/MultilineMethodCallIndentation:
  EnforcedStyle: indented_relative_to_receiver
# sample-app/spec/.rubocop.yml

# アプリ全体の設定を読み込んで
inherit_from: ../.rubocop.yml

# 個別の設定で上書きする
Layout/MultilineMethodCallIndentation:
  EnforcedStyle: indented

コアコミッターが言ってるんだから間違いない https://twitter.com/9sako6/status/1260756420036681729

comments powered by Disqus