ox 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ox might be problematic. Click here for more details.
- data/README.md +2 -3
- data/ext/ox/sax.c +2 -1
- data/lib/ox/element.rb +0 -2
- data/lib/ox/version.rb +1 -1
- data/test/bench.rb +53 -0
- data/test/perf_mars.rb +22 -5
- data/test/sax_test.rb +18 -0
- metadata +5 -12
data/README.md
CHANGED
@@ -26,10 +26,9 @@ A fast XML parser and Object marshaller as a Ruby gem.
|
|
26
26
|
|
27
27
|
## <a name="release">Release Notes</a>
|
28
28
|
|
29
|
-
### Release 1.4.
|
29
|
+
### Release 1.4.1
|
30
30
|
|
31
|
-
-
|
32
|
-
- Added locate() method that provides simple and limited xpath like functionality.
|
31
|
+
- Empty CDATA buf found and fixed by adamvaughan on github
|
33
32
|
|
34
33
|
## <a name="description">Description</a>
|
35
34
|
|
data/ext/ox/sax.c
CHANGED
@@ -451,7 +451,8 @@ read_cdata(SaxDrive dr) {
|
|
451
451
|
char c;
|
452
452
|
int end = 0;
|
453
453
|
|
454
|
-
dr->
|
454
|
+
dr->cur--; // back up to the start in case the cdata is empty
|
455
|
+
dr->str = dr->cur; // mark the start
|
455
456
|
while (1) {
|
456
457
|
c = sax_drive_get(dr);
|
457
458
|
if (']' == c) {
|
data/lib/ox/element.rb
CHANGED
@@ -112,9 +112,7 @@ module Ox
|
|
112
112
|
# @param [Array] path array of steps in a path
|
113
113
|
# @param [Array] found matching nodes
|
114
114
|
def alocate(path, found)
|
115
|
-
#puts "*** locate_dig(#{path}, #{found})"
|
116
115
|
step = path[0]
|
117
|
-
#puts "*** #{step}"
|
118
116
|
if step.start_with?('@') # attribute
|
119
117
|
raise InvalidPath.new(path) unless 1 == path.size
|
120
118
|
step = step[1..-1]
|
data/lib/ox/version.rb
CHANGED
data/test/bench.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# Message Pack vs similar utilities
|
2
|
+
# using ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0]
|
3
|
+
#
|
4
|
+
# Packing
|
5
|
+
# pack: message pack 0.142954
|
6
|
+
# pack: marshall 0.636924
|
7
|
+
# pack: json 3.001180
|
8
|
+
# pack: ox 0.108832
|
9
|
+
#
|
10
|
+
# Unpacking
|
11
|
+
# unpack: message pack 0.260064
|
12
|
+
# unpack: marshal 0.616197
|
13
|
+
# unpack: marshal 0.609927
|
14
|
+
# unpack: ox 0.287053
|
15
|
+
|
16
|
+
require 'msgpack'
|
17
|
+
require 'json'
|
18
|
+
require 'ox'
|
19
|
+
|
20
|
+
iter = 100000
|
21
|
+
|
22
|
+
duck = { 'sound' => 'quack', 'name' => 'Daffy', 'feet' => 2, 'wings' => true }
|
23
|
+
dude = { 'sound' => "I'm the dude!", 'name' => 'Lebowski', 'missing a rug' => true, 'missing money' => 1_000_000.00 }
|
24
|
+
stuff = { :string => "A string", :array => [true, 2, 'yes'], :hash => { :string => "not very deep" }}
|
25
|
+
|
26
|
+
def bench(title, iter, &blk)
|
27
|
+
start = Time.now
|
28
|
+
(1..iter).each { blk.call }
|
29
|
+
time = Time.now - start
|
30
|
+
puts "%-30s %10.6f" % [title, time]
|
31
|
+
end
|
32
|
+
|
33
|
+
def bench_all(title, iter, obj)
|
34
|
+
puts "\n#{title} Packing"
|
35
|
+
bench('pack: message pack', iter) { MessagePack.pack(obj) }
|
36
|
+
bench('pack: marshall', iter) { Marshal.dump(obj) }
|
37
|
+
bench('pack: json', iter) { JSON.dump(obj) }
|
38
|
+
bench('pack: ox', iter) { Ox.dump(obj) }
|
39
|
+
|
40
|
+
puts "\n#{title} Unpacking"
|
41
|
+
mp_obj = MessagePack.pack(obj)
|
42
|
+
bench('unpack: message pack', iter) { MessagePack.unpack(mp_obj) }
|
43
|
+
mars_obj = Marshal.dump(obj)
|
44
|
+
bench('unpack: marshal', iter) { Marshal.load(mars_obj) }
|
45
|
+
json_obj = JSON.dump(obj)
|
46
|
+
bench('unpack: json', iter) { JSON.parse(json_obj) }
|
47
|
+
ox_obj = Ox.dump(obj)
|
48
|
+
bench('unpack: ox', iter) { Ox.parse_obj(ox_obj) }
|
49
|
+
end
|
50
|
+
|
51
|
+
bench_all('duck', iter, duck)
|
52
|
+
bench_all('dude', iter, dude)
|
53
|
+
bench_all('stuff', iter, stuff)
|
data/test/perf_mars.rb
CHANGED
@@ -50,7 +50,7 @@ data = {
|
|
50
50
|
:Rational => ::Test::Ox::Wrap.new(),
|
51
51
|
:Struct => ::Test::Ox::Wrap.new(),
|
52
52
|
:Class => ::Test::Ox::Wrap.new(),
|
53
|
-
:Object => ::Test::Ox::Wrap.new()
|
53
|
+
:Object => ::Test::Ox::Wrap.new(),
|
54
54
|
}
|
55
55
|
|
56
56
|
s = Struct.new('Zoo', :x, :y, :z)
|
@@ -74,7 +74,8 @@ s = Struct.new('Zoo', :x, :y, :z)
|
|
74
74
|
data[:Object].values << ::Test::Ox::Wrap.new(i)
|
75
75
|
end
|
76
76
|
|
77
|
-
puts "
|
77
|
+
puts " load dump"
|
78
|
+
puts "type Ox Marshal ratio Ox Marshal ratio"
|
78
79
|
data.each do |type,a|
|
79
80
|
#xml = Ox.dump(a, :indent => -1, :xsd_date => true)
|
80
81
|
xml = Ox.dump(a, :indent => -1)
|
@@ -85,13 +86,29 @@ data.each do |type,a|
|
|
85
86
|
obj = Ox.load(xml, :mode => :object)
|
86
87
|
#pp obj
|
87
88
|
end
|
88
|
-
|
89
|
+
ox_load_time = Time.now - start
|
89
90
|
|
90
91
|
m = Marshal.dump(a)
|
91
92
|
start = Time.now
|
92
93
|
(1..it).each do
|
93
94
|
obj = Marshal.load(m)
|
94
95
|
end
|
95
|
-
|
96
|
-
|
96
|
+
mars_load_time = Time.now - start
|
97
|
+
|
98
|
+
obj = Ox.load(xml, :mode => :object)
|
99
|
+
start = Time.now
|
100
|
+
(1..it).each do
|
101
|
+
xml = Ox.dump(a, :indent => -1)
|
102
|
+
end
|
103
|
+
ox_dump_time = Time.now - start
|
104
|
+
|
105
|
+
start = Time.now
|
106
|
+
(1..it).each do
|
107
|
+
m = Marshal.dump(a)
|
108
|
+
end
|
109
|
+
mars_dump_time = Time.now - start
|
110
|
+
|
111
|
+
puts "%8s %6.3f %6.3f %0.1f %6.3f %6.3f %0.1f" % [type.to_s,
|
112
|
+
ox_load_time, mars_load_time, mars_load_time / ox_load_time,
|
113
|
+
ox_dump_time, mars_dump_time, mars_dump_time / ox_dump_time]
|
97
114
|
end
|
data/test/sax_test.rb
CHANGED
@@ -351,6 +351,24 @@ encoding = "UTF-8" ?>},
|
|
351
351
|
[:error, "invalid format, cdata terminated unexpectedly", 5, 1]])
|
352
352
|
end
|
353
353
|
|
354
|
+
def test_sax_cdata_empty
|
355
|
+
parse_compare(%{<?xml version="1.0"?>
|
356
|
+
<top>
|
357
|
+
<child><![CDATA[]]></child>
|
358
|
+
<child><![CDATA[This is CDATA.]]></child>
|
359
|
+
</top>
|
360
|
+
},
|
361
|
+
[[:instruct, 'xml'],
|
362
|
+
[:attr, :version, '1.0'],
|
363
|
+
[:start_element, :top],
|
364
|
+
[:start_element, :child],
|
365
|
+
[:cdata, ''],
|
366
|
+
[:end_element, :child],
|
367
|
+
[:start_element, :child],
|
368
|
+
[:cdata, 'This is CDATA.'],
|
369
|
+
[:end_element, :child],
|
370
|
+
[:end_element, :top]])
|
371
|
+
end
|
354
372
|
|
355
373
|
def test_sax_mixed
|
356
374
|
parse_compare(%{<?xml version="1.0"?>
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 1
|
7
|
-
- 4
|
8
|
-
- 0
|
9
|
-
version: 1.4.0
|
4
|
+
prerelease:
|
5
|
+
version: 1.4.1
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Peter Ohler
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date: 2011-
|
13
|
+
date: 2011-11-16 00:00:00 +09:00
|
18
14
|
default_executable:
|
19
15
|
dependencies: []
|
20
16
|
|
@@ -54,6 +50,7 @@ files:
|
|
54
50
|
- ext/ox/ox.c
|
55
51
|
- ext/ox/parse.c
|
56
52
|
- ext/ox/sax.c
|
53
|
+
- test/bench.rb
|
57
54
|
- test/bug1.rb
|
58
55
|
- test/bug2.rb
|
59
56
|
- test/bug3.rb
|
@@ -106,21 +103,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
103
|
requirements:
|
107
104
|
- - ">="
|
108
105
|
- !ruby/object:Gem::Version
|
109
|
-
segments:
|
110
|
-
- 0
|
111
106
|
version: "0"
|
112
107
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
108
|
none: false
|
114
109
|
requirements:
|
115
110
|
- - ">="
|
116
111
|
- !ruby/object:Gem::Version
|
117
|
-
segments:
|
118
|
-
- 0
|
119
112
|
version: "0"
|
120
113
|
requirements: []
|
121
114
|
|
122
115
|
rubyforge_project: ox
|
123
|
-
rubygems_version: 1.
|
116
|
+
rubygems_version: 1.6.2
|
124
117
|
signing_key:
|
125
118
|
specification_version: 3
|
126
119
|
summary: A fast XML parser and object serializer.
|