xmlparsable 1.5.1 → 1.5.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 +6 -6
- data/lib/xmlparsable/elements/array.rb +5 -3
- data/lib/xmlparsable/elements/date.rb +12 -3
- data/lib/xmlparsable/elements/numeric.rb +5 -2
- data/lib/xmlparsable/elements/record.rb +6 -10
- data/lib/xmlparsable/elements/string.rb +9 -2
- data/lib/xmlparsable/elements/text.rb +10 -3
- data/lib/xmlparsable/elements/time.rb +12 -3
- data/lib/xmlparsable/elements/xml.rb +5 -4
- data/spec/examples/elements/array.example +7 -0
- data/spec/examples/elements/date.example +14 -0
- data/spec/examples/elements/numeric.example +14 -0
- data/spec/examples/elements/record.example +16 -0
- data/spec/examples/elements/string.example +14 -0
- data/spec/examples/elements/text.example +14 -0
- data/spec/examples/elements/time.example +14 -0
- metadata +2 -2
data/lib/xmlparsable.rb
CHANGED
@@ -5,11 +5,11 @@ module XmlParsable
|
|
5
5
|
autoload :Parser, "xmlparsable/parser"
|
6
6
|
autoload :Elements, "xmlparsable/elements"
|
7
7
|
|
8
|
-
def self.parser(input)
|
8
|
+
def self.parser(input, *extra)
|
9
9
|
case input
|
10
|
-
when String then LibXML::XML::SaxParser.string(input)
|
11
|
-
when File then LibXML::XML::SaxParser.file(input)
|
12
|
-
when IO then LibXML::XML::SaxParser.io(input)
|
10
|
+
when String then LibXML::XML::SaxParser.string(input, *extra)
|
11
|
+
when File then LibXML::XML::SaxParser.file(input, *extra)
|
12
|
+
when IO then LibXML::XML::SaxParser.io(input, *extra)
|
13
13
|
else raise ArgumentError, "argument must be a String, File, or IO"
|
14
14
|
end
|
15
15
|
end
|
@@ -74,8 +74,8 @@ module XmlParsable
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
def parse(input)
|
78
|
-
root = XmlParsable::Elements::RecordElement.new(nil, nil, nil, new, @parsers)
|
77
|
+
def parse(input, *extras)
|
78
|
+
root = XmlParsable::Elements::RecordElement.new(nil, nil, nil, new, @parsers, Hash.new)
|
79
79
|
stack = XmlParsable::Parser.new(root)
|
80
80
|
parser = XmlParsable.parser(input)
|
81
81
|
|
@@ -2,19 +2,20 @@ module XmlParsable
|
|
2
2
|
module Elements
|
3
3
|
|
4
4
|
class ArrayElement < AbstractElement
|
5
|
-
attr_reader :name
|
6
5
|
|
7
6
|
class Array < ::Array
|
8
7
|
attr_reader :xmlattrs
|
9
8
|
end
|
10
9
|
|
10
|
+
attr_reader :name
|
11
|
+
|
11
12
|
def initialize(name, attributes, parent, arguments)
|
12
|
-
@name, @parent, @elements =
|
13
|
+
@name, @attributes, @parent, @elements =
|
14
|
+
name, attributes, parent, Array.new
|
13
15
|
|
14
16
|
@item_name = arguments[:item_name].to_s
|
15
17
|
@item_type = arguments[:class]
|
16
18
|
@item_args = arguments[:item]
|
17
|
-
@elements.instance_variable_set(:@xmlattrs, attributes)
|
18
19
|
end
|
19
20
|
|
20
21
|
def open(name, attributes)
|
@@ -28,6 +29,7 @@ module XmlParsable
|
|
28
29
|
end
|
29
30
|
|
30
31
|
def finalize
|
32
|
+
@elements.instance_variable_set(:@xmlattrs, @attributes)
|
31
33
|
@parent.close(self, @elements)
|
32
34
|
end
|
33
35
|
end
|
@@ -6,10 +6,16 @@ module XmlParsable
|
|
6
6
|
# Parses content into a ruby Date value
|
7
7
|
#
|
8
8
|
class DateElement < AbstractElement
|
9
|
+
|
10
|
+
class Date < ::Date
|
11
|
+
attr_reader :xmlattrs
|
12
|
+
end
|
13
|
+
|
9
14
|
attr_reader :name
|
10
15
|
|
11
|
-
def initialize(name, attributes, parent,
|
12
|
-
@name, @parent, @string =
|
16
|
+
def initialize(name, attributes, parent, arguments)
|
17
|
+
@name, @attributes, @parent, @string =
|
18
|
+
name, attributes, parent, ""
|
13
19
|
end
|
14
20
|
|
15
21
|
def read(text)
|
@@ -18,7 +24,10 @@ module XmlParsable
|
|
18
24
|
|
19
25
|
def finalize
|
20
26
|
stripped = @string.strip
|
21
|
-
|
27
|
+
date = stripped == "" ? nil : Date.parse(stripped)
|
28
|
+
date.instance_variable_set(:@xmlattrs, @attributes)
|
29
|
+
|
30
|
+
@parent.close(self, date)
|
22
31
|
end
|
23
32
|
end
|
24
33
|
end
|
@@ -6,8 +6,9 @@ module XmlParsable
|
|
6
6
|
class NumericElement < AbstractElement
|
7
7
|
attr_reader :name
|
8
8
|
|
9
|
-
def initialize(name, attributes, parent,
|
10
|
-
@name, @parent, @string =
|
9
|
+
def initialize(name, attributes, parent, arguments)
|
10
|
+
@name, @attributes, @parent, @string =
|
11
|
+
name, attributes, parent, ""
|
11
12
|
end
|
12
13
|
|
13
14
|
def read(text)
|
@@ -22,6 +23,8 @@ module XmlParsable
|
|
22
23
|
Integer(stripped)
|
23
24
|
end
|
24
25
|
|
26
|
+
# TODO: Subclass BigDecimal and Integer to add an accessor method
|
27
|
+
numeric.instance_variable_set(:@xmlattrs, @attributes)
|
25
28
|
@parent.close(self, numeric)
|
26
29
|
end
|
27
30
|
end
|
@@ -3,14 +3,9 @@ module XmlParsable
|
|
3
3
|
class RecordElement < AbstractElement
|
4
4
|
attr_reader :name, :attributes, :parent, :target
|
5
5
|
|
6
|
-
def initialize(name, attributes, parent, target, parsers,
|
7
|
-
@name
|
8
|
-
|
9
|
-
@parent = parent
|
10
|
-
@target = target
|
11
|
-
@parsers = parsers
|
12
|
-
@elements = Hash.new
|
13
|
-
@target.instance_variable_set(:@xmlattrs, @attributes)
|
6
|
+
def initialize(name, attributes, parent, target, parsers, arguments)
|
7
|
+
@name, @attributes, @parent, @target, @parsers, @elements =
|
8
|
+
name, attributes, parent, target, parsers, Hash.new
|
14
9
|
end
|
15
10
|
|
16
11
|
def open(name, attributes)
|
@@ -32,6 +27,7 @@ module XmlParsable
|
|
32
27
|
end
|
33
28
|
|
34
29
|
def finalize
|
30
|
+
@target.instance_variable_set(:@xmlattrs, @attributes)
|
35
31
|
@target.instance_variable_set(:@xmlelems, @elements)
|
36
32
|
@parent.close(self, @target) if @parent
|
37
33
|
end
|
@@ -41,8 +37,8 @@ module XmlParsable
|
|
41
37
|
@base, @parsers = base, parsers
|
42
38
|
end
|
43
39
|
|
44
|
-
def new(name, attributes, parent,
|
45
|
-
RecordElement.new(name, attributes, parent, @base.new, @parsers)
|
40
|
+
def new(name, attributes, parent, arguments)
|
41
|
+
RecordElement.new(name, attributes, parent, @base.new, @parsers, arguments)
|
46
42
|
end
|
47
43
|
end
|
48
44
|
end
|
@@ -5,10 +5,16 @@ module XmlParsable
|
|
5
5
|
# elements so "abc <!-- foo --> def <b>whatever</b>" is read as "abc def"
|
6
6
|
#
|
7
7
|
class StringElement < AbstractElement
|
8
|
+
|
9
|
+
class String < ::String
|
10
|
+
attr_reader :xmlattrs
|
11
|
+
end
|
12
|
+
|
8
13
|
attr_reader :name
|
9
14
|
|
10
|
-
def initialize(name, attributes, parent,
|
11
|
-
@name, @parent, @string =
|
15
|
+
def initialize(name, attributes, parent, arguments)
|
16
|
+
@name, @attributes, @parent, @string =
|
17
|
+
name, attributes, parent, String.new
|
12
18
|
end
|
13
19
|
|
14
20
|
def read(text)
|
@@ -16,6 +22,7 @@ module XmlParsable
|
|
16
22
|
end
|
17
23
|
|
18
24
|
def finalize
|
25
|
+
@string.instance_variable_set(:@xmlattrs, @attributes)
|
19
26
|
@parent.close(self, @string)
|
20
27
|
end
|
21
28
|
end
|
@@ -5,14 +5,20 @@ module XmlParsable
|
|
5
5
|
# elements so "abc def <b>what<!-- foo -->ever</b>" is read as "abc def whatever"
|
6
6
|
#
|
7
7
|
class TextElement < XmlElement::Node
|
8
|
+
|
9
|
+
class String < ::String
|
10
|
+
attr_reader :xmlattrs
|
11
|
+
end
|
12
|
+
|
8
13
|
attr_reader :name, :attributes, :parent
|
9
14
|
|
10
|
-
def initialize(name, attributes, parent,
|
11
|
-
@name, @attributes, @parent, @text =
|
15
|
+
def initialize(name, attributes, parent, arguments)
|
16
|
+
@name, @attributes, @parent, @arguments, @text =
|
17
|
+
name, attributes, parent, arguments, String.new
|
12
18
|
end
|
13
19
|
|
14
20
|
def open(name, attributes)
|
15
|
-
TextElement.new(name, attributes, self)
|
21
|
+
TextElement.new(name, attributes, self, @arguments)
|
16
22
|
end
|
17
23
|
|
18
24
|
def read(text)
|
@@ -27,6 +33,7 @@ module XmlParsable
|
|
27
33
|
end
|
28
34
|
|
29
35
|
def finalize
|
36
|
+
@text.instance_variable_set(:@xmlattrs, @attributes)
|
30
37
|
@parent.close(self, @text)
|
31
38
|
end
|
32
39
|
end
|
@@ -6,10 +6,16 @@ module XmlParsable
|
|
6
6
|
# Parses content into a ruby Time value
|
7
7
|
#
|
8
8
|
class TimeElement < AbstractElement
|
9
|
+
|
10
|
+
class Time < ::Time
|
11
|
+
attr_reader :xmlattrs
|
12
|
+
end
|
13
|
+
|
9
14
|
attr_reader :name
|
10
15
|
|
11
|
-
def initialize(name, attributes, parent,
|
12
|
-
@name, @parent, @string =
|
16
|
+
def initialize(name, attributes, parent, arguments)
|
17
|
+
@name, @attributes, @parent, @string =
|
18
|
+
name, attributes, parent, ""
|
13
19
|
end
|
14
20
|
|
15
21
|
def read(text)
|
@@ -18,7 +24,10 @@ module XmlParsable
|
|
18
24
|
|
19
25
|
def finalize
|
20
26
|
stripped = @string.strip
|
21
|
-
|
27
|
+
time = stripped == "" ? nil : Time.parse(stripped)
|
28
|
+
time.instance_variable_set(:@xmlattrs, @attributes)
|
29
|
+
|
30
|
+
@parent.close(self, time)
|
22
31
|
end
|
23
32
|
end
|
24
33
|
end
|
@@ -11,14 +11,15 @@ module XmlParsable
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class Node < AbstractElement
|
14
|
-
attr_reader :name, :attributes, :parent, :children
|
14
|
+
attr_reader :name, :attributes, :parent, :children, :xmlattr
|
15
15
|
|
16
|
-
def initialize(name, attributes, parent,
|
17
|
-
@
|
16
|
+
def initialize(name, attributes, parent, arguments)
|
17
|
+
@name, @attributes, @parent, @arguments, @children =
|
18
|
+
name, attributes, parent, arguments, Array.new
|
18
19
|
end
|
19
20
|
|
20
21
|
def open(name, attributes)
|
21
|
-
Node.new(name, attributes, self)
|
22
|
+
Node.new(name, attributes, self, @arguments)
|
22
23
|
end
|
23
24
|
|
24
25
|
def read(text)
|
@@ -72,6 +72,13 @@ describe XmlParsable::Elements::ArrayElement do
|
|
72
72
|
parser.parse(input).list.xmlattrs.should == expected
|
73
73
|
end
|
74
74
|
|
75
|
+
it "parses item attributes" do
|
76
|
+
input = '<list><item thang="yarn"/><item milk="yawn"/></list>'
|
77
|
+
result = parser.parse(input)
|
78
|
+
result.list[0].xmlattrs.should == Hash["thang" => "yarn"]
|
79
|
+
result.list[1].xmlattrs.should == Hash["milk" => "yawn"]
|
80
|
+
end
|
81
|
+
|
75
82
|
it "parses non-empty list into an Array" do
|
76
83
|
input = "<list><item>a</item><item>b</item></list>"
|
77
84
|
expected = ["a", "b"]
|
@@ -10,6 +10,20 @@ describe XmlParsable::Elements::DateElement do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
describe "parses attributes" do
|
14
|
+
let(:expected) { Hash["thang" => "yarn", "milk" => "yawn"] }
|
15
|
+
|
16
|
+
it "on non-empty elements" do
|
17
|
+
input = "<date thang='yarn' milk='yawn'>#{Date.today}</date>"
|
18
|
+
parser.parse(input).date.xmlattrs.should == expected
|
19
|
+
end
|
20
|
+
|
21
|
+
pending "on empty elements" do
|
22
|
+
input = '<date thang="yarn" milk="yawn"/>'
|
23
|
+
parser.parse(input).date.xmlattrs.should == expected
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
13
27
|
it "parses date into a ruby Date" do
|
14
28
|
expected = Date.today
|
15
29
|
input = "<date>#{expected}</date>"
|
@@ -10,6 +10,20 @@ describe XmlParsable::Elements::StringElement do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
describe "parses attributes" do
|
14
|
+
let(:expected) { Hash["thang" => "yarn", "milk" => "yawn"] }
|
15
|
+
|
16
|
+
pending "for non-empty elements" do
|
17
|
+
input = '<number thang="yarn" milk="yawn">0</number>'
|
18
|
+
parser.parse(input).number.xmlattrs.should == expected
|
19
|
+
end
|
20
|
+
|
21
|
+
pending "for empty elements" do
|
22
|
+
input = '<number thang="yarn" milk="yawn"/>'
|
23
|
+
parser.parse(input).number.xmlattrs.should == expected
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
13
27
|
it "parses integers" do
|
14
28
|
expected = rand(1_000)
|
15
29
|
input = "<number>#{expected}</number>"
|
@@ -6,6 +6,8 @@ describe XmlParsable::Elements::RecordElement do
|
|
6
6
|
Class.new do
|
7
7
|
include XmlParsable
|
8
8
|
|
9
|
+
attr_reader :xmlattrs
|
10
|
+
|
9
11
|
element :date, XmlParsable::Elements::DateElement
|
10
12
|
element :string, XmlParsable::Elements::StringElement
|
11
13
|
element :text, XmlParsable::Elements::TextElement
|
@@ -61,6 +63,20 @@ describe XmlParsable::Elements::RecordElement do
|
|
61
63
|
DOC
|
62
64
|
end
|
63
65
|
|
66
|
+
describe "parses attributes" do
|
67
|
+
let(:expected) { Hash["thang" => "yarn", "milk" => "yawn"] }
|
68
|
+
|
69
|
+
it "for non-empty elements" do
|
70
|
+
input = '<record thang="yarn" milk="yawn"><number>1</number></record>'
|
71
|
+
parser.parse(input).record.xmlattrs.should == expected
|
72
|
+
end
|
73
|
+
|
74
|
+
it "for empty elements" do
|
75
|
+
input = '<record thang="yarn" milk="yawn"/>'
|
76
|
+
parser.parse(input).record.xmlattrs.should == expected
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
64
80
|
it "parses recursive records" do
|
65
81
|
xml = parser.parse(<<-XML)
|
66
82
|
<record>
|
@@ -10,6 +10,20 @@ describe XmlParsable::Elements::StringElement do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
describe "parses attributes" do
|
14
|
+
let(:expected) { Hash["thang" => "yarn", "milk" => "yawn"] }
|
15
|
+
|
16
|
+
it "for empty elements" do
|
17
|
+
input = '<string thang="yarn" milk="yawn"/>'
|
18
|
+
parser.parse(input).string.xmlattrs.should == expected
|
19
|
+
end
|
20
|
+
|
21
|
+
it "for non-empty elements" do
|
22
|
+
input = '<string thang="yarn" milk="yawn">wormever</string>'
|
23
|
+
parser.parse(input).string.xmlattrs.should == expected
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
13
27
|
it "parses empty string" do
|
14
28
|
expected = ""
|
15
29
|
input = "<string></string>"
|
@@ -10,6 +10,20 @@ describe XmlParsable::Elements::StringElement do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
describe "parses attributes" do
|
14
|
+
let(:expected) { Hash["thang" => "yarn", "milk" => "yawn"] }
|
15
|
+
|
16
|
+
it "for empty elements" do
|
17
|
+
input = '<text thang="yarn" milk="yawn"/>'
|
18
|
+
parser.parse(input).text.xmlattrs.should == expected
|
19
|
+
end
|
20
|
+
|
21
|
+
it "for non-empty elements" do
|
22
|
+
input = '<text thang="yarn" milk="yawn">wormever</text>'
|
23
|
+
parser.parse(input).text.xmlattrs.should == expected
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
13
27
|
it "parses text" do
|
14
28
|
expected = "lo and behold"
|
15
29
|
input = "<text>lo and behold</text>"
|
@@ -10,6 +10,20 @@ describe XmlParsable::Elements::StringElement do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
+
describe "parses attributes" do
|
14
|
+
let(:expected) { Hash["thang" => "yarn", "milk" => "yawn"] }
|
15
|
+
|
16
|
+
pending "for empty elements" do
|
17
|
+
input = '<time thang="yarn" milk="yawn"/>'
|
18
|
+
parser.parse(input).time.xmlattrs.should == expected
|
19
|
+
end
|
20
|
+
|
21
|
+
specify "for non-empty elements" do
|
22
|
+
input = "<time thang='yarn' milk='yawn'>#{Time.now}</time>"
|
23
|
+
parser.parse(input).time.xmlattrs.should == expected
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
13
27
|
it "parses time" do
|
14
28
|
expected = Time.now
|
15
29
|
input = "<time>#{expected}</time>"
|
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.5.
|
4
|
+
version: 1.5.2
|
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-06-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: libxml-ruby
|