xmlparsable 1.4.1 → 1.4.2
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/lib/xmlparsable.rb +12 -2
- data/spec/examples/inheritance.example +155 -0
- data/spec/examples/record.example +2 -2
- metadata +3 -1
data/lib/xmlparsable.rb
CHANGED
@@ -25,7 +25,12 @@ module XmlParsable
|
|
25
25
|
element ||= arguments.shift if arguments.first.is_a?(Class)
|
26
26
|
element ||= Elements::StringElement
|
27
27
|
|
28
|
-
|
28
|
+
# Look up the inheritance hierarchy to map element name to parser
|
29
|
+
parent = superclass < XmlParsable ?
|
30
|
+
superclass.instance_variable_get(:@parsers) : Hash.new
|
31
|
+
|
32
|
+
@parsers ||= Hash.new{|h,k| parent[k] }
|
33
|
+
@parsers[name.to_s] = [element.parsable, *arguments]
|
29
34
|
|
30
35
|
define_method(name) { instance_variable_get("@#{name}") }
|
31
36
|
end
|
@@ -35,7 +40,12 @@ module XmlParsable
|
|
35
40
|
element ||= arguments.shift if arguments.first.is_a?(Class)
|
36
41
|
element ||= Elements::StringElement
|
37
42
|
|
38
|
-
|
43
|
+
# Look up the inheritance hierarchy to map element name to parser
|
44
|
+
parent = superclass < XmlParsable ?
|
45
|
+
superclass.instance_variable_get(:@parsers) : Hash.new
|
46
|
+
|
47
|
+
@parsers ||= Hash.new{|h,k| parent[k] }
|
48
|
+
@parsers[name.to_s.singularize] = [element.parsable, *arguments.push(:repeated)]
|
39
49
|
|
40
50
|
define_method(name) { instance_variable_get("@#{name.to_s.singularize}") }
|
41
51
|
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe XmlParsable::Elements::RecordElement, "inheritance" do
|
4
|
+
|
5
|
+
class BaseRecord
|
6
|
+
include XmlParsable
|
7
|
+
|
8
|
+
class Record
|
9
|
+
include XmlParsable
|
10
|
+
element :id, StringElement
|
11
|
+
element :size, NumericElement
|
12
|
+
end
|
13
|
+
|
14
|
+
element :record, Record
|
15
|
+
end
|
16
|
+
|
17
|
+
class FirstRecord
|
18
|
+
include XmlParsable
|
19
|
+
|
20
|
+
class Record < BaseRecord::Record
|
21
|
+
element :id, TimeElement
|
22
|
+
element :name, StringElement
|
23
|
+
end
|
24
|
+
|
25
|
+
element :record, Record
|
26
|
+
end
|
27
|
+
|
28
|
+
class SecondRecord
|
29
|
+
include XmlParsable
|
30
|
+
|
31
|
+
class Record < BaseRecord::Record
|
32
|
+
element :id, NumericElement
|
33
|
+
end
|
34
|
+
|
35
|
+
element :record, Record
|
36
|
+
end
|
37
|
+
|
38
|
+
class ThirdRecord < BaseRecord
|
39
|
+
include XmlParsable
|
40
|
+
|
41
|
+
class Record < BaseRecord::Record
|
42
|
+
element :parent, Record
|
43
|
+
end
|
44
|
+
|
45
|
+
element :record, Record
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "parent" do
|
49
|
+
subject { BaseRecord::Record.new }
|
50
|
+
specify { should respond_to(:id) }
|
51
|
+
specify { should respond_to(:size) }
|
52
|
+
specify { should_not respond_to(:name) }
|
53
|
+
specify { should_not respond_to(:parent) }
|
54
|
+
|
55
|
+
it "parses attributes" do
|
56
|
+
data = BaseRecord.parse(<<-XML.strip)
|
57
|
+
<record>
|
58
|
+
<id>0xCAFE</id>
|
59
|
+
<size>0xFE</size>
|
60
|
+
</record>
|
61
|
+
XML
|
62
|
+
|
63
|
+
data.record.should be_a(BaseRecord::Record)
|
64
|
+
data.record.id.should == "0xCAFE"
|
65
|
+
data.record.size.should == 0xFE
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "first" do
|
70
|
+
subject { FirstRecord::Record.new }
|
71
|
+
specify { should respond_to(:id) }
|
72
|
+
specify { should respond_to(:size) }
|
73
|
+
specify { should respond_to(:name) }
|
74
|
+
specify { should_not respond_to(:parent) }
|
75
|
+
|
76
|
+
it "parses attributes" do
|
77
|
+
data = FirstRecord.parse(<<-XML.strip)
|
78
|
+
<record>
|
79
|
+
<id>20120530T154500</id>
|
80
|
+
<size>0xCA7</size>
|
81
|
+
<name>Sabji</name>
|
82
|
+
</record>
|
83
|
+
XML
|
84
|
+
|
85
|
+
data.record.should be_a(FirstRecord::Record)
|
86
|
+
data.record.id.should == Time.local(2012, 5, 30, 15, 45)
|
87
|
+
data.record.size.should == 0xCA7
|
88
|
+
data.record.name.should == "Sabji"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "second" do
|
93
|
+
subject { SecondRecord::Record.new }
|
94
|
+
specify { should respond_to(:id) }
|
95
|
+
specify { should respond_to(:size) }
|
96
|
+
specify { should_not respond_to(:name) }
|
97
|
+
specify { should_not respond_to(:parent) }
|
98
|
+
|
99
|
+
it "parses attributes" do
|
100
|
+
data = SecondRecord.parse(<<-XML)
|
101
|
+
<record>
|
102
|
+
<id>0.314</id>
|
103
|
+
<size>3.014</size>
|
104
|
+
</record>
|
105
|
+
XML
|
106
|
+
|
107
|
+
data.record.should be_a(SecondRecord::Record)
|
108
|
+
data.record.id.should == 0.314
|
109
|
+
data.record.size.should == 3.014
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "third" do
|
114
|
+
subject { ThirdRecord::Record.new }
|
115
|
+
specify { should respond_to(:id) }
|
116
|
+
specify { should respond_to(:size) }
|
117
|
+
specify { should_not respond_to(:name) }
|
118
|
+
specify { should respond_to(:parent) }
|
119
|
+
|
120
|
+
it "parses attributes" do
|
121
|
+
data = ThirdRecord.parse(<<-XML)
|
122
|
+
<record>
|
123
|
+
<id>X039-P99-THX1138-U</id>
|
124
|
+
<size>11235813</size>
|
125
|
+
<parent>
|
126
|
+
<id>X039-P99-THX1138</id>
|
127
|
+
<size>112358</size>
|
128
|
+
<parent>
|
129
|
+
<id>X039-P99</id>
|
130
|
+
<size>11235</size>
|
131
|
+
<parent>
|
132
|
+
<id>X039</id>
|
133
|
+
<size>1123</size>
|
134
|
+
</parent>
|
135
|
+
</parent>
|
136
|
+
</parent>
|
137
|
+
</record>
|
138
|
+
XML
|
139
|
+
|
140
|
+
data.record.should be_a(ThirdRecord::Record)
|
141
|
+
data.record.id.should == "X039-P99-THX1138-U"
|
142
|
+
data.record.size.should == 11235813
|
143
|
+
|
144
|
+
data.record.parent.id.should == "X039-P99-THX1138"
|
145
|
+
data.record.parent.size.should == 112358
|
146
|
+
|
147
|
+
data.record.parent.parent.id.should == "X039-P99"
|
148
|
+
data.record.parent.parent.size.should == 11235
|
149
|
+
|
150
|
+
data.record.parent.parent.parent.id.should == "X039"
|
151
|
+
data.record.parent.parent.parent.size.should == 1123
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
@@ -156,7 +156,7 @@ describe XmlParsable::Elements::RecordElement do
|
|
156
156
|
|
157
157
|
it "parses rationals" do
|
158
158
|
number = rand(1_000) + rand
|
159
|
-
Record.parse("<number>#{number}</number>").number.should == number
|
159
|
+
Record.parse("<number>#{number}</number>").number.should == BigDecimal(number.to_s)
|
160
160
|
end
|
161
161
|
|
162
162
|
it "ignores comments" do
|
@@ -205,7 +205,7 @@ describe XmlParsable::Elements::RecordElement do
|
|
205
205
|
|
206
206
|
it "parses number" do
|
207
207
|
number = rand(1_000) + rand
|
208
|
-
Record.parse("<record><number>#{number}</number></record>").record.number.should == number
|
208
|
+
Record.parse("<record><number>#{number}</number></record>").record.number.should == BigDecimal(number.to_s)
|
209
209
|
end
|
210
210
|
|
211
211
|
it "parses multiple elements" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xmlparsable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- lib/xmlparsable/elements.rb
|
48
48
|
- lib/xmlparsable/parser.rb
|
49
49
|
- lib/xmlparsable.rb
|
50
|
+
- spec/examples/inheritance.example
|
50
51
|
- spec/examples/record.example
|
51
52
|
- spec/spec_helper.rb
|
52
53
|
homepage: https://github.com/kputnam/xmlparsable
|
@@ -74,4 +75,5 @@ signing_key:
|
|
74
75
|
specification_version: 3
|
75
76
|
summary: Simple declarative XML parsing
|
76
77
|
test_files:
|
78
|
+
- spec/examples/inheritance.example
|
77
79
|
- spec/examples/record.example
|