ROXML 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. data/.gitignore +6 -0
  2. data/.gitmodules +3 -0
  3. data/History.txt +299 -0
  4. data/MIT-LICENSE +18 -0
  5. data/README.rdoc +161 -0
  6. data/Rakefile +95 -0
  7. data/TODO +39 -0
  8. data/VERSION +1 -0
  9. data/config/website.yml +2 -0
  10. data/examples/amazon.rb +35 -0
  11. data/examples/current_weather.rb +27 -0
  12. data/examples/dashed_elements.rb +20 -0
  13. data/examples/library.rb +40 -0
  14. data/examples/posts.rb +27 -0
  15. data/examples/rails.rb +70 -0
  16. data/examples/twitter.rb +37 -0
  17. data/examples/xml/active_record.xml +70 -0
  18. data/examples/xml/amazon.xml +133 -0
  19. data/examples/xml/current_weather.xml +89 -0
  20. data/examples/xml/dashed_elements.xml +52 -0
  21. data/examples/xml/posts.xml +23 -0
  22. data/examples/xml/twitter.xml +422 -0
  23. data/lib/roxml.rb +547 -0
  24. data/lib/roxml/definition.rb +236 -0
  25. data/lib/roxml/hash_definition.rb +25 -0
  26. data/lib/roxml/xml.rb +43 -0
  27. data/lib/roxml/xml/parsers/libxml.rb +91 -0
  28. data/lib/roxml/xml/parsers/nokogiri.rb +77 -0
  29. data/lib/roxml/xml/references.rb +297 -0
  30. data/roxml.gemspec +201 -0
  31. data/spec/definition_spec.rb +486 -0
  32. data/spec/examples/active_record_spec.rb +40 -0
  33. data/spec/examples/amazon_spec.rb +54 -0
  34. data/spec/examples/current_weather_spec.rb +37 -0
  35. data/spec/examples/dashed_elements_spec.rb +20 -0
  36. data/spec/examples/library_spec.rb +46 -0
  37. data/spec/examples/post_spec.rb +24 -0
  38. data/spec/examples/twitter_spec.rb +32 -0
  39. data/spec/roxml_spec.rb +372 -0
  40. data/spec/shared_specs.rb +15 -0
  41. data/spec/spec.opts +1 -0
  42. data/spec/spec_helper.rb +14 -0
  43. data/spec/support/libxml.rb +3 -0
  44. data/spec/support/nokogiri.rb +3 -0
  45. data/spec/xml/attributes_spec.rb +36 -0
  46. data/spec/xml/namespace_spec.rb +240 -0
  47. data/spec/xml/namespaces_spec.rb +32 -0
  48. data/spec/xml/parser_spec.rb +26 -0
  49. data/tasks/rdoc.rake +13 -0
  50. data/tasks/rspec.rake +25 -0
  51. data/tasks/test.rake +35 -0
  52. data/test/fixtures/book_malformed.xml +5 -0
  53. data/test/fixtures/book_pair.xml +8 -0
  54. data/test/fixtures/book_text_with_attribute.xml +5 -0
  55. data/test/fixtures/book_valid.xml +5 -0
  56. data/test/fixtures/book_with_authors.xml +7 -0
  57. data/test/fixtures/book_with_contributions.xml +9 -0
  58. data/test/fixtures/book_with_contributors.xml +7 -0
  59. data/test/fixtures/book_with_contributors_attrs.xml +7 -0
  60. data/test/fixtures/book_with_default_namespace.xml +9 -0
  61. data/test/fixtures/book_with_depth.xml +6 -0
  62. data/test/fixtures/book_with_octal_pages.xml +4 -0
  63. data/test/fixtures/book_with_publisher.xml +7 -0
  64. data/test/fixtures/book_with_wrapped_attr.xml +3 -0
  65. data/test/fixtures/dictionary_of_attr_name_clashes.xml +8 -0
  66. data/test/fixtures/dictionary_of_attrs.xml +6 -0
  67. data/test/fixtures/dictionary_of_guarded_names.xml +6 -0
  68. data/test/fixtures/dictionary_of_mixeds.xml +4 -0
  69. data/test/fixtures/dictionary_of_name_clashes.xml +10 -0
  70. data/test/fixtures/dictionary_of_names.xml +4 -0
  71. data/test/fixtures/dictionary_of_texts.xml +10 -0
  72. data/test/fixtures/library.xml +30 -0
  73. data/test/fixtures/library_uppercase.xml +30 -0
  74. data/test/fixtures/muffins.xml +3 -0
  75. data/test/fixtures/nameless_ageless_youth.xml +2 -0
  76. data/test/fixtures/node_with_attr_name_conflicts.xml +1 -0
  77. data/test/fixtures/node_with_name_conflicts.xml +4 -0
  78. data/test/fixtures/numerology.xml +4 -0
  79. data/test/fixtures/person.xml +1 -0
  80. data/test/fixtures/person_with_guarded_mothers.xml +13 -0
  81. data/test/fixtures/person_with_mothers.xml +10 -0
  82. data/test/mocks/dictionaries.rb +57 -0
  83. data/test/mocks/mocks.rb +279 -0
  84. data/test/support/fixtures.rb +11 -0
  85. data/test/test_helper.rb +34 -0
  86. data/test/unit/definition_test.rb +235 -0
  87. data/test/unit/deprecations_test.rb +24 -0
  88. data/test/unit/to_xml_test.rb +81 -0
  89. data/test/unit/xml_attribute_test.rb +39 -0
  90. data/test/unit/xml_block_test.rb +81 -0
  91. data/test/unit/xml_bool_test.rb +122 -0
  92. data/test/unit/xml_convention_test.rb +150 -0
  93. data/test/unit/xml_hash_test.rb +115 -0
  94. data/test/unit/xml_initialize_test.rb +49 -0
  95. data/test/unit/xml_name_test.rb +141 -0
  96. data/test/unit/xml_namespace_test.rb +31 -0
  97. data/test/unit/xml_object_test.rb +207 -0
  98. data/test/unit/xml_required_test.rb +94 -0
  99. data/test/unit/xml_text_test.rb +71 -0
  100. data/website/index.html +98 -0
  101. metadata +254 -0
@@ -0,0 +1,15 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "freezable xml reference", :shared => true do
4
+ describe "with :frozen option" do
5
+ it "should be frozen" do
6
+ @frozen.frozen?.should be_true
7
+ end
8
+ end
9
+
10
+ describe "without :frozen option" do
11
+ it "should not be frozen" do
12
+ @unfrozen.frozen?.should be_false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'pathname'
3
+ require 'test/support/fixtures'
4
+ require 'lib/roxml'
5
+
6
+ require 'spec/shared_specs' if defined?(Spec)
7
+
8
+ def xml_for(name)
9
+ Pathname.new(File.dirname(__FILE__)).expand_path.dirname.join("examples/xml/#{name}.xml")
10
+ end
11
+
12
+ class RoxmlObject
13
+ include ROXML
14
+ end
@@ -0,0 +1,3 @@
1
+ module ROXML
2
+ XML_PARSER = 'libxml'
3
+ end
@@ -0,0 +1,3 @@
1
+ module ROXML
2
+ XML_PARSER = 'nokogiri'
3
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe ROXML::XMLAttributeRef do
4
+ before do
5
+ @xml = ROXML::XML::Parser.parse %(
6
+ <myxml>
7
+ <node name="first" />
8
+ <node name="second" />
9
+ <node name="third" />
10
+ </myxml>
11
+ )
12
+ end
13
+
14
+ context "plain vanilla" do
15
+ before do
16
+ @ref = ROXML::XMLAttributeRef.new(OpenStruct.new(:name => 'name', :wrapper => 'node', :array? => false), RoxmlObject.new)
17
+ end
18
+
19
+ it "should return one instance" do
20
+ @ref.send(:fetch_value, @xml).should == "first"
21
+ end
22
+ it "should output one instance"
23
+ end
24
+
25
+ context "with :as => []" do
26
+ before do
27
+ @ref = ROXML::XMLAttributeRef.new(OpenStruct.new(:name => 'name', :wrapper => 'node', :array? => true), RoxmlObject.new)
28
+ end
29
+
30
+ it "should collect all instances" do
31
+ @ref.send(:fetch_value, @xml).should == ["first", "second", "third"]
32
+ end
33
+
34
+ it "should output all instances"
35
+ end
36
+ end
@@ -0,0 +1,240 @@
1
+ require 'spec/spec_helper.rb'
2
+
3
+ describe ROXML, "with namespaces" do
4
+ context "when an included namespace is not defined in the xml" do
5
+ context "where the missing namespace is the default" do
6
+ it "should raise"
7
+
8
+ context "but the namespace is declared in the body" do
9
+ it "should succeed"
10
+ end
11
+ end
12
+
13
+ context "where the missing namespace is included in a namespacey from" do
14
+ it "should raise"
15
+
16
+ context "but the namespace is declared in the body" do
17
+ it "should succeed"
18
+ end
19
+ end
20
+
21
+ context "where the missing namespace is included in an explicit :namespace" do
22
+ it "should raise"
23
+
24
+ context "but the namespace is declared in the body" do
25
+ it "should succeed"
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "roxml namespacey declaration", :shared => true do
31
+ context "with a namespacey :from" do
32
+ context "and an explicit :namespace" do
33
+ it "should raise" do
34
+ proc do
35
+ Class.new do
36
+ include ROXML
37
+ xml_reader :default_namespace_with_namespacey_from_and_explicit_namespace, :from => 'namespacey:with_namespacey_from', :namespace => 'explicit'
38
+ end
39
+ end.should raise_error(ROXML::ContradictoryNamespaces)
40
+ end
41
+ end
42
+
43
+ context "and :namespace => false" do
44
+ it "should raise" do
45
+ proc do
46
+ Class.new do
47
+ include ROXML
48
+ xml_reader :default_namespace_with_namespacey_from_and_namespace_false, :from => 'namespacey:with_namespacey_from', :namespace => false
49
+ end
50
+ end.should raise_error(ROXML::ContradictoryNamespaces)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ describe "roxml namespacey declaration with default", :shared => true do
57
+ it_should_behave_like "roxml namespacey declaration"
58
+
59
+ it "should use the default namespace" do
60
+ @instance.default_namespace.should == 'default namespace node'
61
+ end
62
+
63
+ context "and :namespace => false" do
64
+ it "should find the namespace-less node" do
65
+ @instance.default_namespace_with_namespace_false.should == 'namespaceless node'
66
+ end
67
+ end
68
+
69
+ context "with an explicit :namespace" do
70
+ it "should use the explicit namespace" do
71
+ @instance.default_and_explicit_namespace == 'explicit namespace node'
72
+ end
73
+ end
74
+
75
+ context "with a namespace-less :from" do
76
+ it "should use the default namespace" do
77
+ @instance.default_namespace_with_namespaceless_from.should == 'default namespace node'
78
+ end
79
+
80
+ context "and :namespace => false" do
81
+ it "should find the namespace-less node" do
82
+ @instance.default_namespace_with_namespaceless_from_and_namespace_false.should == 'namespaceless node'
83
+ end
84
+ end
85
+
86
+ context "and an explicit :namespace" do
87
+ it "should use the explicit namespace" do
88
+ @instance.default_namespace_with_namespaceless_from_and_explicit_namespace.should == 'explicit namespace node'
89
+ end
90
+ end
91
+ end
92
+
93
+ context "with a namespacey :from" do
94
+ it "should use the :from namespace" do
95
+ @instance.default_namespace_with_namespacey_from.should == 'namespacey node'
96
+ end
97
+ end
98
+ end
99
+
100
+ context "with a default namespace declared" do
101
+ class DefaultNamespaceyObject
102
+ include ROXML
103
+ xml_namespace :default_declared
104
+
105
+ xml_reader :default_namespace
106
+ xml_reader :default_namespace_with_namespace_false, :namespace => false
107
+ xml_reader :default_and_explicit_namespace, :namespace => 'explicit'
108
+ xml_reader :default_namespace_with_namespaceless_from, :from => 'with_namespaceless_from'
109
+ xml_reader :default_namespace_with_namespaceless_from_and_explicit_namespace, :from => 'with_namespaceless_from', :namespace => 'explicit'
110
+ xml_reader :default_namespace_with_namespaceless_from_and_namespace_false, :from => 'with_namespaceless_from', :namespace => false
111
+ xml_reader :default_namespace_with_namespacey_from, :from => 'namespacey:with_namespacey_from'
112
+
113
+ # These are handled in the "roxml namespacey declaration" shared spec
114
+ # xml_reader :default_namespace_with_namespacey_from_and_namespace_false, :from => 'namespacey:with_namespaceless_from', :namespace => false
115
+ # xml_reader :default_namespace_with_namespacey_from_and_explicit_namespace, :from => 'namespacey:with_namespaceless_from', :namespace => 'explicit'
116
+ end
117
+
118
+ before do
119
+ @instance = DefaultNamespaceyObject.from_xml(%{
120
+ <book xmlns:namespacey="http://www.aws.com/aws" xmlns:default_declared="http://www.aws.com/default" xmlns:explicit="http://www.aws.com/different">
121
+ <default_declared:default_namespace>default namespace node</default_declared:default_namespace>
122
+ <namespacey:with_namespacey_from>namespacey node</namespacey:with_namespacey_from>
123
+ <explicit:with_namespaceless_from>explicit namespace node</explicit:with_namespaceless_from>
124
+ <with_namespaceless_from>namespaceless node</with_namespaceless_from>
125
+ <default_declared:with_namespaceless_from>default namespace node</default_declared:with_namespaceless_from>
126
+ <explicit:default_and_explicit_namespace>explicit namespace node</explicit:default_and_explicit_namespace>
127
+ <default_namespace_with_namespace_false>namespaceless node</default_namespace_with_namespace_false>
128
+ </book>
129
+ })
130
+ end
131
+
132
+ it_should_behave_like "roxml namespacey declaration with default"
133
+ end
134
+
135
+ context "with a default namespace on the root node" do
136
+ class XmlDefaultNamespaceyObject
137
+ include ROXML
138
+ xml_reader :default_namespace
139
+ xml_reader :default_namespace_with_namespace_false, :namespace => false
140
+ xml_reader :default_and_explicit_namespace, :namespace => 'explicit'
141
+ xml_reader :default_namespace_with_namespaceless_from, :from => 'with_namespaceless_from'
142
+ xml_reader :default_namespace_with_namespaceless_from_and_explicit_namespace, :from => 'with_namespaceless_from', :namespace => 'explicit'
143
+ xml_reader :default_namespace_with_namespaceless_from_and_namespace_false, :from => 'with_namespaceless_from', :namespace => false
144
+ xml_reader :default_namespace_with_namespacey_from, :from => 'namespacey:with_namespacey_from'
145
+
146
+ # These are handled in the "roxml namespacey declaration" shared spec
147
+ # xml_reader :default_namespace_with_namespacey_from_and_namespace_false, :from => 'namespacey:with_namespaceless_from', :namespace => false
148
+ # xml_reader :default_namespace_with_namespacey_from_and_explicit_namespace, :from => 'namespacey:with_namespaceless_from', :namespace => 'explicit'
149
+ end
150
+
151
+ before do
152
+ @instance = XmlDefaultNamespaceyObject.from_xml(%{
153
+ <book xmlns="http://www.aws.com/xml_default" xmlns:namespacey="http://www.aws.com/aws" xmlns:default_declared="http://www.aws.com/default" xmlns:explicit="http://www.aws.com/different">
154
+ <default_namespace>default namespace node</default_namespace>
155
+ <namespacey:with_namespacey_from>namespacey node</namespacey:with_namespacey_from>
156
+ <explicit:with_namespaceless_from>explicit namespace node</explicit:with_namespaceless_from>
157
+ <with_namespaceless_from xmlns="">namespaceless node</with_namespaceless_from>
158
+ <with_namespaceless_from>default namespace node</with_namespaceless_from>
159
+ <explicit:default_and_explicit_namespace>explicit namespace node</explicit:default_and_explicit_namespace>
160
+ <default_namespace_with_namespace_false xmlns="">namespaceless node</default_namespace_with_namespace_false>
161
+ </book>
162
+ })
163
+ end
164
+
165
+ it_should_behave_like "roxml namespacey declaration with default"
166
+ end
167
+
168
+ context "without a default namespace" do
169
+ class NamespaceyObject
170
+ include ROXML
171
+
172
+ xml_reader :no_default_namespace
173
+ xml_reader :no_default_namespace_with_namespace_false, :namespace => false
174
+ xml_reader :no_default_but_an_explicit_namespace, :namespace => 'explicit'
175
+ xml_reader :no_default_namespace_with_namespaceless_from, :from => 'with_namespaceless_from'
176
+ xml_reader :no_default_namespace_with_namespaceless_from_and_explicit_namespace, :from => 'with_namespaceless_from', :namespace => 'explicit'
177
+ xml_reader :no_default_namespace_with_namespaceless_from_and_namespace_false, :from => 'with_namespaceless_from', :namespace => false
178
+ xml_reader :no_default_namespace_with_namespacey_from, :from => 'namespacey:with_namespacey_from'
179
+
180
+ # These are handled in the "roxml namespacey declaration" shared spec
181
+ # xml_reader :no_default_namespace_with_namespacey_from_and_explicit_namespace, :from => 'namespacey:with_namespacey_from', :namespace => 'explicit'
182
+ # xml_reader :no_default_namespace_with_namespacey_from_and_namespace_false, :from => 'namespacey:with_namespacey_from', :namespace => false
183
+ end
184
+
185
+ before do
186
+ @instance = NamespaceyObject.from_xml(%{
187
+ <book xmlns:namespacey="http://www.aws.com/aws" xmlns:explicit="http://www.aws.com/different">
188
+ <namespacey:with_namespacey_from>namespacey node</namespacey:with_namespacey_from>
189
+ <explicit:with_namespaceless_from>explicit namespace node</explicit:with_namespaceless_from>
190
+ <with_namespaceless_from>namespaceless node</with_namespaceless_from>
191
+ <explicit:no_default_but_an_explicit_namespace>explicit namespace node</explicit:no_default_but_an_explicit_namespace>
192
+ <no_default_namespace_with_namespace_false>namespaceless node</no_default_namespace_with_namespace_false>
193
+ <no_default_namespace>namespaceless node</no_default_namespace>
194
+ </book>
195
+ })
196
+ end
197
+
198
+ it_should_behave_like "roxml namespacey declaration"
199
+
200
+ it "should find the namespace-less node" do
201
+ @instance.no_default_namespace.should == 'namespaceless node'
202
+ end
203
+
204
+ context "with :namespace => false" do
205
+ it "should find the namespace-less node" do
206
+ @instance.no_default_namespace_with_namespace_false.should == 'namespaceless node'
207
+ end
208
+ end
209
+
210
+ context "with an explicit :namespace" do
211
+ it "should use the explicit namespace" do
212
+ @instance.no_default_but_an_explicit_namespace.should == 'explicit namespace node'
213
+ end
214
+ end
215
+
216
+ context "with a namespace-less :from" do
217
+ it "should find the namespace-less node" do
218
+ @instance.no_default_namespace_with_namespaceless_from.should == 'namespaceless node'
219
+ end
220
+
221
+ context "and an explicit :namespace" do
222
+ it "should use the explicit namespace" do
223
+ @instance.no_default_namespace_with_namespaceless_from_and_explicit_namespace.should == 'explicit namespace node'
224
+ end
225
+ end
226
+
227
+ context "with :namespace => false" do
228
+ it "should find the namespace-less node" do
229
+ @instance.no_default_namespace_with_namespaceless_from_and_namespace_false.should == 'namespaceless node'
230
+ end
231
+ end
232
+ end
233
+
234
+ context "with a namespacey :from" do
235
+ it "should use the :from namespace" do
236
+ @instance.no_default_namespace_with_namespacey_from.should == 'namespacey node'
237
+ end
238
+ end
239
+ end
240
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec/spec_helper.rb'
2
+
3
+ describe ROXML, "#xml_namespaces" do
4
+ class Tires
5
+ include ROXML
6
+
7
+ xml_namespaces \
8
+ :bobsbike => 'http://bobsbikes.example.com',
9
+ :alicesauto => 'http://alicesautosupply.example.com/'
10
+
11
+ xml_reader :bike_tires, :as => [], :from => '@name', :in => 'bobsbike:tire'
12
+ xml_reader :car_tires, :as => [], :from => '@name', :in => 'alicesauto:tire'
13
+ end
14
+
15
+ before do
16
+ @xml = %{<?xml version="1.0"?>
17
+ <inventory xmlns="http://alicesautosupply.example.com/" xmlns:bike="http://bobsbikes.example.com">
18
+ <tire name="super slick racing tire" />
19
+ <tire name="all weather tire" />
20
+ <bike:tire name="skinny street" />
21
+ </inventory>
22
+ }
23
+ end
24
+
25
+ it "should remap default namespaces" do
26
+ Tires.from_xml(@xml).car_tires.should =~ ['super slick racing tire', 'all weather tire']
27
+ end
28
+
29
+ it "should remap prefix namespaces" do
30
+ Tires.from_xml(@xml).bike_tires.should == ['skinny street']
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec/spec_helper.rb'
2
+
3
+ describe ROXML::XML::Parser do
4
+ before do
5
+ # quiet the error handler
6
+ ROXML::XML::Error.reset_handler if ROXML::XML::Error.respond_to?(:reset_handler)
7
+ end
8
+
9
+ it "should raise on malformed xml" do
10
+ unless ROXML::XML_PARSER == 'nokogiri' # nokogiri is less strict and auto-closes for some reason
11
+ proc { Book.from_xml(fixture(:book_malformed)) }.should raise_error(ROXML::XML::Error)
12
+ end
13
+ end
14
+
15
+ it "should escape invalid characters on output to text node" do
16
+ node = ROXML::XML::Node.create("entities")
17
+ node.content = " < > ' \" & "
18
+ node.to_s.should == "<entities> &lt; &gt; ' \" &amp; </entities>"
19
+ end
20
+
21
+ it "should esape invalid characters for attribute name" do
22
+ node = ROXML::XML::Node.create("attr_holder")
23
+ node.attributes["entities"] = "\"'<>&"
24
+ node.to_s.should == %{<attr_holder entities="&quot;'&lt;&gt;&amp;"/>}
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ require 'rake/rdoctask'
2
+ Rake::RDocTask.new do |rdoc|
3
+ if File.exist?('VERSION')
4
+ version = File.read('VERSION')
5
+ else
6
+ version = ""
7
+ end
8
+
9
+ rdoc.rdoc_dir = 'rdoc'
10
+ rdoc.title = "roxml-new #{version}"
11
+ rdoc.rdoc_files.include('README*')
12
+ rdoc.rdoc_files.include('lib/**/*.rb')
13
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec/rake/spectask'
2
+ desc "Run specs"
3
+ Spec::Rake::SpecTask.new(:spec) do |spec|
4
+ spec.libs << 'lib' << 'spec' << 'examples'
5
+ spec.spec_opts = ['--options', "spec/spec.opts"]
6
+ spec.spec_files = FileList['spec/**/*_spec.rb']
7
+ end
8
+
9
+ namespace :spec do
10
+ [:libxml, :nokogiri].each do |parser|
11
+ desc "Spec ROXML under the #{parser} parser"
12
+ Spec::Rake::SpecTask.new(parser) do |spec|
13
+ spec.libs << 'lib' << 'spec' << 'examples'
14
+ spec.spec_opts = ['--options=spec/spec.opts']
15
+ spec.spec_files = ["spec/support/#{parser}.rb"] + FileList['spec/**/*_spec.rb']
16
+ end
17
+ end
18
+ end
19
+
20
+ desc "Run specs with rcov"
21
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
22
+ spec.libs << 'lib' << 'spec'
23
+ spec.pattern = 'spec/**/*_spec.rb'
24
+ spec.rcov = true
25
+ end
@@ -0,0 +1,35 @@
1
+ require 'rake/testtask'
2
+ Rake::TestTask.new(:bugs) do |test|
3
+ test.libs << 'lib' << 'test'
4
+ test.pattern = 'test/bugs/*_bugs.rb'
5
+ test.verbose = true
6
+ end
7
+
8
+ desc "Test ROXML using the default parser selection behavior"
9
+ task :test do
10
+ require 'rake/runtest'
11
+ Rake.run_tests 'test/unit/*_test.rb'
12
+ end
13
+
14
+ namespace :test do
15
+ desc "Test ROXML under the Nokogiri parser"
16
+ task :nokogiri do
17
+ module ROXML
18
+ XML_PARSER = 'nokogiri'
19
+ end
20
+ Rake::Task["test"].invoke
21
+ end
22
+
23
+ desc "Test ROXML under the LibXML parser"
24
+ task :libxml do
25
+ module ROXML
26
+ XML_PARSER = 'libxml'
27
+ end
28
+ Rake::Task["test"].invoke
29
+ end
30
+
31
+ desc "Runs tests under RCOV"
32
+ task :rcov do
33
+ system "rcov -T --no-html -x '^/' #{FileList['test/unit/*_test.rb']}"
34
+ end
35
+ end