roxml 2.4.3 → 2.5.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 (47) hide show
  1. data/History.txt +54 -0
  2. data/Manifest.txt +9 -6
  3. data/README.rdoc +24 -17
  4. data/Rakefile +2 -1
  5. data/TODO +30 -31
  6. data/examples/active_record.rb +69 -0
  7. data/examples/amazon.rb +1 -1
  8. data/examples/current_weather.rb +1 -1
  9. data/examples/posts.rb +8 -8
  10. data/examples/twitter.rb +2 -2
  11. data/examples/xml/active_record.xml +70 -0
  12. data/lib/roxml.rb +174 -174
  13. data/lib/roxml/definition.rb +165 -89
  14. data/lib/roxml/extensions/deprecation.rb +5 -0
  15. data/lib/roxml/extensions/string/conversions.rb +2 -3
  16. data/lib/roxml/hash_definition.rb +26 -25
  17. data/lib/roxml/xml.rb +15 -6
  18. data/lib/roxml/xml/parsers/libxml.rb +9 -6
  19. data/lib/roxml/xml/parsers/rexml.rb +1 -1
  20. data/lib/roxml/xml/references.rb +14 -17
  21. data/roxml.gemspec +8 -5
  22. data/spec/definition_spec.rb +563 -0
  23. data/spec/examples/active_record_spec.rb +43 -0
  24. data/spec/roxml_spec.rb +372 -0
  25. data/spec/shared_specs.rb +15 -0
  26. data/spec/spec_helper.rb +21 -4
  27. data/spec/string_spec.rb +15 -0
  28. data/spec/xml/parser_spec.rb +22 -0
  29. data/test/fixtures/book_valid.xml +1 -1
  30. data/test/fixtures/person_with_guarded_mothers.xml +3 -3
  31. data/test/mocks/mocks.rb +57 -45
  32. data/test/unit/definition_test.rb +161 -12
  33. data/test/unit/deprecations_test.rb +97 -0
  34. data/test/unit/to_xml_test.rb +30 -1
  35. data/test/unit/xml_bool_test.rb +15 -3
  36. data/test/unit/xml_construct_test.rb +6 -6
  37. data/test/unit/xml_hash_test.rb +18 -0
  38. data/test/unit/xml_initialize_test.rb +6 -3
  39. data/test/unit/xml_object_test.rb +66 -5
  40. data/test/unit/xml_text_test.rb +3 -0
  41. metadata +23 -15
  42. data/test/unit/array_test.rb +0 -16
  43. data/test/unit/freeze_test.rb +0 -71
  44. data/test/unit/inheritance_test.rb +0 -63
  45. data/test/unit/overriden_output_test.rb +0 -33
  46. data/test/unit/roxml_test.rb +0 -60
  47. data/test/unit/string_test.rb +0 -11
@@ -0,0 +1,97 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class TestDefinition < Test::Unit::TestCase
4
+ def test_tag_refs_is_deprecated
5
+ assert_deprecated do
6
+ Class.new do
7
+ include ROXML
8
+ end.tag_refs
9
+ end
10
+ end
11
+
12
+ def test_literal_as_array_is_deprecated
13
+ assert_deprecated do
14
+ assert ROXML::Definition.new(:authors, :as => :array).array?
15
+ end
16
+ end
17
+
18
+ def test_no_block_shorthand_means_no_block
19
+ assert_deprecated do
20
+ assert ROXML::Definition.new(:count, :as => :intager).blocks.empty?
21
+ end
22
+ assert_deprecated do
23
+ assert ROXML::Definition.new(:count, :as => :foat).blocks.empty?
24
+ end
25
+ end
26
+
27
+ def test_symbol_shorthands_are_deprecated
28
+ assert_deprecated do
29
+ ROXML::Definition.new(:junk, :as => :integer)
30
+ end
31
+ assert_deprecated do
32
+ ROXML::Definition.new(:junk, :as => :float)
33
+ end
34
+ end
35
+
36
+ def test_as_cdata_is_deprecated
37
+ assert_deprecated do
38
+ assert ROXML::Definition.new(:manufacturer, :as => :cdata).cdata?
39
+ end
40
+ assert_deprecated do
41
+ assert ROXML::Definition.new(:manufacturer, :as => [Integer, :cdata]).cdata?
42
+ end
43
+ end
44
+
45
+ def test_content_is_a_recognized_type
46
+ assert_deprecated do
47
+ opts = ROXML::Definition.new(:author, :content)
48
+ assert opts.content?
49
+ assert_equal '.', opts.name
50
+ assert_equal :text, opts.type
51
+ end
52
+ end
53
+
54
+ def test_content_symbol_as_target_is_translated_to_string
55
+ assert_deprecated do
56
+ opts = ROXML::Definition.new(:content, :attr => :content)
57
+ assert_equal 'content', opts.name
58
+ assert_equal :attr, opts.type
59
+ end
60
+ end
61
+
62
+ def test_attr_is_a_recognized_type
63
+ assert_deprecated do
64
+ opts = ROXML::Definition.new(:author, :attr)
65
+ assert_equal 'author', opts.name
66
+ assert_equal :attr, opts.type
67
+ end
68
+ end
69
+
70
+ def test_as_array_not_deprecated
71
+ assert_not_deprecated do
72
+ opts = ROXML::Definition.new(:name, :as => [])
73
+ assert_equal :text, opts.type
74
+ assert opts.array?
75
+ end
76
+ end
77
+
78
+ def test_as_hash_of_attrs_deprecated
79
+ assert_deprecated do
80
+ opts = ROXML::Definition.new(:name, :as => {:attrs => [:dt, :dd]})
81
+ assert opts.hash?
82
+ end
83
+ end
84
+
85
+ def test_as_hash_not_deprecated
86
+ assert_not_deprecated do
87
+ opts = ROXML::Definition.new(:name, :as => {:key => '@dt', :value => '@dd'})
88
+ assert opts.hash?
89
+ end
90
+ end
91
+
92
+ def test_as_object_with_from_xml_not_deprecated
93
+ assert_not_deprecated do
94
+ ROXML::Definition.new(:name, :as => OctalInteger)
95
+ end
96
+ end
97
+ end
@@ -49,4 +49,33 @@ class TestToXmlWithBlocks < Test::Unit::TestCase
49
49
  doc.root = b.to_xml
50
50
  assert_equal '500', doc.search('pagecount').first.content
51
51
  end
52
- end
52
+ end
53
+
54
+ class OctalInteger
55
+ def self.from_xml(val)
56
+ new(Integer(val.content))
57
+ end
58
+
59
+ def initialize(value)
60
+ @val = value
61
+ end
62
+
63
+ def ==(other)
64
+ @val == other
65
+ end
66
+
67
+ def to_xml
68
+ sprintf("%#o", @val)
69
+ end
70
+ end
71
+
72
+ class BookWithOctalPages
73
+ include ROXML
74
+
75
+ xml_accessor :pages_with_to_xml_proc, :as => Integer, :to_xml => proc {|val| sprintf("%#o", val) }, :required => true
76
+ xml_accessor :pages_with_type, OctalInteger, :required => true
77
+ end
78
+
79
+ class TestToXmlWithOverriddenOutput < Test::Unit::TestCase
80
+ to_xml_test :book_with_octal_pages
81
+ end
@@ -11,10 +11,10 @@ class XmlBool
11
11
  xml_name 'xml_bool'
12
12
  xml_reader :true_from_TRUE?, :to_xml => PROC_TRUE
13
13
  xml_reader :false_from_FALSE?, :text => 'text_for_FALSE', :to_xml => PROC_TRUE
14
- xml_reader :true_from_one?, :attr => 'attr_for_one', :to_xml => PROC_1
14
+ xml_reader :true_from_one?, :from => '@attr_for_one', :to_xml => PROC_1
15
15
  xml_reader :false_from_zero?, :text => 'text_for_zero', :in => 'container', :to_xml => PROC_1
16
- xml_reader :true_from_True?, :attr => 'attr_for_True', :in => 'container', :to_xml => PROC_True
17
- xml_reader :false_from_False?, :text => 'false_from_cdata_False', :as => :cdata, :to_xml => PROC_True
16
+ xml_reader :true_from_True?, :from => '@attr_for_True', :in => 'container', :to_xml => PROC_True
17
+ xml_reader :false_from_False?, :text => 'false_from_cdata_False', :cdata => true, :to_xml => PROC_True
18
18
  xml_reader :true_from_true?, :to_xml => PROC_true
19
19
  xml_reader :false_from_false?, :to_xml => PROC_true
20
20
  xml_reader :missing?
@@ -106,5 +106,17 @@ class TestXMLBool < Test::Unit::TestCase
106
106
  end
107
107
  end
108
108
 
109
+ def test_writable_references_properly_handle_punctuation
110
+ klass = Class.new do
111
+ include ROXML
112
+ xml_accessor :punctuation?
113
+ end
114
+
115
+ instance = klass.from_xml("<xml><punctuation>True</punctuation></xml>")
116
+ assert_equal true, instance.punctuation?
117
+ instance.punctuation = false
118
+ assert_equal false, instance.punctuation?
119
+ end
120
+
109
121
  to_xml_test XmlBool => BOOL_XML
110
122
  end
@@ -3,8 +3,8 @@ require File.join(File.dirname(__FILE__), '..', 'test_helper')
3
3
  class MeasurementWithXmlConstruct
4
4
  include ROXML
5
5
 
6
- xml_reader :units, :attr
7
- xml_reader :value, :content
6
+ xml_reader :units, :from => :attr
7
+ xml_reader :value, :from => :content
8
8
 
9
9
  xml_construct_without_deprecation :value, :units
10
10
 
@@ -25,9 +25,9 @@ end
25
25
  class BookWithDepthWithXmlConstruct
26
26
  include ROXML
27
27
 
28
- xml_reader :isbn, :attr => 'ISBN'
28
+ xml_reader :isbn, :from => '@ISBN'
29
29
  xml_reader :title
30
- xml_reader :description, :as => :cdata
30
+ xml_reader :description, :cdata => true
31
31
  xml_reader :author
32
32
  xml_reader :depth, MeasurementWithXmlConstruct
33
33
  end
@@ -64,9 +64,9 @@ class TestXMLConstruct < Test::Unit::TestCase
64
64
  Class.new do
65
65
  include ROXML
66
66
 
67
- xml_reader :bar, :attr => 'Foo'
67
+ xml_reader :bar, :from => '@Foo'
68
68
  xml_reader :foo, :text => 'Foo'
69
- xml_reader :baz, :attr => 'Bar'
69
+ xml_reader :baz, :from => '@Bar'
70
70
 
71
71
  xml_construct_without_deprecation :baz, :bar, :foo
72
72
  def initialize(baz, bar, foo)
@@ -103,4 +103,22 @@ class TestXMLHash < Test::Unit::TestCase
103
103
  </dict>
104
104
  }).missing_hash)
105
105
  end
106
+
107
+ def test_as_hash_of_type_keys_deprecated
108
+ assert_deprecated do
109
+ opts = ROXML::Definition.new(:name, :as => {:key => :name, :value => {OctalInteger => 'value'}})
110
+ assert opts.hash?
111
+ assert_equal OctalInteger, opts.hash.value.type
112
+ assert_equal 'value', opts.hash.value.name
113
+ end
114
+ end
115
+
116
+ def test_as_hash_of_as_type_not_deprecated
117
+ assert_not_deprecated do
118
+ opts = ROXML::Definition.new(:name, :as => {:key => :name, :value => {:from => 'value', :as => OctalInteger}})
119
+ assert opts.hash?
120
+ assert_equal OctalInteger, opts.hash.value.type
121
+ assert_equal 'value', opts.hash.value.name
122
+ end
123
+ end
106
124
  end
@@ -1,5 +1,9 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
2
 
3
+ class InheritedBookWithDepth < Book
4
+ xml_reader :depth, Measurement
5
+ end
6
+
3
7
  class BookWithXmlInitialize < BookWithDepth
4
8
  attr_reader :created_at, :creator
5
9
 
@@ -7,7 +11,6 @@ class BookWithXmlInitialize < BookWithDepth
7
11
  @created_at = created_at
8
12
  @creator = creator
9
13
  end
10
- alias_method :xml_initialize, :initialize
11
14
  end
12
15
 
13
16
  class TestXMLInitialize < Test::Unit::TestCase
@@ -32,8 +35,8 @@ class TestXMLInitialize < Test::Unit::TestCase
32
35
  end
33
36
 
34
37
  def test_initialize_fails_on_missing_required_arg
35
- assert_raises(ArgumentError) do
36
- b = BookWithXmlInitialize.from_xml(fixture(:book_with_depth))
38
+ assert_raise ArgumentError do
39
+ BookWithXmlInitialize.from_xml(fixture(:book_with_depth))
37
40
  end
38
41
  end
39
42
 
@@ -57,7 +57,7 @@ class TestXMLObject < Test::Unit::TestCase
57
57
  book_one.isbn = "9781843549161"
58
58
  book_one.title = "Anathem"
59
59
  book_one.description = "A new title from Neal Stephenson"
60
- book_one.contributors << contrib
60
+ book_one.contributors = [contrib]
61
61
 
62
62
  # this book should be completely empty
63
63
  book_two = WriteableBookWithContributors.new
@@ -65,7 +65,7 @@ class TestXMLObject < Test::Unit::TestCase
65
65
  assert_equal(nil, book_two.isbn)
66
66
  assert_equal(nil, book_two.title)
67
67
  assert_equal(nil, book_two.description)
68
- assert_equal(0, book_two.contributors.size)
68
+ assert_equal(nil, book_two.contributors)
69
69
  end
70
70
 
71
71
  # Test XML object containing one other XML object (one-to-one)
@@ -116,11 +116,72 @@ class TestXMLObject < Test::Unit::TestCase
116
116
  assert_equal nil, p.mother.mother.mother
117
117
  end
118
118
 
119
+ class Node
120
+ include ROXML
121
+
122
+ xml_reader :name, :from => 'node_name'
123
+ xml_reader :nodes, [Node]
124
+ end
125
+
126
+ class Taxonomy
127
+ include ROXML
128
+
129
+ xml_reader :name, :from => 'taxonomy_name'
130
+ xml_reader :nodes, [Node]
131
+ end
132
+
133
+ class Taxonomies
134
+ include ROXML
135
+ xml_reader :taxonomies, [Taxonomy]
136
+ end
137
+
138
+ def test_more_recursion
139
+ # quiet the error handler
140
+ ROXML::XML::Error.reset_handler
141
+ taxonomies = Taxonomies.from_xml(<<HERE)
142
+ <?xml version="1.0" encoding="UTF-8" ?>
143
+ <!DOCTYPE taxonomies SYSTEM "taxonomy.dtd">
144
+ <taxonomies>
145
+ <taxonomy>
146
+ <taxonomy_name>World</taxonomy_name>
147
+ <node node_id="2" content_object_id="82534" object_type_id="2">
148
+ <node_name lang_iso="eng">Africa</node_name>
149
+ <node node_id="331" content_object_id="11" object_type_id="4">
150
+ <node_name lang_iso="eng">Algeria</node_name>
151
+ <node node_id="7271" content_object_id="117629" object_type_id="8">
152
+ <node_name lang_iso="eng">Algiers</node_name>
153
+ </node>
154
+ <node node_id="7272" content_object_id="117630" object_type_id="8">
155
+ <node_name lang_iso="eng">Gharda&#239;a</node_name>
156
+ </node>
157
+ <node node_id="7871" content_object_id="1000713999" object_type_id="8">
158
+ <node_name lang_iso="eng">El Oued</node_name>
159
+ </node>
160
+ <node node_id="7872" content_object_id="1000714008" object_type_id="8">
161
+ <node_name lang_iso="eng">Timimoun</node_name>
162
+ </node>
163
+ <node node_id="8903" content_object_id="1000565565" object_type_id="8">
164
+ <node_name lang_iso="eng">Annaba</node_name>
165
+ </node>
166
+ </node>
167
+ </node>
168
+ </taxonomy>
169
+ </taxonomies>
170
+ HERE
171
+ assert_equal 1, taxonomies.taxonomies.size
172
+ assert_equal 'World', taxonomies.taxonomies.first.name
173
+ node = taxonomies.taxonomies.first.nodes.first
174
+ assert_equal 'Africa', node.name
175
+ assert_equal 'Algeria', node.nodes.first.name
176
+ assert_equal ['Algiers', "Gharda\303\257a", 'El Oued', 'Timimoun', 'Annaba'],
177
+ node.nodes.first.nodes.map(&:name)
178
+ end
179
+
119
180
  def test_with_guarded_recursion
120
181
  p = PersonWithGuardedMother.from_xml(fixture(:person_with_guarded_mothers))
121
- assert_equal 'Ben Franklin', p.name
122
- assert_equal 'Abiah Folger', p.mother.name
123
- assert_equal 'Madeup Mother', p.mother.mother.name
182
+ assert_equal 'Ben "Benji" Franklin', p.name
183
+ assert_equal 'Abiah \'Abby\' Folger', p.mother.name
184
+ assert_equal 'Madeup Mother < the third >', p.mother.mother.name
124
185
  assert_equal nil, p.mother.mother.mother
125
186
  end
126
187
 
@@ -5,6 +5,9 @@ class TestXMLText < Test::Unit::TestCase
5
5
  def test_valid_simple
6
6
  book = Book.from_xml(fixture(:book_valid))
7
7
  assert_equal("The PickAxe", book.title)
8
+ assert_equal("David Thomas, Andrew Hunt & Dave Thomas", book.author)
9
+
10
+ assert_equal xml_fixture(:book_valid).to_s.gsub("\n", ''), book.to_xml.to_s.gsub("\n", '')
8
11
  end
9
12
 
10
13
  def test_without_needed_from
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roxml
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.3
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Woosley
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2009-02-01 00:00:00 -05:00
15
+ date: 2009-03-02 00:00:00 -05:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
@@ -25,6 +25,16 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.1.0
27
27
  version:
28
+ - !ruby/object:Gem::Dependency
29
+ name: libxml-ruby
30
+ type: :runtime
31
+ version_requirement:
32
+ version_requirements: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 0.8.6
37
+ version:
28
38
  - !ruby/object:Gem::Dependency
29
39
  name: newgem
30
40
  type: :development
@@ -63,11 +73,13 @@ files:
63
73
  - Rakefile
64
74
  - TODO
65
75
  - config/website.yml
76
+ - examples/active_record.rb
66
77
  - examples/amazon.rb
67
78
  - examples/current_weather.rb
68
79
  - examples/dashed_elements.rb
69
80
  - examples/posts.rb
70
81
  - examples/twitter.rb
82
+ - examples/xml/active_record.xml
71
83
  - examples/xml/amazon.xml
72
84
  - examples/xml/current_weather.xml
73
85
  - examples/xml/dashed_elements.xml
@@ -89,13 +101,19 @@ files:
89
101
  - lib/roxml/xml/parsers/rexml.rb
90
102
  - lib/roxml/xml/references.rb
91
103
  - roxml.gemspec
104
+ - spec/definition_spec.rb
105
+ - spec/examples/active_record_spec.rb
92
106
  - spec/examples/amazon_spec.rb
93
107
  - spec/examples/current_weather_spec.rb
94
108
  - spec/examples/dashed_elements_spec.rb
95
109
  - spec/examples/post_spec.rb
96
110
  - spec/examples/twitter_spec.rb
111
+ - spec/roxml_spec.rb
112
+ - spec/shared_specs.rb
97
113
  - spec/spec.opts
98
114
  - spec/spec_helper.rb
115
+ - spec/string_spec.rb
116
+ - spec/xml/parser_spec.rb
99
117
  - tasks/rspec.rake
100
118
  - tasks/test.rake
101
119
  - test/bugs/rexml_bugs.rb
@@ -133,13 +151,8 @@ files:
133
151
  - test/mocks/mocks.rb
134
152
  - test/release/dependencies_test.rb
135
153
  - test/test_helper.rb
136
- - test/unit/array_test.rb
137
154
  - test/unit/definition_test.rb
138
- - test/unit/freeze_test.rb
139
- - test/unit/inheritance_test.rb
140
- - test/unit/overriden_output_test.rb
141
- - test/unit/roxml_test.rb
142
- - test/unit/string_test.rb
155
+ - test/unit/deprecations_test.rb
143
156
  - test/unit/to_xml_test.rb
144
157
  - test/unit/xml_attribute_test.rb
145
158
  - test/unit/xml_block_test.rb
@@ -181,28 +194,23 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
194
  requirements: []
182
195
 
183
196
  rubyforge_project: roxml
184
- rubygems_version: 1.3.1.xported
197
+ rubygems_version: 1.3.1
185
198
  signing_key:
186
199
  specification_version: 2
187
200
  summary: Ruby Object to XML mapping library
188
201
  test_files:
189
- - test/unit/freeze_test.rb
190
- - test/unit/array_test.rb
191
202
  - test/unit/xml_convention_test.rb
192
203
  - test/unit/xml_object_test.rb
193
204
  - test/unit/xml_required_test.rb
194
205
  - test/unit/xml_bool_test.rb
195
- - test/unit/roxml_test.rb
196
206
  - test/unit/xml_name_test.rb
197
207
  - test/unit/definition_test.rb
198
208
  - test/unit/xml_construct_test.rb
199
- - test/unit/string_test.rb
200
209
  - test/unit/xml_namespace_test.rb
210
+ - test/unit/deprecations_test.rb
201
211
  - test/unit/xml_text_test.rb
202
- - test/unit/overriden_output_test.rb
203
212
  - test/unit/xml_block_test.rb
204
213
  - test/unit/xml_attribute_test.rb
205
- - test/unit/inheritance_test.rb
206
214
  - test/unit/xml_initialize_test.rb
207
215
  - test/unit/xml_hash_test.rb
208
216
  - test/unit/to_xml_test.rb