LoginSignup
21
13

More than 5 years have passed since last update.

Rails で rubocop-rspec を使うときは、 rubocop-inflector も一緒に使うと便利

Posted at

TL; DR

RSpec と Rails を一緒につかって開発するときは、 rubocop-inflector を gem install した上で、以下のような .rubocop.yml にすると、 Railsで利用している語形変化( ActiveSupport::Inflector の設定)がそのまま rubocopにも適用されます。

.rubocop.yml

require:
  - rubocop-rspec # If you are using rubocop-rspec, this should come first.
  - rubocop-inflector
  - ./config/initializers/inflections # Your custom rule file

config/initializers/inflections.rb

ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'RuboCop'
  inflect.acronym 'PvP'
end

RuboCop とは?

Rubocop は、Rubyのコードを静的解析してくれて、フォーマットを整えてくれる君です。
とても便利なツールなので、常日頃お世話になっている方が多いのではないでしょうか?

RuboCop is a Ruby static code analyzer and code formatter. Out of the box it will enforce many of the guidelines outlined in the community Ruby Style Guide.

そして、 rubocop-rspec とは、RSpecに対しても、フォーマットを整えてくれる君です。

チーム開発でRailsを利用する場合は、フォーマットに対して不毛な時間を費やさないためにも、これらは是非導入しておきたいところです。

rubocop-rspec を単体で使った場合の問題点

RuboCop は非常に良いツールです。そして Rubocop::RSpec もそのとおりです。
しかし、Railsを使って開発していると、かゆいところに手が届きづらいということがあります。

例: RSpec/FilePath について

このcopは、RSpecのファイルパスと、RSpec内でのテスト対象が一致しているかをチェックしてくれます。

例えば、以下のようなテストファイルに対して、ファイル名が不適切だと指摘してくれます。

# my_class_spec.rb
describe MommyClass do # ファイル名も mommy_class_spec.rb にしろとおこられる
end

これは内部的には、対象を snake_case にした結果がファイル名と一致しているかを確認しています。
しかし、単純に snake_case にするのではなく、例えば、 RuboCoprubocop に変換するように、いくつかの言葉は一つの言葉として snake_case にしなければなりません。 rubocop-rspec を単体で利用する場合は、このような言葉は 設定値の CustomTransform に追加することで対応することが出来ます。

例えば、PvPという言葉を使っている場合は、以下のような設定値を書くことでこれを回避できます。

RSpec/FilePath:
  CustomTransform:
    PvP: pvp
    SyncPvP: sync_pvp
    AsyncPvP: async_pvp
    PvPOverPvP: pvp_over_pvp
    PvPController: pvp_controller

しかし、CustomTransformは完全一致であるため、利用しているパターンの数だけ書く必要があります。
そして、Railsを使っている方ならお気づきかもしれませんが、このような設定値ってどこかで見た記憶がありますよね?

rubocop-rspec も一緒に利用する場合

そうです。 config/initializers/inflections.rb に記述している ActiveSupport::Inflector の設定が、今回の問題を解消するための鍵になります。そして、この設定を簡単にrubocopに反映してくれるのが、以下の rubocop-inflector になります。

これを導入することで、以下のような簡潔な設定を書くだけで、特殊な言葉への対応が完了します。そして、これらは Rails での inflector と同じ設定であるため、実際のコードと、Rubocopの設定が同期的にメンテナンスされるというメリットもあります。

require:
  - rubocop-rspec # If you are using rubocop-rspec, this should come first.
  - rubocop-inflector
  - ./config/initializers/inflections # Your custom rule file
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'PvP'
end

この rubocop-inflector はリリースされたばかりですが、非常に薄いgemであり、これを導入することで、Rubocopの設定ファイルのメンテナンスが非常に楽になるので、rubocop-rspec を Rails で利用されている方は、是非利用してみることをおすすめします。

21
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
13