juicer 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,5 +1,12 @@
1
+ == 1.0.5 / 2010-06-06
2
+ * No more Regexp warnings on Ruby 1.9.1
3
+ * Cycle hosts for relative paths
4
+ * Allow hostnames with no protocol (i.e. //myassets)
5
+
1
6
  == 1.0.4 / 2010-05-26
2
- * Brought to you by Elliott Wood, two-fish.com
7
+ * Fix issue (GH-22) where Closure Compiler would not work due to wrong
8
+ command line arguments passed by Juicer
9
+ * Brought to you by Elliott Wood, two-fish.com:
3
10
  * Added "rails" cache-buster type for cache-buster stamps that are identical
4
11
  to those generated by Rails'
5
12
  * --all-hosts-local is no longer dependent upon command-line positioning.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.4
1
+ 1.0.5
data/lib/juicer.rb CHANGED
@@ -3,7 +3,7 @@ require "logger"
3
3
  module Juicer
4
4
 
5
5
  # :stopdoc:
6
- VERSION = '1.0.4'
6
+ VERSION = '1.0.5'
7
7
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
8
8
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
9
9
  LOGGER = Logger.new(STDOUT)
@@ -63,7 +63,7 @@ module Juicer
63
63
  # Directory served as root through a web server, see Juicer::Asset::Path#initialize
64
64
  attr_reader :document_root
65
65
 
66
- @@scheme_pattern = %r{^[a-zA-Z]{3,5}://}
66
+ @@scheme_pattern = %r{^([a-zA-Z]{3,5}:)?//}
67
67
 
68
68
  #
69
69
  # Initialize asset at <tt>path</tt>. Accepts an optional hash of options:
@@ -94,7 +94,7 @@ the compressor the path should be the path to where the jar file is found.
94
94
  @log.fatal "Please provide atleast one input file"
95
95
  raise SystemExit.new("Please provide atleast one input file")
96
96
  end
97
-
97
+
98
98
  # Copy hosts to local_hosts if --all-hosts-local was specified
99
99
  @local_hosts = @hosts if @all_hosts_local
100
100
 
@@ -8,7 +8,7 @@ module Juicer
8
8
  class CssDependencyResolver < DependencyResolver
9
9
  # Regexp borrowed from similar project:
10
10
  # http://github.com/cgriego/front-end-blender/tree/master/lib/front_end_architect/blender.rb
11
- @@import_pattern = /^\s*@import(?:\surl\(|\s)(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]+)?)?\1\)?(?:[^?;]+)?;?/im
11
+ @@import_pattern = /^\s*@import(?:\surl\(|\s)(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]*))?\1\)?(?:[^?;]*);?/im
12
12
 
13
13
  private
14
14
  def parse(line, imported_file = nil)
@@ -53,7 +53,7 @@ module Juicer
53
53
  # for all absolute URLs regardless of absolute/relative URL strategy.
54
54
  #
55
55
  def merge(file)
56
- content = super.gsub(/^\s*@import(?:\surl\(|\s)(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]+)?)?\1\)?(?:[^?;]+)?;?/i, "")
56
+ content = super.gsub(/^\s*@import(?:\surl\(|\s)(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]*))?\1\)?(?:[^?;]*);?/i, "")
57
57
  dir = File.expand_path(File.dirname(file))
58
58
 
59
59
  content.scan(/url\([\s"']*([^\)"'\s]*)[\s"']*\)/m).uniq.collect do |url|
@@ -79,7 +79,7 @@ module Juicer
79
79
 
80
80
  # All URLs that don't start with a protocol
81
81
  if url !~ %r{^/} && url !~ %r{^[a-z]+://}
82
- if @use_absolute
82
+ if @use_absolute || @hosts.length > 0
83
83
  raise ArgumentError.new("Unable to handle absolute URLs without :document_root option") if !@document_root
84
84
  path = File.expand_path(File.join(dir, url)).sub(@document_root, "") # Make absolute
85
85
  else
@@ -88,8 +88,8 @@ module Juicer
88
88
  end
89
89
 
90
90
  # Cycle hosts, if any
91
- if url =~ %r{^/} && @hosts.length > 0
92
- path = File.join(@hosts[@host_num % @hosts.length], url)
91
+ if path =~ %r{^/} && @hosts.length > 0
92
+ path = File.join(@hosts[@host_num % @hosts.length], path)
93
93
  @host_num += 1
94
94
  end
95
95
 
@@ -55,6 +55,12 @@ class AssetPathTest < Test::Unit::TestCase
55
55
 
56
56
  assert_equal ["http://localhost", "http://dev.server", "http://some.server"], asset.hosts
57
57
  end
58
+
59
+ should "accept protocol-less hosts" do
60
+ asset = Juicer::Asset::Path.new "../images/logo.png", :hosts => ["localhost/", "//dev.server", "some.server/"]
61
+
62
+ assert_equal ["http://localhost", "//dev.server", "http://some.server"], asset.hosts
63
+ end
58
64
  end
59
65
 
60
66
  context "asset absolute path" do
@@ -1,7 +1,6 @@
1
1
  require "test_helper"
2
2
 
3
3
  class TestStylesheetMerger < Test::Unit::TestCase
4
-
5
4
  def setup
6
5
  @file_merger = Juicer::Merger::StylesheetMerger.new
7
6
  Juicer::Test::FileSetup.new.create
@@ -15,28 +14,34 @@ class TestStylesheetMerger < Test::Unit::TestCase
15
14
  Dir.chdir(@cwd)
16
15
  end
17
16
 
18
- def test_init
19
- Juicer::Merger::StylesheetMerger.publicize_methods do
20
- assert_equal Juicer::CssDependencyResolver, @file_merger.dependency_resolver.class
17
+ context "stylesheet merger" do
18
+ should "keep reference to css dependency resolver" do
19
+ Juicer::Merger::StylesheetMerger.publicize_methods do
20
+ resolver = @file_merger.dependency_resolver
21
+
22
+ assert_equal Juicer::CssDependencyResolver, resolver.class
23
+ end
21
24
  end
22
- end
23
25
 
24
- def test_merge
25
- Juicer::Merger::StylesheetMerger.publicize_methods do
26
- a_content = "\n\n/* Dette er a.css */\n"
27
- content = @file_merger.merge(path('a.css'))
28
- assert_equal a_content + "\n", content
26
+ should "merge single file" do
27
+ Juicer::Merger::StylesheetMerger.publicize_methods do
28
+ a_content = "\n\n/* Dette er a.css */\n"
29
+ content = @file_merger.merge(path('a.css'))
30
+
31
+ assert_equal a_content + "\n", content
32
+ end
29
33
  end
30
- end
31
34
 
32
- def test_constructor
33
- file_merger = Juicer::Merger::StylesheetMerger.new(path('a.css'))
34
- assert_equal 2, file_merger.files.length
35
- end
35
+ should "recognize all files" do
36
+ file_merger = Juicer::Merger::StylesheetMerger.new(path('a.css'))
36
37
 
37
- def test_append
38
- @file_merger << path('a.css')
39
- assert_equal 2, @file_merger.files.length
38
+ assert_equal 2, file_merger.files.length
39
+ end
40
+
41
+ should "not append existing file" do
42
+ @file_merger << path('a.css')
43
+ assert_equal 2, @file_merger.files.length
44
+ end
40
45
  end
41
46
 
42
47
  context "saving files" do
@@ -95,112 +100,147 @@ EOF
95
100
 
96
101
  assert_equal "a1.css::css/2.gif::images/1.png", files.join("::")
97
102
  end
98
- end
99
103
 
100
- def test_resolve_path_should_leave_absolute_urls
101
- merger = Juicer::Merger::StylesheetMerger.new
102
- url = "/some/url"
104
+ should "not touch absolute urls" do
105
+ merger = Juicer::Merger::StylesheetMerger.new
106
+ url = "/some/url"
103
107
 
104
- Juicer::Merger::StylesheetMerger.publicize_methods do
105
- assert_equal url, merger.resolve_path(url, nil)
108
+ Juicer::Merger::StylesheetMerger.publicize_methods do
109
+ assert_equal url, merger.resolve_path(url, nil)
110
+ end
106
111
  end
107
- end
108
112
 
109
- def test_resolve_path_error_when_relative_missing_document_root
110
- merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true
113
+ should "raise when mapping absolute to relative path without document root" do
114
+ merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true
111
115
 
112
- Juicer::Merger::StylesheetMerger.publicize_methods do
113
- assert_raise ArgumentError do
114
- merger.resolve_path("/some/url", nil)
116
+ Juicer::Merger::StylesheetMerger.publicize_methods do
117
+ assert_raise ArgumentError do
118
+ merger.resolve_path("/some/url", nil)
119
+ end
115
120
  end
116
121
  end
117
- end
118
122
 
119
- def test_resolve_path_should_make_absolute_urls_relative
120
- merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true, :document_root => "/home/usr"
123
+ should "make absolute urls relative" do
124
+ merger = Juicer::Merger::StylesheetMerger.new([],
125
+ :relative_urls => true,
126
+ :document_root => "/home/usr")
127
+
128
+ Juicer::Merger::StylesheetMerger.publicize_methods do
129
+ merger.instance_eval { @root = Pathname.new "/home/usr/design" }
121
130
 
122
- Juicer::Merger::StylesheetMerger.publicize_methods do
123
- merger.instance_eval { @root = Pathname.new "/home/usr/design" }
124
- assert_equal "../some/url", merger.resolve_path("/some/url", nil)
131
+ assert_equal "../some/url", merger.resolve_path("/some/url", nil)
132
+ end
125
133
  end
126
- end
127
134
 
128
- def test_resolve_path_should_leave_full_urls
129
- merger = Juicer::Merger::StylesheetMerger.new []
130
- url = "http://test.com"
135
+ should "should leave full urls" do
136
+ merger = Juicer::Merger::StylesheetMerger.new []
137
+ url = "http://test.com"
138
+
139
+ Juicer::Merger::StylesheetMerger.publicize_methods do
140
+ merger.instance_eval { @root = Pathname.new "/home/usr/design" }
131
141
 
132
- Juicer::Merger::StylesheetMerger.publicize_methods do
133
- merger.instance_eval { @root = Pathname.new "/home/usr/design" }
134
- assert_equal url, merger.resolve_path(url, nil)
142
+ assert_equal url, merger.resolve_path(url, nil)
143
+ end
135
144
  end
136
- end
137
145
 
138
- def test_resolve_path_error_when_missing_absolute_document_root
139
- merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true
146
+ should "error when missing document root for absolute urls" do
147
+ merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true
140
148
 
141
- Juicer::Merger::StylesheetMerger.publicize_methods do
142
- assert_raise ArgumentError do
143
- merger.resolve_path("../some/url", nil)
149
+ Juicer::Merger::StylesheetMerger.publicize_methods do
150
+ assert_raise ArgumentError do
151
+ merger.resolve_path("../some/url", nil)
152
+ end
144
153
  end
145
154
  end
146
- end
147
155
 
148
- def test_resolve_path_should_make_relative_urls_absolute
149
- merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true, :document_root => "/home/usr"
156
+ should "make relative urls absolute" do
157
+ merger = Juicer::Merger::StylesheetMerger.new([],
158
+ :absolute_urls => true,
159
+ :document_root => "/home/usr")
150
160
 
151
- Juicer::Merger::StylesheetMerger.publicize_methods do
152
- merger.instance_eval { @root = Pathname.new "/home/usr/design" }
153
- assert_equal "/design/images/1.png", merger.resolve_path("../images/1.png", "/home/usr/design/css")
161
+ Juicer::Merger::StylesheetMerger.publicize_methods do
162
+ merger.instance_eval { @root = Pathname.new "/home/usr/design" }
163
+ assert_equal "/design/images/1.png", merger.resolve_path("../images/1.png", "/home/usr/design/css")
164
+ end
154
165
  end
155
- end
156
166
 
157
- def test_resolve_path_should_redefine_relative_urls
158
- merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true
167
+ should "redefine relative urls" do
168
+ merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true
159
169
 
160
- Juicer::Merger::StylesheetMerger.publicize_methods do
161
- merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
162
- assert_equal "../../design/images/1.png", merger.resolve_path("../images/1.png", "/home/usr/design/css")
170
+ Juicer::Merger::StylesheetMerger.publicize_methods do
171
+ merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
172
+ assert_equal "../../design/images/1.png", merger.resolve_path("../images/1.png", "/home/usr/design/css")
173
+ end
163
174
  end
164
- end
165
175
 
166
- def test_resolve_path_should_redefine_absolute_urls
167
- merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true, :document_root => "/home/usr"
176
+ should "redefine absolute urls" do
177
+ merger = Juicer::Merger::StylesheetMerger.new([],
178
+ :relative_urls => true,
179
+ :document_root => "/home/usr")
180
+
181
+ Juicer::Merger::StylesheetMerger.publicize_methods do
182
+ merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
183
+ result = merger.resolve_path("/images/1.png", "/home/usr/design/css")
168
184
 
169
- Juicer::Merger::StylesheetMerger.publicize_methods do
170
- merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
171
- assert_equal "../../images/1.png", merger.resolve_path("/images/1.png", "/home/usr/design/css")
185
+ assert_equal "../../images/1.png", result
186
+ end
172
187
  end
173
- end
174
188
 
175
- def test_resolve_path_with_hosts_should_cycle_asset_hosts
176
- merger = Juicer::Merger::StylesheetMerger.new [], :hosts => ["http://assets1", "http://assets2", "http://assets3"]
189
+ should "cycle asset hosts" do
190
+ hosts = ["http://assets1", "http://assets2", "http://assets3"]
191
+ merger = Juicer::Merger::StylesheetMerger.new([], :hosts => hosts)
192
+
193
+ Juicer::Merger::StylesheetMerger.publicize_methods do
194
+ merger.instance_eval do
195
+ @root = Pathname.new "/home/usr/design2/css"
196
+ end
177
197
 
178
- Juicer::Merger::StylesheetMerger.publicize_methods do
179
- merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
180
- assert_equal "http://assets1/images/1.png", merger.resolve_path("/images/1.png", nil)
181
- assert_equal "http://assets2/images/1.png", merger.resolve_path("/images/1.png", nil)
182
- assert_equal "http://assets3/images/1.png", merger.resolve_path("/images/1.png", nil)
183
- assert_equal "http://assets1/images/1.png", merger.resolve_path("/images/1.png", nil)
198
+ assert_equal "http://assets1/images/1.png", merger.resolve_path("/images/1.png", nil)
199
+ assert_equal "http://assets2/images/1.png", merger.resolve_path("/images/1.png", nil)
200
+ assert_equal "http://assets3/images/1.png", merger.resolve_path("/images/1.png", nil)
201
+ assert_equal "http://assets1/images/1.png", merger.resolve_path("/images/1.png", nil)
202
+ end
184
203
  end
185
- end
186
204
 
187
- def test_resolve_paths_should_handle_relative_document_roots
188
- merger = Juicer::Merger::StylesheetMerger.new [], :document_root => "test/data", :relative_urls => true
189
- merger << File.expand_path("css/test2.css")
205
+ should "handle relative document roots" do
206
+ merger = Juicer::Merger::StylesheetMerger.new([],
207
+ :document_root => "test/data",
208
+ :relative_urls => true)
209
+ merger << File.expand_path("css/test2.css")
210
+
211
+ Juicer::Merger::StylesheetMerger.publicize_methods do
212
+ merger.instance_eval do
213
+ @root = Pathname.new File.expand_path("test/data/css")
214
+ end
190
215
 
191
- Juicer::Merger::StylesheetMerger.publicize_methods do
192
- merger.instance_eval { @root = Pathname.new File.expand_path("test/data/css") }
193
- assert_equal "../images/1.png", merger.resolve_path("/images/1.png", nil)
216
+ assert_equal "../images/1.png", merger.resolve_path("/images/1.png", nil)
217
+ end
218
+ end
219
+
220
+ should "cycle hosts for relative urls" do
221
+ merger = Juicer::Merger::StylesheetMerger.new([],
222
+ :document_root => "test/data",
223
+ :hosts => ["http://assets1/"])
224
+ merger << File.expand_path("path_test2.css")
225
+
226
+ Juicer::Merger::StylesheetMerger.publicize_methods do
227
+ merger.instance_eval do
228
+ @root = Pathname.new(File.expand_path("test/data/css"))
229
+ end
230
+
231
+ expected = "http://assets1/images/1.png"
232
+ assert_equal expected, merger.resolve_path("../images/1.png", "test/data/css")
233
+ end
194
234
  end
195
- end
196
235
 
197
- def test_cycle_asset_hosts_should_use_same_host_for_same_url
198
- @file_merger = Juicer::Merger::StylesheetMerger.new nil, :hosts => ["http://assets1", "http://assets2", "http://assets3"]
199
- @file_merger << path("path_test2.css")
200
- ios = StringIO.new
201
- @file_merger.save(ios)
202
- files = ios.string.scan(/url\(([^\)]*)\)/).collect { |f| f.first }
236
+ should "use same host for same url when cycling asset hosts" do
237
+ @file_merger = Juicer::Merger::StylesheetMerger.new nil, :hosts => ["http://assets1", "http://assets2", "http://assets3"]
238
+ @file_merger << path("path_test2.css")
239
+ ios = StringIO.new
240
+ @file_merger.save(ios)
241
+ files = ios.string.scan(/url\(([^\)]*)\)/).collect { |f| f.first }
203
242
 
204
- assert_equal "1/images/1.png::2/css/2.gif::3/a1.css::2/css/2.gif::1/a2.css".gsub(/(\d\/)/, 'http://assets\1'), files.join("::")
243
+ assert_equal "1/images/1.png::2/css/2.gif::3/a1.css::2/css/2.gif::1/a2.css".gsub(/(\d\/)/, 'http://assets\1'), files.join("::")
244
+ end
205
245
  end
206
246
  end
@@ -13,18 +13,18 @@ class ClosureCompilerTest < Test::Unit::TestCase
13
13
 
14
14
  context "#save" do
15
15
  should "overwrite existing file" do
16
- @closure.expects(:execute).with(%Q{#@cmd -js_output_file "#@output" -js "#@output"})
16
+ @closure.expects(:execute).with(%Q{#@cmd --js_output_file "#@output" --js "#@output"})
17
17
  @closure.save(@output, @output)
18
18
  end
19
19
 
20
20
  should "write compressed input to output" do
21
- @closure.expects(:execute).with(%Q{#@cmd -js_output_file "#@output" -js "#@input"})
21
+ @closure.expects(:execute).with(%Q{#@cmd --js_output_file "#@output" --js "#@input"})
22
22
  @closure.save(@input, @output)
23
23
  end
24
24
 
25
25
  should "create non-existant path" do
26
26
  output = "some/nested/directory"
27
- @closure.expects(:execute).with(%Q{#@cmd -js_output_file "#{output}/file.css" -js "#@input"})
27
+ @closure.expects(:execute).with(%Q{#@cmd --js_output_file "#{output}/file.css" --js "#@input"})
28
28
  FileUtils.expects(:mkdir_p).with(output)
29
29
  @closure.save(@input, "#{output}/file.css")
30
30
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 4
9
- version: 1.0.4
8
+ - 5
9
+ version: 1.0.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Christian Johansen
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-31 00:00:00 +02:00
17
+ date: 2010-06-06 00:00:00 +02:00
18
18
  default_executable: juicer
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency