SinatraのテンプレートにBundlerを導入してみた

先日作成したSinatraのテンプレートにwycats’s bundler at master – GitHubを導入してみた。

まず、SinatraアプリをSinatra::Baseを継承したクラス化。

アプリルートにGemfileファイルを以下の内容で作成。

gem "sinatra",          "0.9.4", :require_as => "sinatra/base"
gem "rack",		"1.0.1"
gem "rack-flash",	"0.1.1", :require_as => "rack/flash"
gem "haml",             "2.2.13"
gem "chriseppstein-compass", "0.8.17", :require_as => "compass"
gem "dm-core",          "0.10.1"


アプリルートのgemsにバンドルを保存して、利用するgemを記述。

app.rbの先頭のsinatraなどのrequireを削除して以下を追加。

require File.expand_path(File.join(File.dirname(__FILE__), 'vendor', 'gems', 'environment'))
Bundler.require_env

アプリルートで

$ gem bundle


を実行して、利用するgemをダウンロードして環境を作成します。
デフォルトではvender/gemsにダウンロードされて、実行ファイルはbinに配置される。変更可能。

で、

$ ruby app.rb


すると、これまでと変わらずsinatraアプリが実行される。

テストでのみ利用するgemはGemfileに

only :test do
  gem 'shoulda',        "2.10.2"
  gem 'rack-test',      "0.5.2", :require_as => "rack/test"
end

アプリをクラス化したのでテストも書き換え。
test/test_helper.rbを作って

require File.join(File.dirname(__FILE__), '..', 'app.rb')
require 'test/unit'
 
require File.expand_path(File.join(APP_ROOT, 'vendor', 'gems', 'environment'))
Bundler.require_env :test
 
module TestHelper
  include Rack::Test::Methods
 
  def app
    SinatraApp
  end
end
 
Test::Unit::TestCase.send(:include, TestHelper)

test/app_test.rbを下記に変更。

require File.dirname(__FILE__) + '/test_helper'
 
class AppTest < Test::Unit::TestCase
  context "Access pages" do
    should "show index" do
      get '/'
      assert_match 'Say hello!', last_response.body
    end
 
    should "show hello" do
      post '/hello'
      follow_redirect!
      assert_match 'Hello world!', last_response.body
    end
  end
end

features/support/env.rb

# -*- encoding: UTF-8 -*-
require File.join(File.dirname(__FILE__), '../../app.rb')
 
require File.expand_path(File.join(APP_ROOT, 'vendor', 'gems', 'environment'))
Bundler.require_env :test
 
require 'test/unit/assertions'
 
Encoding.default_external = 'UTF-8'
 
Webrat.configure do |config|
  config.mode = :rack
  config.application_framework = :sinatra
  config.application_port = 4567
end
 
World(Test::Unit::Assertions) do
  def app
    SinatraApp
  end
 
  include Rack::Test::Methods
  include Webrat::Methods
  include Webrat::Matchers
end
 
Before do
  DataMapper.auto_migrate!
end

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です