cjohansen-juicer 0.2.0 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/History.txt +17 -5
  2. data/Manifest.txt +33 -15
  3. data/Rakefile +22 -1
  4. data/Readme.rdoc +68 -32
  5. data/bin/juicer +1 -0
  6. data/lib/juicer.rb +26 -1
  7. data/lib/juicer/binary.rb +173 -0
  8. data/lib/juicer/cache_buster.rb +45 -0
  9. data/lib/juicer/chainable.rb +1 -0
  10. data/lib/juicer/cli.rb +13 -8
  11. data/lib/juicer/command/install.rb +59 -0
  12. data/lib/juicer/command/list.rb +50 -0
  13. data/lib/juicer/command/merge.rb +130 -31
  14. data/lib/juicer/command/util.rb +32 -0
  15. data/lib/juicer/command/verify.rb +60 -0
  16. data/lib/juicer/core.rb +61 -0
  17. data/lib/juicer/css_cache_buster.rb +106 -0
  18. data/lib/juicer/install/base.rb +186 -0
  19. data/lib/juicer/install/jslint_installer.rb +51 -0
  20. data/lib/juicer/install/rhino_installer.rb +52 -0
  21. data/lib/juicer/install/yui_compressor_installer.rb +66 -0
  22. data/lib/juicer/jslint.rb +90 -0
  23. data/lib/juicer/merger/base.rb +74 -72
  24. data/lib/juicer/merger/dependency_resolver.rb +34 -16
  25. data/lib/juicer/merger/stylesheet_merger.rb +71 -1
  26. data/lib/juicer/minifyer/yui_compressor.rb +20 -43
  27. data/tasks/test/setup.rake +35 -0
  28. data/test/juicer/command/test_install.rb +53 -0
  29. data/test/juicer/command/test_list.rb +69 -0
  30. data/test/juicer/command/test_merge.rb +160 -0
  31. data/test/juicer/command/test_util.rb +54 -0
  32. data/test/juicer/command/test_verify.rb +33 -0
  33. data/test/juicer/install/test_installer_base.rb +195 -0
  34. data/test/juicer/install/test_jslint_installer.rb +54 -0
  35. data/test/juicer/install/test_rhino_installer.rb +57 -0
  36. data/test/juicer/install/test_yui_compressor_installer.rb +56 -0
  37. data/test/juicer/merger/test_base.rb +2 -3
  38. data/test/juicer/merger/test_css_dependency_resolver.rb +8 -4
  39. data/test/juicer/merger/test_javascript_dependency_resolver.rb +6 -7
  40. data/test/juicer/merger/test_javascript_merger.rb +1 -2
  41. data/test/juicer/merger/test_stylesheet_merger.rb +118 -2
  42. data/test/juicer/minifyer/test_yui_compressor.rb +109 -29
  43. data/test/juicer/test_cache_buster.rb +58 -0
  44. data/test/juicer/test_chainable.rb +7 -0
  45. data/test/juicer/test_core.rb +47 -0
  46. data/test/juicer/test_css_cache_buster.rb +91 -0
  47. data/test/juicer/test_jslint.rb +33 -0
  48. data/test/test_helper.rb +65 -196
  49. metadata +77 -26
  50. data/.gitignore +0 -2
  51. data/juicer.gemspec +0 -38
  52. data/lib/juicer/minifyer/compressor.rb +0 -125
  53. data/test/juicer/minifyer/test_compressor.rb +0 -36
@@ -0,0 +1,91 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[.. test_helper])) unless defined?(Juicer)
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
+ end
12
+
13
+ def test_resolve_full_url
14
+ assert_equal "http://localhost/images/1.png", @buster.resolve("http://localhost/images/1.png", "")
15
+ end
16
+
17
+ def test_resolve_relative_url
18
+ file = path("images/1.png")
19
+ assert_equal(file, @buster.resolve("../images/1.png", path("css/test.css")))
20
+ end
21
+
22
+ def test_resolve_absolute_url_without_web_root_should_fail
23
+ file = path("images/1.png")
24
+ assert_raise FileNotFoundError do
25
+ @buster.resolve("/images/1.png", path("css/test.css"))
26
+ end
27
+ end
28
+
29
+ def test_resolve_absolute_url_with_web_root
30
+ buster = Juicer::CssCacheBuster.new :web_root => path("")
31
+ file = path("images/1.png")
32
+ assert_equal(file, buster.resolve("/images/1.png", path("css/test.css")))
33
+ end
34
+
35
+ def test_find_urls
36
+ urls = @buster.urls(path("css/test.css"))
37
+ assert_equal 3, urls.length
38
+ assert_equal "../a1.css../images/1.png2.gif", urls.sort.join.gsub(path("/"), "")
39
+ end
40
+
41
+ def test_image_references_should_be_updated
42
+ file = path("css/test.css")
43
+ buster = Juicer::CssCacheBuster.new
44
+ buster.save file
45
+
46
+ File.read(file).scan(/url\(([^\)]*)\)/m).each do |path|
47
+ assert_match(/[^\?]*\?jcb=\d+/, path.first)
48
+ end
49
+ end
50
+
51
+ def test_absolute_path_without_web_root_should_fail
52
+ file = path("css/test2.css")
53
+ buster = Juicer::CssCacheBuster.new
54
+
55
+ assert_raise FileNotFoundError do
56
+ buster.save file
57
+ end
58
+ end
59
+
60
+ def test_absolute_path_should_be_resolved_when_web_root_known
61
+ file = path("css/test.css")
62
+ buster = Juicer::CssCacheBuster.new :web_root => path("")
63
+
64
+ assert_nothing_raised do
65
+ buster.save file
66
+ end
67
+
68
+ File.read(file).scan(/url\(([^\)]*)\)/m).each do |path|
69
+ assert_match(/[^\?]*\?jcb=\d+/, path.first)
70
+ end
71
+ end
72
+
73
+ def test_urls_should_only_have_mtime_appended_once
74
+ File.open(path("a2.css"), "w") { |f| f.puts "" }
75
+ file = path("path_test2.css")
76
+ output = path("path_test3.css")
77
+ buster = Juicer::CssCacheBuster.new :web_root => path("")
78
+ buster.save file, output
79
+
80
+ buster.urls(output).each { |url| assert url !~ /(jcb=\d+).*(jcb=\d+)/, url }
81
+ end
82
+
83
+ def test_type_hard_should_produce_hard_buster_urls
84
+ File.open(path("a2.css"), "w") { |f| f.puts "" }
85
+ file = path("path_test2.css")
86
+ output = path("path_test3.css")
87
+ buster = Juicer::CssCacheBuster.new :web_root => path(""), :type => :hard
88
+ buster.save file, output
89
+ buster.urls(output).each { |url| assert url =~ /-\d+\.[a-z]{3}/, url }
90
+ end
91
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[.. test_helper])) unless defined?(Juicer)
2
+
3
+ class TestJsLint < Test::Unit::TestCase
4
+ def setup
5
+ Juicer::Test::FileSetup.new.create
6
+ installer = Juicer::Install::JSLintInstaller.new path(".juicer")
7
+ installer.install unless installer.installed?
8
+
9
+ @jslint = Juicer::JsLint.new(:bin_path => path(".juicer"))
10
+ end
11
+
12
+ def test_check_valid_file
13
+ assert @jslint.check(path("ok.js")).ok?
14
+ end
15
+
16
+ def test_invalid_file
17
+ assert !@jslint.check(path("not-ok.js")).ok?
18
+ end
19
+
20
+ def test_check_return_type
21
+ assert_equal Juicer::JsLint::Report, @jslint.check(path("ok.js")).class
22
+ assert_equal Juicer::JsLint::Report, @jslint.check(path("not-ok.js")).class
23
+ end
24
+
25
+ def test_error_list
26
+ assert_equal 2, @jslint.check(path("not-ok.js")).errors.length
27
+ end
28
+
29
+ def test_errors
30
+ error = @jslint.check(path("not-ok.js")).errors.first
31
+ assert_equal Juicer::JsLint::Error, error.class
32
+ end
33
+ end
data/test/test_helper.rb CHANGED
@@ -2,15 +2,12 @@ require 'fileutils'
2
2
  require 'test/unit'
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib juicer])) unless defined?(Juicer)
4
4
 
5
- # Test directory
6
- $TEST_DIR = File.expand_path(File.dirname(__FILE__))
7
-
8
- # Directory containing test data
9
- $DATA_DIR = File.join($TEST_DIR, 'data')
5
+ $data_dir = File.join(File.expand_path(File.dirname(__FILE__)), "data")
6
+ Juicer::LOGGER = Logger.new StringIO.new
10
7
 
11
8
  # Prefixes paths with the data dir
12
9
  def path(path)
13
- File.join($DATA_DIR, path)
10
+ File.join($data_dir, path)
14
11
  end
15
12
 
16
13
  # Allow for testing of private methods inside a block:
@@ -27,6 +24,30 @@ class Class
27
24
  end
28
25
  end
29
26
 
27
+ #
28
+ # Intercept calls to open, and return local files
29
+ #
30
+ module Kernel
31
+ private
32
+ alias juicer_original_open open # :nodoc:
33
+
34
+ def open(name, *rest, &block)
35
+ if name =~ /http.+yuicompressor-(\d\.\d\.\d)\.zip$/
36
+ name = File.join($data_dir, "..", "bin", "yuicompressor-#{$1}.zip")
37
+ elsif name =~ /http.+yuicompressor/
38
+ name = File.join($data_dir, "..", "bin", "yuicompressor")
39
+ elsif name =~ /http.+jslint/
40
+ name = File.join($data_dir, "..", "bin", "jslint.js")
41
+ elsif name =~ /ftp.+rhino(.+)\.zip/
42
+ name = File.join($data_dir, "..", "bin", "rhino#{$1}.zip")
43
+ end
44
+
45
+ juicer_original_open(File.expand_path(name), *rest, &block)
46
+ end
47
+
48
+ module_function :open
49
+ end
50
+
30
51
  module Juicer
31
52
  module Test
32
53
 
@@ -35,201 +56,77 @@ module Juicer
35
56
  class FileSetup
36
57
  attr_reader :file_count
37
58
 
38
- def initialize(dir = $DATA_DIR)
59
+ def initialize(dir = $data_dir)
39
60
  @dir = dir
40
61
  @file_count = 0
41
62
  end
42
63
 
43
64
  # Recursively deletes the data directory
44
- def delete!
45
- res = FileUtils.remove_dir(@dir) if File.exist?(@dir)
65
+ def delete
66
+ res = FileUtils.rm_rf(@dir) if File.exist?(@dir)
46
67
  end
47
68
 
48
69
  # Set up files for unit tests
49
- def create!(force = false)
70
+ def create(force = false)
50
71
  return if File.exist?(@dir) && !force
51
72
 
52
- delete! if File.exist?(@dir)
73
+ delete if File.exist?(@dir)
53
74
  mkdir @dir
54
-
55
- # mappe/
56
- mappe = mkdir(File.join(@dir, 'mappe'))
57
- #mkfile(mappe, 'a.css', "@import 'b.css';\n\n/* Dette er a.css */")
58
- mkfile(mappe, 'a.css', "/**\n * Test with comment\n */\n@import 'b.css';\n\n/* Dette er a.css */\n")
59
-
60
- mkfile(mappe, 'c.css', "/* Dette er b.css */")
61
-
62
- # mappe/enda_en_mappe/
63
- enda_en_mappe = mkdir(File.join(@dir, 'mappe', 'enda_en_mappe'))
64
- mkfile(enda_en_mappe, 'a.css', "@import 'b.css';\n\n/* Dette er a.css */\n")
65
- mksvndir(enda_en_mappe)
66
-
67
- # Filer
68
75
  mkfile(@dir, 'a.css', "@import 'b.css';\n\n/* Dette er a.css */")
69
76
  mkfile(@dir, 'a.js', "/**\n * @depend b.js\n */\n\n/* Dette er a.js */")
70
77
  mkfile(@dir, 'b.css', "/* Dette er b.css */")
71
78
  mkfile(@dir, 'b.js', "/**\n * @depends a.js\n */\n\n/* Dette er b.css */")
72
- mkfile(@dir, 'Changelog.txt', "2008.02.09 | stb-base 1.29\n\nFEATURE: Core | Bla bla bla bla bla\nFEATURE: UI: | Bla bla bla bla bla\n\n\n2008.02.09 | stb-base 1.29\n\nFEATURE: Core | Bla bla bla bla bla\nFEATURE: UI: | Bla bla bla bla bla\n")
73
-
74
- mkfile(@dir, 'version2.txt', "branch: 1.0\nversion: 5\nbuild: 879\nrevision: 79867\ndate: 2008-01-17 16:05:33\n")
75
- mkfile(@dir, 'version.txt', "")
76
- mkfile(@dir, 'version-test.txt', "branch: 1.5\nversion: 2\nbuild: 65\nrevision: 64\ndate: 2008-01-02 22:03:10\n")
77
-
78
- mksvndir(mappe)
79
- mksvndir(@dir)
80
- end
81
-
82
- def create_design!(force = false, root = 'design')
83
- return if File.exist?(@dir) && !force
84
-
85
- delete! if File.exist?(@dir)
86
- mkdir @dir
87
-
88
- mkdesign(root)
89
- end
90
-
91
- def mkdesign(root, force = false)
92
- design = mkdir(File.join(@dir, root))
79
+ mkfile(@dir, 'a1.css', "@import 'b1.css';\n@import 'c1.css';\nbody {\n width: 800px;\n}\n")
80
+ mkfile(@dir, 'b1.css', "@import 'd1.css';\n\nhtml {\n background: red;\n}\n")
81
+ mkfile(@dir, 'c1.css', "h1 {\n font-size: 12px;\n}\n")
82
+ mkfile(@dir, 'd1.css', "h2 {\n font-size: 10px;\n}\n")
83
+ mkfile(@dir, 'ok.js', "function hey() {\n alert(\"Hey\");\n}\n")
84
+ mkfile(@dir, 'not-ok.js', "var a = 34\nb = 78;\n")
93
85
 
94
- # JavaScripts
95
- js = mkdir(File.join(design, 'js'))
86
+ images = mkdir File.join(@dir, "images")
87
+ mkfile(images, '1.png', "")
96
88
 
97
- lib_content = <<-EOF
98
- /**
99
- * Javascript library
100
- */
101
- var ns = {
102
- fn: function() {
103
- alert(''Hey there!);
104
- }
105
- };
89
+ css_dir = mkdir File.join(@dir, "css")
90
+ mkfile(css_dir, '2.gif', "")
106
91
 
107
- /**
108
- * A really smart function
109
- */
110
- function rlySmrt() {
111
- return 'I am so smart, S-M-R-T';
112
- }
113
- EOF
114
- lib = mkfile(js, 'lib.js', lib_content)
115
-
116
- dom_content = <<-EOF
117
- function tis() {
118
- var just = 'another';
119
- return just + 'function';
120
- }
121
- EOF
122
- dom = mkfile(js, 'dom.js', dom_content)
123
-
124
- yet_content = <<-EOF
125
- /**
126
- * @depends 'lib.js'
127
- */
128
- var another = 'file';
129
-
130
- function good(stuff, is) {
131
- var happening = 'now';
132
- }
133
- EOF
134
- yet = mkfile(js, 'yet.js', yet_content)
135
-
136
- another_content = <<-EOF
137
- /**
138
- * This file definately is really nice
139
- */
140
- var someClass = Base.extend({
141
- couple: 'of',
142
- them: false,
143
- ole: 'properties',
144
-
145
- andThen: function(a, freakin) {
146
- this.methodMan(a + 3, freakin - 6);
147
- }
148
-
149
- mehtodMan: function(some, params) {
150
- return 'ALOHA!';
151
- }
152
- });
153
- EOF
154
- another = mkfile(js, 'another.js', another_content)
155
-
156
- dom_min_content = <<-EOF
157
- /**
158
- * Simply includes other files to make a monolithic minified file. Du-da, du-da
159
- * @depends dom.js
160
- * @depends yet.js
161
- */
162
- EOF
163
- dom_min = mkfile(js, 'dom.min.js', dom_min_content)
164
-
165
- # CSS files
166
- css = mkdir(File.join(design, 'css'))
167
-
168
- defaults_content = <<-EOF
169
- /**
170
- * This is a set of defaults for all browsers
171
- */
172
- * {
173
- margin: 0;
174
- padding: 0;
175
- border: none;
92
+ css = <<-CSS
93
+ body {
94
+ background: url(../images/1.png);
176
95
  }
177
96
 
178
- h1, h2, h3, h4, h5, h6, p, ol, ul, dl {
179
- margin: 0 0 1em;
180
- test-decoration: none;
97
+ h1 {
98
+ background: url(../a1.css) 0 0 no-repeat;
181
99
  }
182
- EOF
183
- defaults = mkfile(css, 'defaults.css', defaults_content)
184
100
 
185
- layout_content = <<-EOF
186
- #main_content {
187
- margin: 0 12px 16px;
188
- width: 900px;
189
- border: 3px solid #344;
101
+ h2 {
102
+ background: url(2.gif) no-repeat;
190
103
  }
104
+ CSS
191
105
 
192
- #nav {
193
- float: left;
194
- width: 400px;
195
- }
196
- EOF
197
- layout = mkfile(css, 'layout.css', layout_content)
106
+ mkfile(css_dir, 'test.css', css)
107
+ mkfile(css_dir, 'test2.css', "body { background: url(/images/1.png); }")
108
+ mkfile(@dir, 'path_test.css', "@import 'css/test.css';\n\nbody {\n background: url(css/2.gif) no-repeat;\n}\n")
198
109
 
199
- fonts_content = <<-EOF
110
+ css = <<-CSS
200
111
  body {
201
- font-family: arial, sans-serif;
202
- font-size: 76%;
112
+ background: url(/images/1.png);
203
113
  }
204
114
 
205
- table {
206
- font-style: normal;
115
+ h1 {
116
+ background: url(/css/2.gif);
117
+ background: url(/a1.css) 0 0 no-repeat;
207
118
  }
208
- EOF
209
- fonts = mkfile(css, 'fonts.css', fonts_content)
210
-
211
- fancy_font_content = <<-EOF
212
- /**
213
- * Fancy fonts
214
- */
215
- @import 'fonts.css';
216
119
 
217
- body {
218
- font-family: tahoma, verdana;
120
+ h2 {
121
+ background: url(/css/2.gif) no-repeat;
219
122
  }
220
- EOF
221
- fancy_font = mkfile(css, 'fancy_font.css', fancy_font_content)
222
123
 
223
- layout_min_content = <<-EOF
224
- @import 'defaults.css';
225
- @import 'layout.css';
226
- EOF
227
- layout_min = mkfile(css, 'layout.min.css', layout_min_content)
124
+ p { background: url(/a2.css); }
125
+ CSS
126
+
127
+ mkfile(@dir, 'path_test2.css', css)
228
128
 
229
- images = mkdir(File.join(design, 'images'))
230
- icons = mkdir(File.join(images, 'icons'))
231
- 10.times { |i| mkfile(icons, "icon#{i}.png", "#{i}") }
232
- 15.times { |i| mkfile(images, "img#{i}.gif", "#{i}") }
129
+ mkfile(@dir, 'Changelog.txt', "2008.02.09 | stb-base 1.29\n\nFEATURE: Core | Bla bla bla bla bla\nFEATURE: UI: | Bla bla bla bla bla\n\n\n2008.02.09 | stb-base 1.29\n\nFEATURE: Core | Bla bla bla bla bla\nFEATURE: UI: | Bla bla bla bla bla\n")
233
130
  end
234
131
 
235
132
  private
@@ -244,34 +141,6 @@ body {
244
141
  @file_count += 1
245
142
  dir
246
143
  end
247
-
248
- def mksvndir(dir)
249
- svn_dir = mkdir(File.join(dir, '.svn'))
250
- mkdir(File.join(svn_dir, 'prop-base'))
251
- mkdir(File.join(svn_dir, 'props'))
252
- text_base = mkdir(File.join(svn_dir, 'text-base'))
253
- tmp = mkdir(File.join(svn_dir, 'tmp'))
254
- mkdir(File.join(tmp, 'prop-base'))
255
- mkdir(File.join(tmp, 'props'))
256
- mkdir(File.join(tmp, 'text-base'))
257
- mkfile(svn_dir, 'all-wcprops', '')
258
- mkfile(svn_dir, 'entries', '')
259
- mkfile(svn_dir, 'format', '')
260
-
261
- Dir.new(dir).each do |f|
262
- if File.file?(File.join(dir, f)) && !(f =~ /^\.\.?/)
263
- mkfile(text_base, File.basename(f) + '.svn-base', '')
264
- end
265
- end
266
- end
267
144
  end
268
145
  end
269
146
  end
270
-
271
- def noout
272
- std = $stdout
273
- $stdout = StringIO.new
274
- res = yield
275
- $stdout = std
276
- return res
277
- end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cjohansen-juicer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Johansen
@@ -9,11 +9,12 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-04 00:00:00 -08:00
12
+ date: 2009-04-29 00:00:00 -07:00
13
13
  default_executable: juicer
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: cmdparse
17
+ type: :runtime
17
18
  version_requirement:
18
19
  version_requirements: !ruby/object:Gem::Requirement
19
20
  requirements:
@@ -21,16 +22,37 @@ dependencies:
21
22
  - !ruby/object:Gem::Version
22
23
  version: 2.0.2
23
24
  version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: hpricot
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.164
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rubyzip
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.9.1
44
+ version:
24
45
  - !ruby/object:Gem::Dependency
25
46
  name: bones
47
+ type: :development
26
48
  version_requirement:
27
49
  version_requirements: !ruby/object:Gem::Requirement
28
50
  requirements:
29
51
  - - ">="
30
52
  - !ruby/object:Gem::Version
31
- version: 2.2.0
53
+ version: 2.4.0
32
54
  version:
33
- description: Juicer is a command line tool aimed at easing JavaScript and CSS development. Currently it only provides a wrapper to YUI Compressor along with a module that can dynamically link together files, but there are plans for more functionality.
55
+ description: Juicer is a command line tool that helps you ship frontend code for production. High level overview; Juicer can * figure out which files depend on each other and merge them together, reducing the number of http requests per page view, thus improving performance * use YUI Compressor to compress code, thus improving performance * verify that your JavaScript is safe to minify/compress by running JsLint on it * cycle asset hosts in CSS files * add "cache busters" to URLs in CSS files * recalculate relative URLs in CSS files, as well as convert them to absolute (or convert absolute URLs to relative URLs)
34
56
  email: christian@cjohansen.no
35
57
  executables:
36
58
  - juicer
@@ -38,56 +60,73 @@ extensions: []
38
60
 
39
61
  extra_rdoc_files:
40
62
  - History.txt
63
+ - Manifest.txt
41
64
  - Readme.rdoc
42
65
  - bin/juicer
43
- - test/data/Changelog.txt
44
- - test/data/version-test.txt
45
- - test/data/version.txt
46
- - test/data/version2.txt
47
66
  files:
48
- - .gitignore
49
67
  - History.txt
50
68
  - Manifest.txt
51
69
  - Rakefile
52
70
  - Readme.rdoc
53
71
  - bin/juicer
54
- - juicer.gemspec
55
72
  - lib/juicer.rb
73
+ - lib/juicer/binary.rb
74
+ - lib/juicer/cache_buster.rb
56
75
  - lib/juicer/chainable.rb
57
76
  - lib/juicer/cli.rb
77
+ - lib/juicer/command/install.rb
78
+ - lib/juicer/command/list.rb
58
79
  - lib/juicer/command/merge.rb
80
+ - lib/juicer/command/util.rb
81
+ - lib/juicer/command/verify.rb
82
+ - lib/juicer/core.rb
83
+ - lib/juicer/css_cache_buster.rb
84
+ - lib/juicer/install/base.rb
85
+ - lib/juicer/install/jslint_installer.rb
86
+ - lib/juicer/install/rhino_installer.rb
87
+ - lib/juicer/install/yui_compressor_installer.rb
88
+ - lib/juicer/jslint.rb
59
89
  - lib/juicer/merger/base.rb
60
90
  - lib/juicer/merger/css_dependency_resolver.rb
61
91
  - lib/juicer/merger/dependency_resolver.rb
62
92
  - lib/juicer/merger/javascript_dependency_resolver.rb
63
93
  - lib/juicer/merger/javascript_merger.rb
64
94
  - lib/juicer/merger/stylesheet_merger.rb
65
- - lib/juicer/minifyer/compressor.rb
66
95
  - lib/juicer/minifyer/yui_compressor.rb
67
- - test/data/Changelog.txt
68
- - test/data/a.css
69
- - test/data/a.js
70
- - test/data/b.css
71
- - test/data/b.js
72
- - test/data/mappe/a.css
73
- - test/data/mappe/c.css
74
- - test/data/mappe/enda_en_mappe/a.css
75
- - test/data/version-test.txt
76
- - test/data/version.txt
77
- - test/data/version2.txt
96
+ - tasks/test/setup.rake
97
+ - test/juicer/command/test_install.rb
98
+ - test/juicer/command/test_list.rb
99
+ - test/juicer/command/test_merge.rb
100
+ - test/juicer/command/test_util.rb
101
+ - test/juicer/command/test_verify.rb
102
+ - test/juicer/install/test_installer_base.rb
103
+ - test/juicer/install/test_jslint_installer.rb
104
+ - test/juicer/install/test_rhino_installer.rb
105
+ - test/juicer/install/test_yui_compressor_installer.rb
78
106
  - test/juicer/merger/test_base.rb
79
107
  - test/juicer/merger/test_css_dependency_resolver.rb
80
108
  - test/juicer/merger/test_javascript_dependency_resolver.rb
81
109
  - test/juicer/merger/test_javascript_merger.rb
82
110
  - test/juicer/merger/test_stylesheet_merger.rb
83
- - test/juicer/minifyer/test_compressor.rb
84
111
  - test/juicer/minifyer/test_yui_compressor.rb
112
+ - test/juicer/test_cache_buster.rb
85
113
  - test/juicer/test_chainable.rb
114
+ - test/juicer/test_core.rb
115
+ - test/juicer/test_css_cache_buster.rb
116
+ - test/juicer/test_jslint.rb
86
117
  - test/test_helper.rb
87
118
  - test/test_juicer.rb
88
119
  has_rdoc: true
89
120
  homepage: http://www.cjohansen.no/en/projects/juicer
90
- post_install_message:
121
+ post_install_message: |
122
+ Juicer does not ship with third party libraries. You probably want to install
123
+ Yui Compressor and JsLint now:
124
+
125
+ juicer install yui_compressor
126
+ juicer install jslint
127
+
128
+ Happy juicing!
129
+
91
130
  rdoc_options:
92
131
  - --main
93
132
  - Readme.rdoc
@@ -111,15 +150,27 @@ rubyforge_project: juicer
111
150
  rubygems_version: 1.2.0
112
151
  signing_key:
113
152
  specification_version: 2
114
- summary: Juicer is a command line tool aimed at easing JavaScript and CSS development
153
+ summary: Juicer is a command line tool that helps you ship frontend code for production
115
154
  test_files:
116
155
  - test/test_helper.rb
156
+ - test/juicer/test_cache_buster.rb
117
157
  - test/juicer/test_chainable.rb
158
+ - test/juicer/test_jslint.rb
159
+ - test/juicer/install/test_installer_base.rb
160
+ - test/juicer/install/test_jslint_installer.rb
161
+ - test/juicer/install/test_yui_compressor_installer.rb
162
+ - test/juicer/install/test_rhino_installer.rb
163
+ - test/juicer/test_css_cache_buster.rb
118
164
  - test/juicer/merger/test_javascript_dependency_resolver.rb
119
165
  - test/juicer/merger/test_css_dependency_resolver.rb
120
166
  - test/juicer/merger/test_base.rb
121
167
  - test/juicer/merger/test_javascript_merger.rb
122
168
  - test/juicer/merger/test_stylesheet_merger.rb
123
- - test/juicer/minifyer/test_compressor.rb
169
+ - test/juicer/command/test_verify.rb
170
+ - test/juicer/command/test_util.rb
171
+ - test/juicer/command/test_install.rb
172
+ - test/juicer/command/test_merge.rb
173
+ - test/juicer/command/test_list.rb
174
+ - test/juicer/test_core.rb
124
175
  - test/juicer/minifyer/test_yui_compressor.rb
125
176
  - test/test_juicer.rb