xml_resource 1.0.0 → 2.0.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.
- data/README.md +63 -1
- data/lib/xml_resource/base.rb +15 -5
- data/lib/xml_resource/version.rb +1 -1
- data/lib/xml_resource.rb +1 -1
- data/test/cases/xml_resource_test.rb +4 -0
- data/test/data/orders.xml +3 -0
- data/test/models/order.rb +5 -4
- metadata +28 -13
data/README.md
CHANGED
@@ -1,2 +1,64 @@
|
|
1
1
|
xml_resource
|
2
|
-
============
|
2
|
+
============
|
3
|
+
|
4
|
+
Turn XML into Ruby objects
|
5
|
+
|
6
|
+
Install
|
7
|
+
-------
|
8
|
+
|
9
|
+
In your Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'xml_resource', '~> 2.0.0'
|
13
|
+
```
|
14
|
+
|
15
|
+
Use
|
16
|
+
---
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
xml = %q{
|
20
|
+
<library>
|
21
|
+
<books>
|
22
|
+
<book>
|
23
|
+
<name>The Tempest</name>
|
24
|
+
<author>William Shakespeare</author>
|
25
|
+
<firstpublished>Nov 1, 1611</firstpublished>
|
26
|
+
</book>
|
27
|
+
<book>
|
28
|
+
<name>Moby-Dick</name>
|
29
|
+
<author>Herman Melville</author>
|
30
|
+
<firstpublished>Oct 18, 1851</firstpublished>
|
31
|
+
</book>
|
32
|
+
</books>
|
33
|
+
<hours>
|
34
|
+
<from>08:00 AM</from>
|
35
|
+
<till>06:00 PM</till>
|
36
|
+
</hours>
|
37
|
+
</library>
|
38
|
+
}
|
39
|
+
|
40
|
+
class Library < XmlResource::Base
|
41
|
+
has_collection :books
|
42
|
+
|
43
|
+
has_attribute :open_from, :xpath => 'hours/from'
|
44
|
+
has_attribute :open_till, :xpath => 'hours/till'
|
45
|
+
end
|
46
|
+
|
47
|
+
class Book < XmlResource::Base
|
48
|
+
has_attribute :name
|
49
|
+
has_attribute :author
|
50
|
+
has_attribute :published, :type => :date, :xpath => 'firstpublished'
|
51
|
+
end
|
52
|
+
|
53
|
+
library = Library.from_xml(xml)
|
54
|
+
=> #<Library:0x00000100dcf7e8 @attributes={"open_from"=>"08:00 AM", "open_till"=>"06:00 PM"}, @books=[#<Book:0x00000100dd1778 @attributes={"name"=>"The Tempest", "author"=>"William Shakespeare", "published"=>Tue, 01 Nov 1611}>, #<Book:0x00000100dcfbd0 @attributes={"name"=>"Moby-Dick", "author"=>"Herman Melville", "published"=>Sat, 18 Oct 1851}>]>
|
55
|
+
|
56
|
+
library.open_from
|
57
|
+
=> "08:00 AM"
|
58
|
+
|
59
|
+
book = library.books.first
|
60
|
+
=> #<Book:0x00000100dd1778 @attributes={"name"=>"The Tempest", "author"=>"William Shakespeare", "published"=>Tue, 01 Nov 1611}>
|
61
|
+
|
62
|
+
book.published
|
63
|
+
=> Tue, 01 Nov 1611
|
64
|
+
```
|
data/lib/xml_resource/base.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module XmlResource
|
2
2
|
class Base
|
3
|
+
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON'].to_set
|
4
|
+
|
3
5
|
class_attribute :attributes, :collections, :objects, :root_path
|
4
6
|
self.attributes = {}
|
5
7
|
self.collections = {}
|
@@ -45,7 +47,7 @@ module XmlResource
|
|
45
47
|
end
|
46
48
|
|
47
49
|
def root
|
48
|
-
self.root_path || "
|
50
|
+
self.root_path || "./#{self.basename.underscore}"
|
49
51
|
end
|
50
52
|
|
51
53
|
def root=(root)
|
@@ -95,7 +97,7 @@ module XmlResource
|
|
95
97
|
[:attribute, :object, :collection].each do |method_name|
|
96
98
|
define_method "#{method_name}_xpath" do |name|
|
97
99
|
options = send(method_name.to_s.pluralize)
|
98
|
-
options[name] && options[name][:xpath] or "
|
100
|
+
options[name] && options[name][:xpath] or "./#{name}"
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
@@ -124,7 +126,7 @@ module XmlResource
|
|
124
126
|
when :string then value
|
125
127
|
when :integer then value.to_i
|
126
128
|
when :float then value.to_f
|
127
|
-
when :boolean then
|
129
|
+
when :boolean then cast_to_boolean(value)
|
128
130
|
when :decimal then BigDecimal.new(value)
|
129
131
|
when :date then Date.parse(value)
|
130
132
|
when :datetime then DateTime.parse(value)
|
@@ -133,10 +135,18 @@ module XmlResource
|
|
133
135
|
end
|
134
136
|
end
|
135
137
|
|
138
|
+
def cast_to_boolean(value)
|
139
|
+
if value.is_a?(String) && value.blank?
|
140
|
+
nil
|
141
|
+
else
|
142
|
+
TRUE_VALUES.include?(value)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
136
146
|
def parse(xml_or_string)
|
137
147
|
case xml_or_string
|
138
|
-
when
|
139
|
-
when String then
|
148
|
+
when Nokogiri::XML::Node, Nokogiri::XML::NodeSet then xml_or_string
|
149
|
+
when String then Nokogiri.XML(xml_or_string).root
|
140
150
|
else
|
141
151
|
raise XmlResource::ParseError, "cannot parse #{xml_or_string.inspect}"
|
142
152
|
end
|
data/lib/xml_resource/version.rb
CHANGED
data/lib/xml_resource.rb
CHANGED
@@ -49,6 +49,10 @@ class XmlResourceTest < ActiveSupport::TestCase
|
|
49
49
|
assert_raise(XmlResource::ParseError) { Order.collection_from_xml({}) }
|
50
50
|
end
|
51
51
|
|
52
|
+
test 'Boolean attributes' do
|
53
|
+
assert_equal [true, false, true], orders.map { |o| o.finished }
|
54
|
+
end
|
55
|
+
|
52
56
|
private
|
53
57
|
|
54
58
|
def orders
|
data/test/data/orders.xml
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
<someroot>
|
2
2
|
<order>
|
3
3
|
<id>1</id>
|
4
|
+
<finished>true</finished>
|
4
5
|
<info>
|
5
6
|
<foo type="bar">A</foo>
|
6
7
|
<date>2012-08-27</date>
|
@@ -25,6 +26,7 @@
|
|
25
26
|
|
26
27
|
<order>
|
27
28
|
<id>2</id>
|
29
|
+
<finished>false</finished>
|
28
30
|
<info>
|
29
31
|
<foo type="non">blubb</foo>
|
30
32
|
<foo type="bar">B</foo>
|
@@ -53,6 +55,7 @@
|
|
53
55
|
|
54
56
|
<order>
|
55
57
|
<id>3</id>
|
58
|
+
<finished>true</finished>
|
56
59
|
<info>
|
57
60
|
<foo type="non">wah</foo>
|
58
61
|
<foo type="bar">C</foo>
|
data/test/models/order.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
class Order < XmlResource::Base
|
2
2
|
has_attribute :id, :type => :integer
|
3
|
-
has_attribute :date, :type => :date, :xpath => '
|
4
|
-
has_attribute :foobar, :xpath => '
|
3
|
+
has_attribute :date, :type => :date, :xpath => 'info/date'
|
4
|
+
has_attribute :foobar, :xpath => 'info/foo[@type="bar"]'
|
5
|
+
has_attribute :finished, :type => :boolean
|
5
6
|
has_attribute :shipping_cost, :type => :decimal
|
6
|
-
|
7
|
+
|
7
8
|
has_object :customer, :class_name => "Contact"
|
8
9
|
has_object :contact
|
9
10
|
|
10
|
-
has_collection :items, :class_name => "Item", :xpath => '
|
11
|
+
has_collection :items, :class_name => "Item", :xpath => 'items'
|
11
12
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xml_resource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,27 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-11-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '3.1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.1'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement:
|
31
|
+
name: nokogiri
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: debugger
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,8 +53,13 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
47
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: ! 'xml_resource is '
|
48
63
|
email:
|
49
64
|
- mtgrosser@gmx.net
|
50
65
|
executables: []
|
@@ -63,7 +78,7 @@ files:
|
|
63
78
|
- test/models/item.rb
|
64
79
|
- test/models/order.rb
|
65
80
|
- test/test_helper.rb
|
66
|
-
homepage: http://
|
81
|
+
homepage: http://github.com/mtgrosser/xml_resource
|
67
82
|
licenses: []
|
68
83
|
post_install_message:
|
69
84
|
rdoc_options: []
|
@@ -83,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
98
|
version: '0'
|
84
99
|
requirements: []
|
85
100
|
rubyforge_project:
|
86
|
-
rubygems_version: 1.8.
|
101
|
+
rubygems_version: 1.8.23
|
87
102
|
signing_key:
|
88
103
|
specification_version: 3
|
89
104
|
summary: Turn XML into Ruby objects
|