読者です 読者をやめる 読者になる 読者になる

Programming log - Shindo200

イベント参加記録とプログラミング系の雑記

guard-rspec に送った Pull request がマージされました

rspec-rails は2014年6月にリリースされた v3.0.0 から rails_helper.rb という新しいヘルパーファイルを生成するようになりました。 純粋な RSpec の設定は spec_helper.rb に記述し、RailsRSpec を使うときに必要な設定は別のヘルパーファイル(rails_helper.rb)に記述した方が良いという考えにより変更されたようです。

(参考: Move spec_helper to rails_helper. · d3065c0 · rspec/rspec-rails · GitHub

「guard init rspec」コマンドで生成した Guardfile は rails_helper.rb を監視対象にしていませんでしたので、このファイルを監視するように Pull request を送りました。

f:id:Shindo_Masaya:20140716205325p:plain:w600

Updated Guardfile template so that Guard can watch the new rails helper file. by odaillyjp · Pull Request #275 · guard/guard-rspec · GitHub

相手に意図が伝わる英語を使えているか不安だったのですが、単純な内容の Pull request でしたので、送ってから10分足らずでマージされていました。

よちよち向け Guard 説明

ここからは PR とは関係がない話しになるのですが、よちよち.rb で「Guardって何?」という話しが出ていましたので、軽くメモを残しておきます。

Guard とは

一言で説明すると、Guard は「ファイルが更新されたときに『何か』をしてくれるツールです。 「監視対象のファイル名」と「そのファイルが更新されたときに行う処理内容」を Guardfile というファイルに記述しておくと、監視対象のファイルのタイムスタンプが更新されたときに自動的に処理を行ってくれます。 例えば、以下の内容が記述された Guardfile を用意します。

# Guardfile

watch('hello.txt') do
  puts ''
  puts '-------------'
  puts 'Hello, world!'
  puts '-------------'
end

これには、カレントディレクトリにある hello.txt が更新されたときに「Hello, world!」と出力するようにと記述されています。(ただの Ruby のコードですね。) guard を起動し、別ウィンドウで hello.txt のタイムスタンプを更新してみます。

$ guard
22:30:00 - INFO - Guard is now watching at '/Users/odailly/learning/guard'
[1] guard(main)>

# 別ウィンドウで hello.txt のタイムスタンプを更新した

-------------
Hello, world!
-------------

「Hello, world!」の出力に成功しました。 Guard は何をしてくれるツールなのか、なんとなくイメージできましたでしょうか?

今度はもう少し実用的なことを試してみます。 先ほど起動した Guard は「exit」コマンドで一度止めておきましょう。 まずは Gemfile を作成し、以下の内容を記述をします。

source 'https://rubygems.org/'

gem 'guard'
gem 'guard-bundler'

Bundler を使って gem をインストールします。

$ bundle install

Guardfile に以下の内容を追記します。

guard :bundler do
  watch('Gemfile')
end

これには、Gemfile が更新されたときに自動で bundle install を実行するようにと記述されています。 Guard を起動し、別ウィンドウで Gemfile を更新してみます。 (今回は Bundler で Guard をインストールしましたので、Bundler 経由で Guard を起動します。)

$ bundle exec guard
22:43:50 - INFO - Bundle already up-to-date
22:43:50 - INFO - Guard is now watching at '/Users/odailly/learning/guard'
[1] guard(main)>

# Gemfile に「gem 'what_methods'」を追加した

Fetching gem metadata from https://rubygems.org/...........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
# 途中略
Installing what_methods 1.0.1
Your bundle is complete!
Gems in the group production were not installed.
It was installed into ./vendor/bundle
22:44:44 - INFO - Bundle installed

「what_methods」のインストールに成功しました。 今回は Guard から Bundler を使うためのプラグイン「guard-bundler」を利用しました。 Guard には他にも様々なプラグインがありますので、いくつか紹介します。

プラグイン 説明
guard-shell Guard から shell コマンドを実行する
guard-rspec Guard から rspec を実行する

プラグインGithub の Guard organization から見つけることができます。

Guard · GitHub

私のお気に入り設定

「terminal-notifier-guard」という gem を入れて、Guard の処理結果を Mac の通知センターに飛ばすようにしています。邪魔には感じないくらいに目立ってくれるので、お気に入りです。

f:id:Shindo_Masaya:20140716211707j:plain

Springest/terminal-notifier-guard · GitHub