asset_hat 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/HISTORY +38 -19
- data/README.rdoc +99 -41
- data/Rakefile +17 -10
- data/VERSION.yml +3 -3
- data/app/helpers/asset_hat_helper.rb +40 -20
- data/asset_hat.gemspec +105 -101
- data/doc/classes/AssetHat.html +173 -59
- data/doc/classes/AssetHat/CSS.html +35 -26
- data/doc/classes/AssetHat/CSS/Engines.html +13 -12
- data/doc/classes/AssetHat/JS.html +11 -11
- data/doc/classes/AssetHat/JS/Engines.html +10 -10
- data/doc/classes/AssetHat/JS/Vendors.html +9 -5
- data/doc/classes/AssetHatHelper.html +18 -14
- data/doc/created.rid +1 -1
- data/doc/files/HISTORY.html +66 -24
- data/doc/files/LICENSE.html +1 -1
- data/doc/files/README_rdoc.html +112 -37
- data/doc/files/app/helpers/asset_hat_helper_rb.html +1 -1
- data/doc/files/lib/asset_hat/capistrano_rb.html +1 -1
- data/doc/files/lib/asset_hat/css_rb.html +1 -1
- data/doc/files/lib/asset_hat/js/vendors_rb.html +1 -1
- data/doc/files/lib/asset_hat/js_rb.html +1 -1
- data/doc/files/lib/asset_hat/tasks/css_rb.html +1 -1
- data/doc/files/lib/asset_hat/tasks/js_rb.html +1 -1
- data/doc/files/lib/asset_hat/tasks_rb.html +1 -1
- data/doc/files/lib/asset_hat/vcs_rb.html +1 -1
- data/doc/files/lib/asset_hat/version_rb.html +1 -1
- data/doc/files/lib/asset_hat_rb.html +1 -1
- data/doc/fr_method_index.html +54 -46
- data/lib/asset_hat.rb +100 -16
- data/lib/asset_hat/capistrano.rb +4 -3
- data/lib/asset_hat/css.rb +69 -20
- data/lib/asset_hat/js.rb +2 -2
- data/lib/asset_hat/js/vendors.rb +14 -10
- data/lib/asset_hat/tasks.rb +22 -3
- data/lib/asset_hat/tasks/css.rb +118 -74
- data/lib/asset_hat/tasks/js.rb +79 -35
- data/lib/asset_hat/vcs.rb +19 -0
- data/public/stylesheets/bundles/ssl/css-bundle-1.min.css +3 -0
- data/public/stylesheets/bundles/ssl/css-bundle-2.min.css +3 -0
- data/public/stylesheets/bundles/ssl/css-bundle-3.min.css +3 -0
- data/rails/init.rb +1 -16
- data/test/asset_hat_helper_test.rb +172 -28
- data/test/asset_hat_test.rb +167 -25
- metadata +54 -21
- data/.gitignore +0 -2
data/doc/fr_method_index.html
CHANGED
@@ -4331,30 +4331,34 @@
|
|
4331
4331
|
|
4332
4332
|
Element.addMethods();
|
4333
4333
|
var search_index = [
|
4334
|
-
{ method: 'add_asset_commit_ids', module: 'assethat::css', html: '<a href="classes/AssetHat/CSS.html#
|
4335
|
-
{ method: 'add_asset_hosts', module: 'assethat::css', html: '<a href="classes/AssetHat/CSS.html#
|
4336
|
-
{ method: 'asset_exists?', module: 'assethat', html: '<a href="classes/AssetHat.html#
|
4337
|
-
{ method: 'assets_dir', module: 'assethat', html: '<a href="classes/AssetHat.html#
|
4338
|
-
{ method: 'bundle_filenames', module: 'assethat', html: '<a href="classes/AssetHat.html#
|
4339
|
-
{ method: 'bundle_filepaths', module: 'assethat', html: '<a href="classes/AssetHat.html#
|
4340
|
-
{ method: '
|
4341
|
-
{ method: '
|
4342
|
-
{ method: '
|
4343
|
-
{ method: '
|
4344
|
-
{ method: '
|
4345
|
-
{ method: '
|
4346
|
-
{ method: '
|
4347
|
-
{ method: '
|
4334
|
+
{ method: 'add_asset_commit_ids', module: 'assethat::css', html: '<a href="classes/AssetHat/CSS.html#M000018"><span class="method_name">add_asset_commit_ids</span> <span class="module_name">(AssetHat::CSS)</span></a>' },
|
4335
|
+
{ method: 'add_asset_hosts', module: 'assethat::css', html: '<a href="classes/AssetHat/CSS.html#M000019"><span class="method_name">add_asset_hosts</span> <span class="module_name">(AssetHat::CSS)</span></a>' },
|
4336
|
+
{ method: 'asset_exists?', module: 'assethat', html: '<a href="classes/AssetHat.html#M000008"><span class="method_name">asset_exists?</span> <span class="module_name">(AssetHat)</span></a>' },
|
4337
|
+
{ method: 'assets_dir', module: 'assethat', html: '<a href="classes/AssetHat.html#M000006"><span class="method_name">assets_dir</span> <span class="module_name">(AssetHat)</span></a>' },
|
4338
|
+
{ method: 'bundle_filenames', module: 'assethat', html: '<a href="classes/AssetHat.html#M000011"><span class="method_name">bundle_filenames</span> <span class="module_name">(AssetHat)</span></a>' },
|
4339
|
+
{ method: 'bundle_filepaths', module: 'assethat', html: '<a href="classes/AssetHat.html#M000012"><span class="method_name">bundle_filepaths</span> <span class="module_name">(AssetHat)</span></a>' },
|
4340
|
+
{ method: 'bundles_dir', module: 'assethat', html: '<a href="classes/AssetHat.html#M000007"><span class="method_name">bundles_dir</span> <span class="module_name">(AssetHat)</span></a>' },
|
4341
|
+
{ method: 'cache?', module: 'assethat', html: '<a href="classes/AssetHat.html#M000009"><span class="method_name">cache?</span> <span class="module_name">(AssetHat)</span></a>' },
|
4342
|
+
{ method: 'cache_last_commit_ids', module: 'assethat', html: '<a href="classes/AssetHat.html#M000003"><span class="method_name">cache_last_commit_ids</span> <span class="module_name">(AssetHat)</span></a>' },
|
4343
|
+
{ method: 'clear_html_cache', module: 'assethat', html: '<a href="classes/AssetHat.html#M000015"><span class="method_name">clear_html_cache</span> <span class="module_name">(AssetHat)</span></a>' },
|
4344
|
+
{ method: 'compute_asset_host', module: 'assethat', html: '<a href="classes/AssetHat.html#M000013"><span class="method_name">compute_asset_host</span> <span class="module_name">(AssetHat)</span></a>' },
|
4345
|
+
{ method: 'config', module: 'assethat', html: '<a href="classes/AssetHat.html#M000005"><span class="method_name">config</span> <span class="module_name">(AssetHat)</span></a>' },
|
4346
|
+
{ method: 'cssmin', module: 'assethat::css::engines', html: '<a href="classes/AssetHat/CSS/Engines.html#M000021"><span class="method_name">cssmin</span> <span class="module_name">(AssetHat::CSS::Engines)</span></a>' },
|
4347
|
+
{ method: 'include_css', module: 'assethathelper', html: '<a href="classes/AssetHatHelper.html#M000027"><span class="method_name">include_css</span> <span class="module_name">(AssetHatHelper)</span></a>' },
|
4348
|
+
{ method: 'include_js', module: 'assethathelper', html: '<a href="classes/AssetHatHelper.html#M000028"><span class="method_name">include_js</span> <span class="module_name">(AssetHatHelper)</span></a>' },
|
4349
|
+
{ method: 'jsmin', module: 'assethat::js::engines', html: '<a href="classes/AssetHat/JS/Engines.html#M000026"><span class="method_name">jsmin</span> <span class="module_name">(AssetHat::JS::Engines)</span></a>' },
|
4350
|
+
{ method: 'last_bundle_commit_id', module: 'assethat', html: '<a href="classes/AssetHat.html#M000002"><span class="method_name">last_bundle_commit_id</span> <span class="module_name">(AssetHat)</span></a>' },
|
4348
4351
|
{ method: 'last_commit_id', module: 'assethat', html: '<a href="classes/AssetHat.html#M000001"><span class="method_name">last_commit_id</span> <span class="module_name">(AssetHat)</span></a>' },
|
4349
|
-
{ method: 'min_filepath', module: 'assethat', html: '<a href="classes/AssetHat.html#
|
4350
|
-
{ method: 'min_filepath', module: 'assethat::css', html: '<a href="classes/AssetHat/CSS.html#
|
4351
|
-
{ method: 'min_filepath', module: 'assethat
|
4352
|
-
{ method: 'minify', module: 'assethat::
|
4353
|
-
{ method: 'minify', module: 'assethat::
|
4354
|
-
{ method: 'source_for', module: 'assethat::js::vendors', html: '<a href="classes/AssetHat/JS/Vendors.html#
|
4355
|
-
{ method: '
|
4356
|
-
{ method: '
|
4357
|
-
{ method: 'weak', module: 'assethat::
|
4352
|
+
{ method: 'min_filepath', module: 'assethat::js', html: '<a href="classes/AssetHat/JS.html#M000022"><span class="method_name">min_filepath</span> <span class="module_name">(AssetHat::JS)</span></a>' },
|
4353
|
+
{ method: 'min_filepath', module: 'assethat::css', html: '<a href="classes/AssetHat/CSS.html#M000016"><span class="method_name">min_filepath</span> <span class="module_name">(AssetHat::CSS)</span></a>' },
|
4354
|
+
{ method: 'min_filepath', module: 'assethat', html: '<a href="classes/AssetHat.html#M000010"><span class="method_name">min_filepath</span> <span class="module_name">(AssetHat)</span></a>' },
|
4355
|
+
{ method: 'minify', module: 'assethat::css', html: '<a href="classes/AssetHat/CSS.html#M000017"><span class="method_name">minify</span> <span class="module_name">(AssetHat::CSS)</span></a>' },
|
4356
|
+
{ method: 'minify', module: 'assethat::js', html: '<a href="classes/AssetHat/JS.html#M000023"><span class="method_name">minify</span> <span class="module_name">(AssetHat::JS)</span></a>' },
|
4357
|
+
{ method: 'source_for', module: 'assethat::js::vendors', html: '<a href="classes/AssetHat/JS/Vendors.html#M000024"><span class="method_name">source_for</span> <span class="module_name">(AssetHat::JS::Vendors)</span></a>' },
|
4358
|
+
{ method: 'ssl_asset_host_differs?', module: 'assethat', html: '<a href="classes/AssetHat.html#M000014"><span class="method_name">ssl_asset_host_differs?</span> <span class="module_name">(AssetHat)</span></a>' },
|
4359
|
+
{ method: 'version', module: 'assethat', html: '<a href="classes/AssetHat.html#M000004"><span class="method_name">version</span> <span class="module_name">(AssetHat)</span></a>' },
|
4360
|
+
{ method: 'weak', module: 'assethat::js::engines', html: '<a href="classes/AssetHat/JS/Engines.html#M000025"><span class="method_name">weak</span> <span class="module_name">(AssetHat::JS::Engines)</span></a>' },
|
4361
|
+
{ method: 'weak', module: 'assethat::css::engines', html: '<a href="classes/AssetHat/CSS/Engines.html#M000020"><span class="method_name">weak</span> <span class="module_name">(AssetHat::CSS::Engines)</span></a>' },
|
4358
4362
|
]
|
4359
4363
|
$(document).observe('dom:loaded', function() {
|
4360
4364
|
// Setup search-during-typing.
|
@@ -4425,30 +4429,34 @@
|
|
4425
4429
|
</form>
|
4426
4430
|
<ol class='methods' id='search-results' style='display: none'></ol>
|
4427
4431
|
<ol class='methods' id='index-entries'>
|
4428
|
-
<li><a href="classes/AssetHat/CSS.html#
|
4429
|
-
<li><a href="classes/AssetHat/CSS.html#
|
4430
|
-
<li><a href="classes/AssetHat.html#
|
4431
|
-
<li><a href="classes/AssetHat.html#
|
4432
|
-
<li><a href="classes/AssetHat.html#
|
4433
|
-
<li><a href="classes/AssetHat.html#
|
4434
|
-
<li><a href="classes/AssetHat.html#M000007"><span class="method_name">
|
4435
|
-
<li><a href="classes/AssetHat.html#
|
4436
|
-
<li><a href="classes/AssetHat.html#
|
4437
|
-
<li><a href="classes/AssetHat
|
4438
|
-
<li><a href="classes/
|
4439
|
-
<li><a href="classes/
|
4440
|
-
<li><a href="classes/AssetHat/
|
4441
|
-
<li><a href="classes/
|
4432
|
+
<li><a href="classes/AssetHat/CSS.html#M000018"><span class="method_name">add_asset_commit_ids</span> <span class="module_name">(AssetHat::CSS)</span></a></li>
|
4433
|
+
<li><a href="classes/AssetHat/CSS.html#M000019"><span class="method_name">add_asset_hosts</span> <span class="module_name">(AssetHat::CSS)</span></a></li>
|
4434
|
+
<li><a href="classes/AssetHat.html#M000008"><span class="method_name">asset_exists?</span> <span class="module_name">(AssetHat)</span></a></li>
|
4435
|
+
<li><a href="classes/AssetHat.html#M000006"><span class="method_name">assets_dir</span> <span class="module_name">(AssetHat)</span></a></li>
|
4436
|
+
<li><a href="classes/AssetHat.html#M000011"><span class="method_name">bundle_filenames</span> <span class="module_name">(AssetHat)</span></a></li>
|
4437
|
+
<li><a href="classes/AssetHat.html#M000012"><span class="method_name">bundle_filepaths</span> <span class="module_name">(AssetHat)</span></a></li>
|
4438
|
+
<li><a href="classes/AssetHat.html#M000007"><span class="method_name">bundles_dir</span> <span class="module_name">(AssetHat)</span></a></li>
|
4439
|
+
<li><a href="classes/AssetHat.html#M000009"><span class="method_name">cache?</span> <span class="module_name">(AssetHat)</span></a></li>
|
4440
|
+
<li><a href="classes/AssetHat.html#M000003"><span class="method_name">cache_last_commit_ids</span> <span class="module_name">(AssetHat)</span></a></li>
|
4441
|
+
<li><a href="classes/AssetHat.html#M000015"><span class="method_name">clear_html_cache</span> <span class="module_name">(AssetHat)</span></a></li>
|
4442
|
+
<li><a href="classes/AssetHat.html#M000013"><span class="method_name">compute_asset_host</span> <span class="module_name">(AssetHat)</span></a></li>
|
4443
|
+
<li><a href="classes/AssetHat.html#M000005"><span class="method_name">config</span> <span class="module_name">(AssetHat)</span></a></li>
|
4444
|
+
<li><a href="classes/AssetHat/CSS/Engines.html#M000021"><span class="method_name">cssmin</span> <span class="module_name">(AssetHat::CSS::Engines)</span></a></li>
|
4445
|
+
<li><a href="classes/AssetHatHelper.html#M000027"><span class="method_name">include_css</span> <span class="module_name">(AssetHatHelper)</span></a></li>
|
4446
|
+
<li><a href="classes/AssetHatHelper.html#M000028"><span class="method_name">include_js</span> <span class="module_name">(AssetHatHelper)</span></a></li>
|
4447
|
+
<li><a href="classes/AssetHat/JS/Engines.html#M000026"><span class="method_name">jsmin</span> <span class="module_name">(AssetHat::JS::Engines)</span></a></li>
|
4448
|
+
<li><a href="classes/AssetHat.html#M000002"><span class="method_name">last_bundle_commit_id</span> <span class="module_name">(AssetHat)</span></a></li>
|
4442
4449
|
<li><a href="classes/AssetHat.html#M000001"><span class="method_name">last_commit_id</span> <span class="module_name">(AssetHat)</span></a></li>
|
4443
|
-
<li><a href="classes/AssetHat.html#
|
4444
|
-
<li><a href="classes/AssetHat/CSS.html#
|
4445
|
-
<li><a href="classes/AssetHat
|
4446
|
-
<li><a href="classes/AssetHat/
|
4447
|
-
<li><a href="classes/AssetHat/
|
4448
|
-
<li><a href="classes/AssetHat/JS/Vendors.html#
|
4449
|
-
<li><a href="classes/AssetHat.html#
|
4450
|
-
<li><a href="classes/AssetHat
|
4451
|
-
<li><a href="classes/AssetHat/
|
4450
|
+
<li><a href="classes/AssetHat/JS.html#M000022"><span class="method_name">min_filepath</span> <span class="module_name">(AssetHat::JS)</span></a></li>
|
4451
|
+
<li><a href="classes/AssetHat/CSS.html#M000016"><span class="method_name">min_filepath</span> <span class="module_name">(AssetHat::CSS)</span></a></li>
|
4452
|
+
<li><a href="classes/AssetHat.html#M000010"><span class="method_name">min_filepath</span> <span class="module_name">(AssetHat)</span></a></li>
|
4453
|
+
<li><a href="classes/AssetHat/CSS.html#M000017"><span class="method_name">minify</span> <span class="module_name">(AssetHat::CSS)</span></a></li>
|
4454
|
+
<li><a href="classes/AssetHat/JS.html#M000023"><span class="method_name">minify</span> <span class="module_name">(AssetHat::JS)</span></a></li>
|
4455
|
+
<li><a href="classes/AssetHat/JS/Vendors.html#M000024"><span class="method_name">source_for</span> <span class="module_name">(AssetHat::JS::Vendors)</span></a></li>
|
4456
|
+
<li><a href="classes/AssetHat.html#M000014"><span class="method_name">ssl_asset_host_differs?</span> <span class="module_name">(AssetHat)</span></a></li>
|
4457
|
+
<li><a href="classes/AssetHat.html#M000004"><span class="method_name">version</span> <span class="module_name">(AssetHat)</span></a></li>
|
4458
|
+
<li><a href="classes/AssetHat/JS/Engines.html#M000025"><span class="method_name">weak</span> <span class="module_name">(AssetHat::JS::Engines)</span></a></li>
|
4459
|
+
<li><a href="classes/AssetHat/CSS/Engines.html#M000020"><span class="method_name">weak</span> <span class="module_name">(AssetHat::CSS::Engines)</span></a></li>
|
4452
4460
|
</ol>
|
4453
4461
|
</div>
|
4454
4462
|
</body>
|
data/lib/asset_hat.rb
CHANGED
@@ -17,7 +17,7 @@ end
|
|
17
17
|
# just the current host.
|
18
18
|
# * Add an image's last Git[http://git-scm.com/] commit ID to its CSS URLs to
|
19
19
|
# <strong>bust browser caches</strong> (e.g.,
|
20
|
-
# <code>/images/foo.png?
|
20
|
+
# <code>/images/foo.png?ab12cd3</code>).
|
21
21
|
#
|
22
22
|
# After setup, you can use these in your layouts and views:
|
23
23
|
#
|
@@ -46,10 +46,10 @@ module AssetHat
|
|
46
46
|
ASSETS_DIR = defined?(Rails.public_path) ? Rails.public_path : 'public'
|
47
47
|
|
48
48
|
# Directory in which all stylesheets are kept, e.g., 'public/stylesheets/'.
|
49
|
-
STYLESHEETS_DIR =
|
49
|
+
STYLESHEETS_DIR = File.join(ASSETS_DIR, 'stylesheets')
|
50
50
|
|
51
51
|
# Directory in which all JavaScripts are kept, e.g., 'public/javascripts/'.
|
52
|
-
JAVASCRIPTS_DIR =
|
52
|
+
JAVASCRIPTS_DIR = File.join(ASSETS_DIR, 'javascripts')
|
53
53
|
|
54
54
|
# Relative path for the config file.
|
55
55
|
RELATIVE_CONFIG_FILEPATH = File.join('config', 'assets.yml')
|
@@ -64,31 +64,66 @@ module AssetHat
|
|
64
64
|
# Nested-hash version of <code>config/assets.yml</code>.
|
65
65
|
def self.config
|
66
66
|
if !cache? || @config.blank?
|
67
|
-
@config = YAML.load(File.
|
67
|
+
@config = YAML.load(ERB.new(File.read(CONFIG_FILEPATH)).result)
|
68
68
|
end
|
69
69
|
@config
|
70
70
|
end
|
71
71
|
|
72
|
-
#
|
72
|
+
# Returns the relative path to the directory where the original CSS or JS
|
73
|
+
# files are stored.
|
73
74
|
#
|
74
|
-
#
|
75
|
+
# <code>type</code> argument: <code>:css</code> or <code>:js</code>
|
75
76
|
def self.assets_dir(type)
|
76
|
-
|
77
|
+
type = type.to_sym
|
78
|
+
|
79
|
+
unless TYPES.include?(type)
|
80
|
+
raise "Unknown type \"#{type}\"; should be one of: #{TYPES.join(', ')}."
|
81
|
+
return
|
82
|
+
end
|
83
|
+
|
84
|
+
case type
|
77
85
|
when :css ; STYLESHEETS_DIR
|
78
86
|
when :js ; JAVASCRIPTS_DIR
|
79
87
|
else nil
|
80
88
|
end
|
81
89
|
end
|
82
90
|
|
91
|
+
# Returns the relative path to the directory where CSS or JS bundles are
|
92
|
+
# stored.
|
93
|
+
#
|
94
|
+
# Usage:
|
95
|
+
#
|
96
|
+
# AssetHat.bundles_dir
|
97
|
+
# # => 'bundles'
|
98
|
+
# AssetHat.bundles_dir(:ssl => true)
|
99
|
+
# # => 'bundles/ssl'
|
100
|
+
# AssetHat.bundles_dir(:css)
|
101
|
+
# # => 'public/stylesheets/bundles'
|
102
|
+
# AssetHat.bundles_dir(:js, :ssl => true)
|
103
|
+
# # => 'public/javascripts/bundles/ssl
|
104
|
+
#
|
105
|
+
# Options:
|
106
|
+
#
|
107
|
+
# [ssl] Set this to <code>true</code> if the stylesheet references images
|
108
|
+
# via SSL. Defaults to <code>false</code>.
|
109
|
+
def self.bundles_dir(*args)
|
110
|
+
options = args.extract_options!
|
111
|
+
options.symbolize_keys!.reverse_merge!(:ssl => false)
|
112
|
+
type = args.first
|
113
|
+
|
114
|
+
dir = type.present? ? File.join(assets_dir(type), 'bundles') : 'bundles'
|
115
|
+
dir = File.join(dir, 'ssl') if options[:ssl]
|
116
|
+
dir
|
117
|
+
end
|
118
|
+
|
83
119
|
# Returns true if the specified asset exists in the file system:
|
84
120
|
#
|
85
|
-
# AssetHat.asset_exists?('application', :css)
|
86
|
-
# # => true if
|
87
|
-
# AssetHat.asset_exists?('some-plugin', :js)
|
88
|
-
# # => true if
|
121
|
+
# AssetHat.asset_exists?('application.css', :css)
|
122
|
+
# # => true if public/stylesheets/application.css exists
|
123
|
+
# AssetHat.asset_exists?('some-plugin.js', :js)
|
124
|
+
# # => true if public/javascripts/some-plugin.js exists
|
89
125
|
#
|
90
|
-
# See also <code>AssetHat
|
91
|
-
# <code>AssetHat::JAVASCRIPTS_DIR</code>.
|
126
|
+
# See also <code>AssetHat.assets_dir</code>.
|
92
127
|
def self.asset_exists?(filename, type)
|
93
128
|
# Process arguments
|
94
129
|
type = type.to_sym
|
@@ -97,9 +132,9 @@ module AssetHat
|
|
97
132
|
return
|
98
133
|
end
|
99
134
|
|
100
|
-
|
101
|
-
|
102
|
-
|
135
|
+
# Default to `{:css => {}, :js => {}}`
|
136
|
+
@asset_exists ||= TYPES.inject({}) { |hsh, t| hsh.merge(t => {}) }
|
137
|
+
|
103
138
|
if @asset_exists[type][filename].nil?
|
104
139
|
@asset_exists[type][filename] =
|
105
140
|
File.exist?(File.join(self.assets_dir(type), filename))
|
@@ -162,6 +197,55 @@ module AssetHat
|
|
162
197
|
filenames.map { |fn| File.join(dir, "#{fn}.#{type}") } : nil
|
163
198
|
end
|
164
199
|
|
200
|
+
# Reads <code>ActionController::Base.asset_host</code>, which can be a
|
201
|
+
# String or Proc, and returns a String. Should behave just like Rails
|
202
|
+
# 2.3.x's private `compute_asset_host` method, but with a simulated request.
|
203
|
+
#
|
204
|
+
# Example environment config for CDN support via SSL:
|
205
|
+
#
|
206
|
+
# # In config/environments/production.rb:
|
207
|
+
# config.action_controller.asset_host = Proc.new do |source, request|
|
208
|
+
# "#{request.protocol}cdn#{source.hash % 4}.example.com"
|
209
|
+
# # => 'http://cdn0.example.com', 'https://cdn1.example.com', etc.
|
210
|
+
# end
|
211
|
+
#
|
212
|
+
# If your CDN doesn't have SSL support, you can instead revert SSL pages to
|
213
|
+
# serving assets from your web server:
|
214
|
+
#
|
215
|
+
# config.action_controller.asset_host = Proc.new do |source, request|
|
216
|
+
# request.ssl? ? nil : "http://cdn#{source.hash % 4}.example.com"
|
217
|
+
# end
|
218
|
+
#
|
219
|
+
# Options:
|
220
|
+
#
|
221
|
+
# [ssl] Set to <code>true</code> to simulate a request via SSL. Defaults to
|
222
|
+
# <code>false</code>.
|
223
|
+
def self.compute_asset_host(asset_host, source, options={})
|
224
|
+
host = asset_host
|
225
|
+
if host.is_a?(Proc) || host.respond_to?(:call)
|
226
|
+
case host.is_a?(Proc) ?
|
227
|
+
host.arity : host.method(:call).arity
|
228
|
+
when 2
|
229
|
+
request = ActionController::Request.new(
|
230
|
+
'HTTPS' => options[:ssl] ? 'on' : 'off')
|
231
|
+
host = host.call(source, request)
|
232
|
+
else
|
233
|
+
host = host.call(source)
|
234
|
+
end
|
235
|
+
else
|
236
|
+
host %= (source.hash % 4) if host =~ /%d/
|
237
|
+
end
|
238
|
+
host
|
239
|
+
end
|
240
|
+
|
241
|
+
# Returns <code>true</code> if the asset host differs between SSL and
|
242
|
+
# non-SSL pages, or <code>false</code> if the asset host doesn't change.
|
243
|
+
def self.ssl_asset_host_differs?
|
244
|
+
asset_host = ActionController::Base.asset_host
|
245
|
+
AssetHat.compute_asset_host(asset_host, 'x.png') !=
|
246
|
+
AssetHat.compute_asset_host(asset_host, 'x.png', :ssl => true)
|
247
|
+
end
|
248
|
+
|
165
249
|
def self.clear_html_cache
|
166
250
|
html_cache = {}
|
167
251
|
end
|
data/lib/asset_hat/capistrano.rb
CHANGED
@@ -3,11 +3,12 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
3
3
|
|
4
4
|
namespace :deploy do
|
5
5
|
namespace :asset_hat do
|
6
|
-
desc 'Minify all CSS/JS with
|
6
|
+
desc 'Minify all CSS/JS with AssetHat'
|
7
7
|
task :minify, :roles => :assets, :except => {:no_release => true} do
|
8
8
|
rake = fetch(:rake, "rake")
|
9
|
-
env
|
10
|
-
run "cd #{current_path} ;
|
9
|
+
env = fetch(:environment, fetch(:rails_env, "production"))
|
10
|
+
run "cd #{current_path} ; " +
|
11
|
+
"#{rake} RAILS_ENV=#{env} FORMAT=short asset_hat:minify"
|
11
12
|
end
|
12
13
|
end
|
13
14
|
end
|
data/lib/asset_hat/css.rb
CHANGED
@@ -25,25 +25,23 @@ module AssetHat
|
|
25
25
|
|
26
26
|
engine = options[:engine].to_sym
|
27
27
|
unless ENGINES.include?(engine)
|
28
|
-
raise %
|
28
|
+
raise %{
|
29
29
|
Unknown CSS minification engine '#{engine}'.
|
30
30
|
Allowed: #{ENGINES.map{ |e| "'#{e}'" }.join(', ')}
|
31
31
|
}.strip.gsub(/\s+/, ' ') and return
|
32
32
|
end
|
33
33
|
|
34
|
-
AssetHat::CSS::Engines.send(engine, input_string)
|
34
|
+
AssetHat::CSS::Engines.send(engine, input_string).strip
|
35
35
|
end
|
36
36
|
|
37
37
|
# Given a string containing CSS, appends each referenced asset's last
|
38
38
|
# commit ID to its URL, e.g.,
|
39
|
-
# <code>background: url(/images/foo.png?
|
39
|
+
# <code>background: url(/images/foo.png?ab12cd3)</code>. This enables
|
40
40
|
# cache busting: If the user's browser has cached a copy of foo.png from a
|
41
41
|
# previous deployment, this new URL forces the browser to ignore that
|
42
42
|
# cache and request the latest version.
|
43
43
|
def self.add_asset_commit_ids(css)
|
44
|
-
css
|
45
|
-
src = $1
|
46
|
-
|
44
|
+
update_css_urls(css, %w[images htc]) do |src, quote|
|
47
45
|
# Get absolute path
|
48
46
|
filepath = File.join(ASSETS_DIR, src)
|
49
47
|
|
@@ -51,7 +49,11 @@ module AssetHat
|
|
51
49
|
filepath.sub!(/^#{FileUtils.pwd}#{File::SEPARATOR}/, '')
|
52
50
|
|
53
51
|
commit_id = AssetHat.last_commit_id(filepath)
|
54
|
-
commit_id.present?
|
52
|
+
if commit_id.present?
|
53
|
+
"url(#{quote}#{src}#{src =~ /\?/ ? '&' : '?'}#{commit_id}#{quote})"
|
54
|
+
else
|
55
|
+
"url(#{quote}#{src}#{quote})"
|
56
|
+
end
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
@@ -59,26 +61,32 @@ module AssetHat
|
|
59
61
|
#
|
60
62
|
# - A string containing CSS;
|
61
63
|
# - A string containing the app's asset host, e.g.,
|
62
|
-
# 'http\://
|
64
|
+
# 'http\://cdn%d.example.com'. This value is typically taken from
|
63
65
|
# <code>config.action_controller.asset_host</code> in
|
64
66
|
# the app's <code>config/environments/production.rb</code>.
|
65
67
|
#
|
66
68
|
# An asset host is added to every image URL in the CSS, e.g.,
|
67
|
-
# <code>background: url(http\://
|
69
|
+
# <code>background: url(http\://cdn2.example.com/images/foo.png)</code>;
|
68
70
|
# if <code>%d</code> in the asset host, it is replaced with an arbitrary
|
69
71
|
# number in 0-3, inclusive.
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
72
|
+
#
|
73
|
+
# Options:
|
74
|
+
#
|
75
|
+
# [ssl] Set to <code>true</code> to simulate a request via SSL. Defaults
|
76
|
+
# to <code>false</code>.
|
77
|
+
def self.add_asset_hosts(css, asset_host, options={})
|
78
|
+
return css if asset_host.blank?
|
79
|
+
|
80
|
+
options.reverse_merge!(:ssl => false)
|
81
|
+
|
82
|
+
update_css_urls(css, %w[images]) do |src, quote|
|
83
|
+
computed_asset_host = AssetHat.compute_asset_host(
|
84
|
+
asset_host, src, options.slice(:ssl))
|
85
|
+
"url(#{quote}#{computed_asset_host}#{src}#{quote})"
|
78
86
|
end
|
79
87
|
end
|
80
88
|
|
81
|
-
# Swappable CSS minification engines.
|
89
|
+
# Swappable CSS minification engines. Each accepts and returns a string.
|
82
90
|
module Engines
|
83
91
|
# Barebones CSS minification engine that only strips whitespace from the
|
84
92
|
# start and end of every line, including linebreaks. For safety, doesn't
|
@@ -99,17 +107,58 @@ module AssetHat
|
|
99
107
|
output.read
|
100
108
|
end
|
101
109
|
|
102
|
-
# CSS minification engine that
|
110
|
+
# CSS minification engine that mostly uses the CSSMin gem, a Ruby port
|
103
111
|
# of Lecomte's YUI Compressor and Schlueter's PHP cssmin.
|
104
112
|
#
|
105
113
|
# Sources:
|
106
114
|
# - http://github.com/rgrove/cssmin
|
107
115
|
# - http://rubygems.org/gems/cssmin
|
108
116
|
def self.cssmin(input_string)
|
109
|
-
CSSMin.minify(input_string)
|
117
|
+
output = CSSMin.minify(input_string)
|
118
|
+
|
119
|
+
# Remove rules that have empty declaration blocks
|
120
|
+
output.gsub!(/\}([^\}]+\{;\}){1,}/, '}')
|
121
|
+
|
122
|
+
output
|
110
123
|
end
|
111
124
|
end
|
112
125
|
|
126
|
+
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
# Strips any balanced quotation marks from `src`. Returns `src` and an
|
131
|
+
# instance of the quotation mark as two separate strings.
|
132
|
+
def self.separate_src_and_quotes(src)
|
133
|
+
quote = src[0, 1]
|
134
|
+
|
135
|
+
if %w[' "].include?(quote) && quote == src[-1, 1]
|
136
|
+
src = src[1, src.length - 2] # Strip quotes
|
137
|
+
else
|
138
|
+
quote = nil # No quotes in original CSS
|
139
|
+
end
|
140
|
+
|
141
|
+
[src, quote]
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.update_css_urls(css, dirs, &css_block)
|
145
|
+
new_css = css.dup
|
146
|
+
dirs = dirs.join('|')
|
147
|
+
|
148
|
+
gsub_block = lambda do |match|
|
149
|
+
src, quote = separate_src_and_quotes($1)
|
150
|
+
css_block.call(src, quote)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Match without quotes
|
154
|
+
new_css.gsub!(/url[\s]*\((\/(#{dirs})\/[^)'"]+)\)/, &gsub_block)
|
155
|
+
|
156
|
+
# Match with single/double quotes
|
157
|
+
new_css.gsub!(/url[\s]*\(((['"])\/(#{dirs})\/[^)]+\2)\)/, &gsub_block)
|
158
|
+
|
159
|
+
new_css
|
160
|
+
end
|
161
|
+
|
113
162
|
end
|
114
163
|
|
115
164
|
end
|