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 | |