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 にするのではなく、例えば、 RuboCop
を rubocop
に変換するように、いくつかの言葉は一つの言葉として 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 で利用されている方は、是非利用してみることをおすすめします。