rack-zippy 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 1.1.0 / 2014-01-26
2
+ - rack-zippy no longer blocks requests for assets that it cannot find on the filesystem. These
3
+ requests are now passed on to the app. ([#7](https://github.com/eliotsykes/rack-zippy/issues/7))
4
+
1
5
  ## 1.0.1 / 2013-09-06
2
6
  - Fix error on request for assets root dir (fixes [#2](https://github.com/eliotsykes/rack-zippy/issues/2))
3
7
  - Add MIT license to gemspec (fixes [#1](https://github.com/eliotsykes/rack-zippy/issues/1))
data/README.md CHANGED
@@ -9,6 +9,10 @@ rack-zippy replaces the ActionDispatch::Static middleware used by Rails, which i
9
9
  the `rake assets:precompile` task. rack-zippy will serve non-gzipped assets where they are not available or not supported by the
10
10
  requesting client.
11
11
 
12
+ For a fuller explanation of the how, why, and the kind of performance difference you can expect when using rack-zippy,
13
+ see [Serving Compressed Assets with Heroku and Rack-Zippy](http://www.cheynewallace.com/serving-compressed-assets-with-heroku-rack-zippy/)
14
+ (thanks to Cheyne Wallace).
15
+
12
16
  ## Installation
13
17
 
14
18
  Add this line to your application's Gemfile:
@@ -28,6 +32,14 @@ Add this line to config/application.rb:
28
32
  Follow the installation instructions above and rack-zippy will serve any static assets, including gzipped assets, from your
29
33
  application's public/ directory and will respond with sensible caching headers.
30
34
 
35
+ ## Troubleshooting
36
+
37
+ ##### 'assert_index': No such middleware to insert before: ActionDispatch::Static (RuntimeError)
38
+
39
+ Check your environment (in config/environments/) does not have `serve_static_assets` set to false:
40
+
41
+ config.serve_static_assets = false # Oops! Should be set to true for rack-zippy
42
+
31
43
  ## Contributing
32
44
 
33
45
  1. Fork it
@@ -39,9 +51,9 @@ application's public/ directory and will respond with sensible caching headers.
39
51
 
40
52
  ## Releasing a new gem
41
53
 
42
- 1. Increment version in lib/rack-zippy/version.rb in line with semantic versioning
54
+ 1. Update pre-release version to the release version in lib/rack-zippy/version.rb, e.g. '1.0.1.pre' becomes '1.0.1'
43
55
  2. Update CHANGELOG.md
44
56
  3. Tests pass? (`rake test`)
45
57
  4. Build the gem (`rake build`)
46
58
  5. Release on rubygems.org (`rake release`)
47
-
59
+ 6. Update version to the next pre-release version in lib/rack-zippy/version.rb, e.g. '1.0.1' becomes '1.0.2.pre'
data/lib/rack-zippy.rb CHANGED
@@ -14,33 +14,25 @@ module Rack
14
14
  assert_legal_path path_info
15
15
 
16
16
  if serve?(path_info)
17
+ headers = { 'Content-Type' => Rack::Mime.mime_type(::File.extname(path_info)) }
18
+ headers.merge! cache_headers(path_info)
17
19
 
18
- file_path = "#{@asset_root}#{path_info}"
20
+ file_path = path_to_file(path_info)
21
+ gzipped_file_path = "#{file_path}.gz"
22
+ gzipped_file_present = ::File.exists?(gzipped_file_path) && ::File.readable?(gzipped_file_path)
19
23
 
20
- if ::File.file?(file_path)
21
- headers = { 'Content-Type' => Rack::Mime.mime_type(::File.extname(path_info)) }
22
- headers.merge! cache_headers(path_info)
24
+ if gzipped_file_present
25
+ headers['Vary'] = 'Accept-Encoding'
23
26
 
24
- gzipped_file_path = "#{file_path}.gz"
25
- gzipped_file_present = ::File.exists?(gzipped_file_path)
26
-
27
- if gzipped_file_present
28
- headers['Vary'] = 'Accept-Encoding'
29
-
30
- if client_accepts_gzip?(env)
31
- file_path = gzipped_file_path
32
- headers['Content-Encoding'] = 'gzip'
33
- end
27
+ if client_accepts_gzip?(env)
28
+ file_path = gzipped_file_path
29
+ headers['Content-Encoding'] = 'gzip'
34
30
  end
35
-
36
- status = 200
37
- headers['Content-Length'] = ::File.size(file_path).to_s
38
- response_body = [::File.read(file_path)]
39
- else
40
- status = 404
41
- headers = {}
42
- response_body = ['Not Found']
43
31
  end
32
+
33
+ status = 200
34
+ headers['Content-Length'] = ::File.size(file_path).to_s
35
+ response_body = [::File.read(file_path)]
44
36
  return [status, headers, response_body]
45
37
  end
46
38
 
@@ -84,15 +76,28 @@ module Rack
84
76
  return headers
85
77
  end
86
78
 
79
+ def path_to_file(path_info)
80
+ "#{@asset_root}#{path_info}"
81
+ end
82
+
87
83
  def serve?(path_info)
88
- is_assets_dir_or_below = (path_info =~ PRECOMPILED_ASSETS_SUBDIR_REGEX)
89
- if is_assets_dir_or_below
90
- return should_assets_be_compiled_already?
84
+ should_serve_from_filesystem = false
85
+
86
+ if has_static_extension?(path_info)
87
+ file_path = path_to_file(path_info)
88
+ is_serveable = ::File.file?(file_path) && ::File.readable?(file_path)
89
+
90
+ if is_serveable
91
+ is_outside_assets_dir = !(path_info =~ PRECOMPILED_ASSETS_SUBDIR_REGEX)
92
+ should_serve_from_filesystem = is_outside_assets_dir || block_asset_pipeline_from_generating_asset?
93
+ end
91
94
  end
92
- return has_static_extension?(path_info)
95
+
96
+ return should_serve_from_filesystem
93
97
  end
94
98
 
95
- def should_assets_be_compiled_already?
99
+ def block_asset_pipeline_from_generating_asset?
100
+ # config.assets.compile is normally false in production, and true in dev+test envs.
96
101
  !::Rails.configuration.assets.compile
97
102
  end
98
103
 
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module Zippy
3
- VERSION = '1.0.1'
3
+ VERSION = '1.1.0'
4
4
  end
5
5
  end
@@ -25,28 +25,28 @@ class Rack::Zippy::AssetServerTest < Test::Unit::TestCase
25
25
  assert_underlying_app_responded
26
26
  end
27
27
 
28
- def test_request_for_subdir_of_assets_responds_404_not_found
28
+ def test_request_for_subdir_of_assets_passed_onto_app
29
29
  ['/assets/blog', '/assets/blog/logos/'].each do |path|
30
30
  local_path = "public#{path}"
31
31
  assert File.directory?(local_path)
32
32
  get path
33
- assert_not_found
33
+ assert_underlying_app_responded
34
34
  end
35
35
  end
36
36
 
37
- def test_request_for_non_existent_subdir_of_assets_responds_404_not_found
37
+ def test_request_for_non_existent_subdir_of_assets_passed_onto_app
38
38
  ['/assets/ghost', '/assets/does/not/exist', '/assets/nothing-here/with-trailing-slash/'].each do |path|
39
39
  local_path = "public#{path}"
40
40
  assert !File.exists?(local_path)
41
41
  get path
42
- assert_not_found
42
+ assert_underlying_app_responded
43
43
  end
44
44
  end
45
45
 
46
- def test_request_for_assets_root_responds_404_not_found
46
+ def test_request_for_assets_root_passed_onto_app
47
47
  ['/assets/', '/assets'].each do |assets_root|
48
48
  get assets_root
49
- assert_not_found "'#{assets_root}' assets root request should not be found"
49
+ assert_underlying_app_responded
50
50
  end
51
51
  end
52
52
 
@@ -68,8 +68,12 @@ class Rack::Zippy::AssetServerTest < Test::Unit::TestCase
68
68
  assert_underlying_app_responded
69
69
  end
70
70
 
71
- def test_serve_returns_true_if_request_has_static_extension
72
- assert app.send(:serve?, '/about.html')
71
+ def test_serve_returns_true_if_request_has_static_extension_and_file_exists
72
+ assert app.send(:serve?, '/thanks.html')
73
+ end
74
+
75
+ def test_serve_returns_false_if_request_has_static_extension_and_file_does_not_exist
76
+ assert !app.send(:serve?, '/about.html')
73
77
  end
74
78
 
75
79
  def test_serve_returns_false_if_request_does_not_have_static_extension
@@ -85,15 +89,15 @@ class Rack::Zippy::AssetServerTest < Test::Unit::TestCase
85
89
  assert !app.send(:serve?, '/assets/application.css')
86
90
  end
87
91
 
88
- def test_should_assets_be_compiled_already_returns_false_if_assets_compile_enabled
92
+ def test_block_asset_pipeline_from_generating_asset_returns_false_if_assets_compile_enabled
89
93
  ::Rails.configuration.assets.compile = true
90
94
  assert ::Rails.configuration.assets.compile
91
- assert !app.send(:should_assets_be_compiled_already?)
95
+ assert !app.send(:block_asset_pipeline_from_generating_asset?)
92
96
  end
93
97
 
94
- def test_should_assets_be_compiled_already_returns_true_if_assets_compile_disabled
98
+ def test_block_asset_pipeline_from_generating_asset_returns_true_if_assets_compile_disabled
95
99
  assert !::Rails.configuration.assets.compile
96
- assert app.send(:should_assets_be_compiled_already?)
100
+ assert app.send(:block_asset_pipeline_from_generating_asset?)
97
101
  end
98
102
 
99
103
  def test_responds_with_gzipped_css_to_gzip_capable_clients
@@ -231,9 +235,9 @@ class Rack::Zippy::AssetServerTest < Test::Unit::TestCase
231
235
  assert_underlying_app_responded
232
236
  end
233
237
 
234
- def test_does_not_pass_not_found_asset_requests_onto_app
238
+ def test_passes_not_found_asset_requests_onto_app
235
239
  get '/index.html'
236
- assert_not_found
240
+ assert_underlying_app_responded
237
241
  end
238
242
 
239
243
  def test_responds_with_favicon_in_assets_dir
@@ -250,19 +254,19 @@ class Rack::Zippy::AssetServerTest < Test::Unit::TestCase
250
254
  assert_content_length 'public/favicon.ico'
251
255
  end
252
256
 
253
- def test_responds_404_not_found_for_non_existent_image
257
+ def test_request_for_non_existent_image_passed_onto_app
254
258
  get '/assets/pot-of-gold.png'
255
- assert_not_found
259
+ assert_underlying_app_responded
256
260
  end
257
261
 
258
- def test_responds_404_not_found_for_non_existent_css
262
+ def test_request_for_non_existent_css_passed_onto_app
259
263
  get '/assets/unicorn.css'
260
- assert_not_found
264
+ assert_underlying_app_responded
261
265
  end
262
266
 
263
- def test_responds_404_not_found_for_non_existent_js
267
+ def test_request_for_non_existent_js_passed_onto_app
264
268
  get '/assets/dragon.js'
265
- assert_not_found
269
+ assert_underlying_app_responded
266
270
  end
267
271
 
268
272
  private
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-zippy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-06 00:00:00.000000000 Z
12
+ date: 2014-01-26 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Rack middleware for serving static gzipped assets generated by the Rails
15
15
  asset pipeline
@@ -55,7 +55,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
55
55
  version: '0'
56
56
  segments:
57
57
  - 0
58
- hash: 3051334136221018269
58
+ hash: 2781769223884308970
59
59
  required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  none: false
61
61
  requirements:
@@ -64,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
64
  version: '0'
65
65
  segments:
66
66
  - 0
67
- hash: 3051334136221018269
67
+ hash: 2781769223884308970
68
68
  requirements: []
69
69
  rubyforge_project:
70
70
  rubygems_version: 1.8.23