RuboCopのカスタムCopをつくるときの注意点

井原(@ihara2525)です。

自社の文法チェックのためにRuboCopのカスタムCopをつくりたいと思い調べていたところ、RuboCopのCustom Copを作るという良い記事があるのですが、2015/6/16時点で若干気をつけないといけない点がありました。

rubocop-0.29.1までを使う

rubocop-0.30.0からspec以下が含まれなくなったようで、テストの書き方を変えないといけません。具体的にはinspect_sourceを使えないので、その対応をどうするかというところです。 僕は0.29.1を使うことでとりあえず回避しました :+1:

Gem::Specification.find_by_nameではなくBundler.load.specs.findを使う

上記のinspect_sourceを使うためにrubocopのヘルパを読み込むのですが、rubocopの複数バージョンがインストールされていた場合、

require File.join(Gem::Specification.find_by_name('rubocop').gem_dir, 'spec', 'spec_helper.rb')

だと最新のものを見つけてしまい(0.29.1以降があればそれ)、そうすると読み込みたいヘルパがないバージョンをロードしようとしてしまいます。

そのため、

rubocop_gem_path = Bundler.load.specs.find { |s| s.name == 'rubocop' }.full_gem_path
Dir["#{rubocop_gem_path}/spec/support/**/*.rb"].each { |f| require f }

のように、Bundler.load.specs.findを使ってBundler環境でrubocopを探すようにしました。gemspecに

spec.add_development_dependency 'rubocop', '0.29.1' # fix the version, see https://github.com/nevir/rubocop-rspec/issues/38

のように書いておけばバージョン固定で大丈夫だと思います。

というわけでとりあえずつくってみた弊社用のrubocop拡張はこちら。

github.com

it { should be_valid }

みたいなものは

it { is_expected.to be_valid }

のように指摘して欲しかったのです。

RuboCop、頑張ればコーディング規約のような文章をつくるよりも機械にチェックさせることができて断然楽そうです。 もっとやりたいことがあるのですが、とりあえずまずはここまで!