blender 0.20 → 0.24

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -1,5 +1,5 @@
1
1
  History.txt
2
- MIT-LICENSE
2
+ License.txt
3
3
  Manifest.txt
4
4
  README.txt
5
5
  Rakefile
data/README.txt CHANGED
@@ -35,18 +35,22 @@ source files are the hash values as an array. Here is a sample Blendfile:
35
35
  == Usage
36
36
 
37
37
  Usage: blend [options]
38
- -h, --help Show this message
39
- -V, --version Prints Blender's version number
40
- -g, --generate Generate a stub Blendfile
41
- -f, --file FILE Use given Blendfile
42
- -r, --root ROOT Specify the path to the web root directory
43
- -t, --type TYPE Select file type to blend (css, js)
44
- -m, --min [MINIFIER] Select minifier to use (yui, none)
45
- -c, --cache-buster [BUSTER] Append cache busters to URLs in CSS, defaults to timestamps
46
- --force Force blending when source files aren't newer than output files
47
- --yui=YUIOPTS Pass arguments to YUI Compressor
48
- -d, --data EXPERIMENTAL Convert url(file.ext) to url(data:) in CSS files
49
- -z, --gzip EXPERIMENTAL Also create gzip output files
38
+ -g, --generate Generate a stub Blendfile
39
+ -f, --file FILE Use specified Blendfile
40
+ -r, --root ROOT Specify the path to the web root directory
41
+ -t, --type TYPE Select file type to blend (css, js)
42
+ -m, --min [MINIFIER] Select minifier to use (yui, none)
43
+ -c, --cache-buster [BUSTER] Add cache busters to URLs in CSS
44
+ --force Don't allow output files to be skipped
45
+ --yui=YUIOPTS Pass arguments to YUI Compressor
46
+
47
+ Experimental:
48
+ -d, --data Convert url(file.ext) to url(data:) in CSS
49
+ -z, --gzip Additionally generate gzipped output files
50
+
51
+ Meta:
52
+ -h, --help Show this message
53
+ -V, --version Show the version number
50
54
 
51
55
  == Examples
52
56
 
@@ -63,21 +67,18 @@ Other examples:
63
67
  == Installation
64
68
 
65
69
  To install the RubyGem, run the following at the command line (you may need to use a command such as su or sudo):
66
- gem install mime-types
67
- gem install colored
68
- gem install front-end-blender --source http://gems.github.com
70
+ gem install blender
69
71
 
70
- If you're using Windows, you'll also need to run the following:
72
+ If you're using Windows, you'll also want to run the following to get colored command line output:
71
73
  gem install win32console
72
74
 
73
- * Java v1.4 or greater is required, http://java.com/en/
74
- * Ruby v1.8.6 or greater is required, http://www.ruby-lang.org/en/downloads/
75
- * RubyGems v1.2 or greater is recommended, http://rubygems.org/read/chapter/3
75
+ * Java[http://java.com/en/] v1.4 or greater is required
76
+ * Ruby[http://www.ruby-lang.org/en/downloads/] v1.8.6 or greater is required
77
+ * RubyGems[http://rubygems.org/read/chapter/3] v1.2 or greater is recommended
76
78
 
77
79
  == License
78
80
 
79
- Copyright (c) 2008 Chris Griego
80
- (c) 2008 Blake Elshire
81
+ Copyright (c) 2008 Blake Elshire, Chris Griego
81
82
 
82
83
  Blender is freely distributable under the terms of an MIT-style license.
83
84
  For details, see http://www.opensource.org/licenses/mit-license.php
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
- # Copyright (c) 2008 Chris Griego
2
- # (c) 2008 Blake Elshire
1
+ # Copyright (c) 2008 Blake Elshire, Chris Griego
3
2
  #
4
3
  # Blender is freely distributable under the terms of an MIT-style license.
5
4
  # For details, see http://www.opensource.org/licenses/mit-license.php
@@ -8,15 +7,14 @@ $:.unshift File.join(File.dirname(File.symlink?(__FILE__) ? File.readlink(__FILE
8
7
 
9
8
  require 'rubygems'
10
9
  require 'hoe'
11
- require 'front_end_architect/blender.rb'
10
+ require 'front_end_architect/blender'
12
11
 
13
12
  hoe = Hoe.new('blender', FrontEndArchitect::Blender::VERSION) do |p|
14
- p.author = ['Blake Elshire', 'Chris Griego']
15
- p.email = 'blender@front-end-architect.com'
16
- p.summary = 'Blender outputs efficient, production-ready CSS and/or JavaScript assets.'
17
- p.description = 'Blender is like ant or make for the front-end. It aggregates and compresses CSS and/or JavaScript assets for a site into efficient, production-ready files.'
18
-
19
- p.url = 'http://www.front-end-architect.com/blender/'
13
+ p.author = ['Blake Elshire', 'Chris Griego']
14
+ p.email = 'blender@front-end-architect.com'
15
+ p.summary = 'Blender outputs efficient, production-ready CSS and/or JavaScript assets.'
16
+ p.description = 'Blender is like ant or make for the front-end. It aggregates and compresses CSS and/or JavaScript assets for a site into efficient, production-ready files.'
17
+ p.url = 'http://www.front-end-architect.com/blender/'
20
18
 
21
19
  p.extra_deps << ['mime-types', '>= 1.15']
22
20
  p.extra_deps << ['colored', '>= 1.1']
@@ -24,6 +22,7 @@ hoe = Hoe.new('blender', FrontEndArchitect::Blender::VERSION) do |p|
24
22
  p.spec_extras[:requirements] = 'Java, v1.4 or greater'
25
23
 
26
24
  p.remote_rdoc_dir = '' # Release to root
25
+ p.rdoc_pattern = /^(lib\/front_end_architect|bin|ext)|txt$/
27
26
  end
28
27
 
29
28
  task :update_gemspec do
data/bin/blend CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # Copyright (c) 2008 Chris Griego
4
- # (c) 2008 Blake Elshire
3
+ # Copyright (c) 2008 Blake Elshire, Chris Griego
5
4
  #
6
5
  # Blender is freely distributable under the terms of an MIT-style license.
7
6
  # For details, see http://www.opensource.org/licenses/mit-license.php
@@ -12,19 +11,28 @@ require 'front_end_architect/blender'
12
11
 
13
12
  options = {}
14
13
 
14
+ def section(opts, title)
15
+ opts.separator ''
16
+ opts.separator title + ':'
17
+ end
18
+
15
19
  opts = OptionParser.new do |opts|
16
- opts.on('-h', '--help', "Show this message") { puts opts; exit 0 }
17
- opts.on('-V', '--version', "Show the version number") { puts "Front-End Blender v#{Blender::VERSION}"; exit 0 }
18
- opts.on('-g', '--generate', String, "Generate a stub Blendfile") { options[:generate] = true }
19
- opts.on('-f FILE', '--file FILE', String, "Use given Blendfile") {|f| options[:blendfile] = f }
20
- opts.on('-r ROOT', '--root ROOT', String, "Set the path to the web root directory") {|r| options[:root] = r }
21
- opts.on('-t TYPE', '--type TYPE', [:css, :js], "Select file type to blend (css, js)") {|t| options[:file_type] = t }
22
- opts.on('-m [MINIFIER]', '--min [MINIFIER]', [:yui, :none], "Select minifier to use (yui, none)") {|m| options[:min] = m.nil? ? :none : m.to_sym }
23
- opts.on('-c [BUSTER]', '--cache-buster [BUSTER]', String, "Append cache busters to URLs in CSS, defaults to timestamps") {|b| options[:cache_buster] = b.nil? ? :mtime : b }
24
- opts.on( '--force', String, "Force blending when source files aren't newer than output files") { options[:force] = true }
25
- opts.on( '--yui=YUIOPTS', String, "Pass arguments to YUI Compressor") {|o| options[:yuiopts] = o }
26
- opts.on('-d', '--data', String, "EXPERIMENTAL Convert url(file.ext) to url(data:) in CSS files") { options[:data] = true }
27
- opts.on('-z', '--gzip', String, "EXPERIMENTAL Also create gzip output files") { options[:gzip] = true }
20
+ version = "Front-End Blender v#{FrontEndArchitect::Blender::VERSION}"
21
+
22
+ opts.on('-g', '--generate', String, "Generate a stub Blendfile") { options[:generate] = true }
23
+ opts.on('-f FILE', '--file FILE', String, "Use specified Blendfile") {|f| options[:blendfile] = f; options[:root] = File.dirname(f) }
24
+ opts.on('-r ROOT', '--root ROOT', String, "Specify the path to the web root directory") {|r| options[:root] = r }
25
+ opts.on('-t TYPE', '--type TYPE', [:css, :js], "Select file type to blend (css, js)") {|t| options[:file_type] = t }
26
+ opts.on('-m [MINIFIER]', '--min [MINIFIER]', [:yui, :none], "Select minifier to use (yui, none)") {|m| options[:min] = m.nil? ? :none : m.to_sym }
27
+ opts.on('-c [BUSTER]', '--cache-buster [BUSTER]', String, "Add cache busters to URLs in CSS") {|b| options[:cache_buster] = b.nil? ? :mtime : b }
28
+ opts.on( '--force', String, "Don't allow output files to be skipped") { options[:force] = true }
29
+ opts.on( '--yui=YUIOPTS', String, "Pass arguments to YUI Compressor") {|o| options[:yuiopts] = o }
30
+ section opts, 'Experimental'
31
+ opts.on('-d', '--data', String, "Convert url(file.ext) to url(data:) in CSS") { options[:data] = true }
32
+ opts.on('-z', '--gzip', String, "Additionally generate gzipped output files") { options[:gzip] = true }
33
+ section opts, 'Meta'
34
+ opts.on('-h', '--help', "Show this message") { puts opts; exit 0 }
35
+ opts.on('-V', '--version', "Show the version number") { puts version; exit 0 }
28
36
 
29
37
  opts.parse!(ARGV) rescue return false
30
38
  end
@@ -1,5 +1,4 @@
1
- # Copyright (c) 2008 Chris Griego
2
- # (c) 2008 Blake Elshire
1
+ # Copyright (c) 2008 Blake Elshire, Chris Griego
3
2
  #
4
3
  # Blender is freely distributable under the terms of an MIT-style license.
5
4
  # For details, see http://www.opensource.org/licenses/mit-license.php
@@ -7,30 +6,33 @@
7
6
  $:.unshift File.join(File.dirname(File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__), *%w[..])
8
7
 
9
8
  require 'rubygems'
10
- require 'yaml'
9
+
11
10
  require 'base64'
12
11
  require 'benchmark'
13
- require 'colored'
14
- require 'mime/types'
12
+ require 'colored' unless PLATFORM =~ /win32/ && !Gem.available?('win32console')
15
13
  require 'find'
14
+ require 'mime/types'
16
15
  require 'pathname'
17
16
  require 'zlib'
17
+ require 'yaml'
18
+
18
19
  require 'front_end_architect/hash'
19
20
 
20
21
  module FrontEndArchitect
21
22
  class Blender
22
- VERSION = '0.20'
23
+ VERSION = '0.24'
23
24
 
24
- FILTER_REGEX = /filter: ?[^?]+\(src=(['"])([^\?'"]+)(\?(?:[^'"]+)?)?\1,[^?]+\1\);/im
25
- IMPORT_REGEX = /@import(?: url\(| )(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]+)?)?\1\)?(?:[^?;]+)?;/im
25
+ ALPHA_REGEX = /(-ms-)?filter:\s*(['"]?)progid:DXImageTransform\.Microsoft\.AlphaImageLoader\(\s*src=(['"])([^\?'"\)]+)(\?(?:[^'"\)]+)?)?\3,\s*sizingMethod=(['"])(image|scale|crop)\6\s*\)\2/im
26
+ IMPORT_REGEX = /@import(?: url\(| )(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]+)?)?\1\)?(?:[^?;]+)?;/im # shouldn't the semicolon be optional?
26
27
  URL_REGEX = /url\((['"]?)([^\?'"\)]+)(\?(?:[^'"\)]+)?)?\1?\)/im
27
28
 
28
29
  DEFAULT_OPTIONS = {
29
30
  :blendfile => 'Blendfile.yaml',
30
31
  :data => false,
31
32
  :force => false,
32
- :root => File.dirname(:blendfile.to_s),
33
+ :root => File.dirname('Blendfile.yaml'),
33
34
  :min => :yui,
35
+ :colored => (Object.const_defined? :Colored),
34
36
  }
35
37
 
36
38
  def initialize(opts)
@@ -83,12 +85,12 @@ module FrontEndArchitect
83
85
  if File.writable?(output_name) && !(@options[:gzip] && !File.writable?(gzip_output_name))
84
86
  create_output(output_name, sources, file_type)
85
87
  else
86
- puts 'Permission Denied:'.white_on_red + ' ' + output_name.red
87
- puts 'Permission Denied:'.white_on_red + ' ' + gzip_output_name.red if @options[:gzip]
88
+ puts_colored 'Permission Denied:' + ' ' + output_name, :red
89
+ puts_colored 'Permission Denied:' + ' ' + gzip_output_name, :red if @options[:gzip]
88
90
  end
89
91
  else
90
- puts 'Skipping: '.yellow + output_name.yellow
91
- puts 'Skipping: '.yellow + gzip_output_name.yellow if @options[:gzip]
92
+ puts_colored 'Skipping: ' + output_name, :yellow
93
+ puts_colored 'Skipping: ' + gzip_output_name, :yellow if @options[:gzip]
92
94
  end
93
95
  else
94
96
  create_output(output_name, sources, file_type)
@@ -137,6 +139,14 @@ module FrontEndArchitect
137
139
 
138
140
  protected
139
141
 
142
+ def puts_colored(output, color)
143
+ if @options[:colored]
144
+ puts Colored.colorize(output, { :foreground => color })
145
+ else
146
+ puts output
147
+ end
148
+ end
149
+
140
150
  def flatten_blendfile(value, key=nil, context=[])
141
151
  if value.is_a? Hash
142
152
  context << key unless key.nil?
@@ -208,15 +218,19 @@ module FrontEndArchitect
208
218
  end
209
219
  end
210
220
 
211
- # Data
221
+ # Data URI conversion is processed after compression for speed
222
+ # Workaround for YUI Compressor Bug #2099271
212
223
  if @options[:data]
213
224
  if File.extname(output_name).downcase == '.css'
214
225
  output = output.gsub(URL_REGEX) do
215
- unless $2.downcase.include?('.css')
216
- mime_type = MIME::Types.type_for($2)
217
- url_contents = make_data_uri(IO.read($2), mime_type[0])
226
+ url = $2
227
+ query = $3
228
+
229
+ unless url.downcase.include?('.css')
230
+ mime_type = MIME::Types.type_for(url)
231
+ url_contents = make_data_uri(IO.read(url), mime_type[0])
218
232
  else
219
- url_contents = $2
233
+ url_contents = url
220
234
  end
221
235
  %Q!url(#{url_contents})!
222
236
  end
@@ -226,7 +240,7 @@ module FrontEndArchitect
226
240
  output_file << output
227
241
  end
228
242
 
229
- puts output_name.green
243
+ puts_colored output_name, :green
230
244
 
231
245
  if @options[:gzip]
232
246
  output_gzip = output_name + '.gz'
@@ -235,12 +249,13 @@ module FrontEndArchitect
235
249
  gz.write(output)
236
250
  end
237
251
 
238
- puts output_gzip.green
252
+ puts_colored output_gzip, :green
239
253
  end
240
254
  end
241
255
 
242
- # TODO Move this to a seperate class and clean it up A LOT. For 1.1
243
256
  def process_css(input_file, output_path)
257
+ # TODO Move this to a seperate class and clean it up A LOT. For 2.0
258
+
244
259
  # Determine full path of input file
245
260
  input_path = Pathname.new(File.dirname(input_file))
246
261
  input = IO.read(input_file)
@@ -248,45 +263,50 @@ module FrontEndArchitect
248
263
 
249
264
  # Find filter statements and append cache busters to URLs
250
265
  if @options[:cache_buster]
251
- input = input.gsub(FILTER_REGEX) do |filter|
252
- uri = $2
253
- cbuster = $3
254
- unless uri.match(/^(https:\/\/|http:\/\/|\/\/)/i)
255
- full_path = File.expand_path($2, File.dirname(input_file))
256
- buster = make_cache_buster(full_path, $3)
257
- new_path = uri.to_s + buster
258
-
259
- %Q!filter='#{new_path}'!
260
- else
261
- %Q!filter='#{uri}#{cbuster}'!
266
+ input = input.gsub(ALPHA_REGEX) do |alpha|
267
+ prefix = $1
268
+ outter_quote = $2
269
+ inner_quote1 = $3
270
+ url = $4
271
+ query = $5
272
+ inner_quote2 = $6
273
+ sizing = $7
274
+
275
+ # TODO Rewrite to root relative (if :root specified?)
276
+
277
+ unless url.match(/^(https:\/\/|http:\/\/|\/\/)/i)
278
+ full_path = File.expand_path(url, File.dirname(input_file))
279
+ query = make_cache_buster(full_path, query)
262
280
  end
281
+
282
+ "#{prefix}filter:#{outter_quote}progid:DXImageTransform.Microsoft.AlphaImageLoader(src=#{inner_quote1}#{url}#{query}#{inner_quote1},sizingMethod=#{inner_quote2}#{sizing}#{inner_quote2})#{outter_quote}"
263
283
  end
264
284
  end
265
285
 
266
286
  # Handle @import statements URL rewrite and adding cache busters
267
287
  input = input.gsub(IMPORT_REGEX) do |import|
268
- uri = $2
269
- asset_path = Pathname.new(File.expand_path(uri, input_path))
288
+ url = $2
289
+ query = $3
290
+ asset_path = Pathname.new(File.expand_path(url, input_path))
270
291
 
271
- if uri.match(/^(\/[^\/]+.+)$/)
272
- asset_path = Pathname.new(File.join(File.expand_path(@options[:root]), uri))
292
+ if url.match(/^(\/[^\/]+.+)$/)
293
+ asset_path = Pathname.new(File.join(File.expand_path(@options[:root]), url))
273
294
  end
274
295
 
275
- unless uri.match(/^(https:\/\/|http:\/\/|\/\/)/i)
296
+ unless url.match(/^(https:\/\/|http:\/\/|\/\/)/i)
276
297
  if (output_path != input_path)
277
-
278
298
  new_path = asset_path.relative_path_from(output_path)
279
299
 
280
300
  if @options[:cache_buster]
281
- buster = make_cache_buster(asset_path, $3)
282
- import.gsub!(uri, new_path.to_s+buster)
301
+ buster = make_cache_buster(asset_path, query)
302
+ import.gsub!(url, new_path.to_s + buster)
283
303
  else
284
- import.gsub!(uri, new_path)
304
+ import.gsub!(url, new_path)
285
305
  end
286
306
  else
287
307
  if @options[:cache_buster]
288
- buster = make_cache_buster(asset_path, $3)
289
- import.gsub!(uri, asset_path.to_s+buster)
308
+ buster = make_cache_buster(asset_path, query)
309
+ import.gsub!(url, asset_path.to_s + buster)
290
310
  end
291
311
  end
292
312
  end
@@ -299,39 +319,39 @@ module FrontEndArchitect
299
319
  if output_path == input_path
300
320
  if @options[:data]
301
321
  input = input.gsub(URL_REGEX) do
302
- uri = $2
303
- cbuster = $3
322
+ url = $2
323
+ query = $3
304
324
 
305
- unless uri.match(/^(https:\/\/|http:\/\/|\/\/)/i)
306
- new_path = File.expand_path($2, File.dirname(input_file))
325
+ unless url.match(/^(https:\/\/|http:\/\/|\/\/)/i)
326
+ new_path = File.expand_path(url, File.dirname(input_file))
307
327
 
308
- if uri.match(/^(\/[^\/]+.+)$/)
309
- new_path = Pathname.new(File.join(File.expand_path(@options[:root]), uri))
328
+ if url.match(/^(\/[^\/]+.+)$/)
329
+ new_path = Pathname.new(File.join(File.expand_path(@options[:root]), url))
310
330
  end
311
331
 
312
332
  %Q!url(#{new_path})!
313
333
  else
314
- %Q!url(#{uri}#{cbuster})!
334
+ %Q!url(#{url}#{query})!
315
335
  end
316
336
  end
317
337
  elsif @options[:cache_buster]
318
338
  input = input.gsub(URL_REGEX) do
319
- unless uri.match(/^(https:\/\/|http:\/\/|\/\/)/i)
320
- uri = $2
321
- cbuster = $3
322
-
323
- if uri.match(/^(\/[^\/]+.+)$/)
324
- uri = Pathname.new(File.join(File.expand_path(@options[:root]), uri))
339
+ url = $2
340
+ query = $3
341
+
342
+ unless url.match(/^(https:\/\/|http:\/\/|\/\/)/i)
343
+ if url.match(/^(\/[^\/]+.+)$/)
344
+ url = Pathname.new(File.join(File.expand_path(@options[:root]), url))
325
345
  end
326
346
 
327
347
  if @options[:cache_buster]
328
- buster = make_cache_buster(uri, $3)
329
- new_path = uri.to_s+buster
348
+ buster = make_cache_buster(url, query)
349
+ new_path = url.to_s + buster
330
350
  end
331
351
 
332
352
  %Q!url(#{new_path})!
333
353
  else
334
- %Q!url(#{uri}#{cbuster})!
354
+ %Q!url(#{url}#{query})!
335
355
  end
336
356
  end
337
357
  end
@@ -340,37 +360,37 @@ module FrontEndArchitect
340
360
  else
341
361
  # Find all url(.ext) in file and rewrite relative url from output directory.
342
362
  input = input.gsub(URL_REGEX) do
343
- uri = $2
344
- cbuster = $3
363
+ url = $2
364
+ query = $3
345
365
 
346
- unless uri.match(/^(https:\/\/|http:\/\/|\/\/)/i)
366
+ unless url.match(/^(https:\/\/|http:\/\/|\/\/)/i)
347
367
  if @options[:data]
348
368
  # if doing data conversion rewrite url as an absolute path
349
- new_path = File.expand_path(uri, File.dirname(input_file))
369
+ new_path = File.expand_path(url, File.dirname(input_file))
350
370
 
351
- if uri.match(/^(\/[^\/]+.+)$/)
352
- new_path = Pathname.new(File.join(File.expand_path(@options[:root]), uri))
371
+ if url.match(/^(\/[^\/]+.+)$/)
372
+ new_path = Pathname.new(File.join(File.expand_path(@options[:root]), url))
353
373
  end
354
374
  else
355
- asset_path = Pathname.new(File.expand_path(uri, File.dirname(input_file)))
375
+ asset_path = Pathname.new(File.expand_path(url, File.dirname(input_file)))
356
376
 
357
- if uri.match(/^(\/[^\/]+.+)$/)
358
- asset_path = Pathname.new(File.join(File.expand_path(@options[:root]), uri))
377
+ if url.match(/^(\/[^\/]+.+)$/)
378
+ asset_path = Pathname.new(File.join(File.expand_path(@options[:root]), url))
359
379
  end
360
380
 
361
381
  new_path = asset_path.relative_path_from(output_path)
362
382
 
363
383
  if @options[:cache_buster]
364
- buster = make_cache_buster(asset_path, $3)
365
- new_path = new_path.to_s+buster
384
+ buster = make_cache_buster(asset_path, query)
385
+ new_path = new_path.to_s + buster
366
386
  else
367
- new_path = new_path.to_s+$3 unless $3.nil?
387
+ new_path = new_path.to_s + query unless query.nil?
368
388
  end
369
389
  end
370
390
 
371
391
  %Q!url(#{new_path})!
372
392
  else
373
- %Q!url(#{uri}#{cbuster})!
393
+ %Q!url(#{url}#{query})!
374
394
  end
375
395
  end
376
396
 
@@ -378,18 +398,18 @@ module FrontEndArchitect
378
398
  end
379
399
  end
380
400
 
381
- def make_cache_buster(asset_path, query_string)
382
- unless query_string.nil?
383
- query_string += '&'
401
+ def make_cache_buster(asset_path, query)
402
+ unless query.nil?
403
+ query += '&'
384
404
  else
385
- query_string = '?'
405
+ query = '?'
386
406
  end
387
407
 
388
408
  if @options[:cache_buster] == :mtime
389
409
  file_mtime = File.mtime(asset_path).to_i
390
- buster = query_string + file_mtime.to_s
410
+ buster = query + file_mtime.to_s
391
411
  else
392
- buster = query_string + @options[:cache_buster]
412
+ buster = query + @options[:cache_buster]
393
413
  end
394
414
 
395
415
  return buster
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blender
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.20"
4
+ version: "0.24"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blake Elshire
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-10-13 00:00:00 -05:00
13
+ date: 2009-03-02 00:00:00 -06:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -41,7 +41,7 @@ dependencies:
41
41
  requirements:
42
42
  - - ">="
43
43
  - !ruby/object:Gem::Version
44
- version: 1.7.0
44
+ version: 1.8.0
45
45
  version:
46
46
  description: Blender is like ant or make for the front-end. It aggregates and compresses CSS and/or JavaScript assets for a site into efficient, production-ready files.
47
47
  email: blender@front-end-architect.com
@@ -51,11 +51,12 @@ extensions: []
51
51
 
52
52
  extra_rdoc_files:
53
53
  - History.txt
54
+ - License.txt
54
55
  - Manifest.txt
55
56
  - README.txt
56
57
  files:
57
58
  - History.txt
58
- - MIT-LICENSE
59
+ - License.txt
59
60
  - Manifest.txt
60
61
  - README.txt
61
62
  - Rakefile
@@ -87,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
88
  requirements:
88
89
  - Java, v1.4 or greater
89
90
  rubyforge_project: blender
90
- rubygems_version: 1.2.0
91
+ rubygems_version: 1.3.1
91
92
  signing_key:
92
93
  specification_version: 2
93
94
  summary: Blender outputs efficient, production-ready CSS and/or JavaScript assets.