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 +8 -1
- data/VERSION +1 -1
- data/lib/juicer.rb +1 -1
- data/lib/juicer/asset/path.rb +1 -1
- data/lib/juicer/command/merge.rb +1 -1
- data/lib/juicer/dependency_resolver/css_dependency_resolver.rb +1 -1
- data/lib/juicer/merger/stylesheet_merger.rb +4 -4
- data/test/unit/juicer/asset/path_test.rb +6 -0
- data/test/unit/juicer/merger/stylesheet_merger_test.rb +131 -91
- data/test/unit/juicer/minifyer/closure_compressor_test.rb +3 -3
- metadata +3 -3
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
|
-
*
|
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.
|
1
|
+
1.0.5
|
data/lib/juicer.rb
CHANGED
data/lib/juicer/asset/path.rb
CHANGED
@@ -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:
|
data/lib/juicer/command/merge.rb
CHANGED
@@ -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]+)(\?(?:[^'"\)]
|
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]+)(\?(?:[^'"\)]
|
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
|
92
|
-
path = File.join(@hosts[@host_num % @hosts.length],
|
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
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
33
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
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
|
-
|
101
|
-
|
102
|
-
|
104
|
+
should "not touch absolute urls" do
|
105
|
+
merger = Juicer::Merger::StylesheetMerger.new
|
106
|
+
url = "/some/url"
|
103
107
|
|
104
|
-
|
105
|
-
|
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
|
-
|
110
|
-
|
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
|
-
|
113
|
-
|
114
|
-
|
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
|
-
|
120
|
-
|
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
|
-
|
123
|
-
|
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
|
-
|
129
|
-
|
130
|
-
|
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
|
-
|
133
|
-
|
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
|
-
|
139
|
-
|
146
|
+
should "error when missing document root for absolute urls" do
|
147
|
+
merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true
|
140
148
|
|
141
|
-
|
142
|
-
|
143
|
-
|
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
|
-
|
149
|
-
|
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
|
-
|
152
|
-
|
153
|
-
|
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
|
-
|
158
|
-
|
167
|
+
should "redefine relative urls" do
|
168
|
+
merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true
|
159
169
|
|
160
|
-
|
161
|
-
|
162
|
-
|
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
|
-
|
167
|
-
|
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
|
-
|
170
|
-
|
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
|
-
|
176
|
-
|
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
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
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
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
192
|
-
|
193
|
-
|
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
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
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
|
-
|
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
|
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
|
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
|
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
|
-
-
|
9
|
-
version: 1.0.
|
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-
|
17
|
+
date: 2010-06-06 00:00:00 +02:00
|
18
18
|
default_executable: juicer
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|