asset_hat 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/HISTORY +38 -19
  2. data/README.rdoc +99 -41
  3. data/Rakefile +17 -10
  4. data/VERSION.yml +3 -3
  5. data/app/helpers/asset_hat_helper.rb +40 -20
  6. data/asset_hat.gemspec +105 -101
  7. data/doc/classes/AssetHat.html +173 -59
  8. data/doc/classes/AssetHat/CSS.html +35 -26
  9. data/doc/classes/AssetHat/CSS/Engines.html +13 -12
  10. data/doc/classes/AssetHat/JS.html +11 -11
  11. data/doc/classes/AssetHat/JS/Engines.html +10 -10
  12. data/doc/classes/AssetHat/JS/Vendors.html +9 -5
  13. data/doc/classes/AssetHatHelper.html +18 -14
  14. data/doc/created.rid +1 -1
  15. data/doc/files/HISTORY.html +66 -24
  16. data/doc/files/LICENSE.html +1 -1
  17. data/doc/files/README_rdoc.html +112 -37
  18. data/doc/files/app/helpers/asset_hat_helper_rb.html +1 -1
  19. data/doc/files/lib/asset_hat/capistrano_rb.html +1 -1
  20. data/doc/files/lib/asset_hat/css_rb.html +1 -1
  21. data/doc/files/lib/asset_hat/js/vendors_rb.html +1 -1
  22. data/doc/files/lib/asset_hat/js_rb.html +1 -1
  23. data/doc/files/lib/asset_hat/tasks/css_rb.html +1 -1
  24. data/doc/files/lib/asset_hat/tasks/js_rb.html +1 -1
  25. data/doc/files/lib/asset_hat/tasks_rb.html +1 -1
  26. data/doc/files/lib/asset_hat/vcs_rb.html +1 -1
  27. data/doc/files/lib/asset_hat/version_rb.html +1 -1
  28. data/doc/files/lib/asset_hat_rb.html +1 -1
  29. data/doc/fr_method_index.html +54 -46
  30. data/lib/asset_hat.rb +100 -16
  31. data/lib/asset_hat/capistrano.rb +4 -3
  32. data/lib/asset_hat/css.rb +69 -20
  33. data/lib/asset_hat/js.rb +2 -2
  34. data/lib/asset_hat/js/vendors.rb +14 -10
  35. data/lib/asset_hat/tasks.rb +22 -3
  36. data/lib/asset_hat/tasks/css.rb +118 -74
  37. data/lib/asset_hat/tasks/js.rb +79 -35
  38. data/lib/asset_hat/vcs.rb +19 -0
  39. data/public/stylesheets/bundles/ssl/css-bundle-1.min.css +3 -0
  40. data/public/stylesheets/bundles/ssl/css-bundle-2.min.css +3 -0
  41. data/public/stylesheets/bundles/ssl/css-bundle-3.min.css +3 -0
  42. data/rails/init.rb +1 -16
  43. data/test/asset_hat_helper_test.rb +172 -28
  44. data/test/asset_hat_test.rb +167 -25
  45. metadata +54 -21
  46. data/.gitignore +0 -2
data/lib/asset_hat/js.rb CHANGED
@@ -30,13 +30,13 @@ module AssetHat
30
30
 
31
31
  engine = options[:engine].to_sym
32
32
  unless ENGINES.include?(engine)
33
- raise %Q{
33
+ raise %{
34
34
  Unknown JS minification engine '#{engine}'.
35
35
  Allowed: #{ENGINES.map{ |e| "'#{e}'" }.join(', ')}
36
36
  }.strip.gsub(/\s+/, ' ') and return
37
37
  end
38
38
 
39
- AssetHat::JS::Engines.send(engine, input_string)
39
+ AssetHat::JS::Engines.send(engine, input_string).strip
40
40
  end
41
41
 
42
42
  # Swappable JavaScript minification engines.
@@ -33,6 +33,8 @@ module AssetHat
33
33
  # points to {Google's CDN}[http://code.google.com/apis/ajaxlibs/].
34
34
  # Options:
35
35
  #
36
+ # [ssl] Boolean for whether to include vendor JS via HTTPS. Defaults
37
+ # to false.
36
38
  # [version] The vendor version, e.g., '1.4.0' for jQuery 1.4. By
37
39
  # default, each vendor version is taken from
38
40
  # <code>config/assets.yml</code>; use this option to override
@@ -41,10 +43,12 @@ module AssetHat
41
43
  vendor_config =
42
44
  AssetHat.config['js']['vendors'][vendor.to_s] rescue nil
43
45
  use_local = ActionController::Base.consider_all_requests_local
46
+ use_ssl = !!options[:ssl]
44
47
  version = options[:version] || vendor_config['version'] rescue nil
45
48
 
46
49
  unless use_local
47
50
  src = vendor_config['remote_url'] rescue nil
51
+ src = (vendor_config['remote_ssl_url'] rescue nil) if use_ssl
48
52
  end
49
53
 
50
54
  if src.blank?
@@ -52,45 +56,45 @@ module AssetHat
52
56
  when :jquery
53
57
  src = use_local || version.blank? ?
54
58
  "#{['jquery', version].compact.join('-')}.min.js" :
55
- "http://ajax.googleapis.com/ajax/libs/jquery/#{version}/jquery.min.js"
59
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/jquery/#{version}/jquery.min.js"
56
60
  when :jquery_ui
57
61
  src = use_local || version.blank? ?
58
62
  "#{['jquery-ui', version].compact.join('-')}.min.js" :
59
- "http://ajax.googleapis.com/ajax/libs/jqueryui/#{version}/jquery-ui.min.js"
63
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/jqueryui/#{version}/jquery-ui.min.js"
60
64
  when :prototype
61
65
  # Prototype currently doesn't provide an official minified version.
62
66
  src = use_local || version.blank? ?
63
67
  "#{['prototype', version].compact.join('-')}.js" :
64
- "http://ajax.googleapis.com/ajax/libs/prototype/#{version}/prototype.js"
68
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/prototype/#{version}/prototype.js"
65
69
  when :scriptaculous
66
70
  # script.aculo.us currently doesn't provide an official minified version.
67
71
  src = use_local || version.blank? ?
68
72
  "#{['scriptaculous', version].compact.join('-')}.js" :
69
- "http://ajax.googleapis.com/ajax/libs/scriptaculous/#{version}/scriptaculous.js"
73
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/scriptaculous/#{version}/scriptaculous.js"
70
74
  when :mootools
71
75
  src = use_local || version.blank? ?
72
76
  "#{['mootools', version].compact.join('-')}.min.js" :
73
- "http://ajax.googleapis.com/ajax/libs/mootools/#{version}/mootools-yui-compressed.js"
77
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/mootools/#{version}/mootools-yui-compressed.js"
74
78
  when :dojo
75
79
  src = use_local || version.blank? ?
76
80
  "#{['dojo', version].compact.join('-')}.min.js" :
77
- "http://ajax.googleapis.com/ajax/libs/dojo/#{version}/dojo/dojo.xd.js"
81
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/dojo/#{version}/dojo/dojo.xd.js"
78
82
  when :swfobject
79
83
  src = use_local || version.blank? ?
80
84
  "#{['swfobject', version].compact.join('-')}.min.js" :
81
- "http://ajax.googleapis.com/ajax/libs/swfobject/#{version}/swfobject.js"
85
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/swfobject/#{version}/swfobject.js"
82
86
  when :yui
83
87
  src = use_local || version.blank? ?
84
88
  "#{['yui', version].compact.join('-')}.min.js" :
85
- "http://ajax.googleapis.com/ajax/libs/yui/#{version}/build/yuiloader/yuiloader-min.js"
89
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/yui/#{version}/build/yuiloader/yuiloader-min.js"
86
90
  when :ext_core
87
91
  src = use_local || version.blank? ?
88
92
  "#{['ext_core', version].compact.join('-')}.min.js" :
89
- "http://ajax.googleapis.com/ajax/libs/ext-core/#{version}/ext-core.js"
93
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/ext-core/#{version}/ext-core.js"
90
94
  when :webfont
91
95
  src = use_local || version.blank? ?
92
96
  "#{['webfont', version].compact.join('-')}.min.js" :
93
- "http://ajax.googleapis.com/ajax/libs/webfont/#{version}/webfont.js"
97
+ "http#{'s' if use_ssl}://ajax.googleapis.com/ajax/libs/webfont/#{version}/webfont.js"
94
98
  else nil # TODO: Write to log
95
99
  end
96
100
  end
@@ -4,17 +4,36 @@ require 'asset_hat/tasks/js'
4
4
  namespace :asset_hat do
5
5
 
6
6
  desc 'Minifies all CSS and JS bundles'
7
- task :minify => ['asset_hat:css:minify', 'asset_hat:js:minify']
7
+ task :minify, :needs => :environment do
8
+ format = ENV['FORMAT']
9
+ print 'Minifying CSS/JS...'
10
+ puts unless format == 'dot'
11
+
12
+ %w[css js].each do |type|
13
+ task = Rake::Task["asset_hat:#{type}:minify"]
14
+ task.reenable
15
+ task.invoke(:show_intro => false, :show_outro => false)
16
+ end
17
+ puts unless format == 'short'
18
+ puts 'Done.'
19
+ end
20
+
21
+ namespace :minify do
22
+ %w[css js].each do |type|
23
+ desc "Alias for asset_hat:#{type}:minify"
24
+ task type.to_sym => "asset_hat:#{type}:minify"
25
+ end
26
+ end
8
27
 
9
28
  desc 'Prepare configuration file'
10
- task :config do
29
+ task :config, :needs => :environment do
11
30
  template_filepath = File.join(File.dirname(__FILE__), '..', '..',
12
31
  AssetHat::RELATIVE_CONFIG_FILEPATH)
13
32
  target_filepath = AssetHat::CONFIG_FILEPATH
14
33
 
15
34
  if File.exists?(target_filepath)
16
35
  print "Replace #{target_filepath}? (y/n) "
17
- response = STDIN.gets.chomp
36
+ response = $stdin.gets.chomp
18
37
  unless response.downcase == 'y'
19
38
  puts 'Aborted.' ; exit
20
39
  end
@@ -1,66 +1,56 @@
1
1
  namespace :asset_hat do
2
2
  namespace :css do
3
3
 
4
- # desc 'Adds mtimes to asset URLs in CSS'
5
- # task :add_asset_mtimes, :filename, :verbose do |t, args|
6
- # if args.filename.blank?
7
- # raise 'Usage: rake asset_hat:css:add_asset_mtimes[filename.css]' and return
8
- # end
9
- #
10
- # args.with_defaults :verbose => true
11
- #
12
- # css = File.open(args.filename, 'r') { |f| f.read }
13
- # css = AssetHat::CSS.add_asset_mtimes(css)
14
- # File.open(args.filename, 'w') { |f| f.write css }
15
- #
16
- # puts "- Added asset mtimes to #{args.filename}" if args.verbose
17
- # end
18
-
19
4
  desc 'Adds commit IDs to asset URLs in CSS for cache busting'
20
- task :add_asset_commit_ids, :filename, :verbose, :needs => :environment do |t, args|
5
+ task :add_asset_commit_ids, :filename, :needs => :environment do |t, args|
21
6
  if args.filename.blank?
22
- raise 'Usage: rake asset_hat:css:add_asset_commit_ids[filename.css]' and return
7
+ raise 'Usage: rake asset_hat:css:' +
8
+ 'add_asset_commit_ids[filename.css]' and return
23
9
  end
24
10
 
25
- args.with_defaults :verbose => true
11
+ verbose = (ENV['VERBOSE'] != 'false') # Defaults to `true`
26
12
 
27
13
  css = File.open(args.filename, 'r') { |f| f.read }
28
14
  css = AssetHat::CSS.add_asset_commit_ids(css)
29
15
  File.open(args.filename, 'w') { |f| f.write css }
30
16
 
31
- puts "- Added asset commit IDs to #{args.filename}" if args.verbose
17
+ puts "- Added asset commit IDs to #{args.filename}" if verbose
32
18
  end
33
19
 
34
20
  desc 'Adds hosts to asset URLs in CSS'
35
- task :add_asset_hosts, :filename, :verbose, :needs => :environment do |t, args|
21
+ task :add_asset_hosts, :filename, :needs => :environment do |t, args|
36
22
  if args.filename.blank?
37
- raise 'Usage: rake asset_hat:css:add_asset_hosts[filename.css]' and return
23
+ raise 'Usage: rake asset_hat:css:' +
24
+ 'add_asset_hosts[filename.css]' and return
38
25
  end
39
26
 
40
- args.with_defaults :verbose => true
27
+ verbose = (ENV['VERBOSE'] != 'false') # Defaults to `true`
41
28
 
42
29
  asset_host = ActionController::Base.asset_host
43
30
  if asset_host.blank?
44
- raise "This environment (#{ENV['RAILS_ENV']}) doesn't have an `asset_host` configured."
45
- return
31
+ raise "This environment (#{ENV['RAILS_ENV']}) " +
32
+ "doesn't have an `asset_host` configured." and return
46
33
  end
47
34
 
48
35
  css = File.open(args.filename, 'r') { |f| f.read }
49
36
  css = AssetHat::CSS.add_asset_hosts(css, asset_host)
50
37
  File.open(args.filename, 'w') { |f| f.write css }
51
38
 
52
- puts "- Added asset hosts to #{args.filename}" if args.verbose
39
+ puts "- Added asset hosts to #{args.filename}" if verbose
53
40
  end
54
41
 
55
42
  desc 'Minifies one CSS file'
56
- task :minify_file, :filepath, :verbose, :needs => :environment do |t, args|
43
+ task :minify_file, :filepath, :needs => :environment do |t, args|
44
+ type = 'css'
45
+
57
46
  if args.filepath.blank?
58
- raise 'Usage: rake asset_hat:css:minify_file[path/to/filename.css]' and return
47
+ raise "Usage: rake asset_hat:#{type}:" +
48
+ "minify_file[path/to/filename.#{type}]" and return
59
49
  end
60
50
 
61
- args.with_defaults :verbose => false
51
+ verbose = (ENV['VERBOSE'] != 'false') # Defaults to `true`
62
52
  min_options = {
63
- :engine => AssetHat.config['css']['engine']
53
+ :engine => AssetHat.config[type]['engine']
64
54
  }.reject { |k,v| v.blank? }
65
55
 
66
56
  input = File.open(args.filepath, 'r').read
@@ -71,79 +61,133 @@ namespace :asset_hat do
71
61
  File.open(target_filepath, 'w') { |f| f.write output }
72
62
 
73
63
  # Print results
74
- puts "- Minified to #{target_filepath}" if args.verbose
64
+ puts "- Minified to #{target_filepath}" if verbose
75
65
  end
76
66
 
77
67
  desc 'Minifies one CSS bundle'
78
68
  task :minify_bundle, :bundle, :needs => :environment do |t, args|
69
+ type = 'css'
70
+
79
71
  if args.bundle.blank?
80
- raise 'Usage: rake asset_hat:css:minify_bundle[application]' and return
72
+ raise "Usage: rake asset_hat:#{type}:" +
73
+ "minify_bundle[application]" and return
81
74
  end
82
75
 
83
- config = AssetHat.config
84
- old_bundle_size = 0.0
85
- new_bundle_size = 0.0
76
+ config = AssetHat.config[type]
77
+ report_format = ([ENV['FORMAT']] & %w[long short dot])[0] || 'long'
78
+ $stdout.sync = (report_format == 'dot')
86
79
  min_options = {
87
- :engine => config['css']['engine']
80
+ :engine => config['engine']
88
81
  }.reject { |k,v| v.blank? }
89
82
 
90
83
  # Get bundle filenames
91
- filenames = config['css']['bundles'][args.bundle]
84
+ filenames = config['bundles'][args.bundle].select(&:present?)
92
85
  if filenames.empty?
93
- raise "No CSS files are specified for the #{args.bundle} bundle in #{AssetHat::CONFIG_FILEPATH}."
94
- return
86
+ raise "No #{type.upcase} files are specified for the " +
87
+ "#{args.bundle} bundle in #{AssetHat::CONFIG_FILEPATH}." and return
95
88
  end
96
89
  filepaths = filenames.map do |filename|
97
- File.join('public', 'stylesheets', "#{filename}.css")
90
+ parts = filename.split(File::SEPARATOR)
91
+ parts.last << '.' << type
92
+ File.join(
93
+ (parts.first.present? ?
94
+ AssetHat.assets_dir(type) : # Given path was relative
95
+ AssetHat::ASSETS_DIR), # Given path was absolute
96
+ parts
97
+ )
98
98
  end
99
- bundle_filepath = AssetHat::CSS.min_filepath(File.join(
100
- 'public', 'stylesheets', 'bundles', "#{args.bundle}.css"))
101
99
 
102
- # Concatenate and process output
103
- output = ''
100
+ # Check whether app has special SSL asset host
104
101
  asset_host = ActionController::Base.asset_host
105
- filepaths.each do |filepath|
106
- file_output = File.open(filepath, 'r').read
107
- old_bundle_size += file_output.size
108
-
109
- file_output = AssetHat::CSS.minify(file_output, min_options)
110
- file_output = AssetHat::CSS.add_asset_commit_ids(file_output)
111
- if asset_host.present?
112
- file_output = AssetHat::CSS.add_asset_hosts(file_output, asset_host)
113
- end
114
-
115
- new_bundle_size += file_output.size
116
- output << file_output + "\n"
102
+ output_options_array = [{:ssl => false}]
103
+ if AssetHat.ssl_asset_host_differs?
104
+ # The bundle needs a second version, which uses the asset host via SSL
105
+ output_options_array << {:ssl => true}
117
106
  end
118
- FileUtils.makedirs(File.dirname(bundle_filepath))
119
- File.open(bundle_filepath, 'w') { |f| f.write output }
120
107
 
121
- # Print results
122
- percent_saved = 1 - (new_bundle_size / old_bundle_size)
123
- puts "\nWrote CSS bundle: #{bundle_filepath}"
124
- filepaths.each do |filepath|
125
- puts " contains: #{filepath}"
126
- end
127
- if old_bundle_size > 0
128
- engine = "(Engine: #{min_options[:engine]})"
129
- puts " MINIFIED: #{'%.1f' % (percent_saved * 100)}% #{engine}"
108
+ output_options_array.each do |output_options|
109
+
110
+ # Concatenate and process output
111
+ bundle_filepath = AssetHat::CSS.min_filepath(File.join(
112
+ AssetHat.bundles_dir(type, output_options.slice(:ssl)),
113
+ "#{args.bundle}.#{type}"))
114
+ old_bundle_size = 0.0
115
+ new_bundle_size = 0.0
116
+ output = ''
117
+ filepaths.each do |filepath|
118
+ file_output = File.open(filepath, 'r').read
119
+ old_bundle_size += file_output.size
120
+
121
+ file_output = AssetHat::CSS.minify(file_output, min_options)
122
+ file_output = AssetHat::CSS.add_asset_commit_ids(file_output)
123
+ if asset_host.present?
124
+ file_output = AssetHat::CSS.add_asset_hosts(
125
+ file_output, asset_host, output_options.slice(:ssl))
126
+ end
127
+
128
+ new_bundle_size += file_output.size
129
+ output << file_output + "\n"
130
+ end
131
+ FileUtils.makedirs(File.dirname(bundle_filepath))
132
+ File.open(bundle_filepath, 'w') { |f| f.write output }
133
+
134
+ # Print results
135
+ percent_saved =
136
+ "#{'%.1f' % ((1 - (new_bundle_size / old_bundle_size)) * 100)}%"
137
+ bundle_filepath.sub!(/^#{Rails.root}\//, '')
138
+ case report_format
139
+ when 'dot'
140
+ print '.'
141
+ when 'short'
142
+ puts "Minified #{percent_saved.rjust(6)}: #{bundle_filepath}"
143
+ else # 'long'
144
+ puts "\nWrote #{type.upcase} bundle: #{bundle_filepath}"
145
+ filepaths.each do |filepath|
146
+ puts " contains: #{filepath.sub(/^#{Rails.root}\//, '')}"
147
+ end
148
+ if old_bundle_size > 0
149
+ puts " MINIFIED: #{percent_saved}" +
150
+ (" (empty!)" if new_bundle_size == 0).to_s +
151
+ " (Engine: #{min_options[:engine]})"
152
+ end
153
+ end
130
154
  end
131
155
  end
132
156
 
133
157
  desc 'Concatenates and minifies all CSS bundles'
134
- task :minify, :needs => :environment do
158
+ task :minify, :opts, :needs => :environment do |t, args|
159
+ args.with_defaults(:opts => {})
160
+ opts = args.opts.reverse_merge(:show_intro => true, :show_outro => true)
161
+ type = 'css'
162
+ report_format = ENV['FORMAT']
163
+
164
+ if opts[:show_intro]
165
+ print "Minifying #{type.upcase}..."
166
+ if report_format == 'dot'
167
+ $stdout.sync = true
168
+ else
169
+ puts
170
+ end
171
+ end
172
+
135
173
  # Get input bundles
136
- config = AssetHat.config
137
- if config['css'].blank? || config['css']['bundles'].blank?
138
- puts "You need to set up CSS bundles in #{AssetHat::CONFIG_FILEPATH}."
139
- exit
174
+ config = AssetHat.config[type]
175
+ if config.blank? || config['bundles'].blank?
176
+ raise "You need to set up #{type.upcase} bundles " +
177
+ "in #{AssetHat::CONFIG_FILEPATH}." and return
140
178
  end
141
- bundles = config['css']['bundles'].keys
179
+ bundles = config['bundles'].keys
142
180
 
143
181
  # Minify bundles
144
182
  bundles.each do |bundle|
145
- Rake::Task['asset_hat:css:minify_bundle'].reenable
146
- Rake::Task['asset_hat:css:minify_bundle'].invoke(bundle)
183
+ task = Rake::Task["asset_hat:#{type}:minify_bundle"]
184
+ task.reenable
185
+ task.invoke(bundle)
186
+ end
187
+
188
+ if opts[:show_outro]
189
+ puts unless report_format == 'short'
190
+ puts 'Done.'
147
191
  end
148
192
  end
149
193
 
@@ -2,19 +2,21 @@ namespace :asset_hat do
2
2
  namespace :js do
3
3
 
4
4
  desc 'Minifies one JS file'
5
- task :minify_file, :filepath, :verbose, :needs => :environment do |t, args|
5
+ task :minify_file, :filepath, :needs => :environment do |t, args|
6
+ type = 'js'
7
+
6
8
  if args.filepath.blank?
7
- raise 'Usage: rake asset_hat:js:minify_file[filepath.js]' and return
9
+ raise "Usage: rake asset_hat:#{type}:" +
10
+ "minify_file[filepath.#{type}]" and return
8
11
  end
9
12
 
10
- args.with_defaults :verbose => false
13
+ verbose = (ENV['VERBOSE'] != 'false') # Defaults to `true`
11
14
  min_options = {
12
- :engine => AssetHat.config['js']['engine']
15
+ :engine => AssetHat.config[type]['engine']
13
16
  }.reject { |k,v| v.blank? }
14
17
 
15
- if args.verbose && args.filepath.match(/\.min\.js$/)
16
- puts "#{args.filepath} is already minified."
17
- exit 1
18
+ if verbose && args.filepath.match(/\.min\.#{type}$/)
19
+ raise "#{args.filepath} is already minified." and return
18
20
  end
19
21
 
20
22
  input = File.open(args.filepath, 'r').read
@@ -25,40 +27,52 @@ namespace :asset_hat do
25
27
  File.open(target_filepath, 'w') { |f| f.write output }
26
28
 
27
29
  # Print results
28
- puts "- Minified to #{target_filepath}" if args.verbose
30
+ puts "- Minified to #{target_filepath}" if verbose
29
31
  end
30
32
 
31
33
  desc 'Minifies one JS bundle'
32
34
  task :minify_bundle, :bundle, :needs => :environment do |t, args|
35
+ type = 'js'
36
+
33
37
  if args.bundle.blank?
34
- raise 'Usage: rake asset_hat:js:minify_bundle[application]' and return
38
+ raise "Usage: rake asset_hat:#{type}:" +
39
+ "minify_bundle[application]" and return
35
40
  end
36
41
 
37
- config = AssetHat.config
38
- old_bundle_size = 0.0
39
- new_bundle_size = 0.0
42
+ config = AssetHat.config[type]
43
+ report_format = ([ENV['FORMAT']] & %w[long short dot])[0] || 'long'
44
+ $stdout.sync = true if report_format == 'dot'
40
45
  min_options = {
41
- :engine => config['js']['engine']
46
+ :engine => config['engine']
42
47
  }.reject { |k,v| v.blank? }
43
48
 
44
49
  # Get bundle filenames
45
- filenames = config['js']['bundles'][args.bundle]
50
+ filenames = config['bundles'][args.bundle].select(&:present?)
46
51
  if filenames.empty?
47
- raise "No JS files are specified for the #{args.bundle} bundle in #{AssetHat::CONFIG_FILEPATH}."
48
- return
52
+ raise "No #{type.upcase} files are specified for the " +
53
+ "#{args.bundle} bundle in #{AssetHat::CONFIG_FILEPATH}." and return
49
54
  end
50
55
  filepaths = filenames.map do |filename|
51
- File.join('public', 'javascripts', "#{filename}.js")
56
+ parts = filename.split(File::SEPARATOR)
57
+ parts.last << '.' << type
58
+ File.join(
59
+ (parts.first.present? ?
60
+ AssetHat.assets_dir(type) : # Given path was relative
61
+ AssetHat::ASSETS_DIR), # Given path was absolute
62
+ parts
63
+ )
52
64
  end
53
65
  bundle_filepath = AssetHat::JS.min_filepath(File.join(
54
- 'public', 'javascripts', 'bundles', "#{args.bundle}.js"))
66
+ AssetHat.bundles_dir(type), "#{args.bundle}.#{type}"))
55
67
 
56
68
  # Concatenate and process output
57
69
  output = ''
70
+ old_bundle_size = 0.0
71
+ new_bundle_size = 0.0
58
72
  filepaths.each do |filepath|
59
73
  file_output = File.open(filepath, 'r').read
60
74
  old_bundle_size += file_output.size
61
- unless filepath =~ /\.min\.js$/ # Already minified
75
+ unless filepath =~ /\.min\.#{type}$/ # Already minified
62
76
  file_output = AssetHat::JS.minify(file_output, min_options)
63
77
  end
64
78
  new_bundle_size += file_output.size
@@ -68,31 +82,61 @@ namespace :asset_hat do
68
82
  File.open(bundle_filepath, 'w') { |f| f.write output }
69
83
 
70
84
  # Print results
71
- percent_saved = 1 - (new_bundle_size / old_bundle_size)
72
- puts "\n Wrote JS bundle: #{bundle_filepath}"
73
- filepaths.each do |filepath|
74
- puts " contains: #{filepath}"
75
- end
76
- if old_bundle_size > 0
77
- engine = "(Engine: #{min_options[:engine]})"
78
- puts " MINIFIED: #{'%.1f' % (percent_saved * 100)}% #{engine}"
85
+ percent_saved =
86
+ "#{'%.1f' % ((1 - (new_bundle_size / old_bundle_size)) * 100)}%"
87
+ bundle_filepath.sub!(/^#{Rails.root}\//, '')
88
+ case report_format
89
+ when 'dot'
90
+ print '.'
91
+ when 'short'
92
+ puts "Minified #{percent_saved.rjust(6)}: #{bundle_filepath}"
93
+ else # 'long'
94
+ puts "\n Wrote #{type.upcase} bundle: #{bundle_filepath}"
95
+ filepaths.each do |filepath|
96
+ puts " contains: #{filepath.sub(/^#{Rails.root}\//, '')}"
97
+ end
98
+ if old_bundle_size > 0
99
+ puts " MINIFIED: #{percent_saved}" +
100
+ (" (empty!)" if new_bundle_size == 0).to_s +
101
+ " (Engine: #{min_options[:engine]})"
102
+ end
79
103
  end
80
104
  end
81
105
 
82
106
  desc 'Concatenates and minifies all JS bundles'
83
- task :minify, :needs => :environment do
107
+ task :minify, :opts, :needs => :environment do |t, args|
108
+ args.with_defaults(:opts => {})
109
+ opts = args.opts.reverse_merge(:show_intro => true, :show_outro => true)
110
+ type = 'js'
111
+ report_format = ENV['FORMAT']
112
+
113
+ if opts[:show_intro]
114
+ print "Minifying #{type.upcase}..."
115
+ if report_format == 'dot'
116
+ $stdout.sync = true
117
+ else
118
+ puts
119
+ end
120
+ end
121
+
84
122
  # Get input bundles
85
- config = AssetHat.config
86
- if config['js'].blank? || config['js']['bundles'].blank?
87
- puts "You need to set up JS bundles in #{AssetHat::CONFIG_FILEPATH}."
88
- exit
123
+ config = AssetHat.config[type]
124
+ if config.blank? || config['bundles'].blank?
125
+ raise "You need to set up #{type.upcase} bundles " +
126
+ "in #{AssetHat::CONFIG_FILEPATH}." and return
89
127
  end
90
- bundles = config['js']['bundles'].keys
128
+ bundles = config['bundles'].keys
91
129
 
92
130
  # Minify bundles
93
131
  bundles.each do |bundle|
94
- Rake::Task['asset_hat:js:minify_bundle'].reenable
95
- Rake::Task['asset_hat:js:minify_bundle'].invoke(bundle)
132
+ task = Rake::Task["asset_hat:#{type}:minify_bundle"]
133
+ task.reenable
134
+ task.invoke(bundle)
135
+ end
136
+
137
+ if opts[:show_outro]
138
+ puts unless report_format == 'short'
139
+ puts 'Done.'
96
140
  end
97
141
  end
98
142