juicer 1.0.4 → 1.0.5

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.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