juicer 0.2.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/History.txt +28 -0
  2. data/Rakefile +84 -36
  3. data/Readme.rdoc +192 -23
  4. data/VERSION +1 -0
  5. data/bin/juicer +2 -4
  6. data/lib/juicer.rb +9 -10
  7. data/lib/juicer/asset/path.rb +275 -0
  8. data/lib/juicer/asset/path_resolver.rb +79 -0
  9. data/lib/juicer/binary.rb +3 -5
  10. data/lib/juicer/cache_buster.rb +112 -27
  11. data/lib/juicer/command/install.rb +4 -2
  12. data/lib/juicer/command/list.rb +16 -9
  13. data/lib/juicer/command/merge.rb +30 -14
  14. data/lib/juicer/command/verify.rb +1 -1
  15. data/lib/juicer/css_cache_buster.rb +31 -47
  16. data/lib/juicer/datafy/datafy.rb +20 -0
  17. data/lib/juicer/dependency_resolver/css_dependency_resolver.rb +29 -0
  18. data/lib/juicer/dependency_resolver/dependency_resolver.rb +101 -0
  19. data/lib/juicer/dependency_resolver/javascript_dependency_resolver.rb +23 -0
  20. data/lib/juicer/ext/logger.rb +5 -0
  21. data/lib/juicer/ext/string.rb +47 -0
  22. data/lib/juicer/ext/symbol.rb +15 -0
  23. data/lib/juicer/image_embed.rb +129 -0
  24. data/lib/juicer/install/base.rb +2 -2
  25. data/lib/juicer/install/closure_compiler_installer.rb +69 -0
  26. data/lib/juicer/install/jslint_installer.rb +3 -3
  27. data/lib/juicer/install/rhino_installer.rb +3 -2
  28. data/lib/juicer/install/yui_compressor_installer.rb +3 -2
  29. data/lib/juicer/jslint.rb +1 -1
  30. data/lib/juicer/merger/base.rb +1 -1
  31. data/lib/juicer/merger/javascript_merger.rb +3 -4
  32. data/lib/juicer/merger/stylesheet_merger.rb +13 -15
  33. data/lib/juicer/minifyer/closure_compiler.rb +90 -0
  34. data/lib/juicer/minifyer/java_base.rb +77 -0
  35. data/lib/juicer/minifyer/yui_compressor.rb +15 -48
  36. data/test/bin/jslint-1.0.js +523 -0
  37. data/test/bin/jslint.js +523 -0
  38. data/test/bin/rhino1_7R1.zip +0 -0
  39. data/test/bin/rhino1_7R2-RC1.jar +0 -0
  40. data/test/bin/rhino1_7R2-RC1.zip +0 -0
  41. data/test/bin/yuicompressor +0 -0
  42. data/test/bin/yuicompressor-2.3.5.zip +0 -0
  43. data/test/bin/yuicompressor-2.4.2.jar +0 -0
  44. data/test/bin/yuicompressor-2.4.2.zip +0 -0
  45. data/test/data/Changelog.txt +10 -0
  46. data/test/data/a.css +3 -0
  47. data/test/data/a.js +5 -0
  48. data/test/data/a1.css +5 -0
  49. data/test/data/b.css +1 -0
  50. data/test/data/b.js +5 -0
  51. data/test/data/b1.css +5 -0
  52. data/test/data/c1.css +3 -0
  53. data/test/data/css/2.gif +1 -0
  54. data/test/data/css/test.css +11 -0
  55. data/test/data/css/test2.css +1 -0
  56. data/test/data/d1.css +3 -0
  57. data/test/data/images/1.png +1 -0
  58. data/test/data/my_app.js +2 -0
  59. data/test/data/not-ok.js +2 -0
  60. data/test/data/ok.js +3 -0
  61. data/test/data/path_test.css +5 -0
  62. data/test/data/path_test2.css +14 -0
  63. data/test/data/pkg/module/moda.js +2 -0
  64. data/test/data/pkg/module/modb.js +3 -0
  65. data/test/data/pkg/pkg.js +1 -0
  66. data/test/fixtures/yui-download.html +425 -0
  67. data/test/test_helper.rb +36 -7
  68. data/test/unit/juicer/asset/path_resolver_test.rb +76 -0
  69. data/test/unit/juicer/asset/path_test.rb +370 -0
  70. data/test/unit/juicer/cache_buster_test.rb +104 -0
  71. data/test/{juicer/test_chainable.rb → unit/juicer/chainable_test.rb} +1 -1
  72. data/test/unit/juicer/command/install_test.rb +58 -0
  73. data/test/{juicer/command/test_list.rb → unit/juicer/command/list_test.rb} +26 -14
  74. data/test/unit/juicer/command/merge_test.rb +162 -0
  75. data/test/{juicer/command/test_util.rb → unit/juicer/command/util_test.rb} +10 -6
  76. data/test/unit/juicer/command/verify_test.rb +48 -0
  77. data/test/{juicer/test_css_cache_buster.rb → unit/juicer/css_cache_buster_test.rb} +10 -30
  78. data/test/unit/juicer/datafy_test.rb +37 -0
  79. data/test/{juicer/merger/test_css_dependency_resolver.rb → unit/juicer/dependency_resolver/css_dependency_resolver_test.rb} +2 -2
  80. data/test/{juicer/merger/test_javascript_dependency_resolver.rb → unit/juicer/dependency_resolver/javascript_dependency_resolver_test.rb} +13 -2
  81. data/test/unit/juicer/ext/{#string_test.rb# → string_test.rb} +0 -7
  82. data/test/unit/juicer/ext/symbol_test.rb +27 -0
  83. data/test/unit/juicer/image_embed_test.rb +271 -0
  84. data/test/unit/juicer/install/installer_base_test.rb +214 -0
  85. data/test/{juicer/install/test_jslint_installer.rb → unit/juicer/install/jslint_installer_test.rb} +1 -1
  86. data/test/{juicer/install/test_rhino_installer.rb → unit/juicer/install/rhino_installer_test.rb} +1 -1
  87. data/test/{juicer/install/test_yui_compressor_installer.rb → unit/juicer/install/yui_compressor_test.rb} +16 -16
  88. data/test/unit/juicer/jslint_test.rb +60 -0
  89. data/test/{juicer/merger/test_base.rb → unit/juicer/merger/base_test.rb} +1 -1
  90. data/test/{juicer/merger/test_javascript_merger.rb → unit/juicer/merger/javascript_merger_test.rb} +2 -2
  91. data/test/{juicer/merger/test_stylesheet_merger.rb → unit/juicer/merger/stylesheet_merger_test.rb} +15 -13
  92. data/test/unit/juicer/minifyer/closure_compressor_test.rb +107 -0
  93. data/test/{integration → unit}/juicer/minifyer/yui_compressor_test.rb +30 -47
  94. data/test/unit/juicer_test.rb +1 -0
  95. metadata +207 -113
  96. data/lib/juicer/core.rb +0 -61
  97. data/lib/juicer/merger/css_dependency_resolver.rb +0 -25
  98. data/lib/juicer/merger/dependency_resolver.rb +0 -82
  99. data/lib/juicer/merger/javascript_dependency_resolver.rb +0 -21
  100. data/tasks/ann.rake +0 -80
  101. data/tasks/bones.rake +0 -20
  102. data/tasks/gem.rake +0 -201
  103. data/tasks/git.rake +0 -40
  104. data/tasks/notes.rake +0 -27
  105. data/tasks/post_load.rake +0 -34
  106. data/tasks/rdoc.rake +0 -51
  107. data/tasks/rubyforge.rake +0 -55
  108. data/tasks/setup.rb +0 -292
  109. data/tasks/spec.rake +0 -54
  110. data/tasks/svn.rake +0 -47
  111. data/tasks/test.rake +0 -40
  112. data/tasks/test/setup.rake +0 -35
  113. data/tasks/zentest.rake +0 -36
  114. data/test/juicer/command/test_install.rb +0 -53
  115. data/test/juicer/command/test_merge.rb +0 -160
  116. data/test/juicer/command/test_verify.rb +0 -33
  117. data/test/juicer/install/test_installer_base.rb +0 -195
  118. data/test/juicer/minifyer/test_yui_compressor.rb +0 -159
  119. data/test/juicer/test_cache_buster.rb +0 -58
  120. data/test/juicer/test_core.rb +0 -47
  121. data/test/juicer/test_jslint.rb +0 -33
  122. data/test/test_juicer.rb +0 -4
@@ -0,0 +1,214 @@
1
+ require "test_helper"
2
+
3
+ module Juicer
4
+ module Install
5
+ class SomeMagicInstaller < Juicer::Install::Base
6
+ def install(version = nil)
7
+ version ||= "1.0.0"
8
+ ver = super(version)
9
+ File.open(File.join(@install_dir, path, "bin", ver + ".app"), "w") do |file|
10
+ file.puts version
11
+ end
12
+
13
+ version
14
+ end
15
+
16
+ def uninstall(version = "1.0.0")
17
+ super(version) do |path, version|
18
+ File.delete(File.join(path, "bin", version + ".app"))
19
+ end
20
+ end
21
+ end
22
+
23
+ class SomeOtherInstaller < Juicer::Install::SomeMagicInstaller
24
+ def install(version = nil)
25
+ version ||= "1.0.0"
26
+ super(version)
27
+ end
28
+
29
+ def latest
30
+ "1.0.0"
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ class TestInstallerBase < Test::Unit::TestCase
37
+ def initialize(*args)
38
+ super
39
+ @juicer_home = File.expand_path(File.join("test", "data", ".juicer"))
40
+ end
41
+
42
+ def setup
43
+ FileUtils.rm_rf @juicer_home
44
+ @installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
45
+ end
46
+
47
+ context "installation directory" do
48
+ should "should be Juicer.home by default" do
49
+ installer = Juicer::Install::SomeMagicInstaller.new
50
+ assert_equal Juicer.home, installer.install_dir
51
+ end
52
+
53
+ should "override installation directory" do
54
+ installer = Juicer::Install::SomeMagicInstaller.new("/home/baluba")
55
+ assert_equal "/home/baluba", installer.install_dir
56
+ end
57
+ end
58
+
59
+ context "latest" do
60
+ should "raise NotImplementedError" do
61
+ assert_raise NotImplementedError do
62
+ @installer.latest
63
+ end
64
+ end
65
+ end
66
+
67
+ context "paths and name" do
68
+ should "reflect installer class name" do
69
+ assert_equal "lib/some_magic", @installer.path
70
+ end
71
+
72
+ should "reflect installer class name for bin path" do
73
+ assert_equal "lib/some_magic/bin", @installer.bin_path
74
+ end
75
+
76
+ should "reflect class name in human name" do
77
+ assert_equal "Some Magic", @installer.name
78
+ end
79
+ end
80
+
81
+ context "already installed module" do
82
+ should "report as installed" do
83
+ assert !@installer.installed?("x.y.z")
84
+ @installer.install("x.y.z")
85
+ assert @installer.installed?("x.y.z")
86
+ end
87
+
88
+ should "fail re-installation" do
89
+ @installer.install("1.0.0")
90
+
91
+ assert_raise RuntimeError do
92
+ @installer.install("1.0.0")
93
+ end
94
+ end
95
+ end
96
+
97
+ context "installation" do
98
+ should "create bin and release folders" do
99
+ assert_equal "1.0.0", @installer.install("1.0.0")
100
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/bin"))
101
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
102
+ end
103
+ end
104
+
105
+ context "uninstall" do
106
+ should "remove library path when only version is uninstalled" do
107
+ @installer.install("1.0.0")
108
+ @installer.uninstall("1.0.0")
109
+ assert !File.exists?(File.join(@juicer_home, "lib/some_magic"))
110
+ end
111
+
112
+ should "keep other versions" do
113
+ @installer.install("1.0.0")
114
+ @installer.install("1.0.1")
115
+ @installer.uninstall("1.0.0")
116
+ assert !File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
117
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic"))
118
+ end
119
+ end
120
+
121
+ context "download" do
122
+ # TODO: Don't download
123
+ should "cache files" do
124
+ File.expects(:delete).at_most(0)
125
+ @installer.download("http://www.julienlecomte.net/yuicompressor/")
126
+ filename = File.join(@juicer_home, "download/some_magic/yuicompressor")
127
+ assert File.exists?(filename)
128
+ @installer.download("http://www.julienlecomte.net/yuicompressor/")
129
+ end
130
+
131
+ should "redownload cached files when forced" do
132
+ File.expects(:delete).at_most(1)
133
+ @installer.download("http://www.julienlecomte.net/yuicompressor/")
134
+ filename = File.join(@juicer_home, "download/some_magic/yuicompressor")
135
+ assert File.exists?(filename)
136
+ File.expects(:open).at_most(1)
137
+ @installer.download("http://www.julienlecomte.net/yuicompressor/", true)
138
+ end
139
+ end
140
+
141
+ context "installer dependencies" do
142
+ should "not return true from installer when missing dependencies" do
143
+ @installer.install
144
+
145
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
146
+ assert !installer.installed?("1.0.1"), "Installer should be installed"
147
+
148
+ installer.dependency Juicer::Install::SomeOtherInstaller
149
+ assert !installer.installed?("1.0.1"), "Installer should not report as being installed when missing dependencies"
150
+ end
151
+
152
+ should "install single dependency" do
153
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
154
+ installer.dependency Juicer::Install::SomeOtherInstaller
155
+ installer.install "1.0.0"
156
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
157
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/1.0.0"))
158
+ end
159
+
160
+ should "not raise error when they exist" do
161
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
162
+ installer.dependency Juicer::Install::SomeOtherInstaller
163
+
164
+ dep = Juicer::Install::SomeOtherInstaller.new
165
+ dep.install unless dep.installed?
166
+
167
+ assert_nothing_raised do
168
+ installer.install "1.0.0"
169
+ end
170
+ end
171
+
172
+ should "get dependency from single symbol" do
173
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
174
+ installer.dependency :some_other
175
+ installer.install "1.0.0"
176
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
177
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/1.0.0"))
178
+ end
179
+
180
+ should "get dependency from single string" do
181
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
182
+ installer.dependency "some_other"
183
+ installer.install "1.0.0"
184
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
185
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/1.0.0"))
186
+ end
187
+
188
+ should "support multiple dependencies" do
189
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
190
+ installer.dependency :some_other
191
+ installer.dependency :some_other, "2.0.4"
192
+ installer.dependency :some_other, "3.0.5"
193
+ installer.install "1.0.0"
194
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
195
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/1.0.0"))
196
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/2.0.4"))
197
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/3.0.5"))
198
+ end
199
+ end
200
+
201
+ context "resolving class" do
202
+ should "accept class input" do
203
+ assert_equal Juicer::Install::SomeMagicInstaller, Juicer::Install.get(Juicer::Install::SomeMagicInstaller)
204
+ end
205
+
206
+ should "accept symbol input" do
207
+ assert_equal Juicer::Install::SomeMagicInstaller, Juicer::Install.get(:some_magic)
208
+ end
209
+
210
+ should "accept string input" do
211
+ assert_equal Juicer::Install::SomeMagicInstaller, Juicer::Install.get("some_magic")
212
+ end
213
+ end
214
+ end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
1
+ require "test_helper"
2
2
 
3
3
  class TestJsLintInstaller < Test::Unit::TestCase
4
4
  def setup
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
1
+ require "test_helper"
2
2
 
3
3
  class TestRhinoInstaller < Test::Unit::TestCase
4
4
  def setup
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
1
+ require "test_helper"
2
2
 
3
3
  class TestYuiCompressorInstall < Test::Unit::TestCase
4
4
  def setup
@@ -35,22 +35,22 @@ class TestYuiCompressorInstall < Test::Unit::TestCase
35
35
  assert !File.exists?(path(".juicer/lib/yui_compressor"))
36
36
  end
37
37
 
38
- def test_install_specific_version
39
- @installer.install("2.3.5")
38
+ # def test_install_specific_version
39
+ # @installer.install("2.3.5")
40
40
 
41
- assert File.exists?(path(".juicer/lib/yui_compressor/bin"))
42
- assert File.exists?(path(".juicer/lib/yui_compressor/2.3.5"))
43
- assert_equal "yuicompressor-2.3.5.jar", File.basename(Dir.glob(path(".juicer/lib/yui_compressor/bin/*"))[0])
44
- end
41
+ # assert File.exists?(path(".juicer/lib/yui_compressor/bin"))
42
+ # assert File.exists?(path(".juicer/lib/yui_compressor/2.3.5"))
43
+ # assert_equal "yuicompressor-2.3.5.jar", File.basename(Dir.glob(path(".juicer/lib/yui_compressor/bin/*"))[0])
44
+ # end
45
45
 
46
- def test_uninstall_should_leave_directories_when_other_versions_are_installed
47
- @installer.install
48
- @installer.install("2.3.5")
49
- assert File.exists?(path(".juicer/lib/yui_compressor/bin"))
50
- assert_equal 6, Dir.glob(path(".juicer/lib/yui_compressor/**/*")).find_all { |f| File.file?(f) }.length
46
+ # def test_uninstall_should_leave_directories_when_other_versions_are_installed
47
+ # @installer.install
48
+ # @installer.install("2.3.5")
49
+ # assert File.exists?(path(".juicer/lib/yui_compressor/bin"))
50
+ # assert_equal 6, Dir.glob(path(".juicer/lib/yui_compressor/**/*")).find_all { |f| File.file?(f) }.length
51
51
 
52
- @installer.uninstall("2.3.5")
53
- assert File.exists?(path(".juicer/lib/yui_compressor"))
54
- assert_equal 3, Dir.glob(path(".juicer/lib/yui_compressor/**/*")).find_all { |f| File.file?(f) }.length
55
- end
52
+ # @installer.uninstall("2.3.5")
53
+ # assert File.exists?(path(".juicer/lib/yui_compressor"))
54
+ # assert_equal 3, Dir.glob(path(".juicer/lib/yui_compressor/**/*")).find_all { |f| File.file?(f) }.length
55
+ # end
56
56
  end
@@ -0,0 +1,60 @@
1
+ require "test_helper"
2
+
3
+ class TestJsLint < Test::Unit::TestCase
4
+ def initialize(*args)
5
+ @path = File.expand_path(path("../bin"))
6
+ @file = path("jsltest.js")
7
+ super
8
+ end
9
+
10
+ def setup
11
+ FileUtils.mkdir(path("")) unless File.exists?(path(""))
12
+ File.open(@file, "w") { |f| f.puts "" }
13
+ end
14
+
15
+ def teardown
16
+ File.delete(@file)
17
+ end
18
+
19
+ context "verifying file with jslint" do
20
+ should "shell out to rhino/jslint" do
21
+ jslint = Juicer::JsLint.new(:bin_path => @path)
22
+ jslint.expects(:execute).with("-jar \"#{@path}/rhino1_7R2-RC1.jar\" \"#{@path}/jslint-1.0.js\" \"#{@file}\"").returns("jslint: No problems")
23
+
24
+ assert jslint.check(@file).ok?
25
+ end
26
+ end
27
+
28
+ context "jslint report returns" do
29
+ should "be a report object for valid files" do
30
+ jslint = Juicer::JsLint.new(:bin_path => @path)
31
+ jslint.expects(:execute).returns("jslint: No problems")
32
+
33
+ assert_equal Juicer::JsLint::Report, jslint.check(@file).class
34
+ end
35
+
36
+ should "be a report object for invalid files" do
37
+ jslint = Juicer::JsLint.new(:bin_path => @path)
38
+ jslint.expects(:execute).returns("Wrong use of semicolon\nWrong blabla")
39
+
40
+ assert_equal Juicer::JsLint::Report, jslint.check(path("not-ok.js")).class
41
+ end
42
+ end
43
+
44
+ context "errors" do
45
+ should "be available on report" do
46
+ jslint = Juicer::JsLint.new(:bin_path => @path)
47
+ jslint.expects(:execute).returns("Wrong use of semicolon\nWrong blabla\nWrong use of semicolon\nWrong blabla")
48
+
49
+ assert_equal 2, jslint.check(@file).errors.length
50
+ end
51
+
52
+ should "be error objects" do
53
+ jslint = Juicer::JsLint.new(:bin_path => @path)
54
+ jslint.expects(:execute).returns("Wrong use of semicolon\nWrong blabla")
55
+
56
+ error = jslint.check(@file).errors.first
57
+ assert_equal Juicer::JsLint::Error, error.class
58
+ end
59
+ end
60
+ end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
1
+ require "test_helper"
2
2
 
3
3
  class TestMergerBase < Test::Unit::TestCase
4
4
 
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
1
+ require "test_helper"
2
2
 
3
3
  class TestJavaScriptMerger < Test::Unit::TestCase
4
4
 
@@ -14,7 +14,7 @@ class TestJavaScriptMerger < Test::Unit::TestCase
14
14
 
15
15
  def test_init
16
16
  Juicer::Merger::JavaScriptMerger.publicize_methods do
17
- assert_equal Juicer::Merger::JavaScriptDependencyResolver, @file_merger.dependency_resolver.class
17
+ assert_equal Juicer::JavaScriptDependencyResolver, @file_merger.dependency_resolver.class
18
18
  end
19
19
  end
20
20
 
@@ -1,23 +1,25 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
1
+ require "test_helper"
2
2
 
3
3
  class TestStylesheetMerger < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @file_merger = Juicer::Merger::StylesheetMerger.new
7
7
  Juicer::Test::FileSetup.new.create
8
+ @cwd = Dir.pwd
8
9
  Dir.chdir path("")
9
10
  end
10
11
 
11
12
  def teardown
12
13
  file = path('test_out.css')
13
14
  File.delete(file) if File.exists?(file)
15
+ Dir.chdir(@cwd)
14
16
  end
15
17
 
16
- def test_init
17
- Juicer::Merger::StylesheetMerger.publicize_methods do
18
- assert_equal Juicer::Merger::CssDependencyResolver, @file_merger.dependency_resolver.class
19
- end
20
- end
18
+ def test_init
19
+ Juicer::Merger::StylesheetMerger.publicize_methods do
20
+ assert_equal Juicer::CssDependencyResolver, @file_merger.dependency_resolver.class
21
+ end
22
+ end
21
23
 
22
24
  def test_merge
23
25
  Juicer::Merger::StylesheetMerger.publicize_methods do
@@ -78,7 +80,7 @@ EOF
78
80
  end
79
81
  end
80
82
 
81
- def test_resolve_path_error_when_relative_missing_web_root
83
+ def test_resolve_path_error_when_relative_missing_document_root
82
84
  merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true
83
85
 
84
86
  Juicer::Merger::StylesheetMerger.publicize_methods do
@@ -89,7 +91,7 @@ EOF
89
91
  end
90
92
 
91
93
  def test_resolve_path_should_make_absolute_urls_relative
92
- merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true, :web_root => "/home/usr"
94
+ merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true, :document_root => "/home/usr"
93
95
 
94
96
  Juicer::Merger::StylesheetMerger.publicize_methods do
95
97
  merger.instance_eval { @root = Pathname.new "/home/usr/design" }
@@ -107,7 +109,7 @@ EOF
107
109
  end
108
110
  end
109
111
 
110
- def test_resolve_path_error_when_missing_absolute_web_root
112
+ def test_resolve_path_error_when_missing_absolute_document_root
111
113
  merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true
112
114
 
113
115
  Juicer::Merger::StylesheetMerger.publicize_methods do
@@ -118,7 +120,7 @@ EOF
118
120
  end
119
121
 
120
122
  def test_resolve_path_should_make_relative_urls_absolute
121
- merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true, :web_root => "/home/usr"
123
+ merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true, :document_root => "/home/usr"
122
124
 
123
125
  Juicer::Merger::StylesheetMerger.publicize_methods do
124
126
  merger.instance_eval { @root = Pathname.new "/home/usr/design" }
@@ -136,7 +138,7 @@ EOF
136
138
  end
137
139
 
138
140
  def test_resolve_path_should_redefine_absolute_urls
139
- merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true, :web_root => "/home/usr"
141
+ merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true, :document_root => "/home/usr"
140
142
 
141
143
  Juicer::Merger::StylesheetMerger.publicize_methods do
142
144
  merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
@@ -156,8 +158,8 @@ EOF
156
158
  end
157
159
  end
158
160
 
159
- def test_resolve_paths_should_handle_relative_web_roots
160
- merger = Juicer::Merger::StylesheetMerger.new [], :web_root => "test/data", :relative_urls => true
161
+ def test_resolve_paths_should_handle_relative_document_roots
162
+ merger = Juicer::Merger::StylesheetMerger.new [], :document_root => "test/data", :relative_urls => true
161
163
  merger << File.expand_path("css/test2.css")
162
164
 
163
165
  Juicer::Merger::StylesheetMerger.publicize_methods do
@@ -0,0 +1,107 @@
1
+ require "test_helper"
2
+ require "juicer/minifyer/closure_compiler"
3
+
4
+ class ClosureCompilerTest < Test::Unit::TestCase
5
+ def setup
6
+ @jar = "compiler.jar"
7
+ @input = "in-file.css"
8
+ @output = "out-file.css"
9
+ @cmd = %Q{-jar "#@jar"}
10
+ @closure = Juicer::Minifyer::ClosureCompiler.new
11
+ @closure.stubs(:locate_jar).returns(@jar)
12
+ end
13
+
14
+ context "#save" do
15
+ should "overwrite existing file" do
16
+ @closure.expects(:execute).with(%Q{#@cmd -js_output_file "#@output" -js "#@output"})
17
+ @closure.save(@output, @output)
18
+ end
19
+
20
+ should "write compressed input to output" do
21
+ @closure.expects(:execute).with(%Q{#@cmd -js_output_file "#@output" -js "#@input"})
22
+ @closure.save(@input, @output)
23
+ end
24
+
25
+ should "create non-existant path" do
26
+ output = "some/nested/directory"
27
+ @closure.expects(:execute).with(%Q{#@cmd -js_output_file "#{output}/file.css" -js "#@input"})
28
+ FileUtils.expects(:mkdir_p).with(output)
29
+ @closure.save(@input, "#{output}/file.css")
30
+ end
31
+ end
32
+
33
+ context "locating jar" do
34
+ setup do
35
+ # Avoid developer env settings
36
+ @closure_home = ENV['CLOSUREC_HOME']
37
+ ENV.delete('CLOSUREC_HOME')
38
+ end
39
+
40
+ teardown do
41
+ ENV['CLOSUREC_HOME'] = @closure_home
42
+ File.delete('compiler-2.3.4.jar') if File.exists?('compiler-2.3.4.jar')
43
+ File.delete('compiler-2.3.5.jar') if File.exists?('compiler-2.3.5.jar')
44
+ File.delete('compiler.jar') if File.exists?('compiler.jar')
45
+ FileUtils.rm_rf("another") if File.exists?("another")
46
+ end
47
+
48
+ should "not find jar when no jars on path" do
49
+ Juicer::Minifyer::ClosureCompiler.publicize_methods do
50
+ closure = Juicer::Minifyer::ClosureCompiler.new
51
+
52
+ assert_nil closure.locate_jar
53
+ end
54
+ end
55
+
56
+ should "find only jar in path" do
57
+ Juicer::Minifyer::ClosureCompiler.publicize_methods do
58
+ File.open('compiler-2.3.4.jar', 'w') { |f| f.puts '' }
59
+ closure = Juicer::Minifyer::ClosureCompiler.new
60
+
61
+ assert_equal File.expand_path('compiler-2.3.4.jar'), closure.locate_jar
62
+ end
63
+ end
64
+
65
+ should "find most recent of two jars on path" do
66
+ Juicer::Minifyer::ClosureCompiler.publicize_methods do
67
+ # Create files
68
+ File.open('compiler-2.3.4.jar', 'w') { |f| f.puts '' }
69
+ File.open('compiler-2.3.5.jar', 'w') { |f| f.puts '' }
70
+
71
+ closure = Juicer::Minifyer::ClosureCompiler.new
72
+
73
+ # Test
74
+ assert_equal File.expand_path('compiler-2.3.5.jar'), closure.locate_jar
75
+ end
76
+ end
77
+
78
+ should "find most recent of three jar files on path" do
79
+ Juicer::Minifyer::ClosureCompiler.publicize_methods do
80
+ # Create files
81
+ File.open('compiler-2.3.4.jar', 'w') { |f| f.puts '' }
82
+ File.open('compiler-2.3.5.jar', 'w') { |f| f.puts '' }
83
+ File.open('compiler.jar', 'w') { |f| f.puts '' }
84
+
85
+ closure = Juicer::Minifyer::ClosureCompiler.new
86
+
87
+ # Test
88
+ assert_equal File.expand_path('compiler.jar'), closure.locate_jar
89
+ end
90
+ end
91
+
92
+ should "find jar in custom directory" do
93
+ Juicer::Minifyer::ClosureCompiler.publicize_methods do
94
+ # Prepare
95
+ Dir.mkdir('another')
96
+ File.open('another/compiler-2.3.4.jar', 'w') { |f| f.puts "" }
97
+
98
+ closure = Juicer::Minifyer::ClosureCompiler.new
99
+
100
+ # Test
101
+ assert_nil closure.locate_jar
102
+ closure = Juicer::Minifyer::ClosureCompiler.new({ :bin_path => 'another' })
103
+ assert_equal File.expand_path('another/compiler-2.3.4.jar'), closure.locate_jar
104
+ end
105
+ end
106
+ end
107
+ end