From 4b7902949022d1293ad71e8c25e64635b143ae89 Mon Sep 17 00:00:00 2001 From: wycats Date: Mon, 23 May 2011 16:07:16 -0700 Subject: Start moving some logic from being embedded in AV into the Rails Sprockets extensions --- .../lib/action_view/helpers/asset_tag_helper.rb | 18 ++------ .../lib/action_view/helpers/sprockets_helper.rb | 50 ++------------------- actionpack/lib/sprockets/helpers/rails_helper.rb | 51 ++++++++++++++++++++++ actionpack/lib/sprockets/railtie.rb | 1 + actionpack/test/template/sprockets_helper_test.rb | 2 + 5 files changed, 60 insertions(+), 62 deletions(-) create mode 100644 actionpack/lib/sprockets/helpers/rails_helper.rb diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb index 9bc847a1ab..7970176d37 100644 --- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb @@ -274,11 +274,7 @@ module ActionView # The alias +path_to_image+ is provided to avoid that. Rails uses the alias internally, and # plugin authors are encouraged to do so. def image_path(source) - if config.use_sprockets - asset_path(source) - else - asset_paths.compute_public_path(source, 'images') - end + asset_paths.compute_public_path(source, 'images') end alias_method :path_to_image, :image_path # aliased to avoid conflicts with an image_path named route @@ -293,11 +289,7 @@ module ActionView # video_path("/trailers/hd.avi") # => /trailers/hd.avi # video_path("http://www.example.com/vid/hd.avi") # => http://www.example.com/vid/hd.avi def video_path(source) - if config.use_sprockets - asset_path(source) - else - asset_paths.compute_public_path(source, 'videos') - end + asset_paths.compute_public_path(source, 'videos') end alias_method :path_to_video, :video_path # aliased to avoid conflicts with a video_path named route @@ -312,11 +304,7 @@ module ActionView # audio_path("/sounds/horse.wav") # => /sounds/horse.wav # audio_path("http://www.example.com/sounds/horse.wav") # => http://www.example.com/sounds/horse.wav def audio_path(source) - if config.use_sprockets - asset_path(source) - else - asset_paths.compute_public_path(source, 'audios') - end + asset_paths.compute_public_path(source, 'audios') end alias_method :path_to_audio, :audio_path # aliased to avoid conflicts with an audio_path named route diff --git a/actionpack/lib/action_view/helpers/sprockets_helper.rb b/actionpack/lib/action_view/helpers/sprockets_helper.rb index e5d780225b..c9e6bcaa3f 100644 --- a/actionpack/lib/action_view/helpers/sprockets_helper.rb +++ b/actionpack/lib/action_view/helpers/sprockets_helper.rb @@ -11,7 +11,7 @@ module ActionView def asset_path(source, default_ext = nil, body = false) source = source.logical_path if source.respond_to?(:logical_path) - path = sprockets_asset_paths.compute_public_path(source, 'assets', default_ext, true) + path = asset_paths.compute_public_path(source, 'assets', default_ext, true) body ? "#{path}?body=1" : path end @@ -19,7 +19,7 @@ module ActionView debug = options.key?(:debug) ? options.delete(:debug) : debug_assets? body = options.key?(:body) ? options.delete(:body) : false - if debug && asset = sprockets_asset_paths.asset_for(source, 'js') + if debug && asset = asset_paths.asset_for(source, 'js') asset.to_a.map { |dep| sprockets_javascript_include_tag(dep, :debug => false, :body => true) }.join("\n").html_safe @@ -37,7 +37,7 @@ module ActionView debug = options.key?(:debug) ? options.delete(:debug) : debug_assets? body = options.key?(:body) ? options.delete(:body) : false - if debug && asset = sprockets_asset_paths.asset_for(source, 'css') + if debug && asset = asset_paths.asset_for(source, 'css') asset.to_a.map { |dep| sprockets_stylesheet_link_tag(dep, :debug => false, :body => true) }.join("\n").html_safe @@ -52,50 +52,6 @@ module ActionView tag 'link', options end end - - private - - def sprockets_asset_paths - @sprockets_asset_paths ||= begin - config = self.config if respond_to?(:config) - controller = self.controller if respond_to?(:controller) - SprocketsHelper::AssetPaths.new(config, controller) - end - end - - class AssetPaths < ActionView::Helpers::AssetPaths #:nodoc: - def asset_for(source, ext) - source = source.to_s - return nil if is_uri?(source) - source = rewrite_extension(source, nil, ext) - assets[source] - end - - def rewrite_asset_path(source, dir) - if source[0] == ?/ - source - else - assets.path(source, performing_caching?, dir) - end - end - - def rewrite_extension(source, dir, ext) - if ext && File.extname(source).empty? - "#{source}.#{ext}" - else - source - end - end - - def assets - Rails.application.assets - end - - # When included in Sprockets::Context, we need to ask the top-level config as the controller is not available - def performing_caching? - @config ? @config.perform_caching : Rails.application.config.action_controller.perform_caching - end - end end end end diff --git a/actionpack/lib/sprockets/helpers/rails_helper.rb b/actionpack/lib/sprockets/helpers/rails_helper.rb new file mode 100644 index 0000000000..3a49c347fb --- /dev/null +++ b/actionpack/lib/sprockets/helpers/rails_helper.rb @@ -0,0 +1,51 @@ +module Sprockets + module Helpers + module RailsHelper + def asset_paths + @asset_paths ||= begin + config = self.config if respond_to?(:config) + controller = self.controller if respond_to?(:controller) + RailsHelper::AssetPaths.new(config, controller) + end + end + + class AssetPaths < ActionView::Helpers::AssetPaths #:nodoc: + def compute_public_path(source, dir, ext=nil, include_host=true) + super(source, 'assets', ext, include_host) + end + + def asset_for(source, ext) + source = source.to_s + return nil if is_uri?(source) + source = rewrite_extension(source, nil, ext) + assets[source] + end + + def rewrite_asset_path(source, dir) + if source[0] == ?/ + source + else + assets.path(source, performing_caching?, dir) + end + end + + def rewrite_extension(source, dir, ext) + if ext && File.extname(source).empty? + "#{source}.#{ext}" + else + source + end + end + + def assets + Rails.application.assets + end + + # When included in Sprockets::Context, we need to ask the top-level config as the controller is not available + def performing_caching? + @config ? @config.perform_caching : Rails.application.config.action_controller.perform_caching + end + end + end + end +end diff --git a/actionpack/lib/sprockets/railtie.rb b/actionpack/lib/sprockets/railtie.rb index 8cee3babe2..66354c9789 100644 --- a/actionpack/lib/sprockets/railtie.rb +++ b/actionpack/lib/sprockets/railtie.rb @@ -36,6 +36,7 @@ module Sprockets ActiveSupport.on_load(:action_view) do app.assets.context_class.instance_eval do include ::ActionView::Helpers::SprocketsHelper + include ::Sprockets::Helpers::RailsHelper end end diff --git a/actionpack/test/template/sprockets_helper_test.rb b/actionpack/test/template/sprockets_helper_test.rb index 9d1e08373f..0059317c78 100644 --- a/actionpack/test/template/sprockets_helper_test.rb +++ b/actionpack/test/template/sprockets_helper_test.rb @@ -1,9 +1,11 @@ require 'abstract_unit' require 'sprockets' +require 'sprockets/helpers/rails_helper' require 'mocha' class SprocketsHelperTest < ActionView::TestCase tests ActionView::Helpers::SprocketsHelper + include Sprockets::Helpers::RailsHelper attr_accessor :assets -- cgit v1.2.3