Ruby | Guard gem を利用してファイルの変更を検出し、rubocopを自動実行する
概要
Guard gem を利用してファイルの変更を検出し、rubocopを自動実行します
前提
- guard gem はインストール済みとします。
- rubocop gem はインストール済みとします。
guard-rubocop gem のインストール
$ gem install guard-rubocop --no-ri --no-doc
設定ファイル(Guardfile)の生成
RuboCop 対応のひな形を生成します。
$ guard init rubocop
下記のようなテンプレートが生成されます
Guardfile
# A sample Guardfile
# More info at https://github.com/guard/guard#readme
guard :rubocop do
watch(%r{.+\.rb$})
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
end
guardを起動します
$ guard start
プログラムのひな型を生成します
自作 gem の rspec_piccolo を利用します。
rspec_piccoloはプロダクトコードとテストコードのひな形を生成する CLI ツールです。
詳しくは
https://github.com/tbpgr/rspec_piccolo
を参照。
$ piccolo e Hoge hoge hoge -p
これで、以下のファイルが生成されます。
lib/hoge.rb
# encoding: utf-8
class Hoge
def hoge
# TODO: implement your code
end
end
spec/hoge_spec.rb
# encoding: utf-8
require "spec_helper"
require "hoge"
describe Hoge do
context :hoge do
cases = [
{
case_no: 1,
case_title: "case_title",
expected: "expected",
},
]
cases.each do |c|
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
begin
case_before c
# -- given --
hoge = Hoge.new
# -- when --
# TODO: implement execute code
# actual = hoge.hoge
# -- then --
# TODO: implement assertion code
# expect(actual).to eq(c[:expected])
ensure
case_after c
end
end
def case_before(c)
# implement each case before
end
def case_after(c)
# implement each case after
end
end
end
end
自動生成されたファイルを検知して、 guard が実行されます
rspec_piccolo を作成した当初は RuboCop 対応を加味していなかったため、
複数の警告が発生しています。
[1] guard(main)>
23:07:23 - INFO - Inspecting Ruby code style: lib/hoge.rb spec/hoge_spec.rb
Inspecting 2 files
CW
Offenses:
lib/hoge.rb:3:1: C: Extra blank line detected.
# :
# 中略
# :
spec/hoge_spec.rb:40:22: W: Unused method argument - c. If it's necessary, use _ or _c as an argument name to indicate that it won't be used. You can also write as case_after(*) if you want the method to accept any arguments but don't care about them.
def case_after(c)
^
2 files inspected, 12 offenses detected
RuboCopの設定ファイルを作成し、現状の警告を todo 化することで警告をなくします
$ rubocop --auto-gen-config
$ echo 'inherit_from: .rubocop_todo.yml' > .rubocop.yml
.rubocop.yml の作成を検知して、 guard が実行されます
.rubocop_todo.yml ファイルの設定により、現状の警告が抑止されたことを確認できます。
[1] guard(main)>
23:13:06 - INFO - Inspecting Ruby code style: .
Inspecting 2 files
..
2 files inspected, no offenses detected
参照
http://rubygems.org/gems/guard-rubocop
https://github.com/yujinakayama/guard-rubocop
Guard まとめ記事