xmlparsable 1.3.0 → 1.4.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 +45 -0
- data/lib/xmlparsable/elements/date.rb +1 -1
- data/lib/xmlparsable/elements/list.rb +2 -2
- data/lib/xmlparsable/elements/numeric.rb +30 -0
- data/lib/xmlparsable/elements/record.rb +2 -2
- data/lib/xmlparsable/elements/string.rb +1 -1
- data/lib/xmlparsable/elements/text.rb +2 -2
- data/lib/xmlparsable/elements/time.rb +1 -1
- data/lib/xmlparsable/elements/xml.rb +2 -2
- data/lib/xmlparsable/elements.rb +1 -0
- data/spec/examples/record.example +32 -1
- metadata +3 -2
data/README.md
CHANGED
@@ -78,3 +78,48 @@ relies on LibXML::XML::SaxParser.
|
|
78
78
|
|
79
79
|
vlad.email #=> "vlad@gmail.com"
|
80
80
|
vlad.spouse #=> #<AddressBook::Contact @givenname="Lyudmila" @familyname="Putina">
|
81
|
+
|
82
|
+
## Data Types
|
83
|
+
|
84
|
+
### DateElement
|
85
|
+
|
86
|
+
Parses content into a Ruby `Date` object, using `Date.parse`.
|
87
|
+
|
88
|
+
### ListElement
|
89
|
+
|
90
|
+
Parses children nodes into an `Array` using some other `AbstractElement`
|
91
|
+
child class.
|
92
|
+
|
93
|
+
### NumericElement
|
94
|
+
|
95
|
+
Parses content into a Ruby `Integer` or `BigDecimal`, depending on whether
|
96
|
+
the input contains a decimal point or not. Parses using `Integer(..)` and
|
97
|
+
`BigDecimal(..)` constructor methods.
|
98
|
+
|
99
|
+
### RecordElement
|
100
|
+
|
101
|
+
Parses children nodes according to `element` and `collection` declarations
|
102
|
+
on an `XmlParsable` class.
|
103
|
+
|
104
|
+
### StringElement
|
105
|
+
|
106
|
+
Parses content into a Ruby `String` object.
|
107
|
+
|
108
|
+
### TextElement
|
109
|
+
|
110
|
+
Concatenates all subordinate text nodes into a single `String`. For example,
|
111
|
+
`"abc def <b>what<!-- ever --></b>"` is read as `"abc def what"`.
|
112
|
+
|
113
|
+
### TimeElement
|
114
|
+
|
115
|
+
Parses content into a Ruby `Time` object, using `Time.parse`.
|
116
|
+
|
117
|
+
### XmlElement
|
118
|
+
|
119
|
+
Parses children elements into an `Array` whose elements are one of these three
|
120
|
+
classes. These really should be the same node types that `LibXML` uses, but
|
121
|
+
that's not the case for now.
|
122
|
+
|
123
|
+
* `XmlParsable::Elements::XmlElement::Node`
|
124
|
+
* `XmlParsable::Elements::XmlElement::Text`
|
125
|
+
* `XmlParsable::Elements::XmlElement::Comment`
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module XmlParsable
|
2
|
+
module Elements
|
3
|
+
#
|
4
|
+
# Parses content into a ruby Numeric value.
|
5
|
+
#
|
6
|
+
class NumericElement < AbstractElement
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
def initialize(name, attributes, parent, *arguments)
|
10
|
+
@name, @parent, @string = name, parent, ""
|
11
|
+
end
|
12
|
+
|
13
|
+
def read(text)
|
14
|
+
@string << text
|
15
|
+
end
|
16
|
+
|
17
|
+
def finalize
|
18
|
+
stripped = @string.strip
|
19
|
+
numeric = if stripped =~ /[e.]/i and stripped !~ /x/i
|
20
|
+
BigDecimal(stripped)
|
21
|
+
elsif stripped != ""
|
22
|
+
Integer(stripped)
|
23
|
+
end
|
24
|
+
|
25
|
+
@parent.close(self, numeric)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -19,7 +19,7 @@ module XmlParsable
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
22
|
+
def close(element, value)
|
23
23
|
parser, *arguments = @parsers[element.name]
|
24
24
|
if arguments.include?(:repeated)
|
25
25
|
(@elements[element.name] ||= []) << value
|
@@ -30,7 +30,7 @@ module XmlParsable
|
|
30
30
|
|
31
31
|
def finalize
|
32
32
|
@elements.each{|name, value| @target.instance_variable_set("@#{name}", value) }
|
33
|
-
@parent.
|
33
|
+
@parent.close(self, @target) if @parent
|
34
34
|
end
|
35
35
|
|
36
36
|
class Proxy
|
@@ -29,12 +29,12 @@ module XmlParsable
|
|
29
29
|
@children << Comment.new(text, self)
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
32
|
+
def close(element, value)
|
33
33
|
@children << value
|
34
34
|
end
|
35
35
|
|
36
36
|
def finalize
|
37
|
-
@parent.
|
37
|
+
@parent.close(self, self)
|
38
38
|
end
|
39
39
|
|
40
40
|
def to_s(buffer = "")
|
data/lib/xmlparsable/elements.rb
CHANGED
@@ -3,6 +3,7 @@ module XmlParsable
|
|
3
3
|
autoload :AbstractElement, "xmlparsable/elements/abstract"
|
4
4
|
autoload :DateElement, "xmlparsable/elements/date"
|
5
5
|
autoload :ListElement, "xmlparsable/elements/list"
|
6
|
+
autoload :NumericElement, "xmlparsable/elements/numeric"
|
6
7
|
autoload :RecordElement, "xmlparsable/elements/record"
|
7
8
|
autoload :StringElement, "xmlparsable/elements/string"
|
8
9
|
autoload :TextElement, "xmlparsable/elements/text"
|
@@ -6,11 +6,12 @@ describe XmlParsable::Elements::RecordElement do
|
|
6
6
|
include XmlParsable
|
7
7
|
|
8
8
|
element :date, DateElement
|
9
|
-
element :record, self
|
10
9
|
element :string, StringElement
|
11
10
|
element :text, TextElement
|
12
11
|
element :time, TimeElement
|
13
12
|
element :xml, XmlElement
|
13
|
+
element :number, NumericElement
|
14
|
+
element :record, self
|
14
15
|
|
15
16
|
collection :kids, self
|
16
17
|
collection :list, :item
|
@@ -147,6 +148,31 @@ describe XmlParsable::Elements::RecordElement do
|
|
147
148
|
end
|
148
149
|
end
|
149
150
|
|
151
|
+
describe "number" do
|
152
|
+
it "parses integers" do
|
153
|
+
number = rand(1_000)
|
154
|
+
Record.parse("<number>#{number}</number>").number.should == number
|
155
|
+
end
|
156
|
+
|
157
|
+
it "parses rationals" do
|
158
|
+
number = rand(1_000) + rand
|
159
|
+
Record.parse("<number>#{number}</number>").number.should == number
|
160
|
+
end
|
161
|
+
|
162
|
+
it "ignores comments" do
|
163
|
+
Record.parse("<time><!-- 65432 --></time>").number.should be_nil
|
164
|
+
end
|
165
|
+
|
166
|
+
it "ignores children" do
|
167
|
+
Record.parse("<time><b>#{rand}</b></time>").number.should be_nil
|
168
|
+
end
|
169
|
+
|
170
|
+
it "ignores whitespace" do
|
171
|
+
number = rand(1_000)
|
172
|
+
Record.parse("<number> #{number} </number>").number.should == number
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
150
176
|
describe "record" do
|
151
177
|
it "parses date" do
|
152
178
|
x = Record.parse("<record><date>#{Date.today}</date></record>")
|
@@ -177,6 +203,11 @@ describe XmlParsable::Elements::RecordElement do
|
|
177
203
|
Record.parse("<record><time>#{time}</time></record>").record.time.to_i.should == time.to_i
|
178
204
|
end
|
179
205
|
|
206
|
+
it "parses number" do
|
207
|
+
number = rand(1_000) + rand
|
208
|
+
Record.parse("<record><number>#{number}</number></record>").record.number.should == number
|
209
|
+
end
|
210
|
+
|
180
211
|
it "parses multiple elements" do
|
181
212
|
time = Time.now
|
182
213
|
x = Record.parse <<-XML
|
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
|
+
version: 1.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-05-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: libxml-ruby
|
@@ -38,6 +38,7 @@ files:
|
|
38
38
|
- lib/xmlparsable/elements/abstract.rb
|
39
39
|
- lib/xmlparsable/elements/date.rb
|
40
40
|
- lib/xmlparsable/elements/list.rb
|
41
|
+
- lib/xmlparsable/elements/numeric.rb
|
41
42
|
- lib/xmlparsable/elements/record.rb
|
42
43
|
- lib/xmlparsable/elements/string.rb
|
43
44
|
- lib/xmlparsable/elements/text.rb
|