gyoku 1.1.1 → 1.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/CHANGELOG.md +4 -0
- data/lib/gyoku/hash.rb +1 -1
- data/lib/gyoku/version.rb +1 -1
- data/lib/gyoku/xml_key.rb +12 -3
- data/spec/gyoku/array_spec.rb +8 -8
- data/spec/gyoku/hash_spec.rb +92 -51
- data/spec/gyoku/xml_key_spec.rb +29 -8
- data/spec/gyoku/xml_value_spec.rb +11 -11
- data/spec/gyoku_spec.rb +30 -5
- metadata +14 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5907f34dc0f3b33599c65e59b4fdaa4ccf1878c0
|
|
4
|
+
data.tar.gz: 3929d2f06c095e3375b37b88822afef27cfee219
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8aa20c9179c8283096c66a64c10ca3b2802ac6e316de1118c0ef77c6b5f331622592fc4ba6d69d5e7e16b89d4d1eb03666140f4d32e8c0b1d68328bf743cdc3c
|
|
7
|
+
data.tar.gz: a0e9cdb56e8d91767e697b199185041928441f832c17c350dbcd523216c7e22a3f835f2cd4474e1a7bef8ee18957d57cdb69688fb29e1d106847e25c181e73e1
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/lib/gyoku/hash.rb
CHANGED
|
@@ -66,7 +66,7 @@ module Gyoku
|
|
|
66
66
|
# Defaults to return the actual keys of the Hash if no :order! key could be found.
|
|
67
67
|
# Raises an ArgumentError in case the :order! Array does not match the Hash keys.
|
|
68
68
|
def self.order(hash)
|
|
69
|
-
order = hash[:order!]
|
|
69
|
+
order = hash[:order!] || hash.delete('order!')
|
|
70
70
|
hash_without_order = hash.reject { |key, value| key == :order! }
|
|
71
71
|
order = hash_without_order.keys unless order.kind_of? ::Array
|
|
72
72
|
|
data/lib/gyoku/version.rb
CHANGED
data/lib/gyoku/xml_key.rb
CHANGED
|
@@ -21,7 +21,7 @@ module Gyoku
|
|
|
21
21
|
xml_key = xml_key.split(":").last
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
xml_key = key_converter(options).call(xml_key) if Symbol === key
|
|
24
|
+
xml_key = key_converter(options, xml_key).call(xml_key) if Symbol === key
|
|
25
25
|
|
|
26
26
|
if !unqualified && qualify?(options) && !xml_key.include?(":")
|
|
27
27
|
xml_key = "#{options[:namespace]}:#{xml_key}"
|
|
@@ -33,8 +33,17 @@ module Gyoku
|
|
|
33
33
|
private
|
|
34
34
|
|
|
35
35
|
# Returns the formula for converting Symbol keys.
|
|
36
|
-
def key_converter(options)
|
|
37
|
-
|
|
36
|
+
def key_converter(options, xml_key)
|
|
37
|
+
defined_key = options[:key_to_convert]
|
|
38
|
+
if (defined_key != nil) && (defined_key == xml_key)
|
|
39
|
+
key_converter = options[:key_converter]
|
|
40
|
+
elsif defined_key != nil
|
|
41
|
+
key_converter = :lower_camelcase
|
|
42
|
+
elsif (options[:except] == xml_key)
|
|
43
|
+
key_converter = :lower_camelcase
|
|
44
|
+
else
|
|
45
|
+
key_converter = options[:key_converter] || :lower_camelcase
|
|
46
|
+
end
|
|
38
47
|
FORMULAS[key_converter]
|
|
39
48
|
end
|
|
40
49
|
|
data/spec/gyoku/array_spec.rb
CHANGED
|
@@ -7,56 +7,56 @@ describe Gyoku::Array do
|
|
|
7
7
|
array = [{ :name => "adam" }, { :name => "eve" }]
|
|
8
8
|
result = "<user><name>adam</name></user><user><name>eve</name></user>"
|
|
9
9
|
|
|
10
|
-
to_xml(array, "user").
|
|
10
|
+
expect(to_xml(array, "user")).to eq(result)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
it "returns the XML for an Array of different Objects" do
|
|
14
14
|
array = [:symbol, "string", 123]
|
|
15
15
|
result = "<value>symbol</value><value>string</value><value>123</value>"
|
|
16
16
|
|
|
17
|
-
to_xml(array, "value").
|
|
17
|
+
expect(to_xml(array, "value")).to eq(result)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
it "defaults to escape special characters" do
|
|
21
21
|
array = ["<tag />", "adam & eve"]
|
|
22
22
|
result = "<value><tag /></value><value>adam & eve</value>"
|
|
23
23
|
|
|
24
|
-
to_xml(array, "value").
|
|
24
|
+
expect(to_xml(array, "value")).to eq(result)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
it "does not escape special characters when told to" do
|
|
28
28
|
array = ["<tag />", "adam & eve"]
|
|
29
29
|
result = "<value><tag /></value><value>adam & eve</value>"
|
|
30
30
|
|
|
31
|
-
to_xml(array, "value", false).
|
|
31
|
+
expect(to_xml(array, "value", false)).to eq(result)
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
it "adds attributes to a given tag" do
|
|
35
35
|
array = ["adam", "eve"]
|
|
36
36
|
result = '<value active="true">adam</value><value active="true">eve</value>'
|
|
37
37
|
|
|
38
|
-
to_xml(array, "value", :escape_xml, :active => true).
|
|
38
|
+
expect(to_xml(array, "value", :escape_xml, :active => true)).to eq(result)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
it "adds attributes to duplicate tags" do
|
|
42
42
|
array = ["adam", "eve"]
|
|
43
43
|
result = '<value id="1">adam</value><value id="2">eve</value>'
|
|
44
44
|
|
|
45
|
-
to_xml(array, "value", :escape_xml, :id => [1, 2]).
|
|
45
|
+
expect(to_xml(array, "value", :escape_xml, :id => [1, 2])).to eq(result)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it "skips attribute for element without attributes if there are fewer attributes than elements" do
|
|
49
49
|
array = ["adam", "eve", "serpent"]
|
|
50
50
|
result = '<value id="1">adam</value><value id="2">eve</value><value>serpent</value>'
|
|
51
51
|
|
|
52
|
-
to_xml(array, "value", :escape_xml, :id => [1, 2]).
|
|
52
|
+
expect(to_xml(array, "value", :escape_xml, :id => [1, 2])).to eq(result)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
it "handles nested Arrays" do
|
|
56
56
|
array = [["one", "two"]]
|
|
57
57
|
result = "<value><element>one</element><element>two</element></value>"
|
|
58
58
|
|
|
59
|
-
to_xml(array, "value").
|
|
59
|
+
expect(to_xml(array, "value")).to eq(result)
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
|
data/spec/gyoku/hash_spec.rb
CHANGED
|
@@ -5,41 +5,66 @@ describe Gyoku::Hash do
|
|
|
5
5
|
describe ".to_xml" do
|
|
6
6
|
describe "returns SOAP request compatible XML" do
|
|
7
7
|
it "for a simple Hash" do
|
|
8
|
-
to_xml(:some => "user").
|
|
8
|
+
expect(to_xml(:some => "user")).to eq("<some>user</some>")
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
it "for a nested Hash" do
|
|
12
|
-
to_xml(:some => { :new => "user" }).
|
|
12
|
+
expect(to_xml(:some => { :new => "user" })).to eq("<some><new>user</new></some>")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "with key_converter" do
|
|
16
|
+
it "expect all keys change" do
|
|
17
|
+
expect(to_xml({:some => { :new => "user" }}, {key_converter: :camelcase})).to eq("<Some><New>user</New></Some>")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "and key_to_convert option should change only key" do
|
|
21
|
+
hash = {:some => { :new => "user", :age => 20 }}
|
|
22
|
+
options = {key_converter: :camelcase, key_to_convert: "some"}
|
|
23
|
+
result = "<Some><new>user</new><age>20</age></Some>"
|
|
24
|
+
expect(to_xml(hash, options)).to eq(result)
|
|
25
|
+
|
|
26
|
+
hash = {:some => { :new => "user", :age => 20 }}
|
|
27
|
+
options = {key_converter: :camelcase, key_to_convert: "new"}
|
|
28
|
+
result = "<some><New>user</New><age>20</age></some>"
|
|
29
|
+
expect(to_xml(hash, options)).to eq(result)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "with except option, dont convert this key" do
|
|
33
|
+
hash = {:some => { :new => "user", :age => 20 }}
|
|
34
|
+
options = {key_converter: :camelcase, except: "some"}
|
|
35
|
+
result = "<some><New>user</New><Age>20</Age></some>"
|
|
36
|
+
expect(to_xml(hash, options)).to eq(result)
|
|
37
|
+
end
|
|
13
38
|
end
|
|
14
39
|
|
|
15
40
|
it "for a Hash with multiple keys" do
|
|
16
|
-
to_xml(:all => "users", :before => "whatever").
|
|
41
|
+
expect(to_xml(:all => "users", :before => "whatever")).to include(
|
|
17
42
|
"<all>users</all>",
|
|
18
43
|
"<before>whatever</before>"
|
|
19
44
|
)
|
|
20
45
|
end
|
|
21
46
|
|
|
22
47
|
it "for a Hash containing an Array" do
|
|
23
|
-
to_xml(:some => ["user", "gorilla"]).
|
|
48
|
+
expect(to_xml(:some => ["user", "gorilla"])).to eq("<some>user</some><some>gorilla</some>")
|
|
24
49
|
end
|
|
25
50
|
|
|
26
51
|
it "for a Hash containing an Array of Hashes" do
|
|
27
|
-
to_xml(:some => [{ :new => "user" }, { :old => "gorilla" }]).
|
|
28
|
-
|
|
52
|
+
expect(to_xml(:some => [{ :new => "user" }, { :old => "gorilla" }])).
|
|
53
|
+
to eq("<some><new>user</new></some><some><old>gorilla</old></some>")
|
|
29
54
|
end
|
|
30
55
|
end
|
|
31
56
|
|
|
32
57
|
it "converts Hash key Symbols to lowerCamelCase" do
|
|
33
|
-
to_xml(:find_or_create => "user").
|
|
58
|
+
expect(to_xml(:find_or_create => "user")).to eq("<findOrCreate>user</findOrCreate>")
|
|
34
59
|
end
|
|
35
60
|
|
|
36
61
|
it "does not convert Hash key Strings" do
|
|
37
|
-
to_xml("find_or_create" => "user").
|
|
62
|
+
expect(to_xml("find_or_create" => "user")).to eq("<find_or_create>user</find_or_create>")
|
|
38
63
|
end
|
|
39
64
|
|
|
40
65
|
it "converts DateTime objects to xs:dateTime compliant Strings" do
|
|
41
|
-
to_xml(:before => DateTime.new(2012, 03, 22, 16, 22, 33)).
|
|
42
|
-
|
|
66
|
+
expect(to_xml(:before => DateTime.new(2012, 03, 22, 16, 22, 33))).
|
|
67
|
+
to eq("<before>2012-03-22T16:22:33+00:00</before>")
|
|
43
68
|
end
|
|
44
69
|
|
|
45
70
|
it "converts Objects responding to to_datetime to xs:dateTime compliant Strings" do
|
|
@@ -48,7 +73,7 @@ describe Gyoku::Hash do
|
|
|
48
73
|
DateTime.new(2012, 03, 22, 16, 22, 33)
|
|
49
74
|
end
|
|
50
75
|
|
|
51
|
-
to_xml(:before => singleton).
|
|
76
|
+
expect(to_xml(:before => singleton)).to eq("<before>2012-03-22T16:22:33+00:00</before>")
|
|
52
77
|
end
|
|
53
78
|
|
|
54
79
|
it "calls to_s on Strings even if they respond to to_datetime" do
|
|
@@ -57,78 +82,94 @@ describe Gyoku::Hash do
|
|
|
57
82
|
DateTime.new(2012, 03, 22, 16, 22, 33)
|
|
58
83
|
end
|
|
59
84
|
|
|
60
|
-
to_xml(:name => singleton).
|
|
85
|
+
expect(to_xml(:name => singleton)).to eq("<name>gorilla</name>")
|
|
61
86
|
end
|
|
62
87
|
|
|
63
88
|
it "properly serializes nil values" do
|
|
64
|
-
to_xml(:some => nil).
|
|
89
|
+
expect(to_xml(:some => nil)).to eq('<some xsi:nil="true"/>')
|
|
65
90
|
end
|
|
66
91
|
|
|
67
92
|
it "creates self-closing tags for Hash keys ending with a forward slash" do
|
|
68
|
-
to_xml("self-closing/" => nil).
|
|
93
|
+
expect(to_xml("self-closing/" => nil)).to eq('<self-closing/>')
|
|
69
94
|
end
|
|
70
95
|
|
|
71
96
|
it "calls to_s on any other Object" do
|
|
72
97
|
[666, true, false].each do |object|
|
|
73
|
-
to_xml(:some => object).
|
|
98
|
+
expect(to_xml(:some => object)).to eq("<some>#{object}</some>")
|
|
74
99
|
end
|
|
75
100
|
end
|
|
76
101
|
|
|
77
102
|
it "defaults to escape special characters" do
|
|
78
103
|
result = to_xml(:some => { :nested => "<tag />" }, :tag => "<tag />")
|
|
79
|
-
result.
|
|
80
|
-
result.
|
|
104
|
+
expect(result).to include("<tag><tag /></tag>")
|
|
105
|
+
expect(result).to include("<some><nested><tag /></nested></some>")
|
|
81
106
|
end
|
|
82
107
|
|
|
83
108
|
it "does not escape special characters for keys marked with an exclamation mark" do
|
|
84
109
|
result = to_xml(:some => { :nested! => "<tag />" }, :tag! => "<tag />")
|
|
85
|
-
result.
|
|
86
|
-
result.
|
|
110
|
+
expect(result).to include("<tag><tag /></tag>")
|
|
111
|
+
expect(result).to include("<some><nested><tag /></nested></some>")
|
|
87
112
|
end
|
|
88
113
|
|
|
89
114
|
it "preserves the order of Hash keys and values specified through :order!" do
|
|
90
115
|
hash = { :find_user => { :name => "Lucy", :id => 666, :order! => [:id, :name] } }
|
|
91
116
|
result = "<findUser><id>666</id><name>Lucy</name></findUser>"
|
|
92
|
-
to_xml(hash).
|
|
117
|
+
expect(to_xml(hash)).to eq(result)
|
|
93
118
|
|
|
94
119
|
hash = { :find_user => { :mname => "in the", :lname => "Sky", :fname => "Lucy", :order! => [:fname, :mname, :lname] } }
|
|
95
120
|
result = "<findUser><fname>Lucy</fname><mname>in the</mname><lname>Sky</lname></findUser>"
|
|
96
|
-
to_xml(hash).
|
|
121
|
+
expect(to_xml(hash)).to eq(result)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "preserves the order of Hash keys and values specified through 'order!' (as a string key)" do
|
|
125
|
+
hash = { :find_user => { :name => "Lucy", :id => 666, 'order!' => [:id, :name] } }
|
|
126
|
+
result = "<findUser><id>666</id><name>Lucy</name></findUser>"
|
|
127
|
+
expect(to_xml(hash)).to eq(result)
|
|
128
|
+
|
|
129
|
+
hash = { :find_user => { :mname => "in the", :lname => "Sky", :fname => "Lucy", 'order!' => [:fname, :mname, :lname] } }
|
|
130
|
+
result = "<findUser><fname>Lucy</fname><mname>in the</mname><lname>Sky</lname></findUser>"
|
|
131
|
+
expect(to_xml(hash)).to eq(result)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it "uses :order! symbol values for ordering but leaves the string key 'order!' if both are present" do
|
|
135
|
+
hash = { :find_user => { :name => "Lucy", :id => 666, 'order!' => 'value', :order! => [:id, :name, 'order!'] } }
|
|
136
|
+
result = "<findUser><id>666</id><name>Lucy</name><order>value</order></findUser>"
|
|
137
|
+
expect(to_xml(hash)).to eq(result)
|
|
97
138
|
end
|
|
98
139
|
|
|
99
140
|
it "raises if the :order! Array is missing Hash keys" do
|
|
100
141
|
hash = { :name => "Lucy", :id => 666, :order! => [:name] }
|
|
101
|
-
|
|
142
|
+
expect { to_xml(hash) }.to raise_error(ArgumentError, "Missing elements in :order! [:id]")
|
|
102
143
|
end
|
|
103
144
|
|
|
104
145
|
it "raises if the :order! Array contains missing Hash keys" do
|
|
105
146
|
hash = { :by_name => { :first_name => "Lucy", :last_name => "Sky", :order! => [:first_name, :middle_name, :last_name] } }
|
|
106
|
-
|
|
147
|
+
expect { to_xml(hash) }.to raise_error(ArgumentError, "Spurious elements in :order! [:middle_name]")
|
|
107
148
|
end
|
|
108
149
|
|
|
109
150
|
it "adds attributes to Hash keys specified through :attributes!" do
|
|
110
151
|
hash = { :find_user => { :person => "Lucy", :attributes! => { :person => { :id => 666 } } } }
|
|
111
152
|
result = '<findUser><person id="666">Lucy</person></findUser>'
|
|
112
|
-
to_xml(hash).
|
|
153
|
+
expect(to_xml(hash)).to eq(result)
|
|
113
154
|
|
|
114
155
|
hash = { :find_user => { :person => "Lucy", :attributes! => { :person => { :id => 666, :city => "Hamburg" } } } }
|
|
115
|
-
to_xml(hash).
|
|
156
|
+
expect(to_xml(hash)).to include('id="666"', 'city="Hamburg"')
|
|
116
157
|
end
|
|
117
158
|
|
|
118
159
|
it "adds attributes to duplicate Hash keys specified through :attributes!" do
|
|
119
160
|
hash = { :find_user => { :person => ["Lucy", "Anna"], :attributes! => { :person => { :id => [1, 3] } } } }
|
|
120
161
|
result = '<findUser><person id="1">Lucy</person><person id="3">Anna</person></findUser>'
|
|
121
|
-
to_xml(hash).
|
|
162
|
+
expect(to_xml(hash)).to eq(result)
|
|
122
163
|
|
|
123
164
|
hash = { :find_user => { :person => ["Lucy", "Anna"], :attributes! => { :person => { :active => "true" } } } }
|
|
124
165
|
result = '<findUser><person active="true">Lucy</person><person active="true">Anna</person></findUser>'
|
|
125
|
-
to_xml(hash).
|
|
166
|
+
expect(to_xml(hash)).to eq(result)
|
|
126
167
|
end
|
|
127
168
|
|
|
128
169
|
it "skips attribute for element without attributes if there are fewer attributes than elements" do
|
|
129
170
|
hash = { :find_user => { :person => ["Lucy", "Anna", "Beth"], :attributes! => { :person => { :id => [1, 3] } } } }
|
|
130
171
|
result = '<findUser><person id="1">Lucy</person><person id="3">Anna</person><person>Beth</person></findUser>'
|
|
131
|
-
to_xml(hash).
|
|
172
|
+
expect(to_xml(hash)).to eq(result)
|
|
132
173
|
end
|
|
133
174
|
|
|
134
175
|
it "adds attributes to self-closing tags" do
|
|
@@ -137,7 +178,7 @@ describe Gyoku::Hash do
|
|
|
137
178
|
:attributes! => { "category/" => { :id => 1 } }
|
|
138
179
|
}
|
|
139
180
|
|
|
140
|
-
to_xml(hash).
|
|
181
|
+
expect(to_xml(hash)).to eq('<category id="1"/>')
|
|
141
182
|
end
|
|
142
183
|
|
|
143
184
|
it "recognizes @attribute => value along :attributes!" do
|
|
@@ -147,7 +188,7 @@ describe Gyoku::Hash do
|
|
|
147
188
|
:@id => 1
|
|
148
189
|
}
|
|
149
190
|
}
|
|
150
|
-
to_xml(hash).
|
|
191
|
+
expect(to_xml(hash)).to eq('<category id="1">users</category>')
|
|
151
192
|
end
|
|
152
193
|
|
|
153
194
|
it "recognizes @attribute => value along :attributes! in selfclosed tags" do
|
|
@@ -156,7 +197,7 @@ describe Gyoku::Hash do
|
|
|
156
197
|
:@id => 1
|
|
157
198
|
}
|
|
158
199
|
}
|
|
159
|
-
to_xml(hash).
|
|
200
|
+
expect(to_xml(hash)).to eq('<category id="1"/>')
|
|
160
201
|
end
|
|
161
202
|
|
|
162
203
|
it ":@attribute => value takes over :attributes!" do
|
|
@@ -172,7 +213,7 @@ describe Gyoku::Hash do
|
|
|
172
213
|
}
|
|
173
214
|
}
|
|
174
215
|
# attribute order is undefined
|
|
175
|
-
['<category id="1" type="admins"/>','<category type="admins" id="1"/>'].
|
|
216
|
+
expect(['<category id="1" type="admins"/>','<category type="admins" id="1"/>']).to include to_xml(hash)
|
|
176
217
|
|
|
177
218
|
# with symbols
|
|
178
219
|
hash = {
|
|
@@ -186,7 +227,7 @@ describe Gyoku::Hash do
|
|
|
186
227
|
}
|
|
187
228
|
}
|
|
188
229
|
}
|
|
189
|
-
['<category id="1" type="admins"/>','<category type="admins" id="1"/>'].
|
|
230
|
+
expect(['<category id="1" type="admins"/>','<category type="admins" id="1"/>']).to include to_xml(hash)
|
|
190
231
|
end
|
|
191
232
|
|
|
192
233
|
it "recognizes :content! => value as tag content" do
|
|
@@ -195,7 +236,7 @@ describe Gyoku::Hash do
|
|
|
195
236
|
:content! => "users"
|
|
196
237
|
}
|
|
197
238
|
}
|
|
198
|
-
to_xml(hash).
|
|
239
|
+
expect(to_xml(hash)).to eq("<category>users</category>")
|
|
199
240
|
end
|
|
200
241
|
|
|
201
242
|
it "recognizes :content! => value as tag content with value Fixnum" do
|
|
@@ -204,7 +245,7 @@ describe Gyoku::Hash do
|
|
|
204
245
|
:content! => 666
|
|
205
246
|
}
|
|
206
247
|
}
|
|
207
|
-
to_xml(hash).
|
|
248
|
+
expect(to_xml(hash)).to eq("<category>666</category>")
|
|
208
249
|
end
|
|
209
250
|
|
|
210
251
|
it "recognizes :content! => value as tag content with value true" do
|
|
@@ -213,7 +254,7 @@ describe Gyoku::Hash do
|
|
|
213
254
|
:content! => true
|
|
214
255
|
}
|
|
215
256
|
}
|
|
216
|
-
to_xml(hash).
|
|
257
|
+
expect(to_xml(hash)).to eq("<category>true</category>")
|
|
217
258
|
end
|
|
218
259
|
|
|
219
260
|
it "recognizes :content! => value as tag content with value false" do
|
|
@@ -222,7 +263,7 @@ describe Gyoku::Hash do
|
|
|
222
263
|
:content! => false
|
|
223
264
|
}
|
|
224
265
|
}
|
|
225
|
-
to_xml(hash).
|
|
266
|
+
expect(to_xml(hash)).to eq("<category>false</category>")
|
|
226
267
|
end
|
|
227
268
|
|
|
228
269
|
it "recognizes :content! => value as tag content with value DateTime" do
|
|
@@ -231,7 +272,7 @@ describe Gyoku::Hash do
|
|
|
231
272
|
:content! => DateTime.new(2012, 03, 22, 16, 22, 33)
|
|
232
273
|
}
|
|
233
274
|
}
|
|
234
|
-
to_xml(hash).
|
|
275
|
+
expect(to_xml(hash)).to eq("<before>2012-03-22T16:22:33+00:00</before>")
|
|
235
276
|
end
|
|
236
277
|
|
|
237
278
|
it "ignores :content! if self-closing mark present" do
|
|
@@ -240,14 +281,14 @@ describe Gyoku::Hash do
|
|
|
240
281
|
:content! => "users"
|
|
241
282
|
}
|
|
242
283
|
}
|
|
243
|
-
to_xml(hash).
|
|
284
|
+
expect(to_xml(hash)).to eq("<category/>")
|
|
244
285
|
end
|
|
245
286
|
|
|
246
287
|
it "recognizes array of attributes" do
|
|
247
288
|
hash = {
|
|
248
289
|
"category" => [{:@name => 'one'}, {:@name => 'two'}]
|
|
249
290
|
}
|
|
250
|
-
to_xml(hash).
|
|
291
|
+
expect(to_xml(hash)).to eq('<category name="one"></category><category name="two"></category>')
|
|
251
292
|
|
|
252
293
|
# issue #31.
|
|
253
294
|
hash = {
|
|
@@ -255,7 +296,7 @@ describe Gyoku::Hash do
|
|
|
255
296
|
'foo' => { :@foo => 'foo' },
|
|
256
297
|
'bar' => { :@bar => 'bar', 'baz' => { } },
|
|
257
298
|
}
|
|
258
|
-
to_xml(hash).
|
|
299
|
+
expect(to_xml(hash)).to eq('<foo foo="foo"></foo><bar bar="bar"><baz></baz></bar>')
|
|
259
300
|
end
|
|
260
301
|
|
|
261
302
|
it "recognizes array of attributes with content in each" do
|
|
@@ -263,10 +304,10 @@ describe Gyoku::Hash do
|
|
|
263
304
|
"foo" => [{:@name => "bar", :content! => 'gyoku'}, {:@name => "baz", :@some => "attr", :content! => 'rocks!'}]
|
|
264
305
|
}
|
|
265
306
|
|
|
266
|
-
[
|
|
307
|
+
expect([
|
|
267
308
|
'<foo name="bar">gyoku</foo><foo name="baz" some="attr">rocks!</foo>',
|
|
268
309
|
'<foo name="bar">gyoku</foo><foo some="attr" name="baz">rocks!</foo>'
|
|
269
|
-
].
|
|
310
|
+
]).to include to_xml(hash)
|
|
270
311
|
end
|
|
271
312
|
|
|
272
313
|
it "recognizes array of attributes but ignores content in each if selfclosing" do
|
|
@@ -274,17 +315,17 @@ describe Gyoku::Hash do
|
|
|
274
315
|
"foo/" => [{:@name => "bar", :content! => 'gyoku'}, {:@name => "baz", :@some => "attr", :content! => 'rocks!'}]
|
|
275
316
|
}
|
|
276
317
|
|
|
277
|
-
[
|
|
318
|
+
expect([
|
|
278
319
|
'<foo name="bar"/><foo name="baz" some="attr"/>',
|
|
279
320
|
'<foo name="bar"/><foo some="attr" name="baz"/>'
|
|
280
|
-
].
|
|
321
|
+
]).to include to_xml(hash)
|
|
281
322
|
end
|
|
282
323
|
|
|
283
324
|
it "recognizes array of attributes with selfclosing tag" do
|
|
284
325
|
hash = {
|
|
285
326
|
"category/" => [{:@name => 'one'}, {:@name => 'two'}]
|
|
286
327
|
}
|
|
287
|
-
to_xml(hash).
|
|
328
|
+
expect(to_xml(hash)).to eq('<category name="one"/><category name="two"/>')
|
|
288
329
|
end
|
|
289
330
|
|
|
290
331
|
context "with :element_form_default set to :qualified and a :namespace" do
|
|
@@ -292,7 +333,7 @@ describe Gyoku::Hash do
|
|
|
292
333
|
hash = { :first => { "first_name" => "Lucy" }, ":second" => { :":first_name" => "Anna" }, "v2:third" => { "v2:firstName" => "Danie" } }
|
|
293
334
|
result = to_xml hash, :element_form_default => :qualified, :namespace => :v1
|
|
294
335
|
|
|
295
|
-
result.
|
|
336
|
+
expect(result).to include(
|
|
296
337
|
"<v1:first><v1:first_name>Lucy</v1:first_name></v1:first>",
|
|
297
338
|
"<second><firstName>Anna</firstName></second>",
|
|
298
339
|
"<v2:third><v2:firstName>Danie</v2:firstName></v2:third>"
|
|
@@ -303,7 +344,7 @@ describe Gyoku::Hash do
|
|
|
303
344
|
hash = { :array => [ :first => "Lucy", :second => "Anna" ]}
|
|
304
345
|
result = to_xml hash, :element_form_default => :qualified, :namespace => :v1
|
|
305
346
|
|
|
306
|
-
result.
|
|
347
|
+
expect(result).to include("<v1:array>", "<v1:first>Lucy</v1:first>", "<v1:second>Anna</v1:second>")
|
|
307
348
|
end
|
|
308
349
|
end
|
|
309
350
|
|
|
@@ -322,7 +363,7 @@ describe Gyoku::Hash do
|
|
|
322
363
|
|
|
323
364
|
to_xml(hash)
|
|
324
365
|
|
|
325
|
-
hash.
|
|
366
|
+
expect(hash).to eq({
|
|
326
367
|
:persons => {
|
|
327
368
|
:first => "Lucy",
|
|
328
369
|
:second => "Anna",
|
|
@@ -332,14 +373,14 @@ describe Gyoku::Hash do
|
|
|
332
373
|
:countries => [:de, :us],
|
|
333
374
|
:order! => [:countries, :persons],
|
|
334
375
|
:attributes! => { :countries => { :array => true } }
|
|
335
|
-
}
|
|
376
|
+
})
|
|
336
377
|
end
|
|
337
378
|
end
|
|
338
379
|
|
|
339
380
|
it "doesn't modify original hash parameter by deleting its attribute keys" do
|
|
340
381
|
hash = { :person => {:name => "Johnny", :surname => "Bravo", :"@xsi:type" => "People"} }
|
|
341
382
|
to_xml(hash)
|
|
342
|
-
hash.
|
|
383
|
+
expect(hash).to eq({:person=>{:name=>"Johnny", :surname=>"Bravo", :"@xsi:type"=>"People"}})
|
|
343
384
|
end
|
|
344
385
|
|
|
345
386
|
def to_xml(hash, options = {})
|
data/spec/gyoku/xml_key_spec.rb
CHANGED
|
@@ -4,36 +4,57 @@ describe Gyoku::XMLKey do
|
|
|
4
4
|
|
|
5
5
|
describe ".create" do
|
|
6
6
|
it "removes exclamation marks from the end of a String" do
|
|
7
|
-
create("value!").
|
|
7
|
+
expect(create("value!")).to eq("value")
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
it "removes forward slashes from the end of a String" do
|
|
11
|
-
create("self-closing/").
|
|
11
|
+
expect(create("self-closing/")).to eq("self-closing")
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
it "does not convert snake_case Strings" do
|
|
15
|
-
create("lower_camel_case").
|
|
15
|
+
expect(create("lower_camel_case")).to eq("lower_camel_case")
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
it "converts snake_case Symbols to lowerCamelCase Strings" do
|
|
19
|
-
create(:lower_camel_case).
|
|
20
|
-
create(:lower_camel_case!).
|
|
19
|
+
expect(create(:lower_camel_case)).to eq("lowerCamelCase")
|
|
20
|
+
expect(create(:lower_camel_case!)).to eq("lowerCamelCase")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "with key_converter" do
|
|
24
|
+
it "convert symbol to the specified type" do
|
|
25
|
+
expect(create(:some_text, {key_converter: :camelcase})).to eq("SomeText")
|
|
26
|
+
expect(create(:some_text, {key_converter: :upcase})).to eq("SOME_TEXT")
|
|
27
|
+
expect(create(:some_text, {key_converter: :none})).to eq("some_text")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "when key_to_convert is defined, convert only this key" do
|
|
31
|
+
options = {key_converter: :camelcase, key_to_convert: 'somekey'}
|
|
32
|
+
expect(create(:some_key, options)).to eq("someKey")
|
|
33
|
+
|
|
34
|
+
options = {key_converter: :camelcase, key_to_convert: 'some_key'}
|
|
35
|
+
expect(create(:some_key, options)).to eq("SomeKey")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "when except is defined, dont convert this key" do
|
|
39
|
+
options = {key_converter: :camelcase, except: 'some_key'}
|
|
40
|
+
expect(create(:some_key, options)).to eq("someKey")
|
|
41
|
+
end
|
|
21
42
|
end
|
|
22
43
|
|
|
23
44
|
context "with :element_form_default set to :qualified and a :namespace" do
|
|
24
45
|
it "adds the given namespace" do
|
|
25
46
|
key = create :qualify, :element_form_default => :qualified, :namespace => :v1
|
|
26
|
-
key.
|
|
47
|
+
expect(key).to eq("v1:qualify")
|
|
27
48
|
end
|
|
28
49
|
|
|
29
50
|
it "does not add the given namespace if the key starts with a colon" do
|
|
30
51
|
key = create ":qualify", :element_form_default => :qualified, :namespace => :v1
|
|
31
|
-
key.
|
|
52
|
+
expect(key).to eq("qualify")
|
|
32
53
|
end
|
|
33
54
|
|
|
34
55
|
it "adds a given :namespace after converting the key" do
|
|
35
56
|
key = create :username, :element_form_default => :qualified, :namespace => :v1, :key_converter => :camelcase
|
|
36
|
-
key.
|
|
57
|
+
expect(key).to eq("v1:Username")
|
|
37
58
|
end
|
|
38
59
|
end
|
|
39
60
|
end
|
|
@@ -5,31 +5,31 @@ describe Gyoku::XMLValue do
|
|
|
5
5
|
describe ".create" do
|
|
6
6
|
context "for DateTime objects" do
|
|
7
7
|
it "returns an xs:dateTime compliant String" do
|
|
8
|
-
create(DateTime.new(2012, 03, 22, 16, 22, 33)).
|
|
8
|
+
expect(create(DateTime.new(2012, 03, 22, 16, 22, 33))).to eq("2012-03-22T16:22:33+00:00")
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
context "for Date objects" do
|
|
13
13
|
it "returns an xs:date compliant String" do
|
|
14
|
-
create(Date.new(2012, 03, 22)).
|
|
14
|
+
expect(create(Date.new(2012, 03, 22))).to eq("2012-03-22")
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
context "for Time objects" do
|
|
19
19
|
it "returns an xs:time compliant String" do
|
|
20
|
-
create(Time.local(2012, 03, 22, 16, 22, 33)).
|
|
20
|
+
expect(create(Time.local(2012, 03, 22, 16, 22, 33))).to eq("16:22:33")
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
it "returns the String value and escapes special characters" do
|
|
25
|
-
create("string").
|
|
26
|
-
create("<tag>").
|
|
27
|
-
create("at&t").
|
|
28
|
-
create('"quotes"').
|
|
25
|
+
expect(create("string")).to eq("string")
|
|
26
|
+
expect(create("<tag>")).to eq("<tag>")
|
|
27
|
+
expect(create("at&t")).to eq("at&t")
|
|
28
|
+
expect(create('"quotes"')).to eq(""quotes"")
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
it "returns the String value without escaping special characters" do
|
|
32
|
-
create("<tag>", false).
|
|
32
|
+
expect(create("<tag>", false)).to eq("<tag>")
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
it "returns an xs:dateTime compliant String for Objects responding to #to_datetime" do
|
|
@@ -38,16 +38,16 @@ describe Gyoku::XMLValue do
|
|
|
38
38
|
DateTime.new 2012, 03, 22, 16, 22, 33
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
create(singleton).
|
|
41
|
+
expect(create(singleton)).to eq("2012-03-22T16:22:33+00:00")
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
it "calls Proc objects and converts their return value" do
|
|
45
45
|
object = lambda { DateTime.new 2012, 03, 22, 16, 22, 33 }
|
|
46
|
-
create(object).
|
|
46
|
+
expect(create(object)).to eq("2012-03-22T16:22:33+00:00")
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
it "calls #to_s unless the Object responds to #to_datetime" do
|
|
50
|
-
create("value").
|
|
50
|
+
expect(create("value")).to eq("value")
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
53
|
|
data/spec/gyoku_spec.rb
CHANGED
|
@@ -29,15 +29,40 @@ describe Gyoku do
|
|
|
29
29
|
hash = { :id => 1 }
|
|
30
30
|
xml = Gyoku.xml(hash, :element_form_default => :qualified)
|
|
31
31
|
|
|
32
|
-
xml.
|
|
32
|
+
expect(xml).to eq("<id>1</id>")
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
it "accepts a key_converter for the Hash keys" do
|
|
36
|
+
hash = { :user_name => "finn", :pass_word => "secret" }
|
|
37
|
+
xml = Gyoku.xml(hash, {key_converter: :upcase})
|
|
38
|
+
|
|
39
|
+
expect(xml).to include("<USER_NAME>finn</USER_NAME>")
|
|
40
|
+
expect(xml).to include("<PASS_WORD>secret</PASS_WORD>")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "don't converts Strings keys" do
|
|
36
44
|
hash = { :user_name => "finn", "pass_word" => "secret" }
|
|
37
|
-
xml = Gyoku.xml(hash, :
|
|
45
|
+
xml = Gyoku.xml(hash, {key_converter: :upcase})
|
|
46
|
+
|
|
47
|
+
expect(xml).to include("<USER_NAME>finn</USER_NAME>")
|
|
48
|
+
expect(xml).to include("<pass_word>secret</pass_word>")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "when defined key_to_convert only convert this key" do
|
|
52
|
+
hash = { user_name: "finn", pass_word: "secret" }
|
|
53
|
+
options = {key_converter: :upcase, key_to_convert: 'user_name'}
|
|
54
|
+
xml = Gyoku.xml(hash, options)
|
|
55
|
+
|
|
56
|
+
expect(xml).to include("<USER_NAME>finn</USER_NAME>")
|
|
57
|
+
expect(xml).to include("<passWord>secret</passWord>")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "accepts key_converter for nested hash" do
|
|
61
|
+
hash = { user: { user_name: "finn", pass_word: "secret" }}
|
|
62
|
+
xml = Gyoku.xml(hash, {key_converter: :upcase})
|
|
38
63
|
|
|
39
|
-
xml.
|
|
40
|
-
xml.
|
|
64
|
+
expect(xml).to include("<USER><USER_NAME>finn</USER_NAME>")
|
|
65
|
+
expect(xml).to include("<PASS_WORD>secret</PASS_WORD></USER>")
|
|
41
66
|
end
|
|
42
67
|
|
|
43
68
|
it "does not modify the original Hash" do
|
|
@@ -52,7 +77,7 @@ describe Gyoku do
|
|
|
52
77
|
original_hash = hash.dup
|
|
53
78
|
|
|
54
79
|
Gyoku.xml(hash)
|
|
55
|
-
original_hash.
|
|
80
|
+
expect(original_hash).to eq(hash)
|
|
56
81
|
end
|
|
57
82
|
end
|
|
58
83
|
|
metadata
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gyoku
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Harrington
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-
|
|
11
|
+
date: 2014-09-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: builder
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: 2.1.2
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- -
|
|
24
|
+
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: 2.1.2
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: '0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rspec
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - ">="
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
47
|
version: '0'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- -
|
|
52
|
+
- - ">="
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '0'
|
|
55
55
|
description: Gyoku translates Ruby Hashes to XML
|
|
@@ -58,9 +58,9 @@ executables: []
|
|
|
58
58
|
extensions: []
|
|
59
59
|
extra_rdoc_files: []
|
|
60
60
|
files:
|
|
61
|
-
- .gitignore
|
|
62
|
-
- .rspec
|
|
63
|
-
- .travis.yml
|
|
61
|
+
- ".gitignore"
|
|
62
|
+
- ".rspec"
|
|
63
|
+
- ".travis.yml"
|
|
64
64
|
- CHANGELOG.md
|
|
65
65
|
- Gemfile
|
|
66
66
|
- MIT-LICENSE
|
|
@@ -89,17 +89,17 @@ require_paths:
|
|
|
89
89
|
- lib
|
|
90
90
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
91
|
requirements:
|
|
92
|
-
- -
|
|
92
|
+
- - ">="
|
|
93
93
|
- !ruby/object:Gem::Version
|
|
94
94
|
version: '0'
|
|
95
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
96
|
requirements:
|
|
97
|
-
- -
|
|
97
|
+
- - ">="
|
|
98
98
|
- !ruby/object:Gem::Version
|
|
99
99
|
version: '0'
|
|
100
100
|
requirements: []
|
|
101
101
|
rubyforge_project: gyoku
|
|
102
|
-
rubygems_version: 2.
|
|
102
|
+
rubygems_version: 2.2.2
|
|
103
103
|
signing_key:
|
|
104
104
|
specification_version: 4
|
|
105
105
|
summary: Translates Ruby Hashes to XML
|