juicer 0.2.6 → 1.0.0

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