井原(@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拡張はこちら。
it { should be_valid }
みたいなものは
it { is_expected.to be_valid }
のように指摘して欲しかったのです。
RuboCop、頑張ればコーディング規約のような文章をつくるよりも機械にチェックさせることができて断然楽そうです。 もっとやりたいことがあるのですが、とりあえずまずはここまで!