asset_hat 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/HISTORY +13 -14
  2. data/README.rdoc +171 -0
  3. data/Rakefile +24 -2
  4. data/VERSION.yml +3 -3
  5. data/app/helpers/asset_hat_helper.rb +67 -61
  6. data/asset_hat.gemspec +42 -8
  7. data/doc/classes/AssetHat/CSS/Engines.html +118 -0
  8. data/doc/classes/AssetHat/CSS.html +194 -0
  9. data/doc/classes/AssetHat/JS/Engines.html +122 -0
  10. data/doc/classes/AssetHat/JS/Vendors.html +110 -0
  11. data/doc/classes/AssetHat/JS.html +151 -0
  12. data/doc/classes/AssetHat.html +446 -0
  13. data/doc/classes/AssetHatHelper.html +161 -0
  14. data/doc/created.rid +1 -0
  15. data/doc/files/HISTORY.html +116 -0
  16. data/doc/files/LICENSE.html +76 -0
  17. data/doc/files/README_rdoc.html +234 -0
  18. data/doc/files/app/helpers/asset_hat_helper_rb.html +55 -0
  19. data/doc/files/lib/asset_hat/capistrano_rb.html +49 -0
  20. data/doc/files/lib/asset_hat/css_rb.html +57 -0
  21. data/doc/files/lib/asset_hat/js/vendors_rb.html +49 -0
  22. data/doc/files/lib/asset_hat/js_rb.html +57 -0
  23. data/doc/files/lib/asset_hat/tasks/css_rb.html +49 -0
  24. data/doc/files/lib/asset_hat/tasks/js_rb.html +49 -0
  25. data/doc/files/lib/asset_hat/tasks_rb.html +58 -0
  26. data/doc/files/lib/asset_hat/vcs_rb.html +49 -0
  27. data/doc/files/lib/asset_hat/version_rb.html +49 -0
  28. data/doc/files/lib/asset_hat_rb.html +49 -0
  29. data/doc/fr_class_index.html +23 -0
  30. data/doc/fr_file_index.html +33 -0
  31. data/doc/fr_method_index.html +4455 -0
  32. data/doc/index.html +15 -0
  33. data/doc/rdoc-style.css +328 -0
  34. data/lib/asset_hat/capistrano.rb +14 -0
  35. data/lib/asset_hat/css.rb +40 -10
  36. data/lib/asset_hat/js/vendors.rb +85 -0
  37. data/lib/asset_hat/js.rb +28 -29
  38. data/lib/asset_hat/tasks/css.rb +151 -0
  39. data/lib/asset_hat/tasks/js.rb +100 -0
  40. data/lib/asset_hat/tasks.rb +4 -272
  41. data/lib/asset_hat/vcs.rb +23 -20
  42. data/lib/asset_hat/version.rb +2 -0
  43. data/lib/asset_hat.rb +94 -19
  44. data/tasks/asset_hat.rake +1 -1
  45. data/test/asset_hat_helper_test.rb +63 -9
  46. data/test/test_helper.rb +5 -1
  47. metadata +94 -26
  48. data/README.markdown +0 -154
data/lib/asset_hat.rb CHANGED
@@ -2,19 +2,66 @@
2
2
  require File.join(File.dirname(__FILE__), 'asset_hat', x)
3
3
  end
4
4
 
5
+ # Your assets are covered.
6
+ #
7
+ # With Rails' default asset caching, CSS and JS are concatenated (not even
8
+ # minified) the first time that bundle is requested. Not good enough. AssetHat
9
+ # can automatically:
10
+ #
11
+ # * Easily *minify* and *bundle* CSS and JS on deploy to reduce file sizes and
12
+ # HTTP requests.
13
+ # * Load popular <strong>third-party JS</strong> (like jQuery and Prototype)
14
+ # from {<strong>Google's CDN</strong>}[http://code.google.com/apis/ajaxlibs/]
15
+ # when in production, or from localhost in development.
16
+ # * Force image URLs in your CSS to use <strong>CDN subdomains</strong>, not
17
+ # just the current host.
18
+ # * Add an image's last Git[http://git-scm.com/] commit ID to its CSS URLs to
19
+ # <strong>bust browser caches</strong> (e.g.,
20
+ # <code>/images/foo.png?ab12cd34e</code>).
21
+ #
22
+ # After setup, you can use these in your layouts and views:
23
+ #
24
+ # <%= include_css :bundle => 'application' %>
25
+ # # => <link href="/stylesheets/bundles/application.min.css"
26
+ # # media="screen,projection" rel="stylesheet" type="text/css" />
27
+ #
28
+ # <%= include_js :bundles => ['plugins', 'common'] %>
29
+ # # => <script src="/javascripts/bundles/plugins.min.js"
30
+ # # type="text/javascript"></script>
31
+ # # <script src="/javascripts/bundles/common.min.js"
32
+ # # type="text/javascript"></script>
33
+ #
34
+ # And this in your deploy script:
35
+ #
36
+ # rake asset_hat:minify
37
+ #
38
+ # See README.rdoc for more.
5
39
  module AssetHat
6
- RAILS_ROOT = File.join(File.dirname(__FILE__), '..') unless defined?(RAILS_ROOT)
7
- TYPES = [:css, :js]
8
- ASSETS_DIR = defined?(Rails.public_path) ? Rails.public_path : 'public'
9
- JAVASCRIPTS_DIR = "#{ASSETS_DIR}/javascripts"
40
+ RAILS_ROOT = File.join(File.dirname(__FILE__), '..') unless defined?(RAILS_ROOT) #:nodoc:
41
+
42
+ # Types of supported assets; currently <code>[:css, :js]</code>.
43
+ TYPES = [:css, :js]
44
+
45
+ # Base directory in which all assets are kept, e.g., 'public/'.
46
+ ASSETS_DIR = defined?(Rails.public_path) ? Rails.public_path : 'public'
47
+
48
+ # Directory in which all stylesheets are kept, e.g., 'public/stylesheets/'.
10
49
  STYLESHEETS_DIR = "#{ASSETS_DIR}/stylesheets"
50
+
51
+ # Directory in which all JavaScripts are kept, e.g., 'public/javascripts/'.
52
+ JAVASCRIPTS_DIR = "#{ASSETS_DIR}/javascripts"
53
+
54
+ # Relative path for the config file.
11
55
  RELATIVE_CONFIG_FILEPATH = File.join('config', 'assets.yml')
56
+
57
+ # Absolute path for the config file.
12
58
  CONFIG_FILEPATH = File.join(RAILS_ROOT, RELATIVE_CONFIG_FILEPATH)
13
59
 
14
60
  class << self
15
- attr_accessor :config, :asset_exists, :html_cache
61
+ attr_accessor :config, :asset_exists, :html_cache #:nodoc:
16
62
  end
17
63
 
64
+ # Nested-hash version of <code>config/assets.yml</code>.
18
65
  def self.config
19
66
  if !cache? || @config.blank?
20
67
  @config = YAML.load(File.open(CONFIG_FILEPATH, 'r'))
@@ -22,6 +69,9 @@ module AssetHat
22
69
  @config
23
70
  end
24
71
 
72
+ # Argument: <code>:css</code> or <code>:js</code>
73
+ #
74
+ # Returns the path to the directory where CSS or JS files are stored.
25
75
  def self.assets_dir(type)
26
76
  case type.to_sym
27
77
  when :css ; STYLESHEETS_DIR
@@ -30,6 +80,15 @@ module AssetHat
30
80
  end
31
81
  end
32
82
 
83
+ # Returns true if the specified asset exists in the file system:
84
+ #
85
+ # AssetHat.asset_exists?('application', :css)
86
+ # # => true if /public/stylesheets/application.css exists
87
+ # AssetHat.asset_exists?('some-plugin', :js)
88
+ # # => true if /public/javascripts/some-plugin.js exists
89
+ #
90
+ # See also <code>AssetHat::STYLESHEETS_DIR</code> and
91
+ # <code>AssetHat::JAVASCRIPTS_DIR</code>.
33
92
  def self.asset_exists?(filename, type)
34
93
  # Process arguments
35
94
  type = type.to_sym
@@ -48,20 +107,31 @@ module AssetHat
48
107
  @asset_exists[type][filename]
49
108
  end
50
109
 
110
+ # Returns <code>true</code> if bundles should be included as single minified
111
+ # files (e.g., in production), or <code>false</code> if bundles should be
112
+ # included as separate, unminified files (e.g., in development). To modify
113
+ # this value, set <code>config.action_controller.perform_caching = true</code>
114
+ # in your environment.
51
115
  def self.cache? ; ActionController::Base.perform_caching ; end
52
116
 
117
+ # Returns the expected path for the minified version of an asset:
118
+ #
119
+ # AssetHat.min_filepath('public/stylesheets/bundles/application.css', 'css')
120
+ # # => 'public/stylesheets/bundles/application.min.css'
121
+ #
122
+ # See also <code>AssetHat::CSS.min_filepath</code> and
123
+ # <code>AssetHat::JS.min_filepath</code>.
53
124
  def self.min_filepath(filepath, extension)
54
125
  filepath.sub(/([^\.]*).#{extension}$/, "\\1.min.#{extension}")
55
126
  end
56
127
 
128
+ # Returns the extension-less names of files in the given bundle:
129
+ #
130
+ # AssetHat.bundle_filenames('application', :css)
131
+ # # => ['reset', 'application', 'clearfix']
132
+ # AssetHat.bundle_filenames('non-existent-file', :css)
133
+ # # => nil
57
134
  def self.bundle_filenames(bundle, type)
58
- # Usage:
59
- #
60
- # AssetHat.bundle_filenames('application', :css)
61
- # # => ['reset', 'application', 'clearfix']
62
- # AssetHat.bundle_filenames('non-existent-file', :css)
63
- # # => nil
64
-
65
135
  # Process arguments
66
136
  unless TYPES.include?(type.to_sym)
67
137
  raise "Unknown type \"#{type}\"; should be one of: #{TYPES.join(', ')}."
@@ -71,14 +141,15 @@ module AssetHat
71
141
  self.config[type.to_s]['bundles'][bundle] rescue nil
72
142
  end
73
143
 
144
+ # Returns the full paths of files in the given bundle:
145
+ #
146
+ # AssetHat.bundle_filenames('application', :css)
147
+ # # => ['/path/to/app/public/stylesheets/reset.css',
148
+ # '/path/to/app/public/stylesheets/application.css',
149
+ # '/path/to/app/public/stylesheets/clearfix.css']
150
+ # AssetHat.bundle_filenames('non-existent-file', :css)
151
+ # # => nil
74
152
  def self.bundle_filepaths(bundle, type)
75
- # Usage:
76
- #
77
- # AssetHat.bundle_filenames('application', :css)
78
- # # => ['reset', 'application', 'clearfix']
79
- # AssetHat.bundle_filenames('non-existent-file', :css)
80
- # # => nil
81
-
82
153
  # Process arguments
83
154
  unless TYPES.include?(type.to_sym)
84
155
  raise "Unknown type \"#{type}\"; should be one of: #{TYPES.join(', ')}."
@@ -91,4 +162,8 @@ module AssetHat
91
162
  filenames.map { |fn| File.join(dir, "#{fn}.#{type}") } : nil
92
163
  end
93
164
 
165
+ def self.clear_html_cache
166
+ html_cache = {}
167
+ end
168
+
94
169
  end
data/tasks/asset_hat.rake CHANGED
@@ -1 +1 @@
1
- require File.join(File.dirname(__FILE__), %w[.. lib asset_hat tasks])
1
+ require 'asset_hat/tasks'
@@ -124,20 +124,74 @@ class AssetHatHelperTest < ActionView::TestCase
124
124
  assert_equal js_tag("jquery.some-plugin.min.js?#{@commit_id}"), output
125
125
  end
126
126
 
127
- should 'include jQuery' do
128
- version = AssetHat::JS::Vendors::JQUERY_DEFAULT_VERSION
129
- output = include_js(:jquery, :cache => true)
130
- assert_equal(
131
- js_tag("jquery-#{version}.min.js?#{@commit_id}"), output)
132
- end
133
-
134
- should 'include jQuery by version' do
135
- version = '1.3.2'
127
+ context 'with vendors' do
128
+ should 'know where to find each vendor file' do
129
+ AssetHat::JS::VENDORS.each do |vendor|
130
+ assert include_js(vendor, :cache => true).present?
131
+ end
132
+ end
133
+
134
+ should 'include jQuery and jQuery UI' do
135
+ flexmock(AssetHat).should_receive(:config => @original_config)
136
+ [:jquery, :jquery_ui].each do |vendor|
137
+ output = include_js(vendor, :cache => true)
138
+ assert_equal js_tag("#{vendor.to_s.dasherize}.min.js?#{@commit_id}"), output
139
+ end
140
+ end
141
+
142
+ should 'include Prototype and script.aculo.us' do
143
+ [:prototype, :scriptaculous].each do |vendor|
144
+ output = include_js(vendor, :cache => true)
145
+ assert_equal js_tag("#{vendor}.js?#{@commit_id}"), output
146
+ # N.B.: Including only the regular, not minified, version
147
+ end
148
+ end
149
+ end # context 'with vendor JS'
150
+
151
+ should 'include jQuery by version via helper option' do
152
+ version = '1.4.1'
136
153
  output = include_js(:jquery, :version => version, :cache => true)
137
154
  assert_equal(
138
155
  js_tag("jquery-#{version}.min.js?#{@commit_id}"), output)
139
156
  end
140
157
 
158
+ context 'with a mock config' do
159
+ setup do
160
+ version = '1.4.1'
161
+ config = AssetHat.config
162
+ config['js']['vendors'] = {
163
+ 'jquery' => {
164
+ 'version' => version,
165
+ 'remote_url' => 'http://example.com/cdn/jquery.min.js'
166
+ }
167
+ }
168
+ flexmock(AssetHat).should_receive(:config => config)
169
+ end
170
+
171
+ should 'include jQuery by version via config file' do
172
+ version = AssetHat.config['js']['vendors']['jquery']['version']
173
+ assert_equal(
174
+ js_tag("jquery-#{version}.min.js?#{@commit_id}"),
175
+ include_js(:jquery, :cache => true)
176
+ )
177
+ end
178
+
179
+ context 'with remote requests' do
180
+ setup do
181
+ flexmock(ActionController::Base).should_receive(
182
+ :consider_all_requests_local => false)
183
+ end
184
+
185
+ should 'use specified remote URL for jQuery' do
186
+ src = AssetHat.config['js']['vendors']['jquery']['remote_url']
187
+ assert_equal(
188
+ %Q{<script src="#{src}" type="text/javascript"></script>},
189
+ include_js(:jquery, :cache => true)
190
+ )
191
+ end
192
+ end # context 'with remote requests'
193
+ end # context 'with a mock config'
194
+
141
195
  should 'include multiple files by name' do
142
196
  flexmock(AssetHat).should_receive(:asset_exists?).and_return(true)
143
197
  expected = %w[foo jquery.bar].map do |source|
data/test/test_helper.rb CHANGED
@@ -22,10 +22,14 @@ unless defined?(Rails)
22
22
  end
23
23
  end
24
24
 
25
+ @original_config = AssetHat.config
26
+ # Use this when FlexMock refuses to teardown automatically. (Yes,
27
+ # this is ugly.)
28
+
25
29
  class ActionView::TestCase
26
30
  teardown :clear_html_cache
27
31
 
28
32
  def clear_html_cache
29
- AssetHat.html_cache = {}
33
+ AssetHat.clear_html_cache
30
34
  end
31
35
  end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asset_hat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Ron DeVera
@@ -10,49 +15,79 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2010-03-11 00:00:00 -05:00
18
+ date: 2010-06-10 00:00:00 -04:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
17
- name: shoulda
18
- type: :development
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
22
+ name: flexmock
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
21
25
  requirements:
22
26
  - - ">="
23
27
  - !ruby/object:Gem::Version
24
- version: 2.10.2
25
- version:
28
+ segments:
29
+ - 0
30
+ - 8
31
+ - 6
32
+ version: 0.8.6
33
+ type: :development
34
+ version_requirements: *id001
26
35
  - !ruby/object:Gem::Dependency
27
- name: flexmock
36
+ name: hanna
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ - 1
45
+ - 12
46
+ version: 0.1.12
28
47
  type: :development
29
- version_requirement:
30
- version_requirements: !ruby/object:Gem::Requirement
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: shoulda
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
31
53
  requirements:
32
54
  - - ">="
33
55
  - !ruby/object:Gem::Version
34
- version: 0.8.6
35
- version:
56
+ segments:
57
+ - 2
58
+ - 10
59
+ - 2
60
+ version: 2.10.2
61
+ type: :development
62
+ version_requirements: *id003
36
63
  - !ruby/object:Gem::Dependency
37
64
  name: cssmin
38
- type: :runtime
39
- version_requirement:
40
- version_requirements: !ruby/object:Gem::Requirement
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
41
67
  requirements:
42
68
  - - ">="
43
69
  - !ruby/object:Gem::Version
70
+ segments:
71
+ - 1
72
+ - 0
73
+ - 2
44
74
  version: 1.0.2
45
- version:
75
+ type: :runtime
76
+ version_requirements: *id004
46
77
  - !ruby/object:Gem::Dependency
47
78
  name: jsmin
48
- type: :runtime
49
- version_requirement:
50
- version_requirements: !ruby/object:Gem::Requirement
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
51
81
  requirements:
52
82
  - - ">="
53
83
  - !ruby/object:Gem::Version
84
+ segments:
85
+ - 1
86
+ - 0
87
+ - 1
54
88
  version: 1.0.1
55
- version:
89
+ type: :runtime
90
+ version_requirements: *id005
56
91
  description: Minify, bundle, and optimize CSS/JS assets.
57
92
  email: ronald.devera@gmail.com
58
93
  executables: []
@@ -61,21 +96,52 @@ extensions: []
61
96
 
62
97
  extra_rdoc_files:
63
98
  - LICENSE
64
- - README.markdown
99
+ - README.rdoc
65
100
  files:
66
101
  - .gitignore
67
102
  - HISTORY
68
103
  - LICENSE
69
- - README.markdown
104
+ - README.rdoc
70
105
  - Rakefile
71
106
  - VERSION.yml
72
107
  - app/helpers/asset_hat_helper.rb
73
108
  - asset_hat.gemspec
74
109
  - config/assets.yml
110
+ - doc/classes/AssetHat.html
111
+ - doc/classes/AssetHat/CSS.html
112
+ - doc/classes/AssetHat/CSS/Engines.html
113
+ - doc/classes/AssetHat/JS.html
114
+ - doc/classes/AssetHat/JS/Engines.html
115
+ - doc/classes/AssetHat/JS/Vendors.html
116
+ - doc/classes/AssetHatHelper.html
117
+ - doc/created.rid
118
+ - doc/files/HISTORY.html
119
+ - doc/files/LICENSE.html
120
+ - doc/files/README_rdoc.html
121
+ - doc/files/app/helpers/asset_hat_helper_rb.html
122
+ - doc/files/lib/asset_hat/capistrano_rb.html
123
+ - doc/files/lib/asset_hat/css_rb.html
124
+ - doc/files/lib/asset_hat/js/vendors_rb.html
125
+ - doc/files/lib/asset_hat/js_rb.html
126
+ - doc/files/lib/asset_hat/tasks/css_rb.html
127
+ - doc/files/lib/asset_hat/tasks/js_rb.html
128
+ - doc/files/lib/asset_hat/tasks_rb.html
129
+ - doc/files/lib/asset_hat/vcs_rb.html
130
+ - doc/files/lib/asset_hat/version_rb.html
131
+ - doc/files/lib/asset_hat_rb.html
132
+ - doc/fr_class_index.html
133
+ - doc/fr_file_index.html
134
+ - doc/fr_method_index.html
135
+ - doc/index.html
136
+ - doc/rdoc-style.css
75
137
  - lib/asset_hat.rb
138
+ - lib/asset_hat/capistrano.rb
76
139
  - lib/asset_hat/css.rb
77
140
  - lib/asset_hat/js.rb
141
+ - lib/asset_hat/js/vendors.rb
78
142
  - lib/asset_hat/tasks.rb
143
+ - lib/asset_hat/tasks/css.rb
144
+ - lib/asset_hat/tasks/js.rb
79
145
  - lib/asset_hat/vcs.rb
80
146
  - lib/asset_hat/version.rb
81
147
  - public/javascripts/bundles/js-bundle-1.min.js
@@ -120,18 +186,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
186
  requirements:
121
187
  - - ">="
122
188
  - !ruby/object:Gem::Version
189
+ segments:
190
+ - 0
123
191
  version: "0"
124
- version:
125
192
  required_rubygems_version: !ruby/object:Gem::Requirement
126
193
  requirements:
127
194
  - - ">="
128
195
  - !ruby/object:Gem::Version
196
+ segments:
197
+ - 0
129
198
  version: "0"
130
- version:
131
199
  requirements: []
132
200
 
133
201
  rubyforge_project:
134
- rubygems_version: 1.3.5
202
+ rubygems_version: 1.3.6
135
203
  signing_key:
136
204
  specification_version: 3
137
205
  summary: Your assets are covered.
data/README.markdown DELETED
@@ -1,154 +0,0 @@
1
- AssetHat
2
- ========
3
- Your assets are covered.
4
-
5
- * Minify CSS and JS with one command. (Can be done on deploy instead of
6
- at runtime.)
7
- * Bundle CSS and JS to reduce HTTP requests.
8
- * Reuse CSS and JS bundles across layouts without repetition.
9
- * Bust image caches by changing CSS URLs whenever an image is modified.
10
- * Force image URLs in your CSS to use CDN subdomains, not just the current
11
- host.
12
-
13
- After setup, you can use these in your layouts and views:
14
-
15
- include_css :bundle => 'application'
16
- # => <link href="/stylesheets/bundles/application.min.css"
17
- # media="screen,projection" rel="stylesheet" type="text/css" />
18
-
19
- include_js :bundles => ['plugins', 'common']
20
- # => <script src="/javascripts/bundles/plugins.min.js"
21
- # type="text/javascript"></script>
22
- # <script src="/javascripts/bundles/common.min.js"
23
- # type="text/javascript"></script>
24
-
25
- And this in your deploy script:
26
-
27
- rake asset_hat:minify
28
-
29
- Works with Rails 2.3.4 and above.
30
-
31
-
32
-
33
- Installation
34
- ------------
35
-
36
- 1. Install the gem:
37
-
38
- gem install asset_hat
39
-
40
- 2. Configure the gem:
41
-
42
- * Using [Bundler](http://github.com/wycats/bundler):
43
-
44
- 1. Add to your app's Gemfile: `gem 'asset_hat', '0.x.x'`
45
-
46
- 2. Command-line: `gem bundle`
47
-
48
- * Using Rails' `config.gem`, add to your app's `config/environment.rb`:
49
-
50
- `config.gem 'asset_hat', :version => '0.x.x'`
51
-
52
- 3. In your app, create `lib/tasks/asset_hat.rake` with the following contents:
53
-
54
- begin
55
- require 'asset_hat/tasks'
56
- rescue LoadError
57
- puts "Could not load AssetHat tasks: 'asset_hat' not found."
58
- end
59
-
60
-
61
-
62
- Configuration
63
- -------------
64
-
65
- 1. Create the default config file:
66
-
67
- rake asset_hat:config
68
-
69
- 2. In your app, open the new config file at `config/assets.yml`, and set up
70
- your CSS/JS bundles according to that file's example.
71
-
72
- 3. Minify your bundles:
73
-
74
- rake asset_hat:minify
75
-
76
- This minifies all of the CSS/JS files listed in `config/assets.yml`,
77
- concatenates the minified code into bundle files, and adds CDN asset hosts
78
- and cache-busting commit IDs to image URLs in your CSS.
79
-
80
- Bundles are created as new files in `public/stylesheets/bundles/` and
81
- `public/javascripts/bundles/`. Your original CSS/JS files remain intact.
82
-
83
- 4. Set your deployment script to run `rake asset_hat:minify` after deploying
84
- your latest CSS/JS. This overwrites previously minified bundles, and
85
- leaves your original CSS/JS files intact.
86
-
87
- ### Advanced configuration ###
88
-
89
- Additional settings are supported in `config/assets.yml`:
90
-
91
- * `engine`: Indicates how CSS and JS are minified; omit this setting to use
92
- the defaults. If the default engines cause problems by minifying too
93
- strongly, try switching each to `weak`. The `weak` engines are much safer,
94
- but don't save as many bytes.
95
-
96
- * `vendors`: Currently only allows for setting the jQuery version number:
97
-
98
- js:
99
- vendors:
100
- jquery:
101
- version: 1.4
102
-
103
- In the future, this will be used for configuring the retrieval of other
104
- third-party code.
105
-
106
-
107
-
108
- Usage
109
- -----
110
-
111
- In your layouts and views, instead of these:
112
-
113
- <%= stylesheet_link_tag 'reset', 'application', 'clearfix',
114
- :media => 'screen,projection',
115
- :cache => 'bundles/application' %>
116
- <%= javascript_include_tag 'plugin-1', 'plugin-2', 'plugin-3',
117
- :cache => 'bundles/application' %>
118
-
119
- **Use these:**
120
-
121
- <%= include_css :bundle => 'application' %>
122
- <%= include_js :bundle => 'application' %>
123
-
124
- These turn into:
125
-
126
- <link href="/stylesheets/bundles/application.min.css"
127
- media="screen,projection" rel="stylesheet" type="text/css" />
128
- <script src="/javascripts/bundles/application.min.js"
129
- type="text/javascript"></script>
130
-
131
- If your environment has `config.action_controller.perform_caching` set to
132
- `true` (e.g., in production), the layout/view will include minified bundle
133
- files. Otherwise, the separate, unminified files will be included, based on
134
- the bundle contents you define in `config/assets.yml`.
135
-
136
- ### Advanced usage ###
137
-
138
- You can also include single files as expected:
139
-
140
- <%= include_css 'reset', 'application' %>
141
- <%= include_js 'plugin.min', 'application' %>
142
-
143
- Or include multiple bundles at once:
144
-
145
- <%= include_js :bundles => %w[plugins common] %>
146
-
147
- When including multiple bundles at once, this yields one `<link>` or
148
- `<script>` element per bundle.
149
-
150
- You may want to use multiple bundles to separate plugins (rarely changed) from
151
- application code (frequently changed). If all code is in one huge bundle, then
152
- whenever there's a change, browsers have to re-download the whole bundle. By
153
- using multiple bundles based on change frequency, browsers cache the rarely
154
- changed code, and only re-download the frequently changed code.