sprockets-rails 3.0.0.beta1 → 3.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a7e8197def5c64d991abb7e4c18f4d8a4f0cc6ae
4
- data.tar.gz: 5f50d295b072faf5d82391d0758b9582be53b3cc
3
+ metadata.gz: 25923aeac0b56b286d1fa13aed70e9473d34ead2
4
+ data.tar.gz: 9dfd806b0fd3a1839680622882d7a01db8670f44
5
5
  SHA512:
6
- metadata.gz: 1ec86dc53e523a016d690cb201fe53e7b13d3c37144025059efbbedb311bd54b2c234ae4d159e9b76f600888b772038e0524f2288705ec83b08ede2896f665fa
7
- data.tar.gz: ce22650daae7b6bfd3ecf93498c08bb064b4c01cb6b770a83acff558e654baf202af8cb8721242f73255a9d7a312eebed669f19d818ff5370e906a75be8bed14
6
+ metadata.gz: 5f8c7541800873483a0032d728d776c5578f770708d83804d8aa77ca41d709726af9a1db5c1ad2e600afd0995f506db10e2ebeda08c8a65de9aa9bc61d41c44e
7
+ data.tar.gz: b7888a09152ca3686aa43e5df660dacbfcf185162e87c3818cddc9aa0698ffb183b19a8a03c6a2c5a4af3aa4fac99bfdb80fddf23f1755c9543ee0cbac677be3
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2014 Joshua Peek
1
+ Copyright (c) 2014 Joshua Peek
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -27,7 +27,7 @@ Only removes old assets (keeps the most recent 3 copies) from `public/assets`. U
27
27
 
28
28
  **`rake assets:clobber`**
29
29
 
30
- Nuke `public/assets` and clear the Sprockets file system cache.
30
+ Nuke `public/assets`.
31
31
 
32
32
  #### Customize
33
33
 
@@ -37,11 +37,6 @@ You can also redefine the task with the built in task generator.
37
37
 
38
38
  ``` ruby
39
39
  require 'sprockets/rails/task'
40
- # clean the old tasks
41
- Rake::Task["assets:environment"].clear
42
- Rake::Task["assets:precompile"].clear
43
- Rake::Task["assets:clean"].clear
44
- Rake::Task["assets:clobber"].clear
45
40
  Sprockets::Rails::Task.new(Rails.application) do |t|
46
41
  t.environment = lambda { Rails.application.assets }
47
42
  t.assets = %w( application.js application.css )
@@ -51,7 +46,7 @@ end
51
46
 
52
47
  Each asset task will invoke `assets:environment` first. By default this loads the Rails environment. You can override this task to add or remove dependencies for your specific compilation environment.
53
48
 
54
- Also see [Sprockets::Rails::Task](https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/rails/task.rb) and [Rake::SprocketsTask](https://github.com/sstephenson/sprockets/blob/master/lib/rake/sprocketstask.rb).
49
+ Also see [Sprockets::Rails::Task](https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/rails/task.rb) and [Rake::SprocketsTask](https://github.com/rails/sprockets/blob/master/lib/rake/sprocketstask.rb).
55
50
 
56
51
 
57
52
  ### Initializer options
@@ -60,10 +55,6 @@ Also see [Sprockets::Rails::Task](https://github.com/rails/sprockets-rails/blob/
60
55
 
61
56
  Add additional assets to compile on deploy. Defaults to `application.js`, `application.css` and any other non-js/css file under `app/assets`.
62
57
 
63
- **`config.assets.raise_runtime_errors`**
64
-
65
- Set to `true` to enable additional runtime error checking. Recommended in the `development` environment to minimize unexpected behavior when deploying to `production`.
66
-
67
58
  **`config.assets.paths`**
68
59
 
69
60
  Add additional load paths to this Array. Rails includes `app/assets`, `lib/assets` and `vendor/assets` for you already. Plugins might want to add their custom paths to this.
@@ -90,8 +81,6 @@ Defines the full path to be used for the asset precompiler's manifest file. Defa
90
81
  **`config.assets.digest`**
91
82
 
92
83
  When enabled, fingerprints will be added to asset filenames.
93
- If `config.assets.raise_runtime_errors` is also enabled, requests for assets
94
- will raise an error unless they contain fingerprints.
95
84
 
96
85
  **`config.assets.debug`**
97
86
 
@@ -99,7 +88,7 @@ Enable expanded asset debugging mode. Individual files will be served to make re
99
88
 
100
89
  **`config.assets.compile`**
101
90
 
102
- Enables Sprockets compile environment. If disabled, `Rails.application.assets` will be unavailable to any ActionView helpers. View helpers will depend on assets being precompiled to `public/assets` in order to link to them. You can still access the environment by directly calling `Rails.application.assets`.
91
+ Enables Sprockets compile environment. If disabled, `Rails.application.assets` will be `nil` to prevent inadvertent compilation calls. View helpers will depend on assets being precompiled to `public/assets` in order to link to them. Initializers expecting `Rails.application.assets` during boot should be accessing the environment in a `config.assets.configure` block. See below.
103
92
 
104
93
  **`config.assets.configure`**
105
94
 
@@ -139,6 +128,17 @@ The following plugins provide some extras for the Sprockets Asset Pipeline.
139
128
  * `config.assets.manifest` (if used) must now include the manifest filename, e.g. `Rails.root.join('config/manifest.json')`. It cannot be a directory.
140
129
  * Two cleanup tasks. `rake assets:clean` is now a safe cleanup that only removes older assets that are no longer used. While `rake assets:clobber` nukes the entire `public/assets` directory and clears your filesystem cache. The clean task allows for rolling deploys that may still be linking to an old asset while the new assets are being built.
141
130
 
131
+ ## Experimental
132
+
133
+ ### [SRI](http://www.w3.org/TR/SRI/) support
134
+
135
+ Sprockets 3.x adds experimental support for subresource integrity checks. The spec is still evolving and the API may change in backwards incompatible ways.
136
+
137
+ ``` ruby
138
+ javascript_include_tag :application, integrity: true
139
+ # => "<script src="/assets/application.js" integrity="sha-256-TvVUHzSfftWg1rcfL6TIJ0XKEGrgLyEq6lEpcmrG9qs="></script>"
140
+ ```
141
+
142
142
 
143
143
  ## Contributing
144
144
 
@@ -156,17 +156,17 @@ $ bundle exec rake test
156
156
 
157
157
  ## Releases
158
158
 
159
- sprockets-rails 2.x will primarily target sprockets 2.x. And future versions will target the corresponding sprockets release line.
159
+ sprockets-rails 3.x will primarily target sprockets 3.x. And future versions will target the corresponding sprockets release line.
160
160
 
161
161
  The minor and patch version will be updated according to [semver](http://semver.org/).
162
162
 
163
163
  * Any new APIs or config options that don't break compatibility will be in a minor release
164
- * Any time the sprockets depedency is bumped, there will be a new minor release
164
+ * Any time the sprockets dependency is bumped, there will be a new minor release
165
165
  * Simple bug fixes will be patch releases
166
166
 
167
167
 
168
168
  ## License
169
169
 
170
- Copyright &copy; 2012 Joshua Peek.
170
+ Copyright &copy; 2014 Joshua Peek.
171
171
 
172
172
  Released under the MIT license. See `LICENSE` for details.
@@ -0,0 +1,48 @@
1
+ require 'action_view'
2
+ require 'sprockets'
3
+
4
+ module Sprockets
5
+ module Rails
6
+ module Context
7
+ include ActionView::Helpers::AssetUrlHelper
8
+ include ActionView::Helpers::AssetTagHelper
9
+
10
+ def self.included(klass)
11
+ klass.class_eval do
12
+ class_attribute :config, :assets_prefix, :digest_assets
13
+ end
14
+ end
15
+
16
+ def compute_asset_path(path, options = {})
17
+ @dependencies << 'actioncontroller-asset-url-config'
18
+
19
+ begin
20
+ asset_uri = resolve(path)
21
+ rescue FileNotFound
22
+ # TODO: eh, we should be able to use a form of locate that returns
23
+ # nil instead of raising an exception.
24
+ end
25
+
26
+ if asset_uri
27
+ asset = link_asset(path)
28
+ digest_path = asset.digest_path
29
+ path = digest_path if digest_assets
30
+ File.join(assets_prefix || "/", path)
31
+ else
32
+ super
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ register_dependency_resolver 'actioncontroller-asset-url-config' do |env|
39
+ config = env.context_class.config
40
+ [config.relative_url_root,
41
+ (config.asset_host unless config.asset_host.respond_to?(:call))]
42
+ end
43
+
44
+ # fallback to the default pipeline when using Sprockets 3.x
45
+ unless config[:pipelines].include? :debug
46
+ register_pipeline :debug, config[:pipelines][:default]
47
+ end
48
+ end
@@ -1,122 +1,123 @@
1
1
  require 'action_view'
2
2
  require 'sprockets'
3
3
  require 'active_support/core_ext/class/attribute'
4
+ require 'sprockets/rails/utils'
4
5
 
5
6
  module Sprockets
6
7
  module Rails
7
8
  module Helper
8
- class << self
9
- attr_accessor :precompile, :assets, :raise_runtime_errors
10
- end
11
-
12
- def precompile
13
- Sprockets::Rails::Helper.precompile
14
- end
15
-
16
- def assets
17
- Sprockets::Rails::Helper.assets
18
- end
19
-
20
- def raise_runtime_errors
21
- Sprockets::Rails::Helper.raise_runtime_errors
22
- end
23
-
24
- class AssetFilteredError < StandardError
9
+ class AssetNotPrecompiled < StandardError
25
10
  def initialize(source)
26
- msg = "Asset filtered out and will not be served: " <<
27
- "add `Rails.application.config.assets.precompile += %w( #{source} )` " <<
28
- "to `config/initializers/assets.rb` and restart your server"
29
- super(msg)
30
- end
31
- end
32
-
33
- class AbsoluteAssetPathError < ArgumentError
34
- def initialize(bad_path, good_path, prefix)
35
- msg = "Asset names passed to helpers should not include the #{prefix.inspect} prefix. " <<
36
- "Instead of #{bad_path.inspect}, use #{good_path.inspect}"
11
+ msg = "Asset was not declared to be precompiled in production.\n" +
12
+ "Add `Rails.application.config.assets.precompile += " +
13
+ "%w( #{source} )` to `config/initializers/assets.rb` and " +
14
+ "restart your server"
37
15
  super(msg)
38
16
  end
39
17
  end
40
18
 
41
19
  include ActionView::Helpers::AssetUrlHelper
42
20
  include ActionView::Helpers::AssetTagHelper
21
+ include Sprockets::Rails::Utils
43
22
 
44
23
  VIEW_ACCESSORS = [:assets_environment, :assets_manifest,
24
+ :assets_precompile, :precompiled_assets,
45
25
  :assets_prefix, :digest_assets, :debug_assets]
46
26
 
47
27
  def self.included(klass)
48
- if klass < Sprockets::Context
49
- klass.class_eval do
50
- alias_method :assets_environment, :environment
51
- def assets_manifest; end
52
- class_attribute :config, :assets_prefix, :digest_assets, :debug_assets
28
+ klass.class_attribute(*VIEW_ACCESSORS)
29
+
30
+ klass.class_eval do
31
+ remove_method :assets_environment
32
+ def assets_environment
33
+ if instance_variable_defined?(:@assets_environment)
34
+ @assets_environment = @assets_environment.cached
35
+ elsif env = self.class.assets_environment
36
+ @assets_environment = env.cached
37
+ else
38
+ nil
39
+ end
53
40
  end
54
- else
55
- klass.class_attribute(*VIEW_ACCESSORS)
56
41
  end
57
42
  end
58
43
 
59
44
  def self.extended(obj)
60
45
  obj.class_eval do
61
46
  attr_accessor(*VIEW_ACCESSORS)
47
+
48
+ remove_method :assets_environment
49
+ def assets_environment
50
+ if env = @assets_environment
51
+ @assets_environment = env.cached
52
+ else
53
+ nil
54
+ end
55
+ end
62
56
  end
63
57
  end
64
58
 
65
59
  def compute_asset_path(path, options = {})
66
- # Check if we are inside Sprockets context before calling check_dependencies!.
67
- check_dependencies!(path) if defined?(depend_on)
68
-
69
- if digest_path = asset_digest_path(path)
60
+ if digest_path = asset_digest_path(path, options)
70
61
  path = digest_path if digest_assets
71
- path += "?body=1" if options[:debug]
62
+ path += "?body=1" if options[:debug] && !using_sprockets4?
72
63
  File.join(assets_prefix || "/", path)
73
64
  else
74
65
  super
75
66
  end
76
67
  end
77
68
 
78
- # Computes the full URL to a asset in the public directory. This
79
- # method checks for errors before returning path.
80
- def asset_path(source, options = {})
81
- unless options[:debug]
82
- check_errors_for(source, options)
83
- end
84
- super(source, options)
85
- end
86
- alias :path_to_asset :asset_path
87
-
88
- # Get digest for asset path.
69
+ # Expand asset path to digested form.
89
70
  #
90
71
  # path - String path
91
72
  # options - Hash options
92
73
  #
93
- # Returns String Hex digest or nil if digests are disabled.
94
- def asset_digest(path, options = {})
95
- return unless digest_assets
74
+ # Returns String path or nil if no asset was found.
75
+ def asset_digest_path(path, options = {})
76
+ if manifest = assets_manifest
77
+ if digest_path = manifest.assets[path]
78
+ return digest_path
79
+ end
80
+ end
96
81
 
97
- if digest_path = asset_digest_path(path, options)
98
- digest_path[/-(.+)\./, 1]
82
+ if environment = assets_environment
83
+ if asset = environment[path]
84
+ unless options[:debug]
85
+ if !precompiled_assets.include?(asset.logical_path)
86
+ raise AssetNotPrecompiled.new(asset.logical_path)
87
+ end
88
+ end
89
+ return asset.digest_path
90
+ end
99
91
  end
100
92
  end
101
93
 
102
- # Expand asset path to digested form.
94
+ # Experimental: Get integrity for asset path.
103
95
  #
104
96
  # path - String path
105
97
  # options - Hash options
106
98
  #
107
- # Returns String path or nil if no asset was found.
108
- def asset_digest_path(path, options = {})
99
+ # Returns String integrity attribute or nil if no asset was found.
100
+ def asset_integrity(path, options = {})
101
+ path = path.to_s
102
+ if extname = compute_asset_extname(path, options)
103
+ path = "#{path}#{extname}"
104
+ end
105
+
109
106
  if manifest = assets_manifest
110
107
  if digest_path = manifest.assets[path]
111
- return digest_path
108
+ if metadata = manifest.files[digest_path]
109
+ return metadata["integrity"]
110
+ end
112
111
  end
113
112
  end
114
113
 
115
114
  if environment = assets_environment
116
115
  if asset = environment[path]
117
- return asset.digest_path
116
+ return asset.integrity
118
117
  end
119
118
  end
119
+
120
+ nil
120
121
  end
121
122
 
122
123
  # Override javascript tag helper to provide debugging support.
@@ -125,20 +126,35 @@ module Sprockets
125
126
  def javascript_include_tag(*sources)
126
127
  options = sources.extract_options!.stringify_keys
127
128
 
129
+ unless request_ssl?
130
+ options.delete("integrity")
131
+ end
132
+
133
+ case options["integrity"]
134
+ when true, false, nil
135
+ compute_integrity = options.delete("integrity")
136
+ end
137
+
128
138
  if options["debug"] != false && request_debug_assets?
129
139
  sources.map { |source|
130
- check_errors_for(source, :type => :javascript)
131
- if asset = lookup_asset_for_path(source, :type => :javascript)
132
- asset.to_a.map do |a|
133
- super(path_to_javascript(a.logical_path, :debug => true), options)
140
+ if asset = lookup_debug_asset(source, :type => :javascript)
141
+ if asset.respond_to?(:to_a)
142
+ asset.to_a.map do |a|
143
+ super(path_to_javascript(a.logical_path, :debug => true), options)
144
+ end
145
+ else
146
+ super(path_to_javascript(asset.logical_path, :debug => true), options)
134
147
  end
135
148
  else
136
149
  super(source, options)
137
150
  end
138
151
  }.flatten.uniq.join("\n").html_safe
139
152
  else
140
- sources.push(options)
141
- super(*sources)
153
+ sources.map { |source|
154
+ super(source, compute_integrity ?
155
+ options.merge("integrity" => asset_integrity(source, :type => :javascript)) :
156
+ options)
157
+ }.join("\n").html_safe
142
158
  end
143
159
  end
144
160
 
@@ -147,61 +163,42 @@ module Sprockets
147
163
  # Eventually will be deprecated and replaced by source maps.
148
164
  def stylesheet_link_tag(*sources)
149
165
  options = sources.extract_options!.stringify_keys
166
+
167
+ unless request_ssl?
168
+ options.delete("integrity")
169
+ end
170
+
171
+ case options["integrity"]
172
+ when true, false, nil
173
+ compute_integrity = options.delete("integrity")
174
+ end
175
+
150
176
  if options["debug"] != false && request_debug_assets?
151
177
  sources.map { |source|
152
- check_errors_for(source, :type => :stylesheet)
153
- if asset = lookup_asset_for_path(source, :type => :stylesheet)
154
- asset.to_a.map do |a|
155
- super(path_to_stylesheet(a.logical_path, :debug => true), options)
178
+ if asset = lookup_debug_asset(source, :type => :stylesheet)
179
+ if asset.respond_to?(:to_a)
180
+ asset.to_a.map do |a|
181
+ super(path_to_stylesheet(a.logical_path, :debug => true), options)
182
+ end
183
+ else
184
+ super(path_to_stylesheet(asset.logical_path, :debug => true), options)
156
185
  end
157
186
  else
158
187
  super(source, options)
159
188
  end
160
189
  }.flatten.uniq.join("\n").html_safe
161
190
  else
162
- sources.push(options)
163
- super(*sources)
191
+ sources.map { |source|
192
+ super(source, compute_integrity ?
193
+ options.merge("integrity" => asset_integrity(source, :type => :stylesheet)) :
194
+ options)
195
+ }.join("\n").html_safe
164
196
  end
165
197
  end
166
198
 
167
199
  protected
168
- # Ensures the asset is included in the dependencies list.
169
- def check_dependencies!(dep)
170
- depend_on(dep)
171
- depend_on_asset(dep)
172
- rescue Sprockets::FileNotFound
173
- end
174
-
175
- # Raise errors when source is not in the precompiled list, or
176
- # incorrectly contains the assets_prefix.
177
- def check_errors_for(source, options)
178
- return unless self.raise_runtime_errors
179
-
180
- source = source.to_s
181
- return if source.blank? || source =~ URI_REGEXP
182
-
183
- asset = lookup_asset_for_path(source, options)
184
-
185
- if asset && asset_needs_precompile?(asset.logical_path, asset.pathname.to_s)
186
- raise AssetFilteredError.new(asset.logical_path)
187
- end
188
-
189
- full_prefix = File.join(self.assets_prefix || "/", '')
190
- if !asset && source.start_with?(full_prefix)
191
- short_path = source[full_prefix.size, source.size]
192
- if lookup_asset_for_path(short_path, options)
193
- raise AbsoluteAssetPathError.new(source, short_path, full_prefix)
194
- end
195
- end
196
- end
197
-
198
- # Returns true when an asset will not be available after precompile is run
199
- def asset_needs_precompile?(source, filename)
200
- if assets_environment && assets_environment.send(:matches_filter, precompile || [], source, filename)
201
- false
202
- else
203
- true
204
- end
200
+ def request_ssl?
201
+ respond_to?(:request) && self.request && self.request.ssl?
205
202
  end
206
203
 
207
204
  # Enable split asset debugging. Eventually will be deprecated
@@ -214,13 +211,21 @@ module Sprockets
214
211
 
215
212
  # Internal method to support multifile debugging. Will
216
213
  # eventually be removed w/ Sprockets 3.x.
217
- def lookup_asset_for_path(path, options = {})
214
+ def lookup_debug_asset(path, options = {})
218
215
  return unless env = assets_environment
219
216
  path = path.to_s
220
217
  if extname = compute_asset_extname(path, options)
221
218
  path = "#{path}#{extname}"
222
219
  end
223
- env[path]
220
+
221
+ if asset = env[path, pipeline: :debug]
222
+ original_path = asset.logical_path.gsub('.debug', '')
223
+ unless precompiled_assets.include?(original_path)
224
+ raise AssetNotPrecompiled.new(original_path)
225
+ end
226
+ end
227
+
228
+ asset
224
229
  end
225
230
  end
226
231
  end
@@ -0,0 +1,23 @@
1
+ module Sprockets
2
+ module Rails
3
+ module RouteWrapper
4
+
5
+ def internal_assets_path?
6
+ path =~ %r{\A#{self.class.assets_prefix}\z}
7
+ end
8
+
9
+ def internal?
10
+ super || internal_assets_path?
11
+ end
12
+
13
+ def self.included(klass)
14
+ klass.class_eval do
15
+ def internal_with_sprockets?
16
+ internal_without_sprockets? || internal_assets_path?
17
+ end
18
+ alias_method_chain :internal?, :sprockets
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -16,7 +16,9 @@ module Sprockets
16
16
 
17
17
  def environment
18
18
  if app
19
- app.assets
19
+ # Use initialized app.assets or force build an environment if
20
+ # config.assets.compile is disabled
21
+ app.assets || Sprockets::Railtie.build_environment(app)
20
22
  else
21
23
  super
22
24
  end
@@ -24,7 +26,8 @@ module Sprockets
24
26
 
25
27
  def output
26
28
  if app
27
- File.join(app.root, 'public', app.config.assets.prefix)
29
+ config = app.config
30
+ File.join(config.paths['public'].first, config.assets.prefix)
28
31
  else
29
32
  super
30
33
  end
@@ -46,17 +49,12 @@ module Sprockets
46
49
  end
47
50
  end
48
51
 
49
- def cache_path
50
- if app
51
- "#{app.config.root}/tmp/cache/assets"
52
- else
53
- @cache_path
54
- end
55
- end
56
- attr_writer :cache_path
57
-
58
52
  def define
59
53
  namespace :assets do
54
+ %w( environment precompile clean clobber ).each do |task|
55
+ Rake::Task[task].clear if Rake::Task.task_defined?(task)
56
+ end
57
+
60
58
  # Override this task change the loaded dependencies
61
59
  desc "Load asset compile environment"
62
60
  task :environment do
@@ -73,9 +71,8 @@ module Sprockets
73
71
 
74
72
  desc "Remove old compiled assets"
75
73
  task :clean, [:keep] => :environment do |t, args|
76
- keep = Integer(args.keep || 2)
77
74
  with_logger do
78
- manifest.clean(keep)
75
+ manifest.clean(Integer(args.keep || self.keep))
79
76
  end
80
77
  end
81
78
 
@@ -83,7 +80,6 @@ module Sprockets
83
80
  task :clobber => :environment do
84
81
  with_logger do
85
82
  manifest.clobber
86
- rm_rf cache_path if cache_path
87
83
  end
88
84
  end
89
85
  end
@@ -0,0 +1,16 @@
1
+ require 'sprockets'
2
+
3
+ module Sprockets
4
+ module Rails
5
+ module Utils
6
+ def using_sprockets4?
7
+ Gem::Version.new(Sprockets::VERSION) >= Gem::Version.new('4.0.0')
8
+ end
9
+
10
+ # Internal: Generate a Set of all precompiled assets logical paths.
11
+ def build_precompiled_list(manifest, assets)
12
+ manifest.find(assets || []).map(&:logical_path)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,5 @@
1
1
  module Sprockets
2
2
  module Rails
3
- VERSION = "3.0.0.beta1"
3
+ VERSION = "3.0.0.beta2"
4
4
  end
5
5
  end
@@ -2,9 +2,11 @@ require 'rails'
2
2
  require 'rails/railtie'
3
3
  require 'action_controller/railtie'
4
4
  require 'active_support/core_ext/module/remove_method'
5
+ require 'active_support/core_ext/numeric/bytes'
5
6
  require 'sprockets'
6
- require 'sprockets/rails/environment'
7
+ require 'sprockets/rails/context'
7
8
  require 'sprockets/rails/helper'
9
+ require 'sprockets/rails/route_wrapper'
8
10
  require 'sprockets/rails/version'
9
11
 
10
12
  module Rails
@@ -19,27 +21,36 @@ module Rails
19
21
  remove_possible_method :assets
20
22
  remove_possible_method :assets=
21
23
 
22
- # Returns Sprockets::Rails::Environment for app config.
23
- def assets
24
- @assets ||= Sprockets::Rails::Environment.new(root.to_s) do |env|
25
- env.version = ::Rails.env
24
+ # Returns Sprockets::Environment for app config.
25
+ attr_accessor :assets
26
26
 
27
- path = "#{config.root}/tmp/cache/assets/#{::Rails.env}"
28
- env.cache = Sprockets::Cache::FileStore.new(path)
27
+ # Returns Sprockets::Manifest for app config.
28
+ attr_accessor :assets_manifest
29
29
 
30
- env.context_class.class_eval do
31
- include ::Sprockets::Rails::Helper
32
- end
30
+ # Returns array of already precompiled assets
31
+ attr_accessor :precompiled_assets
32
+ end
33
+
34
+ class Engine < Railtie
35
+ # Skip defining append_assets_path on Rails <= 4.2
36
+ unless initializers.find { |init| init.name == :append_assets_path }
37
+ initializer :append_assets_path, :group => :all do |app|
38
+ app.config.assets.paths.unshift(*paths["vendor/assets"].existent_directories)
39
+ app.config.assets.paths.unshift(*paths["lib/assets"].existent_directories)
40
+ app.config.assets.paths.unshift(*paths["app"].existent_directories.grep(/\/assets\z/))
41
+ app.config.assets.paths.unshift(*paths["app/assets"].existent_directories)
33
42
  end
34
43
  end
35
- attr_writer :assets
36
44
  end
37
45
  end
38
46
 
39
47
  module Sprockets
40
48
  class Railtie < ::Rails::Railtie
41
- LOOSE_APP_ASSETS = lambda do |filename, path|
42
- path =~ /app\/assets/ && !%w(.js .css).include?(File.extname(filename))
49
+ include Sprockets::Rails::Utils
50
+
51
+ LOOSE_APP_ASSETS = lambda do |logical_path, filename|
52
+ filename.start_with?(::Rails.root.join("app/assets").to_s) &&
53
+ !%w(.js .css).include?(File.extname(logical_path))
43
54
  end
44
55
 
45
56
  class OrderedOptions < ActiveSupport::OrderedOptions
@@ -49,88 +60,129 @@ module Sprockets
49
60
  end
50
61
 
51
62
  config.assets = OrderedOptions.new
52
- config.assets._blocks = []
53
- config.assets.paths = []
54
- config.assets.prefix = "/assets"
55
- config.assets.manifest = nil
56
- config.assets.precompile = [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js)$/]
57
- config.assets.version = ""
58
- config.assets.debug = false
59
- config.assets.compile = true
60
- config.assets.digest = false
63
+ config.assets._blocks = []
64
+ config.assets.paths = []
65
+ config.assets.prefix = "/assets"
66
+ config.assets.manifest = nil
67
+ if using_sprockets4?
68
+ config.assets.precompile = %w( manifest.js )
69
+ else
70
+ config.assets.precompile = [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js)$/]
71
+ end
72
+ config.assets.version = ""
73
+ config.assets.debug = false
74
+ config.assets.compile = true
75
+ config.assets.digest = true
76
+ config.assets.cache_limit = 50.megabytes
77
+
78
+ config.assets.configure do |env|
79
+ config.assets.paths.each { |path| env.append_path(path) }
80
+ end
61
81
 
62
- rake_tasks do |app|
63
- require 'sprockets/rails/task'
64
- Sprockets::Rails::Task.new(app)
82
+ config.assets.configure do |env|
83
+ env.js_compressor = config.assets.js_compressor
84
+ env.css_compressor = config.assets.css_compressor
65
85
  end
66
86
 
67
- config.after_initialize do |app|
68
- config = app.config
87
+ config.assets.configure do |env|
88
+ env.context_class.send :include, ::Sprockets::Rails::Context
89
+ env.context_class.assets_prefix = config.assets.prefix
90
+ env.context_class.digest_assets = config.assets.digest
91
+ env.context_class.config = config.action_controller
92
+ end
69
93
 
70
- manifest_assets_path = File.join(config.paths['public'].first, config.assets.prefix)
71
-
72
- # Configuration options that should invalidate
73
- # the Sprockets cache when changed.
74
- app.assets.version = [
75
- app.assets.version,
76
- config.assets.version,
77
- config.action_controller.relative_url_root,
78
- (config.action_controller.asset_host unless config.action_controller.asset_host.respond_to?(:call)),
79
- Sprockets::Rails::VERSION
80
- ].compact.join('-')
81
-
82
- # Copy config.assets.paths to Sprockets
83
- config.assets.paths.each do |path|
84
- app.assets.append_path path
85
- end
94
+ config.assets.configure do |env|
95
+ env.cache = Sprockets::Cache::FileStore.new(
96
+ "#{env.root}/tmp/cache",
97
+ config.assets.cache_limit,
98
+ env.logger
99
+ )
100
+ end
86
101
 
87
- ActiveSupport.on_load(:action_view) do
88
- include Sprockets::Rails::Helper
102
+ Sprockets.register_dependency_resolver 'rails-env' do
103
+ ::Rails.env
104
+ end
105
+ config.assets.configure do |env|
106
+ env.depend_on 'environment-version'
107
+ end
89
108
 
90
- # Copy relevant config to AV context
91
- self.debug_assets = config.assets.debug
92
- self.digest_assets = config.assets.digest
93
- self.assets_prefix = config.assets.prefix
109
+ config.assets.configure do |env|
110
+ env.version = config.assets.version
111
+ end
94
112
 
95
- # Copy over to Sprockets as well
96
- context = app.assets.context_class
97
- context.assets_prefix = config.assets.prefix
98
- context.digest_assets = config.assets.digest
99
- context.config = config.action_controller
113
+ rake_tasks do |app|
114
+ require 'sprockets/rails/task'
115
+ Sprockets::Rails::Task.new(app)
116
+ end
100
117
 
101
- if config.assets.compile
102
- self.assets_environment = app.assets
103
- self.assets_manifest = Sprockets::Manifest.new(app.assets, manifest_assets_path, config.assets.manifest)
104
- else
105
- self.assets_manifest = Sprockets::Manifest.new(manifest_assets_path, config.assets.manifest)
106
- end
118
+ def build_environment(app, initialized = nil)
119
+ initialized = app.initialized? if initialized.nil?
120
+ unless initialized
121
+ ::Rails.logger.warn "Application uninitialized: Try calling YourApp::Application.initialize!"
107
122
  end
108
123
 
109
- app.assets.js_compressor = config.assets.js_compressor
110
- app.assets.css_compressor = config.assets.css_compressor
124
+ env = Sprockets::Environment.new(app.root.to_s)
111
125
 
112
126
  # Run app.assets.configure blocks
113
- config.assets._blocks.each do |block|
114
- block.call app.assets
127
+ app.config.assets._blocks.each do |block|
128
+ block.call(env)
115
129
  end
116
130
 
117
131
  # No more configuration changes at this point.
118
132
  # With cache classes on, Sprockets won't check the FS when files
119
133
  # change. Preferable in production when the FS only changes on
120
134
  # deploys when the app restarts.
121
- if config.cache_classes
122
- app.assets = app.assets.index
135
+ if app.config.cache_classes
136
+ env = env.cached
123
137
  end
124
138
 
139
+ env
140
+ end
141
+
142
+ def self.build_manifest(app)
143
+ config = app.config
144
+ path = File.join(config.paths['public'].first, config.assets.prefix)
145
+ Sprockets::Manifest.new(app.assets, path, config.assets.manifest)
146
+ end
125
147
 
126
- Sprockets::Rails::Helper.precompile ||= app.config.assets.precompile
127
- Sprockets::Rails::Helper.assets ||= app.assets
128
- Sprockets::Rails::Helper.raise_runtime_errors = app.config.assets.raise_runtime_errors
148
+ config.after_initialize do |app|
149
+ config = app.config
129
150
 
130
151
  if config.assets.compile
152
+ app.assets = self.build_environment(app, true)
131
153
  app.routes.prepend do
132
154
  mount app.assets => config.assets.prefix
133
155
  end
156
+ app.assets_manifest = build_manifest(app)
157
+ app.precompiled_assets = build_precompiled_list(app.assets_manifest, config.assets.precompile)
158
+ else
159
+ app.assets_manifest = build_manifest(app)
160
+ end
161
+
162
+ ActionDispatch::Routing::RouteWrapper.class_eval do
163
+ class_attribute :assets_prefix
164
+
165
+ if defined?(prepend) && ::Rails.version >= '4'
166
+ prepend Sprockets::Rails::RouteWrapper
167
+ else
168
+ include Sprockets::Rails::RouteWrapper
169
+ end
170
+
171
+ self.assets_prefix = config.assets.prefix
172
+ end
173
+
174
+ ActiveSupport.on_load(:action_view) do
175
+ include Sprockets::Rails::Helper
176
+
177
+ # Copy relevant config to AV context
178
+ self.debug_assets = config.assets.debug
179
+ self.digest_assets = config.assets.digest
180
+ self.assets_prefix = config.assets.prefix
181
+ self.assets_precompile = config.assets.precompile
182
+
183
+ self.assets_environment = app.assets
184
+ self.assets_manifest = app.assets_manifest
185
+ self.precompiled_assets = app.precompiled_assets
134
186
  end
135
187
  end
136
188
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sprockets-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.beta1
4
+ version: 3.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Peek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-19 00:00:00.000000000 Z
11
+ date: 2015-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sprockets
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.8'
19
+ version: 3.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '2.8'
26
+ version: 3.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: actionpack
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '4.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: railties
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '4.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '4.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -67,19 +81,33 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: railties
84
+ name: sass
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: '4.0'
89
+ version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: '4.0'
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: uglifier
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description:
84
112
  email: josh@joshpeek.com
85
113
  executables: []
@@ -89,9 +117,11 @@ files:
89
117
  - LICENSE
90
118
  - README.md
91
119
  - lib/sprockets/rails.rb
92
- - lib/sprockets/rails/environment.rb
120
+ - lib/sprockets/rails/context.rb
93
121
  - lib/sprockets/rails/helper.rb
122
+ - lib/sprockets/rails/route_wrapper.rb
94
123
  - lib/sprockets/rails/task.rb
124
+ - lib/sprockets/rails/utils.rb
95
125
  - lib/sprockets/rails/version.rb
96
126
  - lib/sprockets/railtie.rb
97
127
  homepage: https://github.com/rails/sprockets-rails
@@ -106,7 +136,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
136
  requirements:
107
137
  - - ">="
108
138
  - !ruby/object:Gem::Version
109
- version: '0'
139
+ version: 1.9.3
110
140
  required_rubygems_version: !ruby/object:Gem::Requirement
111
141
  requirements:
112
142
  - - ">"
@@ -114,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
144
  version: 1.3.1
115
145
  requirements: []
116
146
  rubyforge_project:
117
- rubygems_version: 2.3.0
147
+ rubygems_version: 2.4.7
118
148
  signing_key:
119
149
  specification_version: 4
120
150
  summary: Sprockets Rails integration
@@ -1,39 +0,0 @@
1
- require 'sprockets'
2
- require 'sprockets/rails/helper'
3
-
4
- module Sprockets
5
- module Rails
6
- class Environment < Sprockets::Environment
7
- class NoDigestError < StandardError
8
- def initialize(asset)
9
- msg = "Assets should not be requested directly without their digests: " <<
10
- "Use the helpers in ActionView::Helpers to request #{asset}"
11
- super(msg)
12
- end
13
- end
14
-
15
- def call(env)
16
- if Sprockets::Rails::Helper.raise_runtime_errors && context_class.digest_assets
17
- path = unescape(env['PATH_INFO'].to_s.sub(/^\//, ''))
18
-
19
- if fingerprint = path_fingerprint(path)
20
- path = path.sub("-#{fingerprint}", '')
21
- else
22
- raise NoDigestError.new(path)
23
- end
24
-
25
- asset = find_asset(path)
26
- if asset && asset.digest != fingerprint
27
- asset_path = File.join(context_class.assets_prefix || "/", asset.digest_path)
28
- asset_path += '?' + env['QUERY_STRING'] if env['QUERY_STRING']
29
- [302, {"Location" => asset_path}, []]
30
- else
31
- super(env)
32
- end
33
- else
34
- super(env)
35
- end
36
- end
37
- end
38
- end
39
- end