multi_xml 0.5.4 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +5 -0
- data/lib/multi_xml.rb +14 -20
- data/lib/multi_xml/parsers/libxml2_parser.rb +9 -1
- data/lib/multi_xml/parsers/ox.rb +3 -3
- data/lib/multi_xml/version.rb +1 -1
- data/spec/multi_xml_spec.rb +5 -8
- data/spec/parser_shared_example.rb +12 -54
- metadata +2 -2
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
0.5.5
|
2
|
+
-----
|
3
|
+
* [Fix symbolize_keys function](https://github.com/sferik/multi_xml/commit/a4cae3aeb690999287cd30206399abaa5ce1ae81)
|
4
|
+
* [Fix Nokogiri parser for the same attr and inner element name](https://github.com/sferik/multi_xml/commit/a28ed86e2d7826b2edeed98552736b4c7ca52726)
|
5
|
+
|
1
6
|
0.5.4
|
2
7
|
-----
|
3
8
|
* [Add option to not cast parsed values](https://github.com/sferik/multi_xml/commit/44fc05fbcfd60cc8b555b75212471fab29fa8cd0)
|
data/lib/multi_xml.rb
CHANGED
@@ -70,9 +70,9 @@ module MultiXml
|
|
70
70
|
class << self
|
71
71
|
# Get the current parser class.
|
72
72
|
def parser
|
73
|
-
return
|
73
|
+
return @parser if defined?(@parser)
|
74
74
|
self.parser = self.default_parser
|
75
|
-
|
75
|
+
@parser
|
76
76
|
end
|
77
77
|
|
78
78
|
# The default parser based on what you currently
|
@@ -84,7 +84,7 @@ module MultiXml
|
|
84
84
|
return :libxml if defined?(::LibXML)
|
85
85
|
return :nokogiri if defined?(::Nokogiri)
|
86
86
|
|
87
|
-
REQUIREMENT_MAP.each do |
|
87
|
+
REQUIREMENT_MAP.each do |library, parser|
|
88
88
|
begin
|
89
89
|
require library
|
90
90
|
return parser
|
@@ -105,9 +105,9 @@ module MultiXml
|
|
105
105
|
case new_parser
|
106
106
|
when String, Symbol
|
107
107
|
require "multi_xml/parsers/#{new_parser.to_s.downcase}"
|
108
|
-
|
108
|
+
@parser = MultiXml::Parsers.const_get("#{new_parser.to_s.split('_').map{|s| s.capitalize}.join('')}")
|
109
109
|
when Class, Module
|
110
|
-
|
110
|
+
@parser = new_parser
|
111
111
|
else
|
112
112
|
raise "Did not recognize your parser specification. Please specify either a symbol or a class."
|
113
113
|
end
|
@@ -180,22 +180,16 @@ module MultiXml
|
|
180
180
|
f
|
181
181
|
end
|
182
182
|
|
183
|
-
def symbolize_keys(
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
key.to_sym
|
188
|
-
else
|
189
|
-
key
|
190
|
-
end
|
191
|
-
new_value = case value
|
192
|
-
when Hash
|
193
|
-
symbolize_keys(value)
|
194
|
-
else
|
195
|
-
value
|
183
|
+
def symbolize_keys(params)
|
184
|
+
case params
|
185
|
+
when Hash
|
186
|
+
params.inject({}) do |result, (key, value)|
|
187
|
+
result.merge(key.to_sym => symbolize_keys(value))
|
196
188
|
end
|
197
|
-
|
198
|
-
|
189
|
+
when Array
|
190
|
+
params.map{|value| symbolize_keys(value)}
|
191
|
+
else
|
192
|
+
params
|
199
193
|
end
|
200
194
|
end
|
201
195
|
|
@@ -35,7 +35,15 @@ module MultiXml
|
|
35
35
|
end
|
36
36
|
|
37
37
|
# Handle attributes
|
38
|
-
each_attr(node)
|
38
|
+
each_attr(node) do |a|
|
39
|
+
key = node_name(a)
|
40
|
+
|
41
|
+
node_hash[key] = if v = node_hash[key]
|
42
|
+
[a.value, v]
|
43
|
+
else
|
44
|
+
a.value
|
45
|
+
end
|
46
|
+
end
|
39
47
|
|
40
48
|
hash
|
41
49
|
end
|
data/lib/multi_xml/parsers/ox.rb
CHANGED
@@ -10,7 +10,7 @@ require 'ox' unless defined?(Ox)
|
|
10
10
|
# pairs. Children are added as described by this rule.
|
11
11
|
#
|
12
12
|
# - Text and CDATE is stored in the parent element Hash with a key of
|
13
|
-
#
|
13
|
+
# MultiXml::CONTENT_ROOT and a value of the text itself.
|
14
14
|
#
|
15
15
|
# - If a key already exists in the Hash then the value associated with the key
|
16
16
|
# is converted to an Array with the old and new value in it.
|
@@ -52,11 +52,11 @@ module MultiXml
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def text(value)
|
55
|
-
append(
|
55
|
+
append(MultiXml::CONTENT_ROOT, value)
|
56
56
|
end
|
57
57
|
|
58
58
|
def cdata(value)
|
59
|
-
append(
|
59
|
+
append(MultiXml::CONTENT_ROOT, value)
|
60
60
|
end
|
61
61
|
|
62
62
|
def start_element(name)
|
data/lib/multi_xml/version.rb
CHANGED
data/spec/multi_xml_spec.rb
CHANGED
@@ -11,17 +11,14 @@ describe "MultiXml" do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it "defaults to the best available gem" do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
expect(MultiXml.parser.name).to eq('MultiXml::Parsers::Nokogiri')
|
18
|
-
require 'libxml'
|
19
|
-
expect(MultiXml.parser.name).to eq('MultiXml::Parsers::Libxml')
|
14
|
+
# Clear cache variable already set by previous tests
|
15
|
+
MultiXml.send(:remove_instance_variable, :@parser)
|
16
|
+
expect(MultiXml.parser.name).to eq('MultiXml::Parsers::Ox')
|
20
17
|
end
|
21
18
|
|
22
19
|
it "is settable via a symbol" do
|
23
|
-
MultiXml.parser = :
|
24
|
-
expect(MultiXml.parser.name).to eq('MultiXml::Parsers::
|
20
|
+
MultiXml.parser = :rexml
|
21
|
+
expect(MultiXml.parser.name).to eq('MultiXml::Parsers::Rexml')
|
25
22
|
end
|
26
23
|
|
27
24
|
it "is settable via a class" do
|
@@ -58,6 +58,16 @@ shared_examples_for "a parser" do |parser|
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
context "element with the same inner element and attribute name" do
|
62
|
+
before do
|
63
|
+
@xml = "<user name='John'><name>Smith</name></user>"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns nams as Array" do
|
67
|
+
expect(MultiXml.parse(@xml)['user']['name']).to eq ['John', 'Smith']
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
61
71
|
context "with content" do
|
62
72
|
before do
|
63
73
|
@xml = '<user>Erik Michaels-Ober</user>'
|
@@ -122,63 +132,11 @@ shared_examples_for "a parser" do |parser|
|
|
122
132
|
|
123
133
|
context "with :symbolize_keys => true" do
|
124
134
|
before do
|
125
|
-
@xml = '<user
|
135
|
+
@xml = '<users><user name="Erik Michaels-Ober"/><user><name>Wynn Netherland</name></user></users>'
|
126
136
|
end
|
127
137
|
|
128
138
|
it "symbolizes keys" do
|
129
|
-
expect(MultiXml.parse(@xml, :symbolize_keys => true)).to eq({:user => {:name => "Erik Michaels-Ober"}})
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
context "when value is true" do
|
134
|
-
before do
|
135
|
-
pending
|
136
|
-
@xml = '<tag>true</tag>'
|
137
|
-
end
|
138
|
-
|
139
|
-
it "returns true" do
|
140
|
-
expect(MultiXml.parse(@xml)['tag']).to be_true
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
context "when value is false" do
|
145
|
-
before do
|
146
|
-
pending
|
147
|
-
@xml = '<tag>false</tag>'
|
148
|
-
end
|
149
|
-
|
150
|
-
it "returns false" do
|
151
|
-
expect(MultiXml.parse(@xml)['tag']).to be_false
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
context "when key is id" do
|
156
|
-
before do
|
157
|
-
pending
|
158
|
-
@xml = '<id>1</id>'
|
159
|
-
end
|
160
|
-
|
161
|
-
it "returns a Fixnum" do
|
162
|
-
expect(MultiXml.parse(@xml)['id']).to be_a(Fixnum)
|
163
|
-
end
|
164
|
-
|
165
|
-
it "returns the correct number" do
|
166
|
-
expect(MultiXml.parse(@xml)['id']).to eq(1)
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
context "when key contains _id" do
|
171
|
-
before do
|
172
|
-
pending
|
173
|
-
@xml = '<tag_id>1</tag_id>'
|
174
|
-
end
|
175
|
-
|
176
|
-
it "returns a Fixnum" do
|
177
|
-
expect(MultiXml.parse(@xml)['tag_id']).to be_a(Fixnum)
|
178
|
-
end
|
179
|
-
|
180
|
-
it "returns the correct number" do
|
181
|
-
expect(MultiXml.parse(@xml)['tag_id']).to eq(1)
|
139
|
+
expect(MultiXml.parse(@xml, :symbolize_keys => true)).to eq({:users => {:user => [{:name => "Erik Michaels-Ober"}, {:name => "Wynn Netherland"}]}})
|
182
140
|
end
|
183
141
|
end
|
184
142
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multi_xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
U0xxV3ZRUnNCbHlwSGZoczZKSnVMbHlaUEdoVTNSL3YKU2YzbFZLcEJDV2dS
|
37
37
|
cEdUdnk0NVhWcEIrNTl5MzNQSm1FdVExUFRFT1l2UXlhbzlVS01BQWFBTi83
|
38
38
|
cVdRdGpsMApobHc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
|
39
|
-
date: 2013-06
|
39
|
+
date: 2013-08-06 00:00:00.000000000 Z
|
40
40
|
dependencies:
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
metadata.gz.sig
CHANGED
Binary file
|