sprockets_rails3_backport 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Shopify
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOa AND
17
+ NONINFRINGEMENT. IN NO EVENT SaALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,41 @@
1
+ # Backport of Rails 3.1.x Sprockets integration to Rails 3.0.x
2
+
3
+ ## Usage
4
+
5
+ In your `Gemfile`:
6
+
7
+ gem "sprockets_rails3_backport"
8
+
9
+ In your `routes.rb`:
10
+
11
+ MyApp::Application.routes.draw do
12
+ if (app = Rails.application).config.assets.compile
13
+ mount app.assets => app.config.assets.prefix
14
+ end
15
+
16
+ # ...
17
+ end
18
+
19
+ Here are the various `config.assets` options and their defaults:
20
+
21
+ config.assets.paths = []
22
+ config.assets.precompile = [ Proc.new{ |path| !['.js', '.css'].include?(File.extname(path)) },
23
+ /(?:\/|\\|\A)application\.(css|js)$/ ]
24
+ config.assets.prefix = "/assets"
25
+ config.assets.version = ''
26
+ config.assets.debug = false
27
+ config.assets.compile = true
28
+ config.assets.digest = false
29
+ config.assets.manifest = nil
30
+ config.assets.cache_store = false
31
+ config.assets.js_compressor = nil
32
+ config.assets.css_compressor = nil
33
+ config.assets.initialize_on_precompile = true
34
+
35
+
36
+ ## Differences from Rails 3.1.3
37
+
38
+ * no `config.assets.enabled`
39
+ * `config.assets.cache_store` defaults to false, so you probably want to set it yourself
40
+
41
+
@@ -0,0 +1,137 @@
1
+ require 'zlib'
2
+ require 'active_support/core_ext/file'
3
+
4
+ module ActionView
5
+
6
+ class AssetPaths #:nodoc:
7
+ attr_reader :config, :controller
8
+
9
+ def initialize(config, controller = nil)
10
+ @config = config
11
+ @controller = controller
12
+ end
13
+
14
+ # Add the extension +ext+ if not present. Return full or scheme-relative URLs otherwise untouched.
15
+ # Prefix with <tt>/dir/</tt> if lacking a leading +/+. Account for relative URL
16
+ # roots. Rewrite the asset path for cache-busting asset ids. Include
17
+ # asset host, if configured, with the correct request protocol.
18
+ #
19
+ # When :relative (default), the protocol will be determined by the client using current protocol
20
+ # When :request, the protocol will be the request protocol
21
+ # Otherwise, the protocol is used (E.g. :http, :https, etc)
22
+ def compute_public_path(source, dir, options = {})
23
+ source = source.to_s
24
+ return source if is_uri?(source)
25
+
26
+ source = rewrite_extension(source, dir, options[:ext]) if options[:ext]
27
+ source = rewrite_asset_path(source, dir, options)
28
+ source = rewrite_relative_url_root(source, relative_url_root)
29
+ source = rewrite_host_and_protocol(source, options[:protocol])
30
+ source
31
+ end
32
+
33
+ # Return the filesystem path for the source
34
+ def compute_source_path(source, dir, ext)
35
+ source = rewrite_extension(source, dir, ext) if ext
36
+ File.join(config.assets_dir, dir, source)
37
+ end
38
+
39
+ def is_uri?(path)
40
+ path =~ %r{^[-a-z]+://|^cid:|^//}
41
+ end
42
+
43
+ private
44
+
45
+ def rewrite_extension(source, dir, ext)
46
+ raise NotImplementedError
47
+ end
48
+
49
+ def rewrite_asset_path(source, path = nil)
50
+ raise NotImplementedError
51
+ end
52
+
53
+ def rewrite_relative_url_root(source, relative_url_root)
54
+ relative_url_root && !source.starts_with?("#{relative_url_root}/") ? "#{relative_url_root}#{source}" : source
55
+ end
56
+
57
+ def has_request?
58
+ controller.respond_to?(:request)
59
+ end
60
+
61
+ def rewrite_host_and_protocol(source, protocol = nil)
62
+ host = compute_asset_host(source)
63
+ if host && !is_uri?(host)
64
+ if (protocol || default_protocol) == :request && !has_request?
65
+ host = nil
66
+ else
67
+ host = "#{compute_protocol(protocol)}#{host}"
68
+ end
69
+ end
70
+ host.nil? ? source : "#{host}#{source}"
71
+ end
72
+
73
+ def compute_protocol(protocol)
74
+ protocol ||= default_protocol
75
+ case protocol
76
+ when :relative
77
+ "//"
78
+ when :request
79
+ unless @controller
80
+ invalid_asset_host!("The protocol requested was :request. Consider using :relative instead.")
81
+ end
82
+ @controller.request.protocol
83
+ else
84
+ "#{protocol}://"
85
+ end
86
+ end
87
+
88
+ def default_protocol
89
+ @config.default_asset_host_protocol || (has_request? ? :request : :relative)
90
+ end
91
+
92
+ def invalid_asset_host!(help_message)
93
+ raise ActionController::RoutingError, "This asset host cannot be computed without a request in scope. #{help_message}"
94
+ end
95
+
96
+ # Pick an asset host for this source. Returns +nil+ if no host is set,
97
+ # the host if no wildcard is set, the host interpolated with the
98
+ # numbers 0-3 if it contains <tt>%d</tt> (the number is the source hash mod 4),
99
+ # or the value returned from invoking the proc if it's a proc or the value from
100
+ # invoking call if it's an object responding to call.
101
+ def compute_asset_host(source)
102
+ if host = asset_host_config
103
+ if host.respond_to?(:call)
104
+ args = [source]
105
+ arity = arity_of(host)
106
+ if arity > 1 && !has_request?
107
+ invalid_asset_host!("Remove the second argument to your asset_host Proc if you do not need the request.")
108
+ end
109
+ args << current_request if (arity > 1 || arity < 0) && has_request?
110
+ host.call(*args)
111
+ else
112
+ (host =~ /%d/) ? host % (Zlib.crc32(source) % 4) : host
113
+ end
114
+ end
115
+ end
116
+
117
+ def relative_url_root
118
+ config.relative_url_root
119
+ end
120
+
121
+ def asset_host_config
122
+ config.asset_host
123
+ end
124
+
125
+ # Returns the current request if one exists.
126
+ def current_request
127
+ controller.request if has_request?
128
+ end
129
+
130
+ # Returns the arity of a callable
131
+ def arity_of(callable)
132
+ callable.respond_to?(:arity) ? callable.arity : callable.method(:call).arity
133
+ end
134
+
135
+ end
136
+
137
+ end
@@ -0,0 +1,5 @@
1
+ module Rails
2
+ class Application < Engine
3
+ attr_accessor :assets
4
+ end
5
+ end
@@ -0,0 +1,95 @@
1
+ require "fileutils"
2
+
3
+ namespace :assets do
4
+ def ruby_rake_task(task)
5
+ env = ENV['RAILS_ENV'] || 'production'
6
+ groups = ENV['RAILS_GROUPS'] || 'assets'
7
+ args = [$0, task,"RAILS_ENV=#{env}","RAILS_GROUPS=#{groups}"]
8
+ args << "--trace" if Rake.application.options.trace
9
+ ruby *args
10
+ end
11
+
12
+ # We are currently running with no explicit bundler group
13
+ # and/or no explicit environment - we have to reinvoke rake to
14
+ # execute this task.
15
+ def invoke_or_reboot_rake_task(task)
16
+ if ENV['RAILS_GROUPS'].to_s.empty? || ENV['RAILS_ENV'].to_s.empty?
17
+ ruby_rake_task task
18
+ else
19
+ Rake::Task[task].invoke
20
+ end
21
+ end
22
+
23
+ desc "Compile all the assets named in config.assets.precompile"
24
+ task :precompile do
25
+ invoke_or_reboot_rake_task "assets:precompile:all"
26
+ end
27
+
28
+ namespace :precompile do
29
+ def internal_precompile(digest=nil)
30
+ # unless Rails.application.config.assets.enabled
31
+ # warn "Cannot precompile assets if sprockets is disabled. Please set config.assets.enabled to true"
32
+ # exit
33
+ # end
34
+
35
+ # Ensure that action view is loaded and the appropriate
36
+ # sprockets hooks get executed
37
+ _ = ActionView::Base
38
+
39
+ config = Rails.application.config
40
+ config.assets.compile = true
41
+ config.assets.digest = digest unless digest.nil?
42
+ config.assets.digests = {}
43
+
44
+ env = Rails.application.assets
45
+ target = File.join(Rails.public_path, config.assets.prefix)
46
+ compiler = Sprockets::StaticCompiler.new(env,
47
+ target,
48
+ config.assets.precompile,
49
+ :manifest_path => config.assets.manifest,
50
+ :digest => config.assets.digest,
51
+ :manifest => digest.nil?)
52
+ compiler.compile
53
+ end
54
+
55
+ task :all do
56
+ Rake::Task["assets:precompile:primary"].invoke
57
+ # We need to reinvoke in order to run the secondary digestless
58
+ # asset compilation run - a fresh Sprockets environment is
59
+ # required in order to compile digestless assets as the
60
+ # environment has already cached the assets on the primary
61
+ # run.
62
+ ruby_rake_task "assets:precompile:nondigest" if Rails.application.config.assets.digest
63
+ end
64
+
65
+ task :primary => ["assets:environment", "tmp:cache:clear"] do
66
+ internal_precompile
67
+ end
68
+
69
+ task :nondigest => ["assets:environment", "tmp:cache:clear"] do
70
+ internal_precompile(false)
71
+ end
72
+ end
73
+
74
+ desc "Remove compiled assets"
75
+ task :clean do
76
+ invoke_or_reboot_rake_task "assets:clean:all"
77
+ end
78
+
79
+ namespace :clean do
80
+ task :all => ["assets:environment", "tmp:cache:clear"] do
81
+ config = Rails.application.config
82
+ public_asset_path = File.join(Rails.public_path, config.assets.prefix)
83
+ rm_rf public_asset_path, :secure => true
84
+ end
85
+ end
86
+
87
+ task :environment do
88
+ if Rails.application.config.assets.initialize_on_precompile
89
+ Rake::Task["environment"].invoke
90
+ else
91
+ Rails.application.initialize!(:assets)
92
+ Sprockets::Bootstrap.new(Rails.application).run
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,68 @@
1
+ module Sprockets
2
+ class Bootstrap
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ # TODO: Get rid of config.assets.enabled
8
+ def run
9
+ app, config = @app, @app.config
10
+ return unless app.assets
11
+
12
+ config.assets.paths.each { |path| app.assets.append_path(path) }
13
+
14
+ if config.assets.compress
15
+ # temporarily hardcode default JS compressor to uglify. Soon, it will work
16
+ # the same as SCSS, where a default plugin sets the default.
17
+ unless config.assets.js_compressor == false
18
+ app.assets.js_compressor = LazyCompressor.new { expand_js_compressor(config.assets.js_compressor || :uglifier) }
19
+ end
20
+
21
+ unless config.assets.css_compressor == false
22
+ app.assets.css_compressor = LazyCompressor.new { expand_css_compressor(config.assets.css_compressor) }
23
+ end
24
+ end
25
+
26
+ ## I can't figure out how to do this properly in Rails 3.0, so you
27
+ ## need to add the mount explicitly in your routes.rb (see README)
28
+ #
29
+ # if config.assets.compile
30
+ # app.routes.prepend do
31
+ # mount app.assets => config.assets.prefix
32
+ # end
33
+ # end
34
+
35
+ if config.assets.digest
36
+ app.assets = app.assets.index
37
+ end
38
+ end
39
+
40
+ protected
41
+
42
+ def expand_js_compressor(sym)
43
+ case sym
44
+ when :closure
45
+ require 'closure-compiler'
46
+ Closure::Compiler.new
47
+ when :uglifier
48
+ require 'uglifier'
49
+ Uglifier.new
50
+ when :yui
51
+ require 'yui/compressor'
52
+ YUI::JavaScriptCompressor.new
53
+ else
54
+ sym
55
+ end
56
+ end
57
+
58
+ def expand_css_compressor(sym)
59
+ case sym
60
+ when :yui
61
+ require 'yui/compressor'
62
+ YUI::CssCompressor.new
63
+ else
64
+ sym
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,21 @@
1
+ module Sprockets
2
+ class NullCompressor
3
+ def compress(content)
4
+ content
5
+ end
6
+ end
7
+
8
+ class LazyCompressor
9
+ def initialize(&block)
10
+ @block = block
11
+ end
12
+
13
+ def compressor
14
+ @compressor ||= @block.call || NullCompressor.new
15
+ end
16
+
17
+ def compress(content)
18
+ compressor.compress(content)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+
2
+ module Sprockets
3
+ module Helpers
4
+ autoload :RailsHelper, "sprockets/helpers/rails_helper"
5
+ autoload :IsolatedHelper, "sprockets/helpers/isolated_helper"
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ module Sprockets
2
+ module Helpers
3
+ module IsolatedHelper
4
+ def controller
5
+ nil
6
+ end
7
+
8
+ def config
9
+ Rails.application.config.action_controller
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,171 @@
1
+ require 'action_view/asset_paths'
2
+
3
+ module Sprockets
4
+ module Helpers
5
+ module RailsHelper
6
+ extend ActiveSupport::Concern
7
+ include ActionView::Helpers::AssetTagHelper
8
+
9
+ def asset_paths
10
+ @asset_paths ||= begin
11
+ paths = RailsHelper::AssetPaths.new(config, controller)
12
+ paths.asset_environment = asset_environment
13
+ paths.asset_digests = asset_digests
14
+ paths.compile_assets = compile_assets?
15
+ paths.digest_assets = digest_assets?
16
+ paths
17
+ end
18
+ end
19
+
20
+ def javascript_include_tag(*sources)
21
+ options = sources.extract_options!
22
+ debug = options.key?(:debug) ? options.delete(:debug) : debug_assets?
23
+ body = options.key?(:body) ? options.delete(:body) : false
24
+ digest = options.key?(:digest) ? options.delete(:digest) : digest_assets?
25
+
26
+ sources.collect do |source|
27
+ if debug && asset = asset_paths.asset_for(source, 'js')
28
+ asset.to_a.map { |dep|
29
+ super(dep.to_s, { :src => asset_path(dep, :ext => 'js', :body => true, :digest => digest) }.merge!(options))
30
+ }
31
+ else
32
+ super(source.to_s, { :src => asset_path(source, :ext => 'js', :body => body, :digest => digest) }.merge!(options))
33
+ end
34
+ end.join("\n").html_safe
35
+ end
36
+
37
+ def stylesheet_link_tag(*sources)
38
+ options = sources.extract_options!
39
+ debug = options.key?(:debug) ? options.delete(:debug) : debug_assets?
40
+ body = options.key?(:body) ? options.delete(:body) : false
41
+ digest = options.key?(:digest) ? options.delete(:digest) : digest_assets?
42
+
43
+ sources.collect do |source|
44
+ if debug && asset = asset_paths.asset_for(source, 'css')
45
+ asset.to_a.map { |dep|
46
+ super(dep.to_s, { :href => asset_path(dep, :ext => 'css', :body => true, :protocol => :request, :digest => digest) }.merge!(options))
47
+ }
48
+ else
49
+ super(source.to_s, { :href => asset_path(source, :ext => 'css', :body => body, :protocol => :request, :digest => digest) }.merge!(options))
50
+ end
51
+ end.join("\n").html_safe
52
+ end
53
+
54
+ def asset_path(source, options = {})
55
+ source = source.logical_path if source.respond_to?(:logical_path)
56
+ path = asset_paths.compute_public_path(source, asset_prefix, options.merge(:body => true))
57
+ options[:body] ? "#{path}?body=1" : path
58
+ end
59
+
60
+ def image_path(source)
61
+ asset_path(source)
62
+ end
63
+ alias_method :path_to_image, :image_path # aliased to avoid conflicts with an image_path named route
64
+
65
+ def javascript_path(source)
66
+ asset_path(source)
67
+ end
68
+ alias_method :path_to_javascript, :javascript_path # aliased to avoid conflicts with an javascript_path named route
69
+
70
+ def stylesheet_path(source)
71
+ asset_path(source)
72
+ end
73
+ alias_method :path_to_stylesheet, :stylesheet_path # aliased to avoid conflicts with an stylesheet_path named route
74
+
75
+ private
76
+ def debug_assets?
77
+ begin
78
+ compile_assets? &&
79
+ (Rails.application.config.assets.debug ||
80
+ params[:debug_assets] == '1' ||
81
+ params[:debug_assets] == 'true')
82
+ rescue NoMethodError
83
+ false
84
+ end
85
+ end
86
+
87
+ # Override to specify an alternative prefix for asset path generation.
88
+ # When combined with a custom +asset_environment+, this can be used to
89
+ # implement themes that can take advantage of the asset pipeline.
90
+ #
91
+ # If you only want to change where the assets are mounted, refer to
92
+ # +config.assets.prefix+ instead.
93
+ def asset_prefix
94
+ Rails.application.config.assets.prefix
95
+ end
96
+
97
+ def asset_digests
98
+ Rails.application.config.assets.digests
99
+ end
100
+
101
+ def compile_assets?
102
+ Rails.application.config.assets.compile
103
+ end
104
+
105
+ def digest_assets?
106
+ Rails.application.config.assets.digest
107
+ end
108
+
109
+ # Override to specify an alternative asset environment for asset
110
+ # path generation. The environment should already have been mounted
111
+ # at the prefix returned by +asset_prefix+.
112
+ def asset_environment
113
+ Rails.application.assets
114
+ end
115
+
116
+ class AssetPaths < ::ActionView::AssetPaths #:nodoc:
117
+ attr_accessor :asset_environment, :asset_prefix, :asset_digests, :compile_assets, :digest_assets
118
+
119
+ class AssetNotPrecompiledError < StandardError; end
120
+
121
+ # Return the filesystem path for the source
122
+ def compute_source_path(source, ext)
123
+ asset_for(source, ext)
124
+ end
125
+
126
+ def asset_for(source, ext)
127
+ source = source.to_s
128
+ return nil if is_uri?(source)
129
+ source = rewrite_extension(source, nil, ext)
130
+ asset_environment[source]
131
+ rescue Sprockets::FileOutsidePaths
132
+ nil
133
+ end
134
+
135
+ def digest_for(logical_path)
136
+ if digest_assets && asset_digests && (digest = asset_digests[logical_path])
137
+ return digest
138
+ end
139
+
140
+ if compile_assets
141
+ if digest_assets && asset = asset_environment[logical_path]
142
+ return asset.digest_path
143
+ end
144
+ return logical_path
145
+ else
146
+ raise AssetNotPrecompiledError.new("#{logical_path} isn't precompiled")
147
+ end
148
+ end
149
+
150
+ def rewrite_asset_path(source, dir, options = {})
151
+ if source[0] == ?/
152
+ source
153
+ else
154
+ source = digest_for(source) unless options[:digest] == false
155
+ source = File.join(dir, source)
156
+ source = "/#{source}" unless source =~ /^\//
157
+ source
158
+ end
159
+ end
160
+
161
+ def rewrite_extension(source, dir, ext)
162
+ if ext && File.extname(source).empty?
163
+ "#{source}.#{ext}"
164
+ else
165
+ source
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,76 @@
1
+ # require "action_controller/railtie"
2
+ require "extensions/application_ext"
3
+
4
+ module Sprockets
5
+ autoload :Bootstrap, "sprockets/bootstrap"
6
+ autoload :Helpers, "sprockets/helpers"
7
+ autoload :LazyCompressor, "sprockets/compressors"
8
+ autoload :NullCompressor, "sprockets/compressors"
9
+ autoload :StaticCompiler, "sprockets/static_compiler"
10
+
11
+ # TODO: Get rid of config.assets.enabled
12
+ class Railtie < ::Rails::Railtie
13
+ # config.action_controller.default_asset_host_protocol = :relative
14
+ config.assets = ActiveSupport::OrderedOptions.new
15
+ # config.assets.enabled = false
16
+ config.assets.paths = []
17
+ config.assets.precompile = [ Proc.new{ |path| !['.js', '.css'].include?(File.extname(path)) },
18
+ /(?:\/|\\|\A)application\.(css|js)$/ ]
19
+ config.assets.prefix = "/assets"
20
+ config.assets.version = ''
21
+ config.assets.debug = false
22
+ config.assets.compile = true
23
+ config.assets.digest = false
24
+ config.assets.manifest = nil
25
+ config.assets.cache_store = false
26
+ config.assets.js_compressor = nil
27
+ config.assets.css_compressor = nil
28
+ config.assets.initialize_on_precompile = true
29
+
30
+ rake_tasks do
31
+ load "sprockets/assets.rake"
32
+ end
33
+
34
+ initializer "sprockets.environment", :group => :all do |app|
35
+ config = app.config
36
+ # next unless config.assets.enabled
37
+
38
+ require 'sprockets'
39
+
40
+ app.assets = Sprockets::Environment.new(app.root.to_s) do |env|
41
+ env.logger = ::Rails.logger
42
+ env.version = ::Rails.env + "-#{config.assets.version}"
43
+
44
+ if config.assets.cache_store != false
45
+ env.cache = ActiveSupport::Cache.lookup_store(config.assets.cache_store) || ::Rails.cache
46
+ end
47
+ end
48
+
49
+ if config.assets.manifest
50
+ path = File.join(config.assets.manifest, "manifest.yml")
51
+ else
52
+ path = File.join(Rails.public_path, config.assets.prefix, "manifest.yml")
53
+ end
54
+
55
+ if File.exist?(path)
56
+ config.assets.digests = YAML.load_file(path)
57
+ end
58
+
59
+ ActiveSupport.on_load(:action_view) do
60
+ include ::Sprockets::Helpers::RailsHelper
61
+ app.assets.context_class.instance_eval do
62
+ include ::Sprockets::Helpers::IsolatedHelper
63
+ include ::Sprockets::Helpers::RailsHelper
64
+ end
65
+ end
66
+ end
67
+
68
+ # We need to configure this after initialization to ensure we collect
69
+ # paths from all engines. This hook is invoked exactly before routes
70
+ # are compiled, and so that other Railties have an opportunity to
71
+ # register compressors.
72
+ config.after_initialize do |app|
73
+ Sprockets::Bootstrap.new(app).run
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,61 @@
1
+ require 'fileutils'
2
+
3
+ module Sprockets
4
+ class StaticCompiler
5
+ attr_accessor :env, :target, :paths
6
+
7
+ def initialize(env, target, paths, options = {})
8
+ @env = env
9
+ @target = target
10
+ @paths = paths
11
+ @digest = options.key?(:digest) ? options.delete(:digest) : true
12
+ @manifest = options.key?(:manifest) ? options.delete(:manifest) : true
13
+ @manifest_path = options.delete(:manifest_path) || target
14
+ end
15
+
16
+ def compile
17
+ manifest = {}
18
+ env.each_logical_path do |logical_path|
19
+ next unless compile_path?(logical_path)
20
+ if asset = env.find_asset(logical_path)
21
+ manifest[logical_path] = write_asset(asset)
22
+ end
23
+ end
24
+ write_manifest(manifest) if @manifest
25
+ end
26
+
27
+ def write_manifest(manifest)
28
+ FileUtils.mkdir_p(@manifest_path)
29
+ File.open("#{@manifest_path}/manifest.yml", 'wb') do |f|
30
+ YAML.dump(manifest, f)
31
+ end
32
+ end
33
+
34
+ def write_asset(asset)
35
+ path_for(asset).tap do |path|
36
+ filename = File.join(target, path)
37
+ FileUtils.mkdir_p File.dirname(filename)
38
+ asset.write_to(filename)
39
+ asset.write_to("#{filename}.gz") if filename.to_s =~ /\.(css|js)$/
40
+ end
41
+ end
42
+
43
+ def compile_path?(logical_path)
44
+ paths.each do |path|
45
+ case path
46
+ when Regexp
47
+ return true if path.match(logical_path)
48
+ when Proc
49
+ return true if path.call(logical_path)
50
+ else
51
+ return true if File.fnmatch(path.to_s, logical_path)
52
+ end
53
+ end
54
+ false
55
+ end
56
+
57
+ def path_for(asset)
58
+ @digest ? asset.digest_path : asset.logical_path
59
+ end
60
+ end
61
+ end
@@ -0,0 +1 @@
1
+ require "sprockets/railtie"
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sprockets_rails3_backport
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - James MacAulay
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-01 00:00:00.000000000 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ requirement: &2156849120 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 3.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2156849120
26
+ - !ruby/object:Gem::Dependency
27
+ name: sprockets
28
+ requirement: &2156848660 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - =
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *2156848660
37
+ description:
38
+ email:
39
+ - james@shopify.com
40
+ executables: []
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - lib/action_view/asset_paths.rb
45
+ - lib/extensions/application_ext.rb
46
+ - lib/sprockets/assets.rake
47
+ - lib/sprockets/bootstrap.rb
48
+ - lib/sprockets/compressors.rb
49
+ - lib/sprockets/helpers/isolated_helper.rb
50
+ - lib/sprockets/helpers/rails_helper.rb
51
+ - lib/sprockets/helpers.rb
52
+ - lib/sprockets/railtie.rb
53
+ - lib/sprockets/static_compiler.rb
54
+ - lib/sprockets_rails3_backport.rb
55
+ - MIT-LICENSE
56
+ - README.markdown
57
+ has_rdoc: true
58
+ homepage: http://github.com/jamesmacaulay/sprockets_rails3_backport
59
+ licenses: []
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.3.6
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 1.6.2
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Rails 3.1.x Sprockets functionality for Rails 3.0.x
82
+ test_files: []