front-end-blender 0.5.2 → 0.6.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.
Files changed (3) hide show
  1. data/README +26 -1
  2. data/bin/blend +102 -68
  3. metadata +2 -2
data/README CHANGED
@@ -3,6 +3,29 @@
3
3
  Blender is like ant or make for the front-end. It aggregates and compresses
4
4
  CSS and/or JavaScript assets for a site into efficient, production-ready files.
5
5
 
6
+ == Blendfile
7
+
8
+ The Blendfile, named blender.yaml by default, is the configuration file that
9
+ tells Blender which input files are combined into which output files. The
10
+ file uses the YAML format. The output file is listed as hash key and input
11
+ files are the hash values as an array. Here is a sample Blendfile:
12
+
13
+ # blender.yaml for boldpx.com
14
+ _behavior/_global-min.js:
15
+ - _vendor/jquery/jquery.js
16
+ - _vendor/shadowbox/src/js/adapter/shadowbox-jquery.js
17
+ - _vendor/shadowbox/src/js/shadowbox.js
18
+ - _behavior/_global.js
19
+
20
+ _style/_global-min.css:
21
+ - _vendor/shadowbox/src/css/shadowbox.css
22
+ - _style/_global/typography.css
23
+ - _style/_global/typography-print.css
24
+ - _style/_global/colors.css
25
+ - _style/_global/colors-print.css
26
+ - _style/_global/layout-screen.css
27
+ - _style/_global/layout-print.css
28
+
6
29
  == Examples
7
30
 
8
31
  In your site directory run 'blend' to minify CSS and JavaScript.
@@ -32,7 +55,9 @@ For help use: blend -h
32
55
  == Installation
33
56
 
34
57
  To install the beta gem, run the following at the command line:
35
- sudo gem install front-end-blender --source=http://gems.github.com
58
+ sudo gem install frontendblender
59
+
60
+ Java, v1.4 or greater is required
36
61
 
37
62
  == License
38
63
 
data/bin/blend CHANGED
@@ -11,11 +11,13 @@ require 'optparse'
11
11
  require 'rdoc/usage'
12
12
  require 'ostruct'
13
13
  require 'base64'
14
+ require 'benchmark'
14
15
  require 'mime/types'
16
+ require 'find'
15
17
 
16
18
  # TODO Move class to lib so other tools could potentially reuse it
17
19
  class Blender
18
- VERSION = '0.5.2'
20
+ VERSION = '0.5.3'
19
21
 
20
22
  attr_reader :options
21
23
 
@@ -33,41 +35,45 @@ class Blender
33
35
 
34
36
  def blend
35
37
  if parsed_options?
36
- unless File.exists? @options.blendfile
37
- puts "Couldn't find '#{@options.blendfile}'"
38
- exit 1
39
- end
40
-
41
- blender = YAML::load_file @options.blendfile
42
-
43
- Dir.chdir(File.dirname(@options.blendfile))
44
-
45
- blender.each do |output_name, inputs|
46
- output_new = false
38
+ elapsed = Benchmark.realtime do
39
+ unless File.exists? @options.blendfile
40
+ puts "Couldn't find '#{@options.blendfile}'"
41
+ exit 1
42
+ end
43
+
44
+ blender = YAML::load_file @options.blendfile
45
+
46
+ Dir.chdir(File.dirname(@options.blendfile))
47
47
 
48
- # Checks the type flag and if the current file meets the type requirements continues
49
- if output_name.match "." + @options.file_type.to_s
50
- file_type = output_name.match(/\.css/) ? "css" : "js"
48
+ blender.each do |output_name, inputs|
49
+ output_new = false
51
50
 
52
- # Checks if output file exists and checks the mtimes of the source files to the output file if new creates a new file
53
- if File.exists? output_name
54
- inputs.each do |i|
55
- if File.mtime(i) > File.mtime(output_name)
56
- output_new = true
57
- break
58
- end
59
- end
51
+ # Checks the type flag and if the current file meets the type requirements continues
52
+ if output_name.match "." + @options.file_type.to_s
53
+ file_type = output_name.match(/\.css/) ? "css" : "js"
60
54
 
61
- if output_new || @options.force
62
- create_output(output_name, inputs, file_type)
55
+ # Checks if output file exists and checks the mtimes of the source files to the output file if new creates a new file
56
+ if File.exists? output_name
57
+ inputs.each do |i|
58
+ if File.mtime(i) > File.mtime(output_name)
59
+ output_new = true
60
+ break
61
+ end
62
+ end
63
+
64
+ if output_new || @options.force
65
+ create_output(output_name, inputs, file_type)
66
+ else
67
+ puts "Skipping: #{output_name}"
68
+ end
63
69
  else
64
- puts "Skipping: #{output_name}"
70
+ create_output(output_name, inputs, file_type)
65
71
  end
66
- else
67
- create_output(output_name, inputs, file_type)
68
72
  end
69
73
  end
70
74
  end
75
+
76
+ puts sprintf("%.5f", elapsed) + " seconds"
71
77
  end
72
78
  end
73
79
 
@@ -89,57 +95,85 @@ class Blender
89
95
 
90
96
  opts.on("-d", "--data", String, "Change url(image.ext) to url(data:) in css files") { @options.data = true }
91
97
  opts.on("-F", "--force", String, "Force minification when source files aren't newer than min files") { @options.force = true }
92
-
98
+ opts.on("--generate", String, "Generate a blendfile") { create_blendfile() }
93
99
  opts.parse!(@arguments) rescue return false
94
100
 
95
101
  true
96
102
  end
97
103
 
98
- # TODO Change to work with directory hashes (css/: [ colors.css, layout.css ])
99
- def create_output(output_name, inputs, type)
100
- File.open(output_name, 'w') do |output_file|
101
- inputs.each do |i|
102
- output_file << IO.read(i)
104
+ def create_blendfile()
105
+ blend_files = Hash.new
106
+ Find.find(Dir.getwd) do |f|
107
+ if f.match /\.css$/
108
+ key = File.dirname(f) + "-min.css"
109
+ if blend_files.has_key? key
110
+ blend_files[key] << f
111
+ else
112
+ blend_files[key] = [f]
113
+ end
103
114
  end
104
- end
105
-
106
- # Compress
107
- IO.popen("java -jar #{File.dirname(__FILE__)}/../lib/yuicompressor.jar #{@passthrough} --type #{type}", mode="r+") do |io|
108
- io.write IO.read(output_name)
109
- io.close_write
110
115
 
111
- File.open(output_name, 'w') do |output_file|
112
- output_file << io.read
116
+ if f.match /\.js$/
117
+ key = File.dirname(f) + "-min.js"
118
+ if blend_files.has_key? key
119
+ blend_files[key] << f
120
+ else
121
+ blend_files[key] = [f]
122
+ end
113
123
  end
124
+
125
+ Find.prune if f=~ /.svn/
126
+ end
127
+
128
+ if !File.exists? 'blender.yaml' || @options.force
129
+ File.open('blender.yaml', 'w') {|f| YAML.dump(blend_files, f)}
114
130
  end
115
131
 
116
- # TODO Move this to before the file gets written
117
- # Workaround for YUI Compressor Bug #1938329 & Bug #1961175
118
- if output_name.match /\.css$/
119
- output = IO.read(output_name)
120
-
121
- output.gsub! ' and(', ' and ('
122
- output.gsub! '/**/;}', '/**/}'
123
-
124
- if @options.data
125
- output = output.gsub(/url\(['"]?([^?']+)['"]+\)/im) do
126
- uri = $1
127
- mime_type = ''
128
-
129
- # Make the URI absolute instead of relative. TODO Seems kinda hacky is there a better way?
130
- uri.gsub! "../", ""
131
-
132
- # Figure out the mime type.
133
- mime_type = MIME::Types.type_for(uri)
134
-
135
- url_contents = make_data_uri(IO.read(uri), mime_type)
136
-
137
- %Q!url("#{url_contents}")!
138
- end
132
+ exit 0
133
+ end
134
+
135
+ # TODO Change to work with directory hashes (css/: [ colors.css, layout.css ])
136
+ def create_output(output_name, inputs, type)
137
+ File.open(output_name, 'w') do |output_file|
138
+ output = ''
139
+ inputs.each do |i|
140
+ output += IO.read(i)
139
141
  end
140
-
141
- File.open(output_name, 'w') do |output_file|
142
- output_file << output
142
+
143
+ # Compress
144
+ real_file = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
145
+
146
+ IO.popen("java -jar #{File.dirname(real_file)}/../lib/yuicompressor.jar #{@passthrough} --type #{type}", mode="r+") do |io|
147
+ io.write output
148
+ io.close_write
149
+
150
+ output = io.read
151
+ # TODO Move this to before the file gets written
152
+ # Workaround for YUI Compressor Bug #1938329 & Bug #1961175
153
+ if output_name.match /\.css$/
154
+
155
+ output.gsub! ' and(', ' and ('
156
+ output.gsub! '/**/;}', '/**/}'
157
+
158
+ if @options.data
159
+ output = output.gsub(/url\(['"]?([^?']+)['"]+\)/im) do
160
+ uri = $1
161
+ mime_type = ''
162
+
163
+ # Make the URI absolute instead of relative. TODO Seems kinda hacky is there a better way?
164
+ uri.gsub! "../", ""
165
+
166
+ # Figure out the mime type.
167
+ mime_type = MIME::Types.type_for(uri)
168
+
169
+ url_contents = make_data_uri(IO.read(uri), mime_type[0])
170
+
171
+ %Q!url("#{url_contents}")!
172
+ end
173
+ end
174
+
175
+ output_file << output
176
+ end
143
177
  end
144
178
  end
145
179
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: front-end-blender
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blake Elshire & Chris Griego
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-05-17 00:00:00 -07:00
12
+ date: 2008-05-21 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency