turbo-sprockets-rails3-envaware 0.3.10
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +117 -0
- data/Rakefile +28 -0
- data/lib/sprockets/asset_with_dependencies.rb +134 -0
- data/lib/sprockets/static_non_digest_generator.rb +106 -0
- data/lib/sprockets/unprocessed_asset.rb +39 -0
- data/lib/turbo-sprockets-rails3.rb +15 -0
- data/lib/turbo-sprockets/helpers.rb +9 -0
- data/lib/turbo-sprockets/railtie.rb +26 -0
- data/lib/turbo-sprockets/sprockets_overrides/asset.rb +31 -0
- data/lib/turbo-sprockets/sprockets_overrides/base.rb +38 -0
- data/lib/turbo-sprockets/sprockets_overrides/bundled_asset.rb +33 -0
- data/lib/turbo-sprockets/sprockets_overrides/environment.rb +21 -0
- data/lib/turbo-sprockets/sprockets_overrides/index.rb +30 -0
- data/lib/turbo-sprockets/sprockets_overrides/processed_asset.rb +29 -0
- data/lib/turbo-sprockets/sprockets_overrides/static_compiler.rb +94 -0
- data/lib/turbo-sprockets/tasks/assets.rake +204 -0
- data/lib/turbo-sprockets/version.rb +3 -0
- data/test/abstract_unit.rb +143 -0
- data/test/assets_debugging_test.rb +65 -0
- data/test/assets_test.rb +542 -0
- data/test/fixtures/alternate/stylesheets/style.css +1 -0
- data/test/fixtures/app/fonts/dir/font.ttf +0 -0
- data/test/fixtures/app/fonts/font.ttf +0 -0
- data/test/fixtures/app/images/logo.png +0 -0
- data/test/fixtures/app/javascripts/application.js +1 -0
- data/test/fixtures/app/javascripts/dir/xmlhr.js +0 -0
- data/test/fixtures/app/javascripts/extra.js +0 -0
- data/test/fixtures/app/javascripts/foo.min.js +0 -0
- data/test/fixtures/app/javascripts/xmlhr.js +0 -0
- data/test/fixtures/app/stylesheets/application.css +1 -0
- data/test/fixtures/app/stylesheets/dir/style.css +0 -0
- data/test/fixtures/app/stylesheets/extra.css +0 -0
- data/test/fixtures/app/stylesheets/style.css +0 -0
- data/test/fixtures/app/stylesheets/style.ext +0 -0
- data/test/fixtures/app/stylesheets/style.min.css +0 -0
- data/test/sprockets_helper_test.rb +363 -0
- data/test/sprockets_helper_with_routes_test.rb +57 -0
- data/test/sprockets_helpers_abstract_unit.rb +358 -0
- metadata +139 -0
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
require 'turbo-sprockets-rails3'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
# Require minitest for 1.9 and test/unit for 1.8
|
8
|
+
# 'active_support/test_case' supports both.
|
9
|
+
begin
|
10
|
+
require 'minitest/autorun'
|
11
|
+
rescue LoadError
|
12
|
+
require 'test/unit'
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'active_support/test_case'
|
16
|
+
require 'rails/generators'
|
17
|
+
require "active_support/testing/isolation"
|
18
|
+
require "active_support/core_ext/kernel/reporting"
|
19
|
+
|
20
|
+
module TestHelpers
|
21
|
+
module Paths
|
22
|
+
TMP_PATH = File.expand_path(File.join(File.dirname(__FILE__), *%w[.. tmp]))
|
23
|
+
|
24
|
+
def tmp_path(*args)
|
25
|
+
File.join(TMP_PATH, *args)
|
26
|
+
end
|
27
|
+
|
28
|
+
def app_path(*args)
|
29
|
+
tmp_path(*%w[app] + args)
|
30
|
+
end
|
31
|
+
|
32
|
+
def rails_root
|
33
|
+
app_path
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
module Rack
|
38
|
+
def app(env = "production")
|
39
|
+
old_env = ENV["RAILS_ENV"]
|
40
|
+
@app ||= begin
|
41
|
+
ENV["RAILS_ENV"] = env
|
42
|
+
require "#{app_path}/config/environment"
|
43
|
+
Rails.application
|
44
|
+
end
|
45
|
+
ensure
|
46
|
+
ENV["RAILS_ENV"] = old_env
|
47
|
+
end
|
48
|
+
|
49
|
+
def get(path)
|
50
|
+
@app.call(::Rack::MockRequest.env_for(path))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module Generation
|
55
|
+
# Build an application by invoking the generator and going through the whole stack.
|
56
|
+
def build_app(options = {})
|
57
|
+
@prev_rails_env = ENV['RAILS_ENV']
|
58
|
+
ENV['RAILS_ENV'] = 'development'
|
59
|
+
|
60
|
+
FileUtils.rm_rf(app_path)
|
61
|
+
FileUtils.cp_r(tmp_path('app_template'), app_path)
|
62
|
+
|
63
|
+
# Delete the initializers unless requested
|
64
|
+
unless options[:initializers]
|
65
|
+
Dir["#{app_path}/config/initializers/*.rb"].each do |initializer|
|
66
|
+
File.delete(initializer)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
unless options[:gemfile]
|
71
|
+
File.delete"#{app_path}/Gemfile"
|
72
|
+
end
|
73
|
+
|
74
|
+
routes = File.read("#{app_path}/config/routes.rb")
|
75
|
+
if routes =~ /(\n\s*end\s*)\Z/
|
76
|
+
File.open("#{app_path}/config/routes.rb", 'w') do |f|
|
77
|
+
f.puts $` + "\nget ':controller(/:action(/:id))(.:format)'\n" + $1
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
add_to_config 'config.secret_token = "3b7cd727ee24e8444053437c36cc66c4"; config.session_store :cookie_store, :key => "_myapp_session"; config.active_support.deprecation = :log'
|
82
|
+
end
|
83
|
+
|
84
|
+
def teardown_app
|
85
|
+
ENV['RAILS_ENV'] = @prev_rails_env if @prev_rails_env
|
86
|
+
end
|
87
|
+
|
88
|
+
def add_to_config(str)
|
89
|
+
environment = File.read("#{app_path}/config/application.rb")
|
90
|
+
if environment =~ /(\n\s*end\s*end\s*)\Z/
|
91
|
+
File.open("#{app_path}/config/application.rb", 'w') do |f|
|
92
|
+
f.puts $` + "\n#{str}\n" + $1
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def add_to_env_config(env, str)
|
98
|
+
environment = File.read("#{app_path}/config/environments/#{env}.rb")
|
99
|
+
if environment =~ /(\n\s*end\s*)\Z/
|
100
|
+
File.open("#{app_path}/config/environments/#{env}.rb", 'w') do |f|
|
101
|
+
f.puts $` + "\n#{str}\n" + $1
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def app_file(path, contents)
|
107
|
+
FileUtils.mkdir_p File.dirname("#{app_path}/#{path}")
|
108
|
+
File.open("#{app_path}/#{path}", 'w') do |f|
|
109
|
+
f.puts contents
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def boot_rails
|
114
|
+
require 'rubygems' unless defined? Gem
|
115
|
+
require 'bundler'
|
116
|
+
Bundler.setup
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class ActiveSupport::TestCase
|
122
|
+
include TestHelpers::Paths
|
123
|
+
include TestHelpers::Rack
|
124
|
+
include TestHelpers::Generation
|
125
|
+
end
|
126
|
+
|
127
|
+
# Create a scope and build a fixture rails app
|
128
|
+
Module.new do
|
129
|
+
extend TestHelpers::Paths
|
130
|
+
# Build a rails app
|
131
|
+
if File.exist?(tmp_path)
|
132
|
+
FileUtils.rm_rf(tmp_path)
|
133
|
+
end
|
134
|
+
FileUtils.mkdir(tmp_path)
|
135
|
+
|
136
|
+
quietly do
|
137
|
+
Rails::Generators.invoke('app', ["#{tmp_path('app_template')}", "--skip-active-record", "--skip-test-unit"])
|
138
|
+
end
|
139
|
+
|
140
|
+
File.open("#{tmp_path}/app_template/config/boot.rb", 'w') do |f|
|
141
|
+
f.puts 'require "action_controller/railtie"'
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/abstract_unit")
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
module ApplicationTests
|
5
|
+
class AssetsDebuggingTest < ActiveSupport::TestCase
|
6
|
+
include ActiveSupport::Testing::Isolation
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
def setup
|
10
|
+
build_app(:initializers => true)
|
11
|
+
|
12
|
+
app_file "app/assets/javascripts/application.js", "//= require_tree ."
|
13
|
+
app_file "app/assets/javascripts/xmlhr.js", "function f1() { alert(); }"
|
14
|
+
app_file "app/views/posts/index.html.erb", "<%= javascript_include_tag 'application' %>"
|
15
|
+
|
16
|
+
app_file "config/routes.rb", <<-RUBY
|
17
|
+
AppTemplate::Application.routes.draw do
|
18
|
+
get '/posts', :to => "posts#index"
|
19
|
+
end
|
20
|
+
RUBY
|
21
|
+
|
22
|
+
app_file "app/controllers/posts_controller.rb", <<-RUBY
|
23
|
+
class PostsController < ActionController::Base
|
24
|
+
end
|
25
|
+
RUBY
|
26
|
+
|
27
|
+
ENV["RAILS_ENV"] = "production"
|
28
|
+
|
29
|
+
boot_rails
|
30
|
+
end
|
31
|
+
|
32
|
+
def teardown
|
33
|
+
teardown_app
|
34
|
+
end
|
35
|
+
|
36
|
+
test "assets are concatenated when debug is off and compile is off either if debug_assets param is provided" do
|
37
|
+
# config.assets.debug and config.assets.compile are false for production environment
|
38
|
+
ENV["RAILS_ENV"] = "production"
|
39
|
+
capture(:stdout) do
|
40
|
+
Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
|
41
|
+
end
|
42
|
+
require "#{app_path}/config/environment"
|
43
|
+
|
44
|
+
class ::PostsController < ActionController::Base ; end
|
45
|
+
|
46
|
+
# the debug_assets params isn't used if compile is off
|
47
|
+
get '/posts?debug_assets=true'
|
48
|
+
assert_match(/<script src="\/assets\/application-([0-z]+)\.js"/, last_response.body)
|
49
|
+
assert_no_match(/<script src="\/assets\/xmlhr-([0-z]+)\.js"/, last_response.body)
|
50
|
+
end
|
51
|
+
|
52
|
+
test "assets aren't concatened when compile is true is on and debug_assets params is true" do
|
53
|
+
app_file "config/initializers/compile.rb", "Rails.application.config.assets.compile = true"
|
54
|
+
|
55
|
+
ENV["RAILS_ENV"] = "production"
|
56
|
+
require "#{app_path}/config/environment"
|
57
|
+
|
58
|
+
class ::PostsController < ActionController::Base ; end
|
59
|
+
|
60
|
+
get '/posts?debug_assets=true'
|
61
|
+
assert_match(/<script src="\/assets\/application-([0-z]+)\.js\?body=1"/, last_response.body)
|
62
|
+
assert_match(/<script src="\/assets\/xmlhr-([0-z]+)\.js\?body=1"/, last_response.body)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/test/assets_test.rb
ADDED
@@ -0,0 +1,542 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/abstract_unit")
|
3
|
+
require 'rack/test'
|
4
|
+
|
5
|
+
module ApplicationTests
|
6
|
+
class AssetsTest < ActiveSupport::TestCase
|
7
|
+
include ActiveSupport::Testing::Isolation
|
8
|
+
include Rack::Test::Methods
|
9
|
+
|
10
|
+
def setup
|
11
|
+
build_app(:initializers => true)
|
12
|
+
boot_rails
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
teardown_app
|
17
|
+
end
|
18
|
+
|
19
|
+
def precompile!(env = nil)
|
20
|
+
quietly do
|
21
|
+
precompile_task = "bundle exec rake assets:precompile #{env} 2>&1"
|
22
|
+
output = Dir.chdir(app_path) { %x[ #{precompile_task} ] }
|
23
|
+
assert $?.success?, output
|
24
|
+
output
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def clean_assets!
|
29
|
+
quietly do
|
30
|
+
assert Dir.chdir(app_path) { system('bundle exec rake assets:clean') }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def assert_file_exists(filename)
|
35
|
+
assert File.exists?(filename), "missing #{filename}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def assert_no_file_exists(filename)
|
39
|
+
assert !File.exists?(filename), "#{filename} does exist"
|
40
|
+
end
|
41
|
+
|
42
|
+
test "assets routes have higher priority" do
|
43
|
+
app_file "app/assets/javascripts/demo.js.erb", "a = <%= image_path('rails.png').inspect %>;"
|
44
|
+
|
45
|
+
app_file 'config/routes.rb', <<-RUBY
|
46
|
+
AppTemplate::Application.routes.draw do
|
47
|
+
get '*path', :to => lambda { |env| [200, { "Content-Type" => "text/html" }, "Not an asset"] }
|
48
|
+
end
|
49
|
+
RUBY
|
50
|
+
|
51
|
+
require "#{app_path}/config/environment"
|
52
|
+
|
53
|
+
get "/assets/demo.js"
|
54
|
+
assert_equal 'a = "/assets/rails.png";', last_response.body.strip
|
55
|
+
end
|
56
|
+
|
57
|
+
test "assets do not require compressors until it is used" do
|
58
|
+
app_file "app/assets/javascripts/demo.js.erb", "<%= :alert %>();"
|
59
|
+
add_to_env_config "production", "config.assets.compile = true"
|
60
|
+
|
61
|
+
ENV["RAILS_ENV"] = "production"
|
62
|
+
require "#{app_path}/config/environment"
|
63
|
+
|
64
|
+
assert !defined?(Uglifier)
|
65
|
+
get "/assets/demo.js"
|
66
|
+
assert_match "alert()", last_response.body
|
67
|
+
assert defined?(Uglifier)
|
68
|
+
end
|
69
|
+
|
70
|
+
test "precompile creates the file, gives it the original asset's content and run in production as default" do
|
71
|
+
app_file "app/assets/javascripts/application.js", "alert();"
|
72
|
+
app_file "app/assets/javascripts/foo/application.js", "alert();"
|
73
|
+
|
74
|
+
ENV["RAILS_ENV"] = nil
|
75
|
+
precompile!
|
76
|
+
|
77
|
+
files = Dir["#{app_path}/public/assets/application-*.js"]
|
78
|
+
files << Dir["#{app_path}/public/assets/application.js"].first
|
79
|
+
files << Dir["#{app_path}/public/assets/foo/application-*.js"].first
|
80
|
+
files << Dir["#{app_path}/public/assets/foo/application.js"].first
|
81
|
+
files.each do |file|
|
82
|
+
assert_not_nil file, "Expected application.js asset to be generated, but none found"
|
83
|
+
assert_equal "alert();", File.read(file)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
test "precompile application.js and application.css and all other non JS/CSS files" do
|
88
|
+
app_file "app/assets/javascripts/application.js", "alert();"
|
89
|
+
app_file "app/assets/stylesheets/application.css", "body{}"
|
90
|
+
|
91
|
+
app_file "app/assets/javascripts/someapplication.js", "alert();"
|
92
|
+
app_file "app/assets/stylesheets/someapplication.css", "body{}"
|
93
|
+
|
94
|
+
app_file "app/assets/javascripts/something.min.js", "alert();"
|
95
|
+
app_file "app/assets/stylesheets/something.min.css", "body{}"
|
96
|
+
|
97
|
+
app_file "app/assets/javascripts/something.else.js.erb", "alert();"
|
98
|
+
app_file "app/assets/stylesheets/something.else.css.erb", "body{}"
|
99
|
+
|
100
|
+
images_should_compile = ["a.png", "happyface.png", "happy_face.png", "happy.face.png",
|
101
|
+
"happy-face.png", "happy.happy_face.png", "happy_happy.face.png",
|
102
|
+
"happy.happy.face.png", "-happy.png", "-happy.face.png",
|
103
|
+
"_happy.face.png", "_happy.png"]
|
104
|
+
|
105
|
+
images_should_compile.each do |filename|
|
106
|
+
app_file "app/assets/images/#{filename}", "happy"
|
107
|
+
end
|
108
|
+
|
109
|
+
precompile!
|
110
|
+
|
111
|
+
images_should_compile.each do |filename|
|
112
|
+
assert_file_exists("#{app_path}/public/assets/#{filename}")
|
113
|
+
end
|
114
|
+
|
115
|
+
assert_file_exists("#{app_path}/public/assets/application.js")
|
116
|
+
assert_file_exists("#{app_path}/public/assets/application.css")
|
117
|
+
|
118
|
+
assert_no_file_exists("#{app_path}/public/assets/someapplication.js")
|
119
|
+
assert_no_file_exists("#{app_path}/public/assets/someapplication.css")
|
120
|
+
|
121
|
+
assert_no_file_exists("#{app_path}/public/assets/something.min.js")
|
122
|
+
assert_no_file_exists("#{app_path}/public/assets/something.min.css")
|
123
|
+
|
124
|
+
assert_no_file_exists("#{app_path}/public/assets/something.else.js")
|
125
|
+
assert_no_file_exists("#{app_path}/public/assets/something.else.css")
|
126
|
+
end
|
127
|
+
|
128
|
+
test "precompile something.js for directory containing index file" do
|
129
|
+
add_to_config "config.assets.precompile = [ 'something.js' ]"
|
130
|
+
app_file "app/assets/javascripts/something/index.js.erb", "alert();"
|
131
|
+
|
132
|
+
precompile!
|
133
|
+
|
134
|
+
assert_file_exists("#{app_path}/public/assets/something.js")
|
135
|
+
end
|
136
|
+
|
137
|
+
test "asset pipeline should use a Sprockets::Index when config.assets.digest is true" do
|
138
|
+
add_to_config "config.assets.digest = true"
|
139
|
+
add_to_config "config.action_controller.perform_caching = false"
|
140
|
+
|
141
|
+
ENV["RAILS_ENV"] = "production"
|
142
|
+
require "#{app_path}/config/environment"
|
143
|
+
|
144
|
+
assert_equal Sprockets::Index, Rails.application.assets.class
|
145
|
+
end
|
146
|
+
|
147
|
+
test "precompile creates a manifest file with all the assets listed" do
|
148
|
+
app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
|
149
|
+
app_file "app/assets/javascripts/application.js", "alert();"
|
150
|
+
# digest is default in false, we must enable it for test environment
|
151
|
+
add_to_config "config.assets.digest = true"
|
152
|
+
|
153
|
+
precompile!
|
154
|
+
manifest = "#{app_path}/public/assets/manifest.yml"
|
155
|
+
|
156
|
+
digests = YAML.load_file("#{app_path}/public/assets/manifest.yml")
|
157
|
+
sources = YAML.load_file("#{app_path}/public/assets/#{TurboSprockets.get_source_manifest_filename}")
|
158
|
+
|
159
|
+
assert_match(/application-([0-z]+)\.js/, digests["application.js"])
|
160
|
+
assert_match(/application-([0-z]+)\.css/, digests["application.css"])
|
161
|
+
|
162
|
+
assert_match(/[0-z]+/, sources["application.js"])
|
163
|
+
assert_match(/[0-z]+/, sources["application.css"])
|
164
|
+
end
|
165
|
+
|
166
|
+
test "the manifest file should be saved by default in the same assets folder" do
|
167
|
+
app_file "app/assets/javascripts/application.js", "alert();"
|
168
|
+
# digest is default in false, we must enable it for test environment
|
169
|
+
add_to_config "config.assets.digest = true"
|
170
|
+
add_to_config "config.assets.prefix = '/x'"
|
171
|
+
|
172
|
+
precompile!
|
173
|
+
|
174
|
+
manifest = "#{app_path}/public/x/manifest.yml"
|
175
|
+
digests = YAML.load_file(manifest)
|
176
|
+
assert_match(/application-([0-z]+)\.js/, digests["application.js"])
|
177
|
+
end
|
178
|
+
|
179
|
+
test "precompile does not append asset digests when config.assets.digest is false" do
|
180
|
+
app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
|
181
|
+
app_file "app/assets/javascripts/application.js", "alert();"
|
182
|
+
add_to_config "config.assets.digest = false"
|
183
|
+
|
184
|
+
precompile!
|
185
|
+
|
186
|
+
assert_file_exists("#{app_path}/public/assets/application.js")
|
187
|
+
assert_file_exists("#{app_path}/public/assets/application.css")
|
188
|
+
|
189
|
+
manifest = "#{app_path}/public/assets/manifest.yml"
|
190
|
+
|
191
|
+
digests = YAML.load_file(manifest)
|
192
|
+
assert_equal "application.js", digests["application.js"]
|
193
|
+
assert_equal "application.css", digests["application.css"]
|
194
|
+
end
|
195
|
+
|
196
|
+
test "assets do not require any assets group gem when manifest file is present" do
|
197
|
+
app_file "app/assets/javascripts/application.js", "alert();"
|
198
|
+
add_to_env_config "production", "config.serve_static_assets = true"
|
199
|
+
|
200
|
+
ENV["RAILS_ENV"] = "production"
|
201
|
+
precompile!
|
202
|
+
|
203
|
+
manifest = "#{app_path}/public/assets/manifest.yml"
|
204
|
+
digests = YAML.load_file(manifest)
|
205
|
+
asset_path = digests["application.js"]
|
206
|
+
|
207
|
+
require "#{app_path}/config/environment"
|
208
|
+
|
209
|
+
# Checking if Uglifier is defined we can know if Sprockets was reached or not
|
210
|
+
assert !defined?(Uglifier)
|
211
|
+
get "/assets/#{asset_path}"
|
212
|
+
assert_match "alert()", last_response.body
|
213
|
+
assert !defined?(Uglifier)
|
214
|
+
end
|
215
|
+
|
216
|
+
test "assets raise AssetNotPrecompiledError when manifest file is present and requested file isn't precompiled" do
|
217
|
+
app_file "app/views/posts/index.html.erb", "<%= javascript_include_tag 'app' %>"
|
218
|
+
|
219
|
+
app_file "config/routes.rb", <<-RUBY
|
220
|
+
AppTemplate::Application.routes.draw do
|
221
|
+
get '/posts', :to => "posts#index"
|
222
|
+
end
|
223
|
+
RUBY
|
224
|
+
|
225
|
+
ENV["RAILS_ENV"] = "production"
|
226
|
+
precompile!
|
227
|
+
|
228
|
+
# Create file after of precompile
|
229
|
+
app_file "app/assets/javascripts/app.js", "alert();"
|
230
|
+
|
231
|
+
require "#{app_path}/config/environment"
|
232
|
+
class ::PostsController < ActionController::Base
|
233
|
+
def show_detailed_exceptions?() true end
|
234
|
+
end
|
235
|
+
|
236
|
+
get '/posts'
|
237
|
+
assert_match(/AssetNotPrecompiledError/, last_response.body)
|
238
|
+
end
|
239
|
+
|
240
|
+
test "assets raise AssetNotPrecompiledError when manifest file is present and requested file isn't precompiled if digest is disabled" do
|
241
|
+
app_file "app/views/posts/index.html.erb", "<%= javascript_include_tag 'app' %>"
|
242
|
+
add_to_config "config.assets.compile = false"
|
243
|
+
add_to_config "config.assets.digests = false"
|
244
|
+
|
245
|
+
app_file "config/routes.rb", <<-RUBY
|
246
|
+
AppTemplate::Application.routes.draw do
|
247
|
+
get '/posts', :to => "posts#index"
|
248
|
+
end
|
249
|
+
RUBY
|
250
|
+
|
251
|
+
ENV["RAILS_ENV"] = "production"
|
252
|
+
precompile!
|
253
|
+
|
254
|
+
# Create file after of precompile
|
255
|
+
app_file "app/assets/javascripts/app.js", "alert();"
|
256
|
+
|
257
|
+
require "#{app_path}/config/environment"
|
258
|
+
class ::PostsController < ActionController::Base
|
259
|
+
def show_detailed_exceptions?() true end
|
260
|
+
end
|
261
|
+
|
262
|
+
get '/posts'
|
263
|
+
assert_match(/AssetNotPrecompiledError/, last_response.body)
|
264
|
+
end
|
265
|
+
|
266
|
+
test "precompile properly refers files referenced with asset_path and and run in the provided RAILS_ENV" do
|
267
|
+
app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
|
268
|
+
# digest is default in false, we must enable it for test environment
|
269
|
+
add_to_env_config "test", "config.assets.digest = true"
|
270
|
+
|
271
|
+
precompile!('RAILS_ENV=test')
|
272
|
+
|
273
|
+
file = Dir["#{app_path}/public/assets/application.css"].first
|
274
|
+
assert_match(/\/assets\/rails\.png/, File.read(file))
|
275
|
+
file = Dir["#{app_path}/public/assets/application-*.css"].first
|
276
|
+
assert_match(/\/assets\/rails-([0-z]+)\.png/, File.read(file))
|
277
|
+
end
|
278
|
+
|
279
|
+
test "precompile shouldn't use the digests present in manifest.yml" do
|
280
|
+
app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
|
281
|
+
|
282
|
+
ENV["RAILS_ENV"] = "production"
|
283
|
+
precompile!
|
284
|
+
|
285
|
+
manifest = "#{app_path}/public/assets/manifest.yml"
|
286
|
+
assets = YAML.load_file(manifest)
|
287
|
+
asset_path = assets["application.css"]
|
288
|
+
|
289
|
+
app_file "app/assets/images/rails.png", "image changed"
|
290
|
+
|
291
|
+
precompile!
|
292
|
+
digests = YAML.load_file(manifest)
|
293
|
+
|
294
|
+
assert_not_equal asset_path, digests["application.css"]
|
295
|
+
end
|
296
|
+
|
297
|
+
test "precompile appends the md5 hash to files referenced with asset_path and run in production as default even using RAILS_GROUPS=assets" do
|
298
|
+
app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
|
299
|
+
add_to_config "config.assets.compile = true"
|
300
|
+
|
301
|
+
ENV["RAILS_ENV"] = nil
|
302
|
+
|
303
|
+
precompile!('RAILS_GROUPS=assets')
|
304
|
+
|
305
|
+
file = Dir["#{app_path}/public/assets/application-*.css"].first
|
306
|
+
assert_match(/\/assets\/rails-([0-z]+)\.png/, File.read(file))
|
307
|
+
end
|
308
|
+
|
309
|
+
test "precompile should handle utf8 filenames" do
|
310
|
+
filename = "レイルズ.png"
|
311
|
+
app_file "app/assets/images/#{filename}", "not a image really"
|
312
|
+
add_to_config "config.assets.precompile = [ /\.png$/, /application.(css|js)$/ ]"
|
313
|
+
|
314
|
+
precompile!
|
315
|
+
require "#{app_path}/config/environment"
|
316
|
+
|
317
|
+
get "/assets/#{URI.parser.escape(filename)}"
|
318
|
+
assert_match "not a image really", last_response.body
|
319
|
+
assert_file_exists("#{app_path}/public/assets/#{filename}")
|
320
|
+
end
|
321
|
+
|
322
|
+
test "assets are cleaned up properly" do
|
323
|
+
app_file "public/assets/application.js", "alert();"
|
324
|
+
app_file "public/assets/application.css", "a { color: green; }"
|
325
|
+
app_file "public/assets/subdir/broken.png", "not really an image file"
|
326
|
+
|
327
|
+
clean_assets!
|
328
|
+
|
329
|
+
files = Dir["#{app_path}/public/assets/**/*", "#{app_path}/tmp/cache/assets/*"]
|
330
|
+
assert_equal 0, files.length, "Expected no assets, but found #{files.join(', ')}"
|
331
|
+
end
|
332
|
+
|
333
|
+
test "assets routes are not drawn when compilation is disabled" do
|
334
|
+
app_file "app/assets/javascripts/demo.js.erb", "<%= :alert %>();"
|
335
|
+
add_to_config "config.assets.compile = false"
|
336
|
+
|
337
|
+
ENV["RAILS_ENV"] = "production"
|
338
|
+
require "#{app_path}/config/environment"
|
339
|
+
|
340
|
+
get "/assets/demo.js"
|
341
|
+
assert_equal 404, last_response.status
|
342
|
+
end
|
343
|
+
|
344
|
+
test "does not stream session cookies back" do
|
345
|
+
app_file "app/assets/javascripts/demo.js.erb", "<%= :alert %>();"
|
346
|
+
|
347
|
+
app_file "config/routes.rb", <<-RUBY
|
348
|
+
AppTemplate::Application.routes.draw do
|
349
|
+
get '/omg', :to => "omg#index"
|
350
|
+
end
|
351
|
+
RUBY
|
352
|
+
|
353
|
+
require "#{app_path}/config/environment"
|
354
|
+
|
355
|
+
class ::OmgController < ActionController::Base
|
356
|
+
def index
|
357
|
+
flash[:cool_story] = true
|
358
|
+
render :text => "ok"
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
get "/omg"
|
363
|
+
assert_equal 'ok', last_response.body
|
364
|
+
|
365
|
+
get "/assets/demo.js"
|
366
|
+
assert_match "alert()", last_response.body
|
367
|
+
assert_equal nil, last_response.headers["Set-Cookie"]
|
368
|
+
end
|
369
|
+
|
370
|
+
test "files in any assets/ directories are not added to Sprockets" do
|
371
|
+
%w[app lib vendor].each do |dir|
|
372
|
+
app_file "#{dir}/assets/#{dir}_test.erb", "testing"
|
373
|
+
end
|
374
|
+
|
375
|
+
app_file "app/assets/javascripts/demo.js", "alert();"
|
376
|
+
|
377
|
+
require "#{app_path}/config/environment"
|
378
|
+
|
379
|
+
get "/assets/demo.js"
|
380
|
+
assert_match "alert();", last_response.body
|
381
|
+
assert_equal 200, last_response.status
|
382
|
+
end
|
383
|
+
|
384
|
+
test "assets are concatenated when debug is off and compile is off either if debug_assets param is provided" do
|
385
|
+
app_with_assets_in_view
|
386
|
+
|
387
|
+
# config.assets.debug and config.assets.compile are false for production environment
|
388
|
+
ENV["RAILS_ENV"] = "production"
|
389
|
+
precompile!
|
390
|
+
|
391
|
+
require "#{app_path}/config/environment"
|
392
|
+
|
393
|
+
class ::PostsController < ActionController::Base ; end
|
394
|
+
|
395
|
+
# the debug_assets params isn't used if compile is off
|
396
|
+
get '/posts?debug_assets=true'
|
397
|
+
assert_match(/<script src="\/assets\/application-([0-z]+)\.js"/, last_response.body)
|
398
|
+
assert_no_match(/<script src="\/assets\/xmlhr-([0-z]+)\.js"/, last_response.body)
|
399
|
+
end
|
400
|
+
|
401
|
+
test "assets aren't concatenated when compile is on and debug_assets params is true" do
|
402
|
+
app_with_assets_in_view
|
403
|
+
add_to_env_config "production", "config.assets.compile = true"
|
404
|
+
add_to_env_config "production", "config.assets.allow_debugging = true"
|
405
|
+
|
406
|
+
ENV["RAILS_ENV"] = "production"
|
407
|
+
require "#{app_path}/config/environment"
|
408
|
+
|
409
|
+
class ::PostsController < ActionController::Base ; end
|
410
|
+
|
411
|
+
get '/posts?debug_assets=true'
|
412
|
+
assert_match(/<script src="\/assets\/application-([0-z]+)\.js\?body=1"/, last_response.body)
|
413
|
+
assert_match(/<script src="\/assets\/xmlhr-([0-z]+)\.js\?body=1"/, last_response.body)
|
414
|
+
end
|
415
|
+
|
416
|
+
test "assets can access model information when precompiling" do
|
417
|
+
app_file "app/models/post.rb", "class Post; end"
|
418
|
+
app_file "app/assets/javascripts/application.js", "//= require_tree ."
|
419
|
+
app_file "app/assets/javascripts/xmlhr.js.erb", "<%= Post.name %>"
|
420
|
+
|
421
|
+
add_to_config "config.assets.digest = false"
|
422
|
+
precompile!
|
423
|
+
assert_equal "Post;\n", File.read("#{app_path}/public/assets/application.js")
|
424
|
+
end
|
425
|
+
|
426
|
+
test "assets can't access model information when precompiling if not initializing the app" do
|
427
|
+
app_file "app/models/post.rb", "class Post; end"
|
428
|
+
app_file "app/assets/javascripts/application.js", "//= require_tree ."
|
429
|
+
app_file "app/assets/javascripts/xmlhr.js.erb", "<%= defined?(Post) || :NoPost %>"
|
430
|
+
|
431
|
+
add_to_config "config.assets.digest = false"
|
432
|
+
add_to_config "config.assets.initialize_on_precompile = false"
|
433
|
+
|
434
|
+
precompile!
|
435
|
+
assert_equal "NoPost;\n", File.read("#{app_path}/public/assets/application.js")
|
436
|
+
end
|
437
|
+
|
438
|
+
test "initialization on the assets group should set assets_dir" do
|
439
|
+
require "#{app_path}/config/application"
|
440
|
+
Rails.application.initialize!(:assets)
|
441
|
+
assert_not_nil Rails.application.config.action_controller.assets_dir
|
442
|
+
end
|
443
|
+
|
444
|
+
test "enhancements to assets:precompile should only run once" do
|
445
|
+
app_file "lib/tasks/enhance.rake", "Rake::Task['assets:precompile'].enhance { puts 'enhancement' }"
|
446
|
+
output = precompile!
|
447
|
+
assert_equal 1, output.scan("enhancement").size
|
448
|
+
end
|
449
|
+
|
450
|
+
test "digested assets are not mistakenly removed" do
|
451
|
+
app_file "app/assets/application.js", "alert();"
|
452
|
+
add_to_config "config.assets.compile = true"
|
453
|
+
add_to_config "config.assets.digest = true"
|
454
|
+
|
455
|
+
precompile!
|
456
|
+
|
457
|
+
files = Dir["#{app_path}/public/assets/application-*.js"]
|
458
|
+
assert_equal 1, files.length, "Expected digested application.js asset to be generated, but none found"
|
459
|
+
end
|
460
|
+
|
461
|
+
test "digested assets are removed from configured path" do
|
462
|
+
app_file "public/production_assets/application.js", "alert();"
|
463
|
+
add_to_env_config "production", "config.assets.prefix = 'production_assets'"
|
464
|
+
|
465
|
+
ENV["RAILS_ENV"] = nil
|
466
|
+
|
467
|
+
clean_assets!
|
468
|
+
|
469
|
+
files = Dir["#{app_path}/public/production_assets/application.js"]
|
470
|
+
assert_equal 0, files.length, "Expected application.js asset to be removed, but still exists"
|
471
|
+
end
|
472
|
+
|
473
|
+
test "asset urls should use the request's protocol by default" do
|
474
|
+
app_with_assets_in_view
|
475
|
+
add_to_config "config.asset_host = 'example.com'"
|
476
|
+
require "#{app_path}/config/environment"
|
477
|
+
class ::PostsController < ActionController::Base; end
|
478
|
+
|
479
|
+
get '/posts', {}, {'HTTPS'=>'off'}
|
480
|
+
assert_match('src="http://example.com/assets/application.js', last_response.body)
|
481
|
+
get '/posts', {}, {'HTTPS'=>'on'}
|
482
|
+
assert_match('src="https://example.com/assets/application.js', last_response.body)
|
483
|
+
end
|
484
|
+
|
485
|
+
test "asset urls should be protocol-relative if no request is in scope" do
|
486
|
+
app_file "app/assets/javascripts/image_loader.js.erb", 'var src="<%= image_path("rails.png") %>";'
|
487
|
+
add_to_config "config.assets.precompile = %w{image_loader.js}"
|
488
|
+
add_to_config "config.asset_host = 'example.com'"
|
489
|
+
precompile!
|
490
|
+
|
491
|
+
assert_match 'src="//example.com/assets/rails.png"', File.read("#{app_path}/public/assets/image_loader.js")
|
492
|
+
end
|
493
|
+
|
494
|
+
test "asset paths should use RAILS_RELATIVE_URL_ROOT by default" do
|
495
|
+
ENV["RAILS_RELATIVE_URL_ROOT"] = "/sub/uri"
|
496
|
+
|
497
|
+
app_file "app/assets/javascripts/app.js.erb", 'var src="<%= image_path("rails.png") %>";'
|
498
|
+
add_to_config "config.assets.precompile = %w{app.js}"
|
499
|
+
precompile!
|
500
|
+
|
501
|
+
assert_match 'src="/sub/uri/assets/rails.png"', File.read("#{app_path}/public/assets/app.js")
|
502
|
+
end
|
503
|
+
|
504
|
+
test "html assets are compiled when executing precompile" do
|
505
|
+
app_file "app/assets/pages/page.html.erb", "<%= javascript_include_tag :application %>"
|
506
|
+
ENV["RAILS_ENV"] = "production"
|
507
|
+
ENV["RAILS_GROUP"] = "assets"
|
508
|
+
|
509
|
+
quietly do
|
510
|
+
Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
|
511
|
+
end
|
512
|
+
|
513
|
+
assert_file_exists("#{app_path}/public/assets/page.html")
|
514
|
+
end
|
515
|
+
|
516
|
+
test "assets:cache:clean should clean cache" do
|
517
|
+
ENV["RAILS_ENV"] = "production"
|
518
|
+
precompile!
|
519
|
+
|
520
|
+
quietly do
|
521
|
+
Dir.chdir(app_path){ `bundle exec rake assets:cache:clean` }
|
522
|
+
end
|
523
|
+
|
524
|
+
require "#{app_path}/config/environment"
|
525
|
+
assert_equal 0, Dir.entries(Rails.application.assets.cache.cache_path).size - 2 # reject [".", ".."]
|
526
|
+
end
|
527
|
+
|
528
|
+
private
|
529
|
+
|
530
|
+
def app_with_assets_in_view
|
531
|
+
app_file "app/assets/javascripts/application.js", "//= require_tree ."
|
532
|
+
app_file "app/assets/javascripts/xmlhr.js", "function f1() { alert(); }"
|
533
|
+
app_file "app/views/posts/index.html.erb", "<%= javascript_include_tag 'application' %>"
|
534
|
+
|
535
|
+
app_file "config/routes.rb", <<-RUBY
|
536
|
+
AppTemplate::Application.routes.draw do
|
537
|
+
get '/posts', :to => "posts#index"
|
538
|
+
end
|
539
|
+
RUBY
|
540
|
+
end
|
541
|
+
end
|
542
|
+
end
|