jsus 0.2.7 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.travis.yml +6 -0
  2. data/CHANGELOG +4 -1
  3. data/Gemfile +4 -1
  4. data/VERSION +1 -1
  5. data/bin/jsus +30 -9
  6. data/features/command-line/compression.feature +24 -0
  7. data/features/command-line/mooforge_compatibility_layer.feature +75 -0
  8. data/features/data/Compression/Source/Library/Color.js +17 -0
  9. data/features/data/Compression/Source/Widget/Input/Input.Color.js +21 -0
  10. data/features/data/Compression/package.yml +9 -0
  11. data/features/data/MooforgePlugin/Core/Source/Core.js +16 -0
  12. data/features/data/MooforgePlugin/Core/package.yml +8 -0
  13. data/features/data/MooforgePlugin/Plugin/Source/plugin-support.js +20 -0
  14. data/features/data/MooforgePlugin/Plugin/Source/plugin.js +21 -0
  15. data/features/data/MooforgePlugin/Plugin/package.yml +9 -0
  16. data/features/data/compression.min.js +1 -0
  17. data/jsus.gemspec +45 -22
  18. data/lib/jsus/middleware.rb +178 -0
  19. data/lib/jsus/package.rb +10 -10
  20. data/lib/jsus/source_file.rb +58 -30
  21. data/lib/jsus/tag.rb +18 -10
  22. data/lib/jsus/util/file_cache.rb +57 -0
  23. data/lib/jsus/util/inflection.rb +39 -0
  24. data/lib/jsus/util.rb +2 -0
  25. data/lib/jsus.rb +2 -0
  26. data/spec/data/ComplexDependencies/Mootools/Source/Core.js +16 -0
  27. data/spec/data/ComplexDependencies/Mootools/package.yml +8 -0
  28. data/spec/data/ComplexDependencies/Output/package.js +70 -0
  29. data/spec/data/ComplexDependencies/Output/scripts.json +14 -0
  30. data/spec/data/ComplexDependencies/Output/tree.json +33 -0
  31. data/spec/data/ComplexDependencies/Source/Library/Color.js +19 -0
  32. data/spec/data/ComplexDependencies/Source/Widget/Input/Input.Color.js +20 -0
  33. data/spec/data/ComplexDependencies/Source/Widget/Input.js +16 -0
  34. data/spec/data/ComplexDependencies/package.yml +10 -0
  35. data/spec/data/mooforge_quirky_source.js +20 -0
  36. data/spec/data/unicode_source.js +23 -0
  37. data/spec/data/unicode_source_with_bom.js +23 -0
  38. data/spec/jsus/middleware_spec.rb +216 -0
  39. data/spec/jsus/package_spec.rb +12 -6
  40. data/spec/jsus/source_file_spec.rb +42 -14
  41. data/spec/jsus/tag_spec.rb +8 -2
  42. data/spec/jsus/util/file_cache_spec.rb +67 -0
  43. data/spec/jsus/util/inflection_spec.rb +42 -0
  44. metadata +124 -62
  45. data/Gemfile.lock +0 -79
@@ -0,0 +1,70 @@
1
+ /*
2
+ ---
3
+
4
+ script: Input.js
5
+
6
+ description: Generic Input
7
+
8
+ license: MIT-style license
9
+
10
+ authors:
11
+ - Yaroslaff Fedin
12
+
13
+ provides: [Input]
14
+
15
+ ...
16
+ */
17
+ /*
18
+ ---
19
+
20
+ script: Core.js
21
+
22
+ description: Mootools fake core
23
+
24
+ license: MIT-style license
25
+
26
+ authors:
27
+ - Valerio Proietti
28
+
29
+ provides: [Core]
30
+
31
+ ...
32
+ */
33
+ /*
34
+ ---
35
+
36
+ script: Color.js
37
+
38
+ description: A library to work with colors
39
+
40
+ license: MIT-style license
41
+
42
+ authors:
43
+ - Valerio Proietti
44
+
45
+ requires:
46
+ - Mootools/Core
47
+
48
+ provides: [Color]
49
+
50
+ ...
51
+ */
52
+ /*
53
+ ---
54
+
55
+ script: Input.Color.js
56
+
57
+ description: Cool colorpicker for everyone to enjoy
58
+
59
+ license: MIT-style license
60
+
61
+ authors:
62
+ - Yaroslaff Fedin
63
+
64
+ requires:
65
+ - Color
66
+
67
+ provides: [Input.Color]
68
+
69
+ ...
70
+ */
@@ -0,0 +1,14 @@
1
+ {
2
+ "Package": {
3
+ "requires": [
4
+
5
+ ],
6
+ "desc": "Jsus package with external dependency",
7
+ "provides": [
8
+ "Input",
9
+ "Color",
10
+ "Input.Color",
11
+ "Mootools/Core"
12
+ ]
13
+ }
14
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "Widget": {
3
+ "Input": {
4
+ "Input.Color": {
5
+ "provides": [
6
+ "Input.Color"
7
+ ],
8
+ "requires": [
9
+ "Color"
10
+ ],
11
+ "desc": "Cool colorpicker for everyone to enjoy"
12
+ },
13
+ "provides": [
14
+ "Input"
15
+ ],
16
+ "requires": [
17
+
18
+ ],
19
+ "desc": "Generic Input"
20
+ }
21
+ },
22
+ "Library": {
23
+ "Color": {
24
+ "provides": [
25
+ "Color"
26
+ ],
27
+ "requires": [
28
+ "Mootools/Core"
29
+ ],
30
+ "desc": "A library to work with colors"
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,19 @@
1
+ /*
2
+ ---
3
+
4
+ script: Color.js
5
+
6
+ description: A library to work with colors
7
+
8
+ license: MIT-style license
9
+
10
+ authors:
11
+ - Valerio Proietti
12
+
13
+ requires:
14
+ - Mootools/Core
15
+
16
+ provides: [Color]
17
+
18
+ ...
19
+ */
@@ -0,0 +1,20 @@
1
+ /*
2
+ ---
3
+
4
+ script: Input.Color.js
5
+
6
+ description: Cool colorpicker for everyone to enjoy
7
+
8
+ license: MIT-style license
9
+
10
+ authors:
11
+ - Yaroslaff Fedin
12
+
13
+ requires:
14
+ - Color
15
+ - Input
16
+
17
+ provides: [Input.Color]
18
+
19
+ ...
20
+ */
@@ -0,0 +1,16 @@
1
+ /*
2
+ ---
3
+
4
+ script: Input.js
5
+
6
+ description: Generic Input
7
+
8
+ license: MIT-style license
9
+
10
+ authors:
11
+ - Yaroslaff Fedin
12
+
13
+ provides: [Input]
14
+
15
+ ...
16
+ */
@@ -0,0 +1,10 @@
1
+ name: Package
2
+ filename: package.js
3
+ web: http://github.com/markiz/jsus
4
+ description: Jsus package with external dependency
5
+ license: Public Domain, http://unlicense.org/UNLICENSE
6
+ authors: Mark Abramov (http://github.com/markiz)
7
+ sources:
8
+ - "Source/Library/Color.js"
9
+ - "Source/Widget/Input/Input.Color.js"
10
+ - "Source/Widget/Input.js"
@@ -0,0 +1,20 @@
1
+ /*
2
+ ---
3
+
4
+ script: mooforge_quirky_source.js
5
+
6
+ description: plugin support file
7
+
8
+ license: UNLICENSE
9
+
10
+ authors:
11
+ - Mark Abramov
12
+
13
+ provides:
14
+ - Support
15
+
16
+ requires:
17
+ - mootools_core/1.3.0: Core
18
+
19
+ ...
20
+ */
@@ -0,0 +1,23 @@
1
+ /*
2
+ ---
3
+
4
+ script: Array.Extras.js
5
+
6
+ name: Array.Extras
7
+
8
+ description: Extends the Array native object to include useful methods to work with arrays.
9
+
10
+ license: MIT-style license
11
+
12
+ authors:
13
+ - Christoph Pojer
14
+ - Sebastian Markbåge
15
+
16
+ requires:
17
+ - Core/Array
18
+ - MooTools.More
19
+
20
+ provides: [Array.Extras]
21
+
22
+ ...
23
+ */
@@ -0,0 +1,23 @@
1
+ /*
2
+ ---
3
+
4
+ script: Array.Extras.js
5
+
6
+ name: Array.Extras
7
+
8
+ description: Extends the Array native object to include useful methods to work with arrays.
9
+
10
+ license: MIT-style license
11
+
12
+ authors:
13
+ - Christoph Pojer
14
+ - Sebastian Markbåge
15
+
16
+ requires:
17
+ - Core/Array
18
+ - MooTools.More
19
+
20
+ provides: [Array.Extras]
21
+
22
+ ...
23
+ */
@@ -0,0 +1,216 @@
1
+ require 'spec_helper'
2
+ require 'sinatra/base'
3
+ require 'rack/test'
4
+
5
+ describe Jsus::Middleware do
6
+ include Rack::Test::Methods
7
+ def new_server
8
+ Sinatra.new do
9
+ use Jsus::Middleware
10
+ set :port, 4567
11
+ set :raise_errors, true
12
+ set :show_exceptions, false
13
+ get("/") { "Ping" }
14
+ end
15
+ end
16
+
17
+ def suppress_output
18
+ old_stdout, old_stderr = $stdout, $stderr
19
+ $stdout, $stderr = IO.new('/dev/null'), IO.new('/dev/null')
20
+ yield
21
+ $stdout, $stderr = old_stdout, old_stderr
22
+ end
23
+
24
+ before(:all) do
25
+ @server = new_server
26
+ @server_thread = Thread.new { suppress_output { @server.run! } }
27
+ end
28
+
29
+ after(:all) { @server_thread.kill }
30
+
31
+ let(:app) { Rack::Lint.new(@server) }
32
+
33
+ it "should not override non-jsus calls" do
34
+ get("/").body.should == "Ping"
35
+ end
36
+
37
+ describe "settings" do
38
+ it "should have some defaults" do
39
+ described_class.settings.should be_a(Hash)
40
+ end
41
+
42
+ it "should merge settings, instead of full overriding on .settings=" do
43
+ described_class.settings = {:hello => :world}
44
+ described_class.settings = {:people => :worthless}
45
+ described_class.settings.should include({:hello => :world, :people => :worthless})
46
+ end
47
+ end
48
+
49
+ context "for basic package with an external dependency" do
50
+ let(:packages_dir) { File.expand_path("spec/data/ComplexDependencies") }
51
+ before(:each) { described_class.settings = {:packages_dir => packages_dir} }
52
+
53
+ describe "/javascripts/jsus/require/Package.js" do
54
+ let(:path) { "/javascripts/jsus/require/Package.js" }
55
+
56
+ it "should be successful" do
57
+ get(path).should be_successful
58
+ end
59
+
60
+ it "should respond with type text/javascript" do
61
+ get(path).content_type.should == "text/javascript"
62
+ end
63
+
64
+ it "should respond with generated package content" do
65
+ get(path).body.should include("script: Input.js")
66
+ get(path).body.should include("script: Color.js")
67
+ get(path).body.should include("script: Input.Color.js")
68
+ end
69
+
70
+ it "should include dependencies by default" do
71
+ get(path).body.should include("script: Core.js")
72
+ end
73
+
74
+ it "should preserve correct order" do
75
+ body = get(path).body
76
+ body.index("script: Core.js").should < body.index("script: Color.js")
77
+ body.index("script: Color.js").should < body.index("script: Input.Color.js")
78
+ body.index("script: Input.js").should < body.index("script: Input.Color.js")
79
+ end
80
+ end
81
+
82
+ describe "using ~Tags" do
83
+ let(:path) { "/javascripts/jsus/require/Package~Package:Color.js" }
84
+
85
+ it "should be successful" do
86
+ get(path).should be_successful
87
+ end
88
+
89
+ it "should respond with type text/javascript" do
90
+ get(path).content_type.should == "text/javascript"
91
+ end
92
+
93
+ it "should respond with generated content" do
94
+ get(path).body.should include("script: Input.Color.js")
95
+ end
96
+
97
+ it "should not include dependencies mentioned in exclude directive" do
98
+ get(path).body.should_not include("script: Color.js")
99
+ get(path).body.should_not include("script: Core.js")
100
+ end
101
+
102
+ it "should not fail when used with non-existent tag" do
103
+ result = get("/javascripts/jsus/require/Package~Package:Colorful.js")
104
+ result.should be_successful
105
+ result.body.should include("script: Input.Color.js")
106
+ end
107
+
108
+ it "should be chainable" do
109
+ result = get("/javascripts/jsus/require/Package~Mootools:Core~Package:Input.js")
110
+ result.should be_successful
111
+ result.body.should include("script: Input.Color.js")
112
+ result.body.should include("script: Color.js")
113
+ result.body.should_not include("script: Input.js")
114
+ result.body.should_not include("script: Core.js")
115
+ end
116
+ end
117
+
118
+ describe "using +Tags" do
119
+ let(:path) { "/javascripts/jsus/require/Package:Color+Package:Input.js" }
120
+
121
+ it "should be successful" do
122
+ get(path).should be_successful
123
+ end
124
+
125
+ it "should respond with type text/javascript" do
126
+ get(path).content_type.should == "text/javascript"
127
+ end
128
+
129
+ it "should respond with generated content" do
130
+ get(path).body.should include("script: Color.js")
131
+ get(path).body.should include("script: Input.js")
132
+ end
133
+
134
+ it "should not include files not mentioned in include directive" do
135
+ get(path).body.should_not include("script: Input.Color.js")
136
+ end
137
+
138
+ it "should not fail when used with non-existent tag" do
139
+ result = get("/javascripts/jsus/require/Package:Color+Package:Colorful.js")
140
+ result.should be_successful
141
+ result.body.should include("script: Color.js")
142
+ end
143
+
144
+ it "should be chainable" do
145
+ result = get("/javascripts/jsus/require/Package:Color+Package:Input~Mootools:Core.js")
146
+ result.should be_successful
147
+ result.body.should include("script: Input.js")
148
+ result.body.should include("script: Color.js")
149
+ result.body.should_not include("script: Input.Color.js")
150
+ result.body.should_not include("script: Core.js")
151
+ end
152
+ end
153
+
154
+ describe "/javascripts/jsus/require/Package:Input.Color.js" do
155
+ let(:path) { "/javascripts/jsus/require/Package:Input.Color.js" }
156
+
157
+ it "should be successful" do
158
+ get(path).should be_successful
159
+ end
160
+
161
+ it "should respond with type text/javascript" do
162
+ get(path).content_type.should == "text/javascript"
163
+ end
164
+
165
+ it "should respond with generated content" do
166
+ get(path).body.should include("script: Input.Color.js")
167
+ end
168
+
169
+ it "should include dependencies by default" do
170
+ get(path).body.should include("script: Color.js")
171
+ get(path).body.should include("script: Core.js")
172
+ end
173
+
174
+ it "should preserve correct order" do
175
+ body = get(path).body
176
+ body.index("script: Color.js").should < body.index("script: Input.Color.js")
177
+ body.index("script: Color.js").should > body.index("script: Core.js")
178
+ end
179
+ end
180
+ end
181
+
182
+ describe "for invalid paths" do
183
+ describe "when package is non-existent" do
184
+ let(:path) { "/javascripts/jsus/require/randomshit.js" }
185
+ it "should return 404" do
186
+ get(path).should be_not_found
187
+ end
188
+ end
189
+
190
+ describe "when required file is non-existent" do
191
+ let(:path) { "/javascripts/jsus/require/nonexistent:randomshit.js" }
192
+ it "should return 404" do
193
+ get(path).should be_not_found
194
+ end
195
+ end
196
+
197
+ describe "when given random gibberish" do
198
+ let(:path) { "/javascripts/jsus/require/+++---asda~~:sda_s+__+-dr928213dasasda=d%20%32%13__=_-=--/asa/sd/.asd13/.js" }
199
+ it "should return 404" do
200
+ get(path).should be_not_found
201
+ end
202
+ end
203
+ end
204
+
205
+ describe "caching" do
206
+ let(:cache_path) { "spec/tmp" }
207
+ before(:each) { Jsus::Middleware.settings = {:cache => true, :cache_path => cache_path} }
208
+ after(:each) { FileUtils.rm_rf(cache_path) }
209
+ let(:path) { "/javascripts/jsus/require/Package.js" }
210
+ it "should save output of requests to files" do
211
+ result = get(path).body
212
+ File.exists?("#{cache_path}/Package.js").should be_true
213
+ File.read("#{cache_path}/Package.js").should == result
214
+ end
215
+ end
216
+ end
@@ -31,7 +31,7 @@ describe Jsus::Package do
31
31
  end
32
32
 
33
33
  it "should set up outside dependencies" do
34
- subject.dependencies_names.should == ['core/Class']
34
+ subject.dependencies_names.should == ['Core/Class']
35
35
  end
36
36
 
37
37
  it "should set directory field" do
@@ -61,12 +61,12 @@ describe Jsus::Package do
61
61
  required_files = Dir["#{input_dir}/**/*.js"].map {|f| IO.read(f) }
62
62
  required_files.each {|f| compiled_content.should include(f)}
63
63
  end
64
-
64
+
65
65
  context "when given nil" do
66
66
  it "should not raise errors" do
67
67
  lambda { subject.compile(nil) }.should_not raise_error
68
68
  end
69
-
69
+
70
70
  it "should return a string with compiled content" do
71
71
  compiled_content = subject.compile(nil)
72
72
  required_files = Dir["#{input_dir}/**/*.js"].map {|f| IO.read(f) }
@@ -84,7 +84,7 @@ describe Jsus::Package do
84
84
  info["provides"].should have_exactly(4).items
85
85
  info["provides"].should include("Color", "Widget", "Input", "Input.Color")
86
86
  end
87
-
87
+
88
88
  context "when external dependencies are included" do
89
89
  let(:lib_dir) { "spec/data/ChainDependencies/app/javascripts" }
90
90
  let(:pool) { Jsus::Pool.new(lib_dir) }
@@ -122,7 +122,7 @@ describe Jsus::Package do
122
122
  tree["Widget"]["Input"]["Input.Color"]["requires"].should include("Input", "Color")
123
123
  tree["Widget"]["Input"]["Input.Color"]["provides"].should == ["Input.Color"]
124
124
  end
125
-
125
+
126
126
  it "should allow different filenames" do
127
127
  subject.generate_tree(output_dir, "structure.json")
128
128
  File.exists?("#{output_dir}/structure.json").should be_true
@@ -130,7 +130,7 @@ describe Jsus::Package do
130
130
  tree["Library"]["Color"]["provides"].should == ["Color"]
131
131
  end
132
132
  end
133
-
133
+
134
134
  describe "#required_files" do
135
135
  it "should list required files in correct order" do
136
136
  required_files = subject.required_files
@@ -174,4 +174,10 @@ describe Jsus::Package do
174
174
  end
175
175
 
176
176
  end
177
+
178
+ describe "#filename" do
179
+ it "should convert package name to snake_case" do
180
+ subject.filename.should == "orwik.js"
181
+ end
182
+ end
177
183
  end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Jsus::SourceFile do
@@ -34,12 +35,12 @@ describe Jsus::SourceFile do
34
35
  lambda { Jsus::SourceFile.from_file('spec/data/non-existant-file.js') }.should raise_error
35
36
  end
36
37
  end
37
-
38
+
38
39
  context "when some error happens" do
39
40
  it "should raise error" do
40
41
  YAML.stub!(:load) { raise "Could not parse the file!" }
41
42
  lambda { subject }.should raise_error(RuntimeError, /spec\/data\/test_source_one\.js/)
42
- end
43
+ end
43
44
  end
44
45
  end
45
46
 
@@ -56,6 +57,28 @@ describe Jsus::SourceFile do
56
57
  source.header.should == subject.header
57
58
  end
58
59
 
60
+ it "should not break on unicode files" do
61
+ source = nil
62
+ lambda { source = Jsus::SourceFile.from_file("spec/data/unicode_source.js") }.should_not raise_error
63
+ source.header["authors"][1].should == "Sebastian Markbåge"
64
+ end
65
+
66
+ it "should recognize and ignore BOM marker" do
67
+ source = nil
68
+ lambda { source = Jsus::SourceFile.from_file("spec/data/unicode_source_with_bom.js") }.should_not raise_error
69
+ source.header["authors"][1].should == "Sebastian Markbåge"
70
+ end
71
+
72
+ if defined?(Encoding) && Encoding.respond_to?(:default_external)
73
+ it "should not break on unicode files even when external encoding is set to non-utf" do
74
+ old_external = Encoding.default_external
75
+ Encoding.default_external = 'us-ascii'
76
+ source = nil
77
+ lambda { source = Jsus::SourceFile.from_file("spec/data/unicode_source.js") }.should_not raise_error
78
+ source.header["authors"][1].should == "Sebastian Markbåge"
79
+ Encoding.default_external = old_external
80
+ end
81
+ end
59
82
  end
60
83
 
61
84
  context "when no package set, " do
@@ -79,13 +102,13 @@ describe Jsus::SourceFile do
79
102
  subject.dependencies_names(:short => true).should == ["Class"]
80
103
  end
81
104
  end
82
-
105
+
83
106
  describe "#external_dependencies" do
84
107
  it "should be empty" do
85
108
  subject.external_dependencies.should be_empty
86
109
  end
87
110
  end
88
-
111
+
89
112
  describe "#external_dependencies_names" do
90
113
  it "should be empty" do
91
114
  subject.external_dependencies_names.should be_empty
@@ -126,18 +149,18 @@ describe Jsus::SourceFile do
126
149
  subject.dependencies_names(:short => true).should include("Class", "Mash/Mash")
127
150
  end
128
151
  end
129
-
152
+
130
153
  describe "#external_dependencies" do
131
- it "should include external dependencies" do
154
+ it "should include external dependencies" do
132
155
  subject.should have_exactly(1).external_dependencies
133
156
  subject.external_dependencies.should include(Jsus::Tag["Mash/Mash"])
134
157
  end
135
-
158
+
136
159
  it "should not include internal dependencies" do
137
160
  subject.external_dependencies.should_not include(Jsus::Tag["Orwik/Class"])
138
161
  end
139
162
  end
140
-
163
+
141
164
  describe "#external_dependencies_names" do
142
165
  it "should include names of external dependencies" do
143
166
  subject.external_dependencies_names.should include("Mash/Mash")
@@ -147,7 +170,7 @@ describe Jsus::SourceFile do
147
170
  subject.external_dependencies_names.should_not include("Orwik/Class")
148
171
  end
149
172
  end
150
-
173
+
151
174
  end
152
175
 
153
176
  context "when pool is not set, " do
@@ -259,18 +282,23 @@ describe Jsus::SourceFile do
259
282
  end
260
283
  end
261
284
  end
262
-
285
+
286
+ it "should allow quirky mooforge dependencies syntax" do
287
+ subject = described_class.from_file("spec/data/mooforge_quirky_source.js")
288
+ subject.dependencies_names.should == ["MootoolsCore/Core"]
289
+ end
290
+
263
291
  describe "#==, eql, hash" do
264
292
  it "should return true for source files pointing to the same physical file" do
265
293
  subject.should == described_class.from_file(subject.filename)
266
294
  subject.should eql(described_class.from_file(subject.filename))
267
295
  subject.hash.should == described_class.from_file(subject.filename).hash
268
296
  end
269
-
297
+
270
298
  it "should return false for source files pointing to different physical files" do
271
299
  subject.should_not == described_class.from_file("spec/data/Extensions/app/javascripts/Orwik/Extensions/Class.js")
272
300
  subject.should_not eql(described_class.from_file("spec/data/Extensions/app/javascripts/Orwik/Extensions/Class.js"))
273
301
  subject.hash.should_not == described_class.from_file("spec/data/Extensions/app/javascripts/Orwik/Extensions/Class.js").hash
274
- end
275
- end
276
- end
302
+ end
303
+ end
304
+ end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Jsus::Tag do
4
4
  subject { Jsus::Tag.new("Wtf") }
5
5
 
6
- context "initialization" do
6
+ context "initialization" do
7
7
  it "should set given name" do
8
8
  Jsus::Tag.new("Wtf").name.should == "Wtf"
9
9
  end
@@ -45,6 +45,12 @@ describe Jsus::Tag do
45
45
  it "should return a given tag if given a tag" do
46
46
  Jsus::Tag.new(subject).should == subject
47
47
  end
48
+
49
+ it "should translate mooforge styled names into jsus-styled names" do
50
+ Jsus::Tag.new("mootools_core/Wtf").should == Jsus::Tag.new("MootoolsCore/Wtf")
51
+ Jsus::Tag.new("Effects.Fx/Hello.World").should == Jsus::Tag.new("EffectsFx/Hello.World")
52
+ Jsus::Tag.new("effects.fx/Wtf").should == Jsus::Tag.new("EffectsFx/Wtf")
53
+ end
48
54
  end
49
55
 
50
56
  describe "#name" do
@@ -106,7 +112,7 @@ describe Jsus::Tag do
106
112
  it "should return true when tag is empty" do
107
113
  Jsus::Tag.new("").should be_empty
108
114
  end
109
-
115
+
110
116
  it "should return false when tag is not empty" do
111
117
  Jsus::Tag.new("Core/Mash").should_not be_empty
112
118
  end