make it work with Rails 3.1 final

This commit is contained in:
Dmytrii Nagirniak 2011-09-04 17:53:43 +10:00
parent c69f31008f
commit 4c527de684
2 changed files with 25 additions and 72 deletions

View File

@ -3,23 +3,39 @@ module Guard
class RailsAssets::RailsRunner class RailsAssets::RailsRunner
@@rails_booted = false # Only one rails app is allowed, so make it a class var @@rails_booted = false # Only one rails app is allowed, so make it a class var
@@rails_env = nil
def initialize(options) def initialize(options={})
@@rails_env = (options[:rails_env] || 'test').to_s unless @@rails_booted
end
def self.apply_hacks
# TODO: Hack due to Rails 3.1 issue: https://github.com/rails/rails/issues/2663#issuecomment-1990121
ENV["RAILS_GROUPS"] ||= "assets"
ENV["RAILS_ENV"] ||= @@rails_env
# TODO: Now another hack: Rails replaces Rails.application.assets with Rails.applciation.assets.index
# (this happens when config.action_controller.perform_caching is true)
# It caches all the assets, so that the Rakse task can't be reused
require 'sprockets/environment'
Sprockets::Environment.class_eval do
def index; self; end # instead of Index.new(self)
end
end end
# Methods to run the asset pipeline # Methods to run the asset pipeline
# See as a reference https://github.com/rails/rails/blob/master/actionpack/lib/sprockets/assets.rake # See as a reference https://github.com/rails/rails/blob/master/actionpack/lib/sprockets/assets.rake
def boot_rails def self.boot_rails
return if @@rails_booted return if @@rails_booted
puts "------------BOOTING RAILS" puts "Booting Rails for #{@@rails_env} environment."
apply_hacks
require 'rake' require 'rake'
require "#{Dir.pwd}/config/environment.rb" require "#{Dir.pwd}/config/environment.rb"
app = ::Rails.application app = ::Rails.application
puts "--- CACHE=#{app.assets.cache}"
app.assets.cache = nil app.assets.cache = nil # don't touch my FS pls. (can we use `app.config.assets.cache_store = false` instead)?
app.load_tasks app.load_tasks
@@rails_booted = true @@rails_booted = true
puts "-- BOOTED after?=#{@@rails_booted}"
end end
@ -27,7 +43,7 @@ module Guard
# #
# @return [ Boolean ] Whether the compilation was successful or not # @return [ Boolean ] Whether the compilation was successful or not
def compile_assets def compile_assets
boot_rails self.class.boot_rails
return false unless @@rails_booted return false unless @@rails_booted
begin begin
Rake::Task['assets:clean'].execute Rake::Task['assets:clean'].execute

View File

@ -2,70 +2,7 @@ require 'spec_helper'
describe Guard::RailsAssets::RailsRunner do describe Guard::RailsAssets::RailsRunner do
subject { Guard::RailsAssets::RailsRunner.new({}) } it 'should be tested properly as a Rails engine'
describe ".compile_assets" do
let(:asset_pipeline) { Guard::RailsAssets::RailsRunner::AssetPipeline }
before do
described_class.class_eval do
def boot_rails
end
end
end
context "successful compile" do
before do
asset_pipeline.stub(:clean)
asset_pipeline.stub(:precompile)
end
it "cleans the assets" do
asset_pipeline.should_receive(:clean)
subject.compile_assets
end
it "runs the compiler" do
asset_pipeline.should_receive(:precompile)
subject.compile_assets
end
it "returns true" do
subject.compile_assets.should be_true
end
end
context "with a compilation error" do
before do
asset_pipeline.stub(:clean)
asset_pipeline.should_receive(:precompile).and_raise(StandardError)
@output = capture(:stdout) do
@result = subject.compile_assets
end
end
it "outputs the error" do
@output.should include("An error occurred")
end
it "returns false" do
@result.should be_false
end
context "on next successful compile" do
it "works" do
asset_pipeline.should_receive(:clean)
asset_pipeline.should_receive(:precompile)
subject.compile_assets.should be_true
end
end
end
end
it { should respond_to :compile_assets }
end end