extract the code to initialize the Sprockets env from the middleware

did committed Apr 18, 2015
commit 58e0a7b3bc0fcc4d4f2023e9d846f3881dbff42a
Showing 4 changed files with 96 additions and 45 deletions
locomotive/steam/initializers/sprockets.rb b/lib/locomotive/steam/initializers/sprockets.rb +47 -0
@@ @@ -1,4 +1,51 @@
require 'sprockets'
require 'sprockets-sass'
+ require 'coffee_script'
Sprockets::Sass.add_sass_functions = false
+
+ module Locomotive::Steam
+
+ class SprocketsEnvironment < ::Sprockets::Environment
+
+ def initialize(root, options = {})
+ super(root)
+
+ @steam_path = root
+
+ append_steam_paths
+
+ install_yui_compressor(options)
+ end
+
+ private
+
+ def append_steam_paths
+ %w(fonts stylesheets javascripts).each do |name|
+ append_path File.join(@steam_path, name)
+ end
+ end
+
+ def install_yui_compressor(options)
+ return unless options[:minify]
+
+ require 'yui/compressor'
+
+ if is_java_installed?
+ # minify javascripts and stylesheets
+ self.js_compressor = YUI::JavaScriptCompressor.new
+ self.css_compressor = YUI::CssCompressor.new
+ else
+ message = "[Important] YUICompressor requires java to be installed. The JAVA_HOME variable should also be set.\n"
+ Locomotive::Common::Logger.warn message.red
+ false
+ end
+ end
+
+ def is_java_installed?
+ `which java` != '' && (!ENV['JAVA_HOME'].blank? && File.exists?(ENV['JAVA_HOME']))
+ end
+
+ end
+
+ end
locomotive/steam/middlewares/dynamic_assets.rb b/lib/locomotive/steam/middlewares/dynamic_assets.rb +6 -36
@@ @@ -1,56 +1,26 @@
- require 'coffee_script'
-
module Locomotive::Steam
module Middlewares
class DynamicAssets
- attr_reader :app, :regexp
+ REGEXP = /^\/(javascripts|stylesheets)\/(.*)$/o
+
+ attr_reader :app, :assets
def initialize(app, options)
@app = app
- @regexp = /^\/(javascripts|stylesheets)\/(.*)$/o
-
- @assets = ::Sprockets::Environment.new(options[:root]).tap do |env|
- install_yui_compressor(env, options)
-
- %w(fonts stylesheets javascripts).each do |name|
- env.append_path File.join(options[:root], name)
- end
- end
+ @assets = Locomotive::Steam::SprocketsEnvironment.new(options[:root], options)
end
def call(env)
- if env['PATH_INFO'] =~ self.regexp
+ if env['PATH_INFO'] =~ REGEXP
env['PATH_INFO'] = $2
- @assets.call(env)
+ assets.call(env)
else
app.call(env)
end
end
- private
-
- def install_yui_compressor(sprockets, options)
- return unless options[:minify]
-
- require 'yui/compressor'
-
- if is_java_installed?
- # minify javascripts and stylesheets
- sprockets.js_compressor = YUI::JavaScriptCompressor.new
- sprockets.css_compressor = YUI::CssCompressor.new
- else
- message = "[Important] YUICompressor requires java to be installed. The JAVA_HOME variable should also be set.\n"
- Locomotive::Common::Logger.warn message.red
- false
- end
- end
-
- def is_java_installed?
- `which java` != '' && (!ENV['JAVA_HOME'].blank? && File.exists?(ENV['JAVA_HOME']))
- end
-
end
end
spec/unit/initializers/sprockets_spec.rb +25 -0
@@ @@ -0,0 +1,25 @@
+ require 'spec_helper'
+
+ require_relative '../../../lib/locomotive/steam/initializers/sprockets'
+
+ describe Locomotive::Steam::SprocketsEnvironment do
+
+ let(:root) { '.' }
+ let(:options) { { minify: true } }
+ let(:env) { described_class.new(root, options) }
+
+ describe '#install_yui_compressor' do
+
+ context 'java not installed' do
+
+ before { allow(env).to receive(:is_java_installed?).and_return(false) }
+
+ subject { env.send(:install_yui_compressor, options) }
+
+ it { is_expected.to eq(false) }
+
+ end
+
+ end
+
+ end
spec/unit/middlewares/dynamic_assets_spec.rb +18 -9
@@ @@ -1,24 +1,33 @@
require 'spec_helper'
- require 'sprockets'
require_relative '../../../lib/locomotive/steam/middlewares/dynamic_assets'
describe Locomotive::Steam::Middlewares::DynamicAssets do
- let(:app) { ->(env) { [200, env, 'app'] }}
- let(:options) { { root: File.dirname(__FILE__), minify: true } }
+ let(:app) { ->(env) { [200, env, 'app'] }}
+ let(:options) { { root: File.dirname(__FILE__), minify: true } }
+ let(:middleware) { described_class.new(app, options) }
- let(:middleware) { Locomotive::Steam::Middlewares::DynamicAssets.new(app, options) }
+ describe '#call' do
- describe 'java not installed' do
+ let(:env) { { 'PATH_INFO' => '/stylesheets/application.css' } }
+ subject { middleware.call(env) }
- let(:sprockets) { instance_double('Sprockets') }
+ it 'calls sprockets to process the asset' do
+ expect(middleware.assets).to receive(:call).with(env).and_return(true)
+ is_expected.to eq true
+ end
- before { allow(middleware).to receive(:is_java_installed?).and_return(false) }
+ context 'not an asset' do
- subject { middleware.send(:install_yui_compressor, sprockets, options) }
+ let(:env) { { 'PATH_INFO' => '/index' } }
- it { is_expected.to eq(false) }
+ it 'bypasses sprockets' do
+ expect(middleware.assets).not_to receive(:call)
+ is_expected.not_to eq nil
+ end
+
+ end
end