diff --git a/lib/sprockets/rails/task.rb b/lib/sprockets/rails/task.rb index e999af4f..9c0af33b 100644 --- a/lib/sprockets/rails/task.rb +++ b/lib/sprockets/rails/task.rb @@ -16,7 +16,9 @@ def initialize(app = nil) def environment if app - app.assets + # Use initialized app.assets or force build an environment if + # config.assets.compile is disabled + app.assets || Sprockets::Railtie.build_environment(app) else super end diff --git a/lib/sprockets/railtie.rb b/lib/sprockets/railtie.rb index af8f4186..16ae29ce 100644 --- a/lib/sprockets/railtie.rb +++ b/lib/sprockets/railtie.rb @@ -69,7 +69,12 @@ def configure(&block) Sprockets::Rails::Task.new(app) end - def self.build_environment(app) + def build_environment(app, initialized = nil) + initialized = app.initialized? if initialized.nil? + unless initialized + ::Rails.logger.warn "Application uninitialized: Try calling YourApp::Application.initialize!" + end + config = app.config env = Sprockets::Environment.new(app.root.to_s) @@ -126,7 +131,7 @@ def self.build_manifest(app) config = app.config if config.assets.compile - app.assets = self.build_environment(app) + app.assets = self.build_environment(app, true) app.routes.prepend do mount app.assets => config.assets.prefix end diff --git a/test/test_railtie.rb b/test/test_railtie.rb index 1ac1c65f..ccf7e950 100644 --- a/test/test_railtie.rb +++ b/test/test_railtie.rb @@ -1,9 +1,17 @@ -require 'minitest/autorun' require 'active_support' require 'active_support/testing/isolation' +require 'minitest/autorun' Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test) +def silence_stderr + orig_stderr = $stderr.clone + $stderr.reopen File.new('/dev/null', 'w') + yield +ensure + $stderr.reopen orig_stderr +end + class TestBoot < Minitest::Test include ActiveSupport::Testing::Isolation @@ -264,4 +272,82 @@ def test_manifest_path_respects_rails_public_path assert_match %r{test_public/assets/manifest-.*\.json$}, manifest.path assert_match %r{test_public/assets$}, manifest.dir end + + def test_load_tasks + app.initialize! + app.load_tasks + + assert Rake.application['assets:environment'] + assert Rake.application['assets:precompile'] + assert Rake.application['assets:clean'] + assert Rake.application['assets:clobber'] + end + + def test_task_precompile + app.configure do + config.assets.paths << FIXTURES_PATH + config.assets.precompile += ["foo.js"] + end + app.initialize! + app.load_tasks + + path = "#{app.assets_manifest.dir}/foo-4ef5541f349f7ed5a0d6b71f2fa4c82745ca106ae02f212aea5129726ac6f6ab.js" + + silence_stderr do + Rake.application['assets:clobber'].execute + end + refute File.exist?(path) + + silence_stderr do + Rake.application['assets:precompile'].execute + end + assert File.exist?(path) + + silence_stderr do + Rake.application['assets:clobber'].execute + end + refute File.exist?(path) + end + + def test_task_precompile_compile_false + app.configure do + config.assets.compile = false + config.assets.paths << FIXTURES_PATH + config.assets.precompile += ["foo.js"] + end + app.initialize! + app.load_tasks + + path = "#{app.assets_manifest.dir}/foo-4ef5541f349f7ed5a0d6b71f2fa4c82745ca106ae02f212aea5129726ac6f6ab.js" + + silence_stderr do + Rake.application['assets:clobber'].execute + end + refute File.exist?(path) + + silence_stderr do + Rake.application['assets:precompile'].execute + end + assert File.exist?(path) + + silence_stderr do + Rake.application['assets:clobber'].execute + end + refute File.exist?(path) + end + + def test_direct_build_environment_call + app.configure do + config.assets.paths << "javascripts" + config.assets.paths << "stylesheets" + end + app.initialize! + + assert env = Sprockets::Railtie.build_environment(app) + assert_kind_of Sprockets::Environment, env + + assert_equal ROOT, env.root + assert_equal ["#{ROOT}/javascripts", "#{ROOT}/stylesheets"], + env.paths.sort + end end