juicer 1.0.16 → 1.0.17
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +27 -11
- data/History.txt +3 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/juicer.rb +1 -1
- data/lib/juicer/install/yui_compressor_installer.rb +2 -2
- metadata +29 -113
- data/GPATH +0 -0
- data/GRTAGS +0 -0
- data/GSYMS +0 -0
- data/GTAGS +0 -0
- data/test/bin/jslint-1.0.js +0 -523
- data/test/bin/jslint.js +0 -523
- data/test/bin/rhino1_7R1.zip +0 -0
- data/test/bin/rhino1_7R2-RC1.jar +0 -0
- data/test/bin/rhino1_7R2-RC1.zip +0 -0
- data/test/bin/rhino1_7R3.jar +0 -0
- data/test/bin/rhino1_7R3.zip +0 -0
- data/test/bin/yuicompressor +0 -0
- data/test/bin/yuicompressor-2.3.5.zip +0 -0
- data/test/bin/yuicompressor-2.4.2.jar +0 -0
- data/test/bin/yuicompressor-2.4.2.zip +0 -0
- data/test/data/Changelog.txt +0 -10
- data/test/data/a.css +0 -3
- data/test/data/a.js +0 -5
- data/test/data/a1.css +0 -5
- data/test/data/b.css +0 -1
- data/test/data/b.js +0 -5
- data/test/data/b1.css +0 -5
- data/test/data/b2.css +0 -5
- data/test/data/c1.css +0 -3
- data/test/data/css/2.gif +0 -1
- data/test/data/css/test.css +0 -15
- data/test/data/css/test2.css +0 -1
- data/test/data/css/test3.css +0 -12
- data/test/data/d1.css +0 -3
- data/test/data/images/1.png +0 -1
- data/test/data/my_app.js +0 -2
- data/test/data/not-ok.js +0 -2
- data/test/data/ok.js +0 -3
- data/test/data/path_test.css +0 -5
- data/test/data/path_test2.css +0 -14
- data/test/data/pkg/module/moda.js +0 -2
- data/test/data/pkg/module/modb.js +0 -3
- data/test/data/pkg/pkg.js +0 -1
- data/test/fixtures/rhino-download.html +0 -42
- data/test/fixtures/yui-download.html +0 -375
- data/test/test_helper.rb +0 -204
- data/test/unit/juicer/asset/path_resolver_test.rb +0 -76
- data/test/unit/juicer/asset/path_test.rb +0 -376
- data/test/unit/juicer/cache_buster_test.rb +0 -128
- data/test/unit/juicer/chainable_test.rb +0 -94
- data/test/unit/juicer/command/install_test.rb +0 -58
- data/test/unit/juicer/command/list_test.rb +0 -81
- data/test/unit/juicer/command/merge_test.rb +0 -162
- data/test/unit/juicer/command/util_test.rb +0 -58
- data/test/unit/juicer/command/verify_test.rb +0 -48
- data/test/unit/juicer/css_cache_buster_test.rb +0 -122
- data/test/unit/juicer/datafy_test.rb +0 -37
- data/test/unit/juicer/dependency_resolver/css_dependency_resolver_test.rb +0 -36
- data/test/unit/juicer/dependency_resolver/javascript_dependency_resolver_test.rb +0 -50
- data/test/unit/juicer/ext/string_test.rb +0 -59
- data/test/unit/juicer/ext/symbol_test.rb +0 -27
- data/test/unit/juicer/image_embed_test.rb +0 -339
- data/test/unit/juicer/install/installer_base_test.rb +0 -214
- data/test/unit/juicer/install/jslint_installer_test.rb +0 -54
- data/test/unit/juicer/install/rhino_installer_test.rb +0 -57
- data/test/unit/juicer/install/yui_compressor_test.rb +0 -56
- data/test/unit/juicer/jslint_test.rb +0 -60
- data/test/unit/juicer/merger/base_test.rb +0 -122
- data/test/unit/juicer/merger/javascript_merger_test.rb +0 -74
- data/test/unit/juicer/merger/stylesheet_merger_test.rb +0 -262
- data/test/unit/juicer/minifyer/closure_compressor_test.rb +0 -107
- data/test/unit/juicer/minifyer/yui_compressor_test.rb +0 -133
- data/test/unit/juicer_test.rb +0 -1
@@ -1,58 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class Dummy
|
4
|
-
include Juicer::Command::Util
|
5
|
-
end
|
6
|
-
|
7
|
-
class TestCommandUtil < Test::Unit::TestCase
|
8
|
-
|
9
|
-
CSS_FILES = %w{a.css a1.css b.css b1.css b2.css c1.css d1.css path_test.css path_test2.css}
|
10
|
-
JS_FILES = %w{a.js}
|
11
|
-
ALL_FILES = (CSS_FILES + JS_FILES).sort
|
12
|
-
|
13
|
-
def setup
|
14
|
-
@impl = Dummy.new
|
15
|
-
Juicer::Test::FileSetup.new.create
|
16
|
-
Dir.glob("test/data/*.min.css").each { |file| File.delete(file) }
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_files_from_single_file
|
20
|
-
files = @impl.files("test/data/a.css")
|
21
|
-
assert files.is_a?(Array)
|
22
|
-
assert_equal "test/data/a.css", files.sort.join
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_files_from_single_glob_pattern
|
26
|
-
files = @impl.files("test/data/*.css")
|
27
|
-
assert files.is_a?(Array)
|
28
|
-
assert_equal CSS_FILES.collect { |f| "test/data/#{f}" }.join, files.sort.join
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_files_from_mixed_arguments
|
32
|
-
files = @impl.files("test/data/*.css", "test/data/a.js")
|
33
|
-
assert files.is_a?(Array)
|
34
|
-
assert_equal ALL_FILES.collect { |f| "test/data/#{f}" }.join, files.sort.join
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_files_from_array
|
38
|
-
files = @impl.files(["test/data/*.css", "test/data/a.js"])
|
39
|
-
assert files.is_a?(Array)
|
40
|
-
assert_equal ALL_FILES.collect { |f| "test/data/#{f}" }.join, files.sort.join
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_relative_path_single_file
|
44
|
-
assert_equal "test/data/a.css", @impl.relative("test/data/a.css")
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_relative_path_many_files
|
48
|
-
files = @impl.relative(Dir.glob("test/data/*.css"))
|
49
|
-
assert files.is_a?(Array)
|
50
|
-
assert_equal CSS_FILES.collect { |f| "test/data/#{f}" }.join, files.sort.join
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_relative_path_many_files_explicit_reference
|
54
|
-
files = @impl.relative(Dir.glob("test/data/*.css"), "lib")
|
55
|
-
assert files.is_a?(Array)
|
56
|
-
assert_equal CSS_FILES.collect { |f| "../test/data/#{f}" }.join, files.sort.join
|
57
|
-
end
|
58
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class TestVerifyCommand < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
@io = StringIO.new
|
6
|
-
@command = Juicer::Command::Verify.new(Logger.new(@io))
|
7
|
-
@path = Dir.pwd
|
8
|
-
@juicer = Juicer.home
|
9
|
-
end
|
10
|
-
|
11
|
-
def teardown
|
12
|
-
Dir.chdir(@path)
|
13
|
-
Juicer.home = @juicer
|
14
|
-
end
|
15
|
-
|
16
|
-
context "executing command" do
|
17
|
-
should "fail with no files" do
|
18
|
-
assert_raise ArgumentError do
|
19
|
-
@command.execute []
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
should "fail if installer is not found" do
|
24
|
-
Juicer.home = path("somewhere")
|
25
|
-
Dir.chdir("lib")
|
26
|
-
command = Juicer::Command::Verify.new(Logger.new(@io))
|
27
|
-
|
28
|
-
assert_raise FileNotFoundError do
|
29
|
-
command.execute path("a.js")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
should "verify several files" do
|
34
|
-
files = %w[file1.js file2.js file3.js]
|
35
|
-
ok = "OK!\njslint: No problems"
|
36
|
-
|
37
|
-
Juicer::Command::Verify.any_instance.expects(:files).with(files).returns(files)
|
38
|
-
Juicer::JsLint.any_instance.expects(:check).with(files[0]).returns(Juicer::JsLint::Report.new)
|
39
|
-
Juicer::JsLint.any_instance.expects(:check).with(files[1]).returns(Juicer::JsLint::Report.new(["Oops"]))
|
40
|
-
Juicer::JsLint.any_instance.expects(:check).with(files[2]).returns(Juicer::JsLint::Report.new)
|
41
|
-
|
42
|
-
@command.execute(files)
|
43
|
-
|
44
|
-
assert_match(/OK!/, @io.string)
|
45
|
-
assert_match(/Problems detected/, @io.string)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,122 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class TestCssCacheBuster < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
Juicer::Test::FileSetup.new.create
|
6
|
-
@buster = Juicer::CssCacheBuster.new
|
7
|
-
end
|
8
|
-
|
9
|
-
def teardown
|
10
|
-
Juicer::Test::FileSetup.new.delete
|
11
|
-
Juicer::Test::FileSetup.new.create
|
12
|
-
end
|
13
|
-
|
14
|
-
context "finding urls" do
|
15
|
-
should "find all urls" do
|
16
|
-
urls = @buster.urls(path("css/test.css"))
|
17
|
-
assert_equal 4, urls.length
|
18
|
-
assert_equal "../a1.css../images/1.png2.gif2.gif", urls.collect { |a| a.path }.sort.join.gsub(path("/"), "")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context "image references" do
|
23
|
-
should "update image urls" do
|
24
|
-
file = path("css/test.css")
|
25
|
-
buster = Juicer::CssCacheBuster.new
|
26
|
-
buster.save file
|
27
|
-
|
28
|
-
File.read(file).scan(/url\(([^\)]*)\)/m).each do |path|
|
29
|
-
assert_match(/[^\?]*\?jcb=\d+/, path.first)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
should "not add multiple cache busters" do
|
34
|
-
file = path("css/test.css")
|
35
|
-
buster = Juicer::CssCacheBuster.new
|
36
|
-
buster.save file
|
37
|
-
|
38
|
-
assert_no_match /2\.gif\?jcb=\d+\?jcb=/, File.read(file)
|
39
|
-
end
|
40
|
-
|
41
|
-
should "not add multiple cache busters when asset host cycling is used" do
|
42
|
-
file = path("css/test3.css")
|
43
|
-
buster = Juicer::CssCacheBuster.new( { :hosts => [ 'http://assets1', 'http://assets2', 'http://assets3' ], :document_root => './test/data' } )
|
44
|
-
buster.save file
|
45
|
-
|
46
|
-
assert_no_match /2\.gif\?jcb=\d+\?jcb=/, File.read(file)
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
context "absolute paths" do
|
52
|
-
# should "fail without document root" do
|
53
|
-
# file = path("css/test2.css")
|
54
|
-
# buster = Juicer::CssCacheBuster.new
|
55
|
-
|
56
|
-
# assert_raise FileNotFoundError do
|
57
|
-
# buster.save file
|
58
|
-
# end
|
59
|
-
# end
|
60
|
-
|
61
|
-
should "resolve with document root" do
|
62
|
-
file = path("css/test.css")
|
63
|
-
buster = Juicer::CssCacheBuster.new :document_root => path("")
|
64
|
-
|
65
|
-
assert_nothing_raised do
|
66
|
-
buster.save file
|
67
|
-
end
|
68
|
-
|
69
|
-
File.read(file).scan(/url\(([^\)]*)\)/m).each do |path|
|
70
|
-
assert_match(/[^\?]*\?jcb=\d+/, path.first)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
context "cache busters" do
|
76
|
-
should "add mtime to urls" do
|
77
|
-
File.open(path("a2.css"), "w") { |f| f.puts "" }
|
78
|
-
file = path("path_test2.css")
|
79
|
-
output = path("path_test3.css")
|
80
|
-
buster = Juicer::CssCacheBuster.new :document_root => path("")
|
81
|
-
buster.save file, output
|
82
|
-
|
83
|
-
buster.urls(output).each { |url| assert url !~ /(jcb=\d+).*(jcb=\d+)/, url }
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
context "rails cache busters" do
|
88
|
-
should "should append mtime to urls" do
|
89
|
-
File.open(path("a2.css"), "w") { |f| f.puts "" }
|
90
|
-
file = path("path_test2.css")
|
91
|
-
output = path("path_test3.css")
|
92
|
-
buster = Juicer::CssCacheBuster.new :document_root => path(""), :type => :rails
|
93
|
-
buster.save file, output
|
94
|
-
|
95
|
-
buster.urls(output).each { |asset| assert_match /\?\d+$/, asset.path }
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
context "hard cache busters" do
|
100
|
-
should "should alter file name" do
|
101
|
-
File.open(path("a2.css"), "w") { |f| f.puts "" }
|
102
|
-
file = path("path_test2.css")
|
103
|
-
output = path("path_test3.css")
|
104
|
-
buster = Juicer::CssCacheBuster.new :document_root => path(""), :type => :hard
|
105
|
-
buster.save file, output
|
106
|
-
|
107
|
-
buster.urls(output).each { |asset| assert_match /-jcb\d+\.[a-z]{3}$/, asset.path }
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context "non-existent urls" do
|
112
|
-
should "not raise" do
|
113
|
-
File.open(path("a2.css"), "w") { |f| f.puts "a { background: url(i/dont/exist.fck); }" }
|
114
|
-
file = path("a2.css")
|
115
|
-
buster = Juicer::CssCacheBuster.new :document_root => path("")
|
116
|
-
|
117
|
-
assert_nothing_raised do
|
118
|
-
buster.save file
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require "test_helper"
|
3
|
-
|
4
|
-
class TC_Datafy < Test::Unit::TestCase
|
5
|
-
|
6
|
-
def test_make_data_uri_text_plain
|
7
|
-
assert_equal(SHORT_TEXT_PLAIN_URI, Datafy::make_data_uri(SHORT_STRING, TEXT_PLAIN))
|
8
|
-
assert_equal(LONG_TEXT_PLAIN_URI, Datafy::make_data_uri(LONG_STRING, TEXT_PLAIN))
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_make_data_uri_octet_stream
|
12
|
-
assert_equal(SHORT_APPLICATION_OCTET_STREAM_URI, Datafy::make_data_uri(SHORT_STRING, APPLICATION_OCTET_STREAM))
|
13
|
-
assert_equal(LONG_APPLICATION_OCTET_STREAM_URI, Datafy::make_data_uri(LONG_STRING, APPLICATION_OCTET_STREAM))
|
14
|
-
end
|
15
|
-
|
16
|
-
# mime types
|
17
|
-
TEXT_PLAIN = 'text/plain'
|
18
|
-
APPLICATION_OCTET_STREAM = 'application/octet-stream'
|
19
|
-
|
20
|
-
# string versions
|
21
|
-
SHORT_STRING = 'this is some text'
|
22
|
-
SHORT_BASE64 = 'dGhpcyBpcyBzb21lIHRleHQ='
|
23
|
-
SHORT_URLENCODED = 'this+is+some+text'
|
24
|
-
|
25
|
-
LONG_STRING = 'this is a really long string. this is a really long string. this is a really long string. this is a really long string. this is a really long string. this is a really long string. this is a really long string. this is a really long string.'
|
26
|
-
LONG_BASE64 = 'dGhpcyBpcyBhIHJlYWxseSBsb25nIHN0cmluZy4gdGhpcyBpcyBhIHJlYWxseSBsb25nIHN0cmluZy4gdGhpcyBpcyBhIHJlYWxseSBsb25nIHN0cmluZy4gdGhpcyBpcyBhIHJlYWxseSBsb25nIHN0cmluZy4gdGhpcyBpcyBhIHJlYWxseSBsb25nIHN0cmluZy4gdGhpcyBpcyBhIHJlYWxseSBsb25nIHN0cmluZy4gdGhpcyBpcyBhIHJlYWxseSBsb25nIHN0cmluZy4gdGhpcyBpcyBhIHJlYWxseSBsb25nIHN0cmluZy4='
|
27
|
-
LONG_URLENCODED = 'this+is+a+really+long+string.+this+is+a+really+long+string.+this+is+a+really+long+string.+this+is+a+really+long+string.+this+is+a+really+long+string.+this+is+a+really+long+string.+this+is+a+really+long+string.+this+is+a+really+long+string.'
|
28
|
-
|
29
|
-
# data: uris
|
30
|
-
SHORT_APPLICATION_OCTET_STREAM_URI = "data:#{APPLICATION_OCTET_STREAM};base64,#{SHORT_BASE64}"
|
31
|
-
SHORT_TEXT_PLAIN_URI = "data:#{TEXT_PLAIN},#{SHORT_URLENCODED}"
|
32
|
-
|
33
|
-
LONG_APPLICATION_OCTET_STREAM_URI = "data:#{APPLICATION_OCTET_STREAM};base64,#{LONG_BASE64}"
|
34
|
-
LONG_TEXT_PLAIN_URI = "data:#{TEXT_PLAIN},#{LONG_URLENCODED}"
|
35
|
-
|
36
|
-
|
37
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class TestCssDependencyResolver < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
@resolver = Juicer::CssDependencyResolver.new
|
6
|
-
Juicer::Test::FileSetup.new.create
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_init
|
10
|
-
assert_equal [], @resolver.files
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_resolve
|
14
|
-
b_file = path('b.css')
|
15
|
-
a_file = path('a.css')
|
16
|
-
|
17
|
-
files = @resolver.resolve(path('a.css')) do |file|
|
18
|
-
assert b_file == file || a_file == file
|
19
|
-
b_file != file
|
20
|
-
end
|
21
|
-
|
22
|
-
assert_equal [a_file], files
|
23
|
-
|
24
|
-
files = @resolver.resolve(path('a.css')) do |file|
|
25
|
-
assert b_file == file || a_file == file
|
26
|
-
true
|
27
|
-
end
|
28
|
-
|
29
|
-
assert_equal [a_file, b_file], files.sort
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_load_order
|
33
|
-
files = @resolver.resolve(path("a1.css")).collect { |file| file.split("/").pop }
|
34
|
-
assert_equal "d1.cssb1.cssc1.cssa1.css", files.join
|
35
|
-
end
|
36
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class TestJavaScriptDependencyResolver < Test::Unit::TestCase
|
4
|
-
|
5
|
-
def setup
|
6
|
-
@resolver = Juicer::JavaScriptDependencyResolver.new
|
7
|
-
Juicer::Test::FileSetup.new.create
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_init
|
11
|
-
assert_equal [], @resolver.files
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_resolve
|
15
|
-
b_file = path('b.js')
|
16
|
-
a_file = path('a.js')
|
17
|
-
|
18
|
-
files = @resolver.resolve(a_file) do |file|
|
19
|
-
assert b_file == file || a_file == file, file
|
20
|
-
b_file != file
|
21
|
-
end
|
22
|
-
|
23
|
-
assert_equal [a_file], files
|
24
|
-
|
25
|
-
files = @resolver.resolve(a_file) do |file|
|
26
|
-
assert b_file == file || a_file == file
|
27
|
-
true
|
28
|
-
end
|
29
|
-
|
30
|
-
assert_equal [a_file, b_file], files.sort
|
31
|
-
|
32
|
-
files = @resolver.resolve(b_file) do |file|
|
33
|
-
assert b_file == file || a_file == file
|
34
|
-
true
|
35
|
-
end
|
36
|
-
|
37
|
-
assert_equal [a_file, b_file], files.sort
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_directory_resolve
|
41
|
-
my_app = path("my_app.js")
|
42
|
-
expected_files = %w(pkg/pkg.js
|
43
|
-
pkg/module/moda.js
|
44
|
-
pkg/module/modb.js
|
45
|
-
my_app.js).map{|file| path(file)}
|
46
|
-
|
47
|
-
actual_files = @resolver.resolve(my_app)
|
48
|
-
assert_equal expected_files, actual_files
|
49
|
-
end
|
50
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class TestStringExtensions < Test::Unit::TestCase
|
4
|
-
context "camel case method" do
|
5
|
-
should "convert underscored string" do
|
6
|
-
assert_equal "CamelCase", "camel_case".camel_case
|
7
|
-
end
|
8
|
-
|
9
|
-
should "convert spaced string" do
|
10
|
-
assert_equal "Camel case", "camel case".camel_case
|
11
|
-
end
|
12
|
-
|
13
|
-
should "convert upper-case underscored string" do
|
14
|
-
assert_equal "CamelCase", "CAMEL_CASE".camel_case
|
15
|
-
end
|
16
|
-
|
17
|
-
should "convert 'camel cased' underscored string" do
|
18
|
-
assert_equal "CamelCase", "Camel_Case".camel_case
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context "to_class method" do
|
23
|
-
should "return String class" do
|
24
|
-
assert_equal String, "String".to_class
|
25
|
-
end
|
26
|
-
|
27
|
-
should "return String class from Object" do
|
28
|
-
assert_equal String, "String".to_class(Object)
|
29
|
-
end
|
30
|
-
|
31
|
-
should "return nested class" do
|
32
|
-
assert_equal Juicer::DependencyResolver, "Juicer::DependencyResolver".to_class
|
33
|
-
end
|
34
|
-
|
35
|
-
should "return class from module" do
|
36
|
-
assert_equal Juicer::DependencyResolver, "DependencyResolver".to_class(Juicer)
|
37
|
-
end
|
38
|
-
|
39
|
-
should "return class from nested module" do
|
40
|
-
assert_equal Juicer::Install::YuiCompressorInstaller, "YuiCompressorInstaller".to_class(Juicer::Install)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
context "classify method" do
|
45
|
-
should "return class from underscored string" do
|
46
|
-
assert_equal Juicer::DependencyResolver, "dependency_resolver".classify(Juicer)
|
47
|
-
end
|
48
|
-
|
49
|
-
should "return top level class from underscored string" do
|
50
|
-
assert_equal FileUtils, "file_utils".classify
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
context "underscore method" do
|
55
|
-
should "return underscored string from camel cased string" do
|
56
|
-
assert_equal "stylesheet_merger", "StylesheetMerger".underscore
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
class TestSymbolExtensions < Test::Unit::TestCase
|
4
|
-
context "camel case method" do
|
5
|
-
should "return camel cased string from underscored symbol" do
|
6
|
-
assert_equal "CamelCase", :camel_case.camel_case
|
7
|
-
end
|
8
|
-
|
9
|
-
should "return camel cased string from upper cased underscored symbol" do
|
10
|
-
assert_equal "CamelCase", :CAMEL_CASE.camel_case
|
11
|
-
end
|
12
|
-
|
13
|
-
should "return camel cased string from 'camel cased' underscored symbol" do
|
14
|
-
assert_equal "CamelCase", :Camel_Case.camel_case
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
context "classify method" do
|
19
|
-
should "return nested class" do
|
20
|
-
assert_equal Juicer::DependencyResolver, :dependency_resolver.classify(Juicer)
|
21
|
-
end
|
22
|
-
|
23
|
-
should "return top level class from underscored symbol" do
|
24
|
-
assert_equal FileUtils, :file_utils.classify
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,339 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
require 'fakefs/safe'
|
3
|
-
|
4
|
-
class TestImageEmbed < Test::Unit::TestCase
|
5
|
-
include FakeFS
|
6
|
-
|
7
|
-
context "ImageEmbed instance using data_uri," do
|
8
|
-
setup do
|
9
|
-
FakeFS.activate!
|
10
|
-
FileSystem.clear
|
11
|
-
FileUtils.mkdir_p("/stylesheets")
|
12
|
-
FileUtils.mkdir_p("/images")
|
13
|
-
|
14
|
-
@supported_assets = [
|
15
|
-
{ :path => '/images/test.png', :content => 'hello png!' },
|
16
|
-
{ :path => '/images/test.gif', :content => 'hello gif!' },
|
17
|
-
{ :path => '/images/test.jpg', :content => 'hello jpg!' },
|
18
|
-
{ :path => '/images/test.jpeg', :content => 'hello jpeg!' },
|
19
|
-
]
|
20
|
-
create_files(@supported_assets)
|
21
|
-
|
22
|
-
@unsupported_assets = [
|
23
|
-
{ :path => '/images/test.bmp', :content => 'hello bmp!' },
|
24
|
-
{ :path => '/images/test.js', :content => 'hello js!' },
|
25
|
-
{ :path => '/images/test.txt', :content => 'hello txt!' },
|
26
|
-
{ :path => '/images/test.swf', :content => 'hello swf!' },
|
27
|
-
{ :path => '/images/test.swf', :content => 'hello swf!' },
|
28
|
-
{ :path => '/images/test.ico', :content => 'hello ico!' },
|
29
|
-
{ :path => '/images/test.tif', :content => 'hello tif!' },
|
30
|
-
{ :path => '/images/test.tiff', :content => 'hello tiff!' },
|
31
|
-
{ :path => '/images/test.applet', :content => 'hello applet!' },
|
32
|
-
{ :path => '/images/test.jar', :content => 'hello jar!' }
|
33
|
-
]
|
34
|
-
create_files(@unsupported_assets)
|
35
|
-
@embedder = Juicer::ImageEmbed.new(:type => :data_uri, :document_root => '')
|
36
|
-
end
|
37
|
-
|
38
|
-
teardown do
|
39
|
-
FakeFS.deactivate!
|
40
|
-
end
|
41
|
-
|
42
|
-
context "save method" do
|
43
|
-
context "with files exceeding SIZE_LIMIT" do
|
44
|
-
setup do
|
45
|
-
@large_files = [{ :path => '/images/large-file.png',
|
46
|
-
:content => "hello png!" + (" " * @embedder.size_limit) }]
|
47
|
-
create_files(@large_files)
|
48
|
-
|
49
|
-
@stylesheets = [{
|
50
|
-
:path => '/stylesheets/test_embed_duplicates.css',
|
51
|
-
:content => "body: { background: url(#{@large_files.first[:path]}?embed=true); }"
|
52
|
-
}]
|
53
|
-
create_files(@stylesheets)
|
54
|
-
end
|
55
|
-
|
56
|
-
should "not embed images that exceeds size limit" do
|
57
|
-
# make sure there are no errors
|
58
|
-
assert_nothing_raised do
|
59
|
-
@embedder.save @stylesheets.first[:path]
|
60
|
-
end
|
61
|
-
|
62
|
-
css_contents = File.read(@stylesheets.first[:path])
|
63
|
-
|
64
|
-
# encode the image
|
65
|
-
image_contents = File.read( @large_files.first[:path] )
|
66
|
-
data_uri = Datafy::make_data_uri(image_contents, 'image/png')
|
67
|
-
|
68
|
-
# make sure the encoded data_uri is not present in the stylesheet
|
69
|
-
assert !css_contents.include?(data_uri)
|
70
|
-
|
71
|
-
# make sure the original url still exist in the stylesheet
|
72
|
-
assert_match Regexp.new(@large_files.first[:path]), css_contents
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
context "non empty document root" do
|
77
|
-
setup do
|
78
|
-
@document_root = '/path/to/public/dir'
|
79
|
-
@another_embedder = Juicer::ImageEmbed.new(:type => :data_uri, :document_root => @document_root)
|
80
|
-
@files = [{ :path => "#{@document_root}/images/custom-file.png", :filename => '/images/custom-file.png', :content => "hello png!" }]
|
81
|
-
create_files(@files)
|
82
|
-
end
|
83
|
-
|
84
|
-
should "embed urls with embedder" do
|
85
|
-
stylesheets = [{ :path => "#{@document_root}/stylesheets/test_absolute_path.css", :content => "body: { background: url(#{@files.first[:filename]}?embed=true); }" }]
|
86
|
-
create_files(stylesheets)
|
87
|
-
|
88
|
-
@another_embedder.save stylesheets.first[:path]
|
89
|
-
css_contents = File.read(stylesheets.first[:path])
|
90
|
-
|
91
|
-
# encode the image
|
92
|
-
image_contents = File.read(@files.first[:path])
|
93
|
-
data_uri = Datafy::make_data_uri(image_contents, 'image/png')
|
94
|
-
|
95
|
-
# make sure the encoded data_uri is present in the stylesheet
|
96
|
-
assert css_contents.include?(data_uri)
|
97
|
-
end
|
98
|
-
|
99
|
-
should "not embed urls with embedder" do
|
100
|
-
stylesheets = [{ :path => "#{@document_root}/stylesheets/test_absolute_path.css", :content => "body: { background: url(#{@files.first[:filename]}?embed=false); }" }]
|
101
|
-
create_files(stylesheets)
|
102
|
-
|
103
|
-
@another_embedder.save stylesheets.first[:path]
|
104
|
-
css_contents = File.read(stylesheets.first[:path])
|
105
|
-
|
106
|
-
# encode the image
|
107
|
-
assert css_contents.include?(@files.first[:filename])
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context "with duplicated urls" do
|
112
|
-
setup do
|
113
|
-
@stylesheets = [{
|
114
|
-
:path => '/stylesheets/test_embed_duplicates.css',
|
115
|
-
:content => <<-EOF
|
116
|
-
body: { background: url(#{@supported_assets.first[:path]}?embed=true); }
|
117
|
-
div.section: { background: url(#{@supported_assets.first[:path]}?embed=true); }
|
118
|
-
div.article: { background: url(#{@supported_assets.last[:path]}?embed=true); }
|
119
|
-
EOF
|
120
|
-
}]
|
121
|
-
create_files(@stylesheets)
|
122
|
-
end
|
123
|
-
|
124
|
-
should_eventually "provide warnings for duplicate urls"
|
125
|
-
|
126
|
-
should "not embed duplicates" do
|
127
|
-
# make sure there are no errors
|
128
|
-
assert_nothing_raised do
|
129
|
-
@embedder.save @stylesheets.first[:path]
|
130
|
-
end
|
131
|
-
|
132
|
-
css_contents = File.read(@stylesheets.first[:path])
|
133
|
-
|
134
|
-
# encode the image
|
135
|
-
image_contents = File.read(@supported_assets.first[:path])
|
136
|
-
data_uri = Datafy::make_data_uri(image_contents, 'image/png')
|
137
|
-
|
138
|
-
# make sure the encoded data_uri is not present in the stylesheet
|
139
|
-
assert !css_contents.include?(data_uri)
|
140
|
-
end
|
141
|
-
|
142
|
-
should "embed distinct urls" do
|
143
|
-
# make sure there are no errors
|
144
|
-
assert_nothing_raised do
|
145
|
-
@embedder.save @stylesheets.first[:path]
|
146
|
-
end
|
147
|
-
|
148
|
-
css_contents = File.read(@stylesheets.first[:path])
|
149
|
-
|
150
|
-
# encode the image
|
151
|
-
image_contents = File.read(@supported_assets.last[:path])
|
152
|
-
data_uri = Datafy::make_data_uri(image_contents, 'image/jpeg')
|
153
|
-
|
154
|
-
# make sure the encoded data_uri is not present in the stylesheet
|
155
|
-
assert css_contents.include?(data_uri)
|
156
|
-
|
157
|
-
assert_no_match Regexp.new(@supported_assets.last[:path]), css_contents
|
158
|
-
end
|
159
|
-
|
160
|
-
end
|
161
|
-
|
162
|
-
should "embed images into css file" do
|
163
|
-
@stylesheets = [
|
164
|
-
{
|
165
|
-
:path => '/stylesheets/test_embed_true.css',
|
166
|
-
:content => "body: { background: url(#{@supported_assets.first[:path]}?embed=true); }"
|
167
|
-
}
|
168
|
-
]
|
169
|
-
create_files( @stylesheets )
|
170
|
-
|
171
|
-
@stylesheets.each do |stylesheet|
|
172
|
-
old_contents = File.read( stylesheet[:path] )
|
173
|
-
|
174
|
-
# make sure there are no errors
|
175
|
-
assert_nothing_raised do
|
176
|
-
@embedder.save stylesheet[:path]
|
177
|
-
end
|
178
|
-
|
179
|
-
css_contents = File.read( stylesheet[:path] )
|
180
|
-
|
181
|
-
# make sure the original url does not exist anymore
|
182
|
-
assert_no_match( Regexp.new( @supported_assets.first[:path] ), css_contents )
|
183
|
-
|
184
|
-
# make sure the url has been converted into a data uri
|
185
|
-
image_contents = File.read( @supported_assets.first[:path] )
|
186
|
-
|
187
|
-
# # create the data uri from the image contents
|
188
|
-
data_uri = Datafy::make_data_uri( image_contents, 'image/png' )
|
189
|
-
|
190
|
-
# let's see if the data uri exists in the file
|
191
|
-
assert css_contents.include?( data_uri )
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
should "force embedding images into css file" do
|
196
|
-
@embedder = Juicer::ImageEmbed.new(:type => :data_uri, :document_root => '', :force => true)
|
197
|
-
@stylesheets = [
|
198
|
-
{
|
199
|
-
:path => '/stylesheets/test_embed_true.css',
|
200
|
-
:content => "body: { background: url(#{@supported_assets.first[:path]}); }"
|
201
|
-
}
|
202
|
-
]
|
203
|
-
create_files( @stylesheets )
|
204
|
-
|
205
|
-
@stylesheets.each do |stylesheet|
|
206
|
-
old_contents = File.read( stylesheet[:path] )
|
207
|
-
|
208
|
-
# make sure there are no errors
|
209
|
-
assert_nothing_raised do
|
210
|
-
@embedder.save stylesheet[:path]
|
211
|
-
end
|
212
|
-
|
213
|
-
css_contents = File.read( stylesheet[:path] )
|
214
|
-
|
215
|
-
# make sure the original url does not exist anymore
|
216
|
-
assert_no_match( Regexp.new( @supported_assets.first[:path] ), css_contents )
|
217
|
-
|
218
|
-
# make sure the url has been converted into a data uri
|
219
|
-
image_contents = File.read( @supported_assets.first[:path] )
|
220
|
-
|
221
|
-
# # create the data uri from the image contents
|
222
|
-
data_uri = Datafy::make_data_uri( image_contents, 'image/png' )
|
223
|
-
|
224
|
-
# let's see if the data uri exists in the file
|
225
|
-
assert css_contents.include?( data_uri )
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
should "not embed unflagged images" do
|
230
|
-
@stylesheets = [
|
231
|
-
{
|
232
|
-
:path => '/stylesheets/test_embed_true.css',
|
233
|
-
:content => "
|
234
|
-
body: { background: url(#{@supported_assets.first[:path]}); }
|
235
|
-
h1: { background: url(#{@supported_assets.last[:path]}?embed=false); }
|
236
|
-
"
|
237
|
-
}
|
238
|
-
]
|
239
|
-
create_files( @stylesheets )
|
240
|
-
|
241
|
-
@stylesheets.each do |stylesheet|
|
242
|
-
old_contents = File.read( stylesheet[:path] )
|
243
|
-
|
244
|
-
# make sure there are no errors
|
245
|
-
assert_nothing_raised do
|
246
|
-
@embedder.save stylesheet[:path]
|
247
|
-
end
|
248
|
-
|
249
|
-
css_contents = File.read( stylesheet[:path] )
|
250
|
-
|
251
|
-
# make sure the original url still exists
|
252
|
-
assert_match( Regexp.new( @supported_assets.first[:path] ), css_contents )
|
253
|
-
assert_match( Regexp.new( @supported_assets.last[:path] ), css_contents )
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
|
258
|
-
should "not embed unsupported images" do
|
259
|
-
@stylesheets = [
|
260
|
-
{
|
261
|
-
:path => '/stylesheets/test_embed_true.css',
|
262
|
-
:content => "
|
263
|
-
body: { background: url(#{@unsupported_assets.first[:path]}?embed=true); }
|
264
|
-
h1: { background: url(#{@unsupported_assets.last[:path]}?embed=true); }
|
265
|
-
"
|
266
|
-
}
|
267
|
-
]
|
268
|
-
create_files( @stylesheets )
|
269
|
-
|
270
|
-
@stylesheets.each do |stylesheet|
|
271
|
-
old_contents = File.read( stylesheet[:path] )
|
272
|
-
|
273
|
-
# make sure there are no errors
|
274
|
-
assert_nothing_raised do
|
275
|
-
@embedder.save stylesheet[:path]
|
276
|
-
end
|
277
|
-
|
278
|
-
css_contents = File.read( stylesheet[:path] )
|
279
|
-
|
280
|
-
# make sure the original url still exists
|
281
|
-
assert_match( Regexp.new( @unsupported_assets.first[:path] ), css_contents )
|
282
|
-
assert_match( Regexp.new( @unsupported_assets.last[:path] ), css_contents )
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
end # context
|
287
|
-
|
288
|
-
context "embed method" do
|
289
|
-
should "not modify regular paths" do
|
290
|
-
path = @supported_assets.first[:path]
|
291
|
-
assert_equal( path, @embedder.embed_data_uri( path ) )
|
292
|
-
end
|
293
|
-
|
294
|
-
should "not modify paths flagged as not embeddable" do
|
295
|
-
path = "#{@supported_assets.first[:path]}?embed=false"
|
296
|
-
assert_equal( path, @embedder.embed_data_uri( path ) )
|
297
|
-
end
|
298
|
-
|
299
|
-
should "embed image when path flagged as embeddable" do
|
300
|
-
path = "#{@supported_assets.first[:path]}?embed=true"
|
301
|
-
assert_not_equal( path, @embedder.embed_data_uri( path ) )
|
302
|
-
end
|
303
|
-
|
304
|
-
should "encode all supported asset types" do
|
305
|
-
@supported_assets.each do |asset|
|
306
|
-
path = "#{asset[:path]}?embed=true"
|
307
|
-
assert_not_equal( path, @embedder.embed_data_uri( path ) )
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
should "not encode unsupported asset types" do
|
312
|
-
@unsupported_assets.each do |asset|
|
313
|
-
path = "#{asset[:path]}?embed=true"
|
314
|
-
assert_equal( path, @embedder.embed_data_uri( path ) )
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
should "set correct mimetype for supported extensions" do
|
319
|
-
@supported_assets.each do |asset|
|
320
|
-
path = "#{asset[:path]}?embed=true"
|
321
|
-
extension = /(png|gif|jpg|jpeg)/.match( asset[:path] )
|
322
|
-
assert_match(/image\/#{extension}/, @embedder.embed_data_uri( path ) )
|
323
|
-
end
|
324
|
-
end
|
325
|
-
end # context
|
326
|
-
end
|
327
|
-
|
328
|
-
private
|
329
|
-
# expects the containing path to have been created already
|
330
|
-
def create_files( files = [] )
|
331
|
-
files.each do |file|
|
332
|
-
path = file[:path]
|
333
|
-
File.open(path, 'w') do |f|
|
334
|
-
f.write file[:content]
|
335
|
-
assert File.exists?( file[:path] )
|
336
|
-
end
|
337
|
-
end
|
338
|
-
end
|
339
|
-
end
|