roxml 3.1.5 → 3.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/{spec/spec.opts → .rspec} +0 -0
  2. data/History.txt +12 -1
  3. data/README.rdoc +19 -2
  4. data/Rakefile +11 -13
  5. data/VERSION +1 -1
  6. data/examples/amazon.rb +1 -1
  7. data/examples/current_weather.rb +1 -1
  8. data/examples/dashed_elements.rb +1 -1
  9. data/examples/posts.rb +1 -1
  10. data/examples/rails.rb +1 -1
  11. data/examples/twitter.rb +1 -1
  12. data/lib/roxml.rb +8 -1
  13. data/lib/roxml/definition.rb +6 -4
  14. data/lib/roxml/xml.rb +3 -3
  15. data/lib/roxml/xml/parsers/libxml.rb +46 -52
  16. data/lib/roxml/xml/parsers/nokogiri.rb +46 -41
  17. data/lib/roxml/xml/references.rb +25 -18
  18. data/roxml.gemspec +10 -8
  19. data/spec/definition_spec.rb +8 -7
  20. data/spec/examples/active_record_spec.rb +3 -2
  21. data/spec/examples/amazon_spec.rb +2 -2
  22. data/spec/examples/current_weather_spec.rb +2 -2
  23. data/spec/examples/dashed_elements_spec.rb +2 -2
  24. data/spec/examples/library_spec.rb +5 -5
  25. data/spec/examples/post_spec.rb +2 -2
  26. data/spec/examples/twitter_spec.rb +2 -2
  27. data/spec/roxml_spec.rb +2 -2
  28. data/spec/shared_specs.rb +2 -2
  29. data/spec/spec_helper.rb +3 -4
  30. data/spec/xml/array_spec.rb +36 -0
  31. data/spec/xml/attributes_spec.rb +5 -5
  32. data/spec/xml/encoding_spec.rb +38 -7
  33. data/spec/xml/namespace_spec.rb +4 -4
  34. data/spec/xml/namespaces_spec.rb +1 -1
  35. data/spec/xml/object_spec.rb +5 -5
  36. data/spec/xml/parser_spec.rb +8 -13
  37. data/spec/xml/text_spec.rb +5 -5
  38. data/test/mocks/dictionaries.rb +1 -1
  39. data/test/mocks/mocks.rb +1 -1
  40. data/test/support/fixtures.rb +1 -1
  41. data/test/test_helper.rb +5 -5
  42. data/test/unit/definition_test.rb +5 -5
  43. data/test/unit/deprecations_test.rb +1 -1
  44. data/test/unit/to_xml_test.rb +4 -4
  45. data/test/unit/xml_attribute_test.rb +1 -1
  46. data/test/unit/xml_block_test.rb +1 -1
  47. data/test/unit/xml_bool_test.rb +1 -1
  48. data/test/unit/xml_convention_test.rb +1 -1
  49. data/test/unit/xml_hash_test.rb +1 -1
  50. data/test/unit/xml_initialize_test.rb +1 -1
  51. data/test/unit/xml_name_test.rb +2 -2
  52. data/test/unit/xml_namespace_test.rb +1 -1
  53. data/test/unit/xml_object_test.rb +3 -4
  54. data/test/unit/xml_required_test.rb +1 -1
  55. data/test/unit/xml_text_test.rb +1 -1
  56. metadata +63 -27
@@ -1,7 +1,7 @@
1
1
  module ROXML
2
2
  class RequiredElementMissing < Exception # :nodoc:
3
3
  end
4
-
4
+
5
5
  #
6
6
  # Internal base class that represents an XML - Class binding.
7
7
  #
@@ -52,7 +52,7 @@ module ROXML
52
52
  def namespacify(what)
53
53
  if what.to_s.present? && !what.to_s.include?(':') && opts.namespace != false
54
54
  [opts.namespace, @instance.class.roxml_namespace, @default_namespace].each do |namespace|
55
- return opts.namespace == '*' ? "*[local-name()='#{what}']" : "#{namespace}:#{what}" if namespace
55
+ return opts.namespace == '*' ? (what == '*' ? "*" : "*[local-name()='#{what}']") : "#{namespace}:#{what}" if namespace
56
56
  end
57
57
  end
58
58
  what
@@ -98,15 +98,15 @@ module ROXML
98
98
  if !opts[:always_create] && (child = xml.children.find {|c| c.name == wrap_with })
99
99
  return child
100
100
  end
101
- xml.add_child(XML::Node.create(wrap_with.to_s))
101
+ XML.add_node(xml, wrap_with.to_s)
102
102
  end
103
103
 
104
104
  def nodes_in(xml)
105
105
  @default_namespace = xml.default_namespace
106
- vals = xml.search(xpath, @instance.class.roxml_namespaces)
106
+ vals = xml.roxml_search(xpath, @instance.class.roxml_namespaces)
107
107
 
108
108
  if several? && vals.empty? && !wrapper && auto_xpath
109
- vals = xml.search(auto_xpath, @instance.class.roxml_namespaces)
109
+ vals = xml.roxml_search(auto_xpath, @instance.class.roxml_namespaces)
110
110
  @auto_vals = !vals.empty?
111
111
  end
112
112
 
@@ -136,12 +136,12 @@ module ROXML
136
136
  if array?
137
137
  values.each do |value|
138
138
  wrap(xml, :always_create => true).tap do |node|
139
- node.attributes[name] = value.to_s
139
+ XML.set_attribute(node, name, value.to_s)
140
140
  end
141
141
  end
142
142
  else
143
143
  wrap(xml).tap do |xml|
144
- xml.attributes[name] = values.to_s
144
+ XML.set_attribute(xml, name, values.to_s)
145
145
  end
146
146
  end
147
147
  end
@@ -177,10 +177,10 @@ module ROXML
177
177
  xml.name = value
178
178
  elsif array?
179
179
  value.each do |v|
180
- add(xml.add_child(XML::Node.create(name)), v)
180
+ add(XML.add_node(xml, name), v)
181
181
  end
182
182
  else
183
- add(xml.add_child(XML::Node.create(name)), value)
183
+ add(XML.add_node(xml, name), value)
184
184
  end
185
185
  end
186
186
  end
@@ -210,13 +210,20 @@ module ROXML
210
210
 
211
211
  def add(dest, value)
212
212
  if cdata?
213
- dest.add_child(XML::Node.new_cdata(value.to_s))
213
+ XML.add_cdata(dest, value.to_s)
214
214
  else
215
- dest.content = value.to_s
215
+ XML.set_content(dest, value.to_s)
216
216
  end
217
217
  end
218
218
  end
219
219
 
220
+ class XMLNameSpaceRef < XMLRef # :nodoc:
221
+ private
222
+ def fetch_value(xml)
223
+ xml.namespace.prefix
224
+ end
225
+ end
226
+
220
227
  class XMLHashRef < XMLTextRef # :nodoc:
221
228
  delegate :hash, :to => :opts
222
229
 
@@ -235,7 +242,7 @@ module ROXML
235
242
  def update_xml(xml, value)
236
243
  wrap(xml).tap do |xml|
237
244
  value.each_pair do |k, v|
238
- node = xml.add_child(XML::Node.create(hash.wrapper))
245
+ node = XML.add_node(xml, hash.wrapper)
239
246
  @key.update_xml(node, k)
240
247
  @value.update_xml(node, v)
241
248
  end
@@ -289,14 +296,14 @@ module ROXML
289
296
  params = {:name => name, :namespace => opts.namespace}
290
297
  if array?
291
298
  value.each do |v|
292
- xml.add_child(v.to_xml(params))
299
+ XML.add_child(xml, v.to_xml(params))
293
300
  end
294
301
  elsif value.is_a?(ROXML)
295
- xml.add_child(value.to_xml(params))
302
+ XML.add_child(xml, value.to_xml(params))
296
303
  else
297
- node = XML::Node.create(name)
298
- node.content = value.to_xml
299
- xml.add_child(node)
304
+ XML.add_node(xml, name).tap do |node|
305
+ XML.set_content(node, value.to_xml)
306
+ end
300
307
  end
301
308
  end
302
309
  end
@@ -312,4 +319,4 @@ module ROXML
312
319
  end
313
320
  end
314
321
  end
315
- end
322
+ end
data/roxml.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{roxml}
8
- s.version = "3.1.5"
8
+ s.version = "3.1.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ben Woosley", "Zak Mandhro", "Anders Engstrom", "Russ Olsen"]
12
- s.date = %q{2009-12-18}
12
+ s.date = %q{2010-11-03}
13
13
  s.description = %q{ROXML is a Ruby library designed to make it easier for Ruby developers to work with XML.
14
14
  Using simple annotations, it enables Ruby classes to be mapped to XML. ROXML takes care
15
15
  of the marshalling and unmarshalling of mapped attributes so that developers can focus on
@@ -24,6 +24,7 @@ RESTful applications, Web Services, and XML-RPC.
24
24
  s.files = [
25
25
  ".gitignore",
26
26
  ".gitmodules",
27
+ ".rspec",
27
28
  "History.txt",
28
29
  "LICENSE",
29
30
  "README.rdoc",
@@ -61,10 +62,10 @@ RESTful applications, Web Services, and XML-RPC.
61
62
  "spec/examples/twitter_spec.rb",
62
63
  "spec/roxml_spec.rb",
63
64
  "spec/shared_specs.rb",
64
- "spec/spec.opts",
65
65
  "spec/spec_helper.rb",
66
66
  "spec/support/libxml.rb",
67
67
  "spec/support/nokogiri.rb",
68
+ "spec/xml/array_spec.rb",
68
69
  "spec/xml/attributes_spec.rb",
69
70
  "spec/xml/encoding_spec.rb",
70
71
  "spec/xml/namespace_spec.rb",
@@ -127,7 +128,7 @@ RESTful applications, Web Services, and XML-RPC.
127
128
  s.rdoc_options = ["--charset=UTF-8"]
128
129
  s.require_paths = ["lib"]
129
130
  s.rubyforge_project = %q{roxml}
130
- s.rubygems_version = %q{1.3.5}
131
+ s.rubygems_version = %q{1.3.7}
131
132
  s.summary = %q{Ruby Object to XML mapping library}
132
133
  s.test_files = [
133
134
  "spec/definition_spec.rb",
@@ -143,6 +144,7 @@ RESTful applications, Web Services, and XML-RPC.
143
144
  "spec/spec_helper.rb",
144
145
  "spec/support/libxml.rb",
145
146
  "spec/support/nokogiri.rb",
147
+ "spec/xml/array_spec.rb",
146
148
  "spec/xml/attributes_spec.rb",
147
149
  "spec/xml/encoding_spec.rb",
148
150
  "spec/xml/namespace_spec.rb",
@@ -182,23 +184,23 @@ RESTful applications, Web Services, and XML-RPC.
182
184
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
183
185
  s.specification_version = 3
184
186
 
185
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
187
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
186
188
  s.add_runtime_dependency(%q<activesupport>, [">= 2.3.0"])
187
189
  s.add_runtime_dependency(%q<nokogiri>, [">= 1.3.3"])
188
- s.add_development_dependency(%q<rspec>, [">= 0"])
190
+ s.add_development_dependency(%q<rspec>, [">= 2.0.0"])
189
191
  s.add_development_dependency(%q<sqlite3-ruby>, [">= 1.2.4"])
190
192
  s.add_development_dependency(%q<activerecord>, [">= 2.2.2"])
191
193
  else
192
194
  s.add_dependency(%q<activesupport>, [">= 2.3.0"])
193
195
  s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
194
- s.add_dependency(%q<rspec>, [">= 0"])
196
+ s.add_dependency(%q<rspec>, [">= 2.0.0"])
195
197
  s.add_dependency(%q<sqlite3-ruby>, [">= 1.2.4"])
196
198
  s.add_dependency(%q<activerecord>, [">= 2.2.2"])
197
199
  end
198
200
  else
199
201
  s.add_dependency(%q<activesupport>, [">= 2.3.0"])
200
202
  s.add_dependency(%q<nokogiri>, [">= 1.3.3"])
201
- s.add_dependency(%q<rspec>, [">= 0"])
203
+ s.add_dependency(%q<rspec>, [">= 2.0.0"])
202
204
  s.add_dependency(%q<sqlite3-ruby>, [">= 1.2.4"])
203
205
  s.add_dependency(%q<activerecord>, [">= 2.2.2"])
204
206
  end
@@ -1,4 +1,5 @@
1
- require 'spec/spec_helper'
1
+ # encoding: utf-8
2
+ require_relative './spec_helper'
2
3
 
3
4
  describe ROXML::Definition do
4
5
  describe "#name_explicit?" do
@@ -13,7 +14,7 @@ describe ROXML::Definition do
13
14
  end
14
15
  end
15
16
 
16
- describe "DateTime reference", :shared => true do
17
+ shared_examples_for "DateTime reference" do
17
18
  it "should return nil on empty string" do
18
19
  @subject.blocks.first.call(" ").should be_nil
19
20
  end
@@ -29,7 +30,7 @@ describe ROXML::Definition do
29
30
  end
30
31
  end
31
32
 
32
- describe "Date reference", :shared => true do
33
+ shared_examples_for "Date reference" do
33
34
  it "should return nil on empty string" do
34
35
  @subject.blocks.first.call(" ").should be_nil
35
36
  end
@@ -128,7 +129,7 @@ describe ROXML::Definition do
128
129
  end
129
130
 
130
131
  describe "=> {}" do
131
- describe "hash options declaration", :shared => true do
132
+ shared_examples_for "hash options declaration" do
132
133
  it "should represent a hash" do
133
134
  @opts.hash?.should be_true
134
135
  end
@@ -210,7 +211,7 @@ describe ROXML::Definition do
210
211
  proc { ROXML::Definition.new(:count, :as => :foat) }.should raise_error(ArgumentError)
211
212
  end
212
213
 
213
- describe "block shorthand type declaration", :shared => true do
214
+ shared_examples_for "block shorthand type declaration" do
214
215
  it "should translate nil to nil" do
215
216
  @definition.blocks.first.call(nil).should be_nil
216
217
  end
@@ -390,7 +391,7 @@ describe ROXML::Definition do
390
391
  end
391
392
 
392
393
  describe ":from" do
393
- describe "attribute reference", :shared => true do
394
+ shared_examples_for "attribute reference" do
394
395
  it "should be interpreted as :attr" do
395
396
  @opts.sought_type.should == :attr
396
397
  end
@@ -450,7 +451,7 @@ describe ROXML::Definition do
450
451
 
451
452
  describe "options" do
452
453
 
453
- describe "boolean option", :shared => true do
454
+ shared_examples_for "boolean option" do
454
455
  it "should be recognized" do
455
456
  ROXML::Definition.new(:author, :from => :content, @option => true).respond_to?(:"#{@option}?")
456
457
  ROXML::Definition.new(:author, :from => :content, @option => true).send(:"#{@option}?").should be_true
@@ -1,5 +1,6 @@
1
- require 'spec/spec_helper'
2
- require 'examples/rails'
1
+ require 'fileutils'
2
+ require_relative './../spec_helper'
3
+ require_relative './../../examples/rails'
3
4
 
4
5
  describe ROXML, "under ActiveRecord" do
5
6
  before do
@@ -1,5 +1,5 @@
1
- require 'spec/spec_helper'
2
- require 'examples/amazon'
1
+ require_relative './../spec_helper'
2
+ require_relative './../../examples/amazon'
3
3
 
4
4
  describe PITA::ItemSearchResponse do
5
5
  before do
@@ -1,5 +1,5 @@
1
- require 'spec/spec_helper'
2
- require 'examples/current_weather'
1
+ require_relative './../spec_helper'
2
+ require_relative './../../examples/current_weather'
3
3
 
4
4
  describe Weather do
5
5
  before do
@@ -1,5 +1,5 @@
1
- require 'spec/spec_helper'
2
- require 'examples/dashed_elements'
1
+ require_relative './../spec_helper'
2
+ require_relative './../../examples/dashed_elements'
3
3
 
4
4
  describe GitHub::Commit do
5
5
  before do
@@ -1,5 +1,5 @@
1
- require 'spec/spec_helper'
2
- require 'examples/library'
1
+ require_relative './../spec_helper'
2
+ require_relative './../../examples/library'
3
3
 
4
4
  describe Library do
5
5
  before :all do
@@ -17,7 +17,7 @@ describe Library do
17
17
 
18
18
  describe "#to_xml" do
19
19
  it "should contain the expected information" do
20
- @lib.to_xml.to_s.should == ROXML::XML::Parser.parse(%{<library><NAME><![CDATA[Favorite Books]]></NAME><novel ISBN='0201710897'><title>The PickAxe</title><description><![CDATA[Best Ruby book out there!]]></description><author>David Thomas, Andrew Hunt, Dave Thomas</author><publisher><name>Addison Wesley Longman, Inc.</name></publisher></novel></library>}).root.to_s
20
+ @lib.to_xml.to_s.should == ROXML::XML.parse_string(%{<library><NAME><![CDATA[Favorite Books]]></NAME><novel ISBN='0201710897'><title>The PickAxe</title><description><![CDATA[Best Ruby book out there!]]></description><author>David Thomas, Andrew Hunt, Dave Thomas</author><publisher><name>Addison Wesley Longman, Inc.</name></publisher></novel></library>}).root.to_s
21
21
  end
22
22
 
23
23
  context "when written to a file" do
@@ -25,7 +25,7 @@ describe Library do
25
25
  @path = "spec/examples/library.xml"
26
26
  @doc = ROXML::XML::Document.new
27
27
  @doc.root = @lib.to_xml
28
- @doc.save(@path)
28
+ ROXML::XML.save_doc(@doc, @path)
29
29
  end
30
30
 
31
31
  after :all do
@@ -33,7 +33,7 @@ describe Library do
33
33
  end
34
34
 
35
35
  it "should be contain the expected xml" do
36
- ROXML::XML::Parser.parse(File.read(@path)).to_s.should == ROXML::XML::Parser.parse(%{<?xml version="1.0"?><library><NAME><![CDATA[Favorite Books]]></NAME><novel ISBN='0201710897'><title>The PickAxe</title><description><![CDATA[Best Ruby book out there!]]></description><author>David Thomas, Andrew Hunt, Dave Thomas</author><publisher><name>Addison Wesley Longman, Inc.</name></publisher></novel></library>}).to_s
36
+ ROXML::XML.parse_string(File.read(@path)).to_s.should == ROXML::XML.parse_string(%{<?xml version="1.0"?><library><NAME><![CDATA[Favorite Books]]></NAME><novel ISBN='0201710897'><title>The PickAxe</title><description><![CDATA[Best Ruby book out there!]]></description><author>David Thomas, Andrew Hunt, Dave Thomas</author><publisher><name>Addison Wesley Longman, Inc.</name></publisher></novel></library>}).to_s
37
37
  end
38
38
 
39
39
  it "should be re-parsable via .from_xml" do
@@ -1,5 +1,5 @@
1
- require 'spec/spec_helper'
2
- require 'examples/posts'
1
+ require_relative './../spec_helper'
2
+ require_relative './../../examples/posts'
3
3
 
4
4
  describe Post do
5
5
  before do
@@ -1,5 +1,5 @@
1
- require 'spec/spec_helper'
2
- require 'examples/twitter'
1
+ require_relative './../spec_helper'
2
+ require_relative './../../examples/twitter'
3
3
 
4
4
  describe Statuses do
5
5
  describe Status do
data/spec/roxml_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
- require 'spec/spec_helper'
1
+ require_relative './spec_helper'
2
2
 
3
3
  describe ROXML, "#from_xml" do
4
- describe "from_xml call", :shared => true do
4
+ shared_examples_for "from_xml call" do
5
5
  it "should fetch values" do
6
6
  book = BookWithContributors.from_xml(@path)
7
7
  book.title.should == "Programming Ruby - 2nd Edition"
data/spec/shared_specs.rb CHANGED
@@ -1,6 +1,6 @@
1
- require 'spec/spec_helper'
1
+ require_relative './spec_helper'
2
2
 
3
- describe "freezable xml reference", :shared => true do
3
+ shared_examples_for "freezable xml reference" do
4
4
  describe "with :frozen option" do
5
5
  it "should be frozen" do
6
6
  @frozen.frozen?.should be_true
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'pathname'
3
- require 'test/support/fixtures'
4
- require 'lib/roxml'
5
-
6
- require 'spec/shared_specs' if defined?(Spec)
3
+ require_relative './../test/support/fixtures'
4
+ require_relative './../lib/roxml'
5
+ require_relative './shared_specs'
7
6
 
8
7
  def xml_for(name)
9
8
  Pathname.new(File.dirname(__FILE__)).expand_path.dirname.join("examples/xml/#{name}.xml")
@@ -0,0 +1,36 @@
1
+ require_relative './../spec_helper'
2
+
3
+ module ArraySpec
4
+ class Book
5
+ include ROXML
6
+ xml_reader :id, :as => Integer
7
+ xml_reader :title
8
+ end
9
+
10
+ class Store
11
+ include ROXML
12
+ xml_reader :books, :from => 'books', :as => [Book]
13
+ end
14
+
15
+ class MyXml
16
+ include ROXML
17
+ xml_reader :store, :as => Store
18
+ end
19
+ end
20
+
21
+
22
+ describe ":as => []" do
23
+ context "with plural from" do
24
+ it "should accept the plural name as the name for each item" do
25
+ ArraySpec::MyXml.from_xml(%(
26
+ <myxml>
27
+ <store>
28
+ <books><id>1</id><title>first book</title></books>
29
+ <books><id>2</id><title>second book</title></books>
30
+ <books><id>3</id><title>third book</title></books>
31
+ </store>
32
+ </myxml>
33
+ )).store.books.size.should == 3
34
+ end
35
+ end
36
+ end
@@ -1,8 +1,8 @@
1
- require 'spec/spec_helper'
1
+ require_relative './../spec_helper'
2
2
 
3
3
  describe ROXML::XMLAttributeRef do
4
4
  before do
5
- @xml = ROXML::XML::Parser.parse %(
5
+ @xml = ROXML::XML.parse_string %(
6
6
  <myxml>
7
7
  <node name="first" />
8
8
  <node name="second" />
@@ -31,7 +31,7 @@ describe ROXML::XMLAttributeRef do
31
31
  end
32
32
 
33
33
  it "should output all instances" do
34
- xml = ROXML::XML::Node.create('myxml')
34
+ xml = ROXML::XML.new_node('myxml')
35
35
  @ref.update_xml(xml, ["first", "second", "third"])
36
36
  xml.to_s.squeeze(' ').should == @xml.root.to_s.squeeze(' ')
37
37
  end
@@ -39,7 +39,7 @@ describe ROXML::XMLAttributeRef do
39
39
 
40
40
  context "when the namespaces are different" do
41
41
  before do
42
- @xml = ROXML::XML::Parser.parse %(
42
+ @xml = ROXML::XML.parse_string %(
43
43
  <document>
44
44
  <myxml xmlns="http://example.com/three" xmlns:one="http://example.com/one" xmlns:two="http://example.com/two">
45
45
  <one:node name="first" />
@@ -62,7 +62,7 @@ describe ROXML::XMLAttributeRef do
62
62
 
63
63
  it "should output all instances with namespaces" do
64
64
  pending "Full namespace write support"
65
- xml = ROXML::XML::Node.create('result')
65
+ xml = ROXML::XML.new_node('result')
66
66
  @ref.update_xml(xml, ["first", "second", "third"])
67
67
  xml.should == @xml.root
68
68
  end