のんびりSEの議事録

プログラミング系のポストからアプリに関してのポストなどをしていきます。まれにアニメ・マンガなど

最近のRuby(Rails)開発でこれいれとくと幸せになれるGem

ここ1年くらいRubyメインで開発することが多いのですが、ここいらでこれいれとくと開発が捗るGemを紹介したいと思います。

  • 対象Ruby version > 2.1
  • 対象Rails version 5.0.0.1 >= 4.2

Gemfile

まずはよく使うGemを記述したGemfileを紹介します。

group :development, :test do

  gem 'byebug', platform: :mri
  gem 'rspec', '~> 3.5'
  gem 'rspec-rails', '~> 3.5', '>= 3.5.1'
  gem 'simplecov', '~> 0.12'
  gem 'test-queue', '~> 0.2'

  gem 'database_cleaner', '~> 1.5', '>= 1.5.3'
  gem 'factory_girl', '~> 4.7'

end

group :development do

  gem 'pry'
  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-byebug'
  gem 'pry-stack_explorer'
  gem 'yard', '~> 0.8.1'
  gem 'rubocop', '~> 0.42.0'

  gem 'guard', '~> 2.14'
  gem 'guard-rspec', '~> 4.7', '>= 4.7.2'
  gem 'guard-yard', '~> 2.1', '>= 2.1.4'
  gem 'guard-rubocop', '~> 1.2'
  gem 'guard-bundler', '~> 2.1'
  gem 'guard-spring', '~> 1.1', '>= 1.1.1'
  gem 'guard-shell', '~> 0.7.1'

  gem 'capistrano', '~> 3.5'
  gem 'capistrano3-unicorn', '~> 0.2.1'
  gem 'capistrano-rbenv', '~> 2.0', '>= 2.0.4'
  gem 'capistrano-rails', '~> 1.1', '>= 1.1.7'
  gem 'capistrano-bundler', '~> 1.1', '>= 1.1.4'

  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'spring-commands-rspec', '~> 1.0', '>= 1.0.4'

end

Rspec関連

RSpec自体の説明は、情報がありふれているのでココでは省きます。

rspec-rails

www.relishapp.com

rails用のテストで便利メソッドが含まれているGem

主にcontrollerやrouting等のテストも可能になるようになってます

simplecov

github.com

テスト結果に基づいてカバレッジレポートを出力してくれます

spec_helper(rails_helper)に以下を追加するだけ

require 'simplecov'
SimpleCov.start 'rails'

test-queue

github.com

テストを並列実行してテスト実行速度を早めます。

Rspecの場合は以下のコマンドで実行(この時、ディレクトリを指定する必要がある)

$ bundle exec rspec-queue spec

database_cleaner

github.com

テストデータをきれいスッキリ、削除します

# coding: utf-8

require "database_cleaner"

# User DB cleaner
RSpec.configure do |config|

  config.before(:suite) do
    ActiveRecord::Base.establish_connection(:db1)
    # `truncation`で`TRUNCATE`指定可能
    DatabaseCleaner.strategy = :deletion
    DatabaseCleaner.start
  end

  config.after(:suite) do
    ActiveRecord::Base.establish_connection(:db1)
    # exceptで除外テーブルを指定
    DatabaseCleaner.clean_with :deletion, { except: %w(schema_migrations) }
  end

end

factory_girl

github.com

テストデータをyml形式でなく、Rubyで作成できます。難易度高め。。。

使い方等は下記とか詳しいかも

qiita.com

また、以前Qiitaにも投稿させてもらいましたが、strategyについては独自に作成できるようです。

qiita.com

pry

irbより断然よいです。補完もききます。Rails標準のConsoleもpry-railsで簡単にpryに変更できます。

こちらが詳しいです

ruby-rails.hatenadiary.com

gem開発だと、bin/consoleに以下のように設定することで使えるようになります

require 'pry'
Pry.start
$ bundle exec console

yard

YARD - A Ruby Documentation Tool

Ruby用のドキュメント生成ツールです。PHPDocやJavaDocの様なアノテーション記法(タグとも言う)で記述できます。

↓タグ一覧です

File: Tags Overview — Documentation for yard (0.9.5)

rubocop

github.com

静的コード解析をしてくれます。

.rubocop.ymlにルールを記述していく形になります。思いついたときにチューニングしてあげると良いです。

こちらも以前ざっくりと調べた物をQiitaにあげてます。

qiita.com

spring

github.com

Javaフレームワークではないほうですw Railsで事前にPreloadをしておいて、開発効率を上げていくスタイルです。

setup

$ bundle exec spring binstub --all

start

$ bundle exec spring server
$ bundle exec spring status
$ bundle exec spring stop

rspec

$ bundle exec spring rspec

capistrano

github.com

こちらは開発ツールというよりはデプロイツールなので、説明は省きます。 2系と3系で大きく記述が違うので注意

guard

github.com

ファイルの変更を監視して、自動実行タスクを走らせるツールです。 ソース変更と同時に走らせたいツールを特に入れてます。 Guardfileに設定を記述していきます。

guardにタスクを記述し、watchで監視するファイルの設定を記述する。

以下よく使用する設定例です

# coding : utf-8
# -*- mode: ruby -*-
# vi: set ft=ruby :

group :red_green_refactor, halt_on_fail: true do

  # rspecの設定
  guard :rspec, cmd: "bundle exec spring rspec" do
    # 監視ファイルの設定
    watch(%r{^app/controllers/(.+)_(controller)\.rb$}) do |m|
      [
        "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb",
        "spec/routing/#{m[1]}_routing_spec.rb",
        "spec/requests/#{m[1]}_spec.rb"
      ]
    end
    watch(%r{lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
    watch(%r{spec/.+_spec\.rb$})
  end

  # yardの設定 docディレクトリに出力する形式
  guard :yard, server: false, stdout: '/dev/null' do
    watch("README.md")
    watch(%r{app/(.+)\.rb$})
    watch(%r{lib/(.+)\.rb$})
    watch(%r{lib/(.+)\.rake$})
  end

  # rubocopの設定
  guard :rubocop, all_on_start: false, keep_failed: false, cli: ["--format", "clang", "-l"] do
    watch(%r{app/(.+)\.rb$})
    watch(%r{lib/(.+)\.rb$})
    watch(%r{spec/.+_spec\.rb$})
    watch(%r{spec/.+\.rb$})
    watch(%r{lib/(.+)\.rake$})
    watch(%r{config/(.+)\.rb$})
    watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
  end

end

# bundlerの設定
guard :bundler, cmd: "bundle" do
  watch("Gemfile")
end

# 指定shellの実行
guard :shell do
  # routes.rbが変更された時点で、ルーティングの一覧を出力する
  watch("config/routes.rb") { |m| `rake routes` }
end

# springの設定
guard 'spring', bundler: true, environments: %w[test] do
  watch('Gemfile.lock')
  watch(%r{^config/})
  watch(%r{^spec/(support|factories)/})
  watch(%r{^spec/factory.rb})
end

実行

$ bundle exec guard

これでソース更新時に、コード解析、テスト実行、ドキュメント生成等を自動で行ってくれるようになります。 便利!

Guardは他にもpluginがいくつかあるので、使用してみるといいかもしれません。

その他

他にもcapybaraselenium等E2テスト用のGemもあります。

まだまだ他にもあると思うので、またいろいろ探してアップデートします。