sax-machine 1.3.0 → 1.3.1
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/HISTORY.md +6 -0
- data/lib/sax-machine/config/sax_element_value.rb +2 -1
- data/lib/sax-machine/handlers/sax_abstract_handler.rb +22 -21
- data/lib/sax-machine/handlers/sax_ox_handler.rb +6 -2
- data/lib/sax-machine/sax_document.rb +1 -1
- data/lib/sax-machine/version.rb +1 -1
- data/spec/sax-machine/sax_document_spec.rb +146 -30
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0917a0f1c569089b182a6517a6cb6706ddb3c42a
|
4
|
+
data.tar.gz: 0828562df1e97d795f0cbc506b7258beed5f7d23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81eff065ec6ec812f7b8ff6c5e48ed4f48490e17a2a199a0f3980d1578863aab9a1bdba28be58b03338aaa7127e55632a7792354dcc57c9f980760b9ec402a51
|
7
|
+
data.tar.gz: b7e005d33a7765814a1188e10f6be96d5aee196df56a5913fbc94b0a5624b9d70f0f5a2270417ce1bcc8c736aec836c3227bdd0b96d569bdb8206e6c421408d8
|
data/HISTORY.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# HEAD
|
2
2
|
|
3
|
+
# 1.3.1
|
4
|
+
|
5
|
+
* Allow default value to be `false` [[#66](https://github.com/pauldix/sax-machine/pull/66)]
|
6
|
+
* Support adding class to an attribute [[#68](https://github.com/pauldix/sax-machine/pull/68)]
|
7
|
+
* Adjust Ox handler to skip empty text/cdata values
|
8
|
+
|
3
9
|
# 1.3.0
|
4
10
|
|
5
11
|
* Improve block modifiers to support all config options
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module SAXMachine
|
2
2
|
class SAXConfig
|
3
3
|
class ElementValueConfig
|
4
|
-
attr_reader :name, :setter
|
4
|
+
attr_reader :name, :setter, :data_class
|
5
5
|
|
6
6
|
def initialize(name, options)
|
7
7
|
@name = name.to_s
|
8
8
|
@as = options[:as]
|
9
9
|
@setter = "#{@as}="
|
10
10
|
@required = options[:required]
|
11
|
+
@data_class = options[:class]
|
11
12
|
end
|
12
13
|
|
13
14
|
def column
|
@@ -107,26 +107,8 @@ module SAXMachine
|
|
107
107
|
|
108
108
|
object.send(config.accessor) << element
|
109
109
|
else
|
110
|
-
value =
|
111
|
-
|
112
|
-
when "String" then value != NO_BUFFER ? value.to_s : value
|
113
|
-
when "Integer" then value != NO_BUFFER ? value.to_i : value
|
114
|
-
when "Float" then value != NO_BUFFER ? value.to_f : value
|
115
|
-
when "Symbol" then
|
116
|
-
if value != NO_BUFFER
|
117
|
-
value.to_s.empty? ? nil : value.to_s.downcase.to_sym
|
118
|
-
else
|
119
|
-
value
|
120
|
-
end
|
121
|
-
# Assumes that time elements will be string-based and are not
|
122
|
-
# something else, e.g. seconds since epoch
|
123
|
-
when "Time" then value != NO_BUFFER ? Time.parse(value.to_s) : value
|
124
|
-
when "" then value
|
125
|
-
else
|
126
|
-
element
|
127
|
-
end
|
128
|
-
|
129
|
-
object.send(config.setter, value) unless value == NO_BUFFER
|
110
|
+
value = data_class_value(config.data_class, value) || element
|
111
|
+
object.send(config.setter, value) if value != NO_BUFFER
|
130
112
|
mark_as_parsed(object, config)
|
131
113
|
end
|
132
114
|
|
@@ -186,8 +168,27 @@ module SAXMachine
|
|
186
168
|
|
187
169
|
if config
|
188
170
|
config.attribute_configs_for_element(attributes).each do |ac|
|
189
|
-
|
171
|
+
value = data_class_value(ac.data_class, ac.value_from_attrs(attributes))
|
172
|
+
object.send(ac.setter, value)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def data_class_value(data_class, value)
|
178
|
+
case data_class.to_s
|
179
|
+
when "String" then value != NO_BUFFER ? value.to_s : value
|
180
|
+
when "Integer" then value != NO_BUFFER ? value.to_i : value
|
181
|
+
when "Float" then value != NO_BUFFER ? value.to_s.gsub(",",".").to_f : value
|
182
|
+
when "Symbol" then
|
183
|
+
if value != NO_BUFFER
|
184
|
+
value.to_s.empty? ? nil : value.to_s.downcase.to_sym
|
185
|
+
else
|
186
|
+
value
|
190
187
|
end
|
188
|
+
# Assumes that time elements will be string-based and are not
|
189
|
+
# something else, e.g. seconds since epoch
|
190
|
+
when "Time" then value != NO_BUFFER ? Time.parse(value.to_s) : value
|
191
|
+
when "" then value
|
191
192
|
end
|
192
193
|
end
|
193
194
|
|
@@ -34,12 +34,16 @@ module SAXMachine
|
|
34
34
|
@element = name
|
35
35
|
end
|
36
36
|
|
37
|
+
def text(value)
|
38
|
+
_characters(value) if value && !value.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
alias_method :cdata, :text
|
42
|
+
|
37
43
|
def error(message, line, column)
|
38
44
|
_error("#{message} on line #{line} column #{column}")
|
39
45
|
end
|
40
46
|
|
41
|
-
alias_method :text, :_characters
|
42
|
-
alias_method :cdata, :_characters
|
43
47
|
alias_method :end_element, :_end_element
|
44
48
|
|
45
49
|
private
|
data/lib/sax-machine/version.rb
CHANGED
@@ -143,54 +143,154 @@ describe "SAXMachine" do
|
|
143
143
|
expect(@klass.data_class(:date)).to eq(DateTime)
|
144
144
|
end
|
145
145
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
146
|
+
describe "string" do
|
147
|
+
before do
|
148
|
+
class TestString
|
149
|
+
include SAXMachine
|
150
|
+
element :number, class: String
|
151
|
+
end
|
152
|
+
|
153
|
+
class TestStringAttribute
|
154
|
+
include SAXMachine
|
155
|
+
attribute :sub_number, class: String
|
156
|
+
end
|
157
|
+
|
158
|
+
class TestStringWithAttribute
|
159
|
+
include SAXMachine
|
160
|
+
element :number, class: TestStringAttribute
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
it "is handled in an element" do
|
165
|
+
document = TestString.parse("<number>5.5</number>")
|
166
|
+
expect(document.number).to eq("5.5")
|
150
167
|
end
|
151
168
|
|
152
|
-
|
153
|
-
|
169
|
+
it "is handled in an attribute" do
|
170
|
+
document = TestStringWithAttribute.parse("<number sub_number='5.5'></number>")
|
171
|
+
expect(document.number.sub_number).to eq("5.5")
|
172
|
+
end
|
154
173
|
end
|
155
174
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
175
|
+
describe "integer" do
|
176
|
+
before do
|
177
|
+
class TestInteger
|
178
|
+
include SAXMachine
|
179
|
+
element :number, class: Integer
|
180
|
+
end
|
181
|
+
|
182
|
+
class TestIntegerAttribute
|
183
|
+
include SAXMachine
|
184
|
+
attribute :sub_number, class: Integer
|
185
|
+
end
|
186
|
+
|
187
|
+
class TestIntegerWithAttribute
|
188
|
+
include SAXMachine
|
189
|
+
element :number, class: TestIntegerAttribute
|
190
|
+
end
|
160
191
|
end
|
161
192
|
|
162
|
-
|
163
|
-
|
193
|
+
it "is handled in an element" do
|
194
|
+
document = TestInteger.parse("<number>5</number>")
|
195
|
+
expect(document.number).to eq(5)
|
196
|
+
end
|
197
|
+
|
198
|
+
it "is handled in an attribute" do
|
199
|
+
document = TestIntegerWithAttribute.parse("<number sub_number='5'></number>")
|
200
|
+
expect(document.number.sub_number).to eq(5)
|
201
|
+
end
|
164
202
|
end
|
165
203
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
204
|
+
describe "float" do
|
205
|
+
before do
|
206
|
+
class TestFloat
|
207
|
+
include SAXMachine
|
208
|
+
element :number, class: Float
|
209
|
+
end
|
210
|
+
|
211
|
+
class TestFloatAttribute
|
212
|
+
include SAXMachine
|
213
|
+
attribute :sub_number, class: Float
|
214
|
+
end
|
215
|
+
|
216
|
+
class TestFloatWithAttribute
|
217
|
+
include SAXMachine
|
218
|
+
element :number, class: TestFloatAttribute
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
it "is handled in an element with '.' delimiter" do
|
223
|
+
document = TestFloat.parse("<number>5.5</number>")
|
224
|
+
expect(document.number).to eq(5.5)
|
225
|
+
end
|
226
|
+
|
227
|
+
it "is handled in an element with ',' delimiter" do
|
228
|
+
document = TestFloat.parse("<number>5,5</number>")
|
229
|
+
expect(document.number).to eq(5.5)
|
170
230
|
end
|
171
231
|
|
172
|
-
|
173
|
-
|
232
|
+
it "is handled in an attribute" do
|
233
|
+
document = TestFloatWithAttribute.parse("<number sub_number='5.5'>5.5</number>")
|
234
|
+
expect(document.number.sub_number).to eq(5.5)
|
235
|
+
end
|
174
236
|
end
|
175
237
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
238
|
+
describe "symbol" do
|
239
|
+
before do
|
240
|
+
class TestSymbol
|
241
|
+
include SAXMachine
|
242
|
+
element :symbol, class: Symbol
|
243
|
+
end
|
244
|
+
|
245
|
+
class TestSymbolAttribute
|
246
|
+
include SAXMachine
|
247
|
+
attribute :sub_symbol, class: Symbol
|
248
|
+
end
|
249
|
+
|
250
|
+
class TestSymbolWithAttribute
|
251
|
+
include SAXMachine
|
252
|
+
element :symbol, class: TestSymbolAttribute
|
253
|
+
end
|
180
254
|
end
|
181
255
|
|
182
|
-
|
183
|
-
|
256
|
+
it "is handled in an element" do
|
257
|
+
document = TestSymbol.parse("<symbol>MY_SYMBOL_VALUE</symbol>")
|
258
|
+
expect(document.symbol).to eq(:my_symbol_value)
|
259
|
+
end
|
260
|
+
|
261
|
+
it "is handled in an attribute" do
|
262
|
+
document = TestSymbolWithAttribute.parse("<symbol sub_symbol='MY_SYMBOL_VALUE'></symbol>")
|
263
|
+
expect(document.symbol.sub_symbol).to eq(:my_symbol_value)
|
264
|
+
end
|
184
265
|
end
|
185
266
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
267
|
+
describe "time" do
|
268
|
+
before do
|
269
|
+
class TestTime
|
270
|
+
include SAXMachine
|
271
|
+
element :time, class: Time
|
272
|
+
end
|
273
|
+
|
274
|
+
class TestTimeAttribute
|
275
|
+
include SAXMachine
|
276
|
+
attribute :sub_time, class: Time
|
277
|
+
end
|
278
|
+
|
279
|
+
class TestTimeWithAttribute
|
280
|
+
include SAXMachine
|
281
|
+
element :time, class: TestTimeAttribute
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
it "is handled in an element" do
|
286
|
+
document = TestTime.parse("<time>1994-02-04T06:20:00Z</time>")
|
287
|
+
expect(document.time).to eq(Time.utc(1994, 2, 4, 6, 20, 0, 0))
|
190
288
|
end
|
191
289
|
|
192
|
-
|
193
|
-
|
290
|
+
it "is handled in an attribute" do
|
291
|
+
document = TestTimeWithAttribute.parse("<time sub_time='1994-02-04T06:20:00Z'>1994-02-04T06:20:00Z</time>")
|
292
|
+
expect(document.time.sub_time).to eq(Time.utc(1994, 2, 4, 6, 20, 0, 0))
|
293
|
+
end
|
194
294
|
end
|
195
295
|
end
|
196
296
|
|
@@ -207,6 +307,22 @@ describe "SAXMachine" do
|
|
207
307
|
document = @klass.parse("<number></number>")
|
208
308
|
expect(document.number).to eq(0)
|
209
309
|
end
|
310
|
+
|
311
|
+
it "can be a Boolean" do
|
312
|
+
@klass = Class.new do
|
313
|
+
include SAXMachine
|
314
|
+
element(:bool, default: false) { |v| !!v }
|
315
|
+
end
|
316
|
+
|
317
|
+
document = @klass.parse("<no>bool</no>")
|
318
|
+
expect(document.bool).to be false
|
319
|
+
|
320
|
+
document = @klass.parse("<bool></bool>")
|
321
|
+
expect(document.bool).to be false
|
322
|
+
|
323
|
+
document = @klass.parse("<bool>1</bool>")
|
324
|
+
expect(document.bool).to be true
|
325
|
+
end
|
210
326
|
end
|
211
327
|
|
212
328
|
describe "the required attribute" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sax-machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Dix
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2015-
|
14
|
+
date: 2015-03-22 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rspec
|