oj 3.14.3 → 3.15.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/CHANGELOG.md +10 -0
- data/ext/oj/code.c +3 -10
- data/ext/oj/compat.c +5 -18
- data/ext/oj/custom.c +10 -28
- data/ext/oj/dump.c +40 -10
- data/ext/oj/dump.h +1 -4
- data/ext/oj/extconf.rb +4 -2
- data/ext/oj/fast.c +3 -6
- data/ext/oj/mimic_json.c +21 -1
- data/ext/oj/object.c +7 -21
- data/ext/oj/oj.c +24 -4
- data/ext/oj/oj.h +10 -6
- data/ext/oj/parse.c +3 -5
- data/ext/oj/parse.h +16 -14
- data/ext/oj/parser.h +2 -2
- data/ext/oj/reader.c +1 -3
- data/ext/oj/saj.c +1 -1
- data/ext/oj/strict.c +9 -27
- data/ext/oj/wab.c +9 -27
- data/lib/oj/active_support_helper.rb +2 -3
- data/lib/oj/json.rb +156 -149
- data/lib/oj/mimic.rb +3 -1
- data/lib/oj/version.rb +1 -1
- data/lib/oj.rb +3 -0
- data/pages/Options.md +4 -0
- data/test/_test_active.rb +8 -8
- data/test/_test_active_mimic.rb +7 -7
- data/test/_test_mimic_rails.rb +17 -19
- data/test/files.rb +14 -14
- data/test/foo.rb +15 -10
- data/test/helper.rb +4 -4
- data/test/mem.rb +8 -7
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +30 -32
- data/test/perf_dump.rb +27 -27
- data/test/perf_fast.rb +80 -82
- data/test/perf_file.rb +27 -29
- data/test/perf_object.rb +65 -68
- data/test/perf_once.rb +8 -7
- data/test/perf_parser.rb +40 -46
- data/test/perf_saj.rb +46 -53
- data/test/perf_scp.rb +57 -69
- data/test/perf_simple.rb +40 -38
- data/test/perf_strict.rb +68 -70
- data/test/perf_wab.rb +67 -69
- data/test/prec.rb +3 -3
- data/test/sample.rb +16 -15
- data/test/sample_json.rb +8 -7
- data/test/test_compat.rb +44 -46
- data/test/test_custom.rb +56 -42
- data/test/test_debian.rb +6 -9
- data/test/test_fast.rb +78 -72
- data/test/test_file.rb +16 -21
- data/test/test_gc.rb +5 -5
- data/test/test_generate.rb +5 -5
- data/test/test_hash.rb +4 -4
- data/test/test_integer_range.rb +9 -9
- data/test/test_null.rb +18 -20
- data/test/test_object.rb +76 -86
- data/test/test_parser.rb +4 -4
- data/test/test_parser_debug.rb +4 -4
- data/test/test_parser_saj.rb +31 -31
- data/test/test_parser_usual.rb +3 -3
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +8 -8
- data/test/test_scp.rb +29 -29
- data/test/test_strict.rb +25 -31
- data/test/test_various.rb +121 -75
- data/test/test_wab.rb +43 -42
- data/test/test_writer.rb +46 -46
- data/test/tests.rb +7 -7
- data/test/tests_mimic.rb +6 -6
- data/test/tests_mimic_addition.rb +6 -6
- metadata +3 -6
- data/test/bar.rb +0 -11
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
data/test/perf_parser.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
7
|
|
8
8
|
require 'optparse'
|
9
9
|
require 'perf'
|
@@ -18,26 +18,26 @@ $cache_keys = true
|
|
18
18
|
$symbol_keys = false
|
19
19
|
|
20
20
|
opts = OptionParser.new
|
21
|
-
opts.on(
|
22
|
-
opts.on(
|
23
|
-
opts.on(
|
24
|
-
opts.on(
|
25
|
-
opts.on(
|
26
|
-
opts.on(
|
27
|
-
opts.on(
|
28
|
-
|
21
|
+
opts.on('-v', 'verbose') { $verbose = true }
|
22
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| $iter = i }
|
23
|
+
opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| $size = i }
|
24
|
+
opts.on('-b', 'with bignum') { $with_bignum = true }
|
25
|
+
opts.on('-k', 'no cache') { $cache_keys = false }
|
26
|
+
opts.on('-sym', 'symbol keys') { $symbol_keys = true }
|
27
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
28
|
+
opts.parse(ARGV)
|
29
29
|
|
30
30
|
$obj = {
|
31
31
|
'a' => 'Alpha', # string
|
32
32
|
'b' => true, # boolean
|
33
|
-
'c' =>
|
34
|
-
'd' => [ true, [false, [-
|
33
|
+
'c' => 12_345, # number
|
34
|
+
'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false, 1, nil], nil]], # mix it up array
|
35
35
|
'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
|
36
36
|
'f' => nil, # nil
|
37
37
|
'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
|
38
38
|
'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
39
39
|
}
|
40
|
-
$obj['g'] =
|
40
|
+
$obj['g'] = 12_345_678_901_234_567_890_123_456_789 if $with_bignum
|
41
41
|
|
42
42
|
if 0 < $size
|
43
43
|
o = $obj
|
@@ -50,16 +50,14 @@ end
|
|
50
50
|
$json = Oj.dump($obj)
|
51
51
|
$failed = {} # key is same as String used in tests later
|
52
52
|
Oj.default_options = {create_id: '^', create_additions: true, class_cache: true}
|
53
|
-
if $cache_keys
|
54
|
-
|
55
|
-
else
|
56
|
-
|
57
|
-
end
|
53
|
+
Oj.default_options = if $cache_keys
|
54
|
+
{cache_keys: true, cache_str: 6, symbol_keys: $symbol_keys}
|
55
|
+
else
|
56
|
+
{cache_keys: false, cache_str: -1, symbol_keys: $symbol_keys}
|
57
|
+
end
|
58
58
|
JSON.parser = JSON::Ext::Parser
|
59
59
|
|
60
60
|
class AllSaj
|
61
|
-
def initialize()
|
62
|
-
end
|
63
61
|
|
64
62
|
def hash_start(key)
|
65
63
|
end
|
@@ -77,12 +75,7 @@ class AllSaj
|
|
77
75
|
end
|
78
76
|
end # AllSaj
|
79
77
|
|
80
|
-
|
81
|
-
def initialize()
|
82
|
-
end
|
83
|
-
end # NoSaj
|
84
|
-
|
85
|
-
no_handler = NoSaj.new()
|
78
|
+
no_handler = Object.new()
|
86
79
|
all_handler = AllSaj.new()
|
87
80
|
|
88
81
|
if $verbose
|
@@ -93,7 +86,7 @@ end
|
|
93
86
|
p_val = Oj::Parser.new(:validate)
|
94
87
|
|
95
88
|
puts '-' * 80
|
96
|
-
puts
|
89
|
+
puts 'Validate Performance'
|
97
90
|
perf = Perf.new()
|
98
91
|
perf.add('Oj::Parser.validate', 'none') { p_val.parse($json) }
|
99
92
|
perf.add('Oj::Saj.none', 'none') { Oj.saj_parse(no_handler, $json) }
|
@@ -106,7 +99,7 @@ p_all.cache_keys = $cache_keys
|
|
106
99
|
p_all.cache_strings = 6
|
107
100
|
|
108
101
|
puts '-' * 80
|
109
|
-
puts
|
102
|
+
puts 'Parse Callback Performance'
|
110
103
|
perf = Perf.new()
|
111
104
|
perf.add('Oj::Parser.saj', 'all') { p_all.parse($json) }
|
112
105
|
perf.add('Oj::Saj.all', 'all') { Oj.saj_parse(all_handler, $json) }
|
@@ -119,11 +112,11 @@ p_usual.cache_strings = ($cache_keys ? 6 : 0)
|
|
119
112
|
p_usual.symbol_keys = $symbol_keys
|
120
113
|
|
121
114
|
puts '-' * 80
|
122
|
-
puts
|
115
|
+
puts 'Parse Usual Performance'
|
123
116
|
perf = Perf.new()
|
124
117
|
perf.add('Oj::Parser.usual', '') { p_usual.parse($json) }
|
125
118
|
perf.add('Oj::strict_load', '') { Oj.strict_load($json) }
|
126
|
-
perf.add('JSON::Ext', 'parse') { JSON.
|
119
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
|
127
120
|
perf.run($iter)
|
128
121
|
|
129
122
|
### Usual Objects ######################
|
@@ -134,18 +127,19 @@ perf.run($iter)
|
|
134
127
|
|
135
128
|
class Stuff
|
136
129
|
attr_accessor :alpha, :bravo, :charlie, :delta, :echo, :foxtrot, :golf, :hotel, :india, :juliet
|
130
|
+
|
137
131
|
def self.json_create(arg)
|
138
|
-
obj =
|
139
|
-
obj.alpha = arg[
|
140
|
-
obj.bravo = arg[
|
141
|
-
obj.charlie = arg[
|
142
|
-
obj.delta = arg[
|
143
|
-
obj.echo = arg[
|
144
|
-
obj.foxtrot = arg[
|
145
|
-
obj.golf = arg[
|
146
|
-
obj.hotel = arg[
|
147
|
-
obj.india = arg[
|
148
|
-
obj.juliet = arg[
|
132
|
+
obj = new
|
133
|
+
obj.alpha = arg['alpha']
|
134
|
+
obj.bravo = arg['bravo']
|
135
|
+
obj.charlie = arg['charlie']
|
136
|
+
obj.delta = arg['delta']
|
137
|
+
obj.echo = arg['echo']
|
138
|
+
obj.foxtrot = arg['foxtrot']
|
139
|
+
obj.golf = arg['golf']
|
140
|
+
obj.hotel = arg['hotel']
|
141
|
+
obj.india = arg['india']
|
142
|
+
obj.juliet = arg['juliet']
|
149
143
|
obj
|
150
144
|
end
|
151
145
|
end
|
@@ -175,15 +169,15 @@ p_usual.ignore_json_create = true
|
|
175
169
|
JSON.create_id = '^'
|
176
170
|
|
177
171
|
puts '-' * 80
|
178
|
-
puts
|
172
|
+
puts 'Parse Usual Object Performance'
|
179
173
|
perf = Perf.new()
|
180
174
|
perf.add('Oj::Parser.usual', '') { p_usual.parse($obj_json) }
|
181
175
|
perf.add('Oj::compat_load', '') { Oj.compat_load($obj_json) }
|
182
|
-
perf.add('JSON::Ext', 'parse') { JSON.
|
176
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse($obj_json) }
|
183
177
|
|
184
178
|
perf.run($iter)
|
185
179
|
|
186
180
|
unless $failed.empty?
|
187
|
-
puts
|
181
|
+
puts 'The following packages were not included for the reason listed'
|
188
182
|
$failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
189
183
|
end
|
data/test/perf_saj.rb
CHANGED
@@ -1,40 +1,37 @@
|
|
1
1
|
#!/usr/bin/env ruby -wW1
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
7
|
|
8
8
|
require 'optparse'
|
9
|
-
require 'yajl'
|
9
|
+
# require 'yajl'
|
10
10
|
require 'perf'
|
11
11
|
require 'json'
|
12
12
|
require 'json/ext'
|
13
13
|
require 'oj'
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
@verbose = false
|
16
|
+
@indent = 0
|
17
|
+
@iter = 10_000
|
18
|
+
@gets = 0
|
19
|
+
@fetch = false
|
20
|
+
@write = false
|
21
|
+
@read = false
|
22
22
|
|
23
23
|
opts = OptionParser.new
|
24
|
-
opts.on(
|
25
|
-
opts.on(
|
26
|
-
opts.on(
|
27
|
-
opts.on(
|
28
|
-
opts.on(
|
29
|
-
opts.on(
|
30
|
-
opts.on(
|
31
|
-
opts.on(
|
32
|
-
|
24
|
+
opts.on('-v', 'verbose') { @verbose = true }
|
25
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
|
26
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = i }
|
27
|
+
opts.on('-g', '--gets [Int]', Integer, 'number of gets') { |i| @gets = i }
|
28
|
+
opts.on('-f', 'fetch') { @fetch = true }
|
29
|
+
opts.on('-w', 'write') { @write = true }
|
30
|
+
opts.on('-r', 'read') { @read = true }
|
31
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
32
|
+
opts.parse(ARGV)
|
33
33
|
|
34
34
|
class AllSaj < Oj::Saj
|
35
|
-
def initialize()
|
36
|
-
end
|
37
|
-
|
38
35
|
def hash_start(key)
|
39
36
|
end
|
40
37
|
|
@@ -52,57 +49,53 @@ class AllSaj < Oj::Saj
|
|
52
49
|
end # AllSaj
|
53
50
|
|
54
51
|
class NoSaj < Oj::Saj
|
55
|
-
def initialize()
|
56
|
-
end
|
57
52
|
end # NoSaj
|
58
53
|
|
59
54
|
saj_handler = AllSaj.new()
|
60
55
|
no_saj = NoSaj.new()
|
61
56
|
|
62
|
-
|
57
|
+
@obj = {
|
63
58
|
'a' => 'Alpha', # string
|
64
59
|
'b' => true, # boolean
|
65
|
-
'c' =>
|
66
|
-
'd' => [ true, [false, {'12345' =>
|
60
|
+
'c' => 12_345, # number
|
61
|
+
'd' => [ true, [false, {'12345' => 12_345, 'nil' => nil}, 3.967, { 'x' => 'something', 'y' => false, 'z' => true}, nil]], # mix it up array
|
67
62
|
'e' => { 'one' => 1, 'two' => 2 }, # hash
|
68
63
|
'f' => nil, # nil
|
69
|
-
'g' =>
|
64
|
+
'g' => 12_345_678_901_234_567_890_123_456_789, # big number
|
70
65
|
'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
|
71
66
|
'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
72
67
|
}
|
73
68
|
|
74
|
-
Oj.default_options = { :indent =>
|
69
|
+
Oj.default_options = { :indent => @indent, :mode => :compat }
|
75
70
|
|
76
|
-
|
77
|
-
|
71
|
+
@json = Oj.dump(@obj)
|
72
|
+
@failed = {} # key is same as String used in tests later
|
78
73
|
|
79
74
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
$failed[tag] = "#{e.class}: #{e.message}"
|
85
|
-
end
|
75
|
+
obj = blk.call(orig)
|
76
|
+
raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
|
77
|
+
rescue Exception => e
|
78
|
+
@failed[tag] = "#{e.class}: #{e.message}"
|
86
79
|
end
|
87
80
|
|
88
81
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
89
|
-
capture_error('Yajl',
|
90
|
-
capture_error('JSON::Ext',
|
82
|
+
# capture_error('Yajl', @obj, 'encode', 'parse') { |o| Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
|
83
|
+
capture_error('JSON::Ext', @obj, 'generate', 'parse') { |o| JSON.generator = JSON::Ext::Generator; JSON::Ext::Parser.new(JSON.generate(o)).parse }
|
91
84
|
|
92
|
-
if
|
93
|
-
puts "json:\n#{
|
85
|
+
if @verbose
|
86
|
+
puts "json:\n#{@json}\n"
|
94
87
|
end
|
95
88
|
|
96
89
|
puts '-' * 80
|
97
|
-
puts
|
90
|
+
puts 'Parse Performance'
|
98
91
|
perf = Perf.new()
|
99
|
-
perf.add('Oj::Saj', 'all') { Oj.saj_parse(saj_handler,
|
100
|
-
perf.add('Oj::Saj', 'none') { Oj.saj_parse(no_saj,
|
101
|
-
perf.add('Yajl', 'parse') { Yajl::Parser.parse(
|
102
|
-
perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new(
|
103
|
-
perf.run(
|
104
|
-
|
105
|
-
unless
|
106
|
-
puts
|
107
|
-
|
92
|
+
perf.add('Oj::Saj', 'all') { Oj.saj_parse(saj_handler, @json) }
|
93
|
+
perf.add('Oj::Saj', 'none') { Oj.saj_parse(no_saj, @json) }
|
94
|
+
# perf.add('Yajl', 'parse') { Yajl::Parser.parse(@json) } unless @failed.has_key?('Yajl')
|
95
|
+
perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new(@json).parse } unless @failed.key?('JSON::Ext')
|
96
|
+
perf.run(@iter)
|
97
|
+
|
98
|
+
unless @failed.empty?
|
99
|
+
puts 'The following packages were not included for the reason listed'
|
100
|
+
@failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
108
101
|
end
|
data/test/perf_scp.rb
CHANGED
@@ -1,61 +1,58 @@
|
|
1
1
|
#!/usr/bin/env ruby -wW1
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
7
|
|
8
8
|
require 'optparse'
|
9
|
-
require 'yajl'
|
9
|
+
# require 'yajl'
|
10
10
|
require 'perf'
|
11
11
|
require 'json'
|
12
12
|
require 'json/ext'
|
13
13
|
require 'oj'
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
@verbose = false
|
16
|
+
@indent = 0
|
17
|
+
@iter = 50_000
|
18
|
+
@with_bignum = false
|
19
|
+
@size = 1
|
20
20
|
|
21
21
|
opts = OptionParser.new
|
22
|
-
opts.on(
|
23
|
-
opts.on(
|
24
|
-
opts.on(
|
25
|
-
opts.on(
|
26
|
-
opts.on(
|
27
|
-
opts.on(
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
opts.on('-v', 'verbose') { @verbose = true }
|
23
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
|
24
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = i }
|
25
|
+
opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| @size = i }
|
26
|
+
opts.on('-b', 'with bignum') { @with_bignum = true }
|
27
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
28
|
+
opts.parse(ARGV)
|
29
|
+
|
30
|
+
@obj = {
|
31
31
|
'a' => 'Alpha', # string
|
32
32
|
'b' => true, # boolean
|
33
|
-
'c' =>
|
34
|
-
'd' => [ true, [false, [-
|
33
|
+
'c' => 12_345, # number
|
34
|
+
'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
|
35
35
|
'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
|
36
36
|
'f' => nil, # nil
|
37
37
|
'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
|
38
38
|
'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
39
39
|
}
|
40
|
-
|
40
|
+
@obj['g'] = 12_345_678_901_234_567_890_123_456_789 if @with_bignum
|
41
41
|
|
42
|
-
if 0 <
|
43
|
-
|
44
|
-
|
45
|
-
(4 *
|
46
|
-
|
42
|
+
if 0 < @size
|
43
|
+
ob = @obj
|
44
|
+
@obj = []
|
45
|
+
(4 * @size).times do
|
46
|
+
@obj << ob
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
Oj.default_options = { :indent =>
|
50
|
+
Oj.default_options = { :indent => @indent, :mode => :strict, cache_keys: true, cache_str: 5 }
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
@json = Oj.dump(@obj)
|
53
|
+
@failed = {} # key is same as String used in tests later
|
54
54
|
|
55
55
|
class AllSaj < Oj::Saj
|
56
|
-
def initialize()
|
57
|
-
end
|
58
|
-
|
59
56
|
def hash_start(key)
|
60
57
|
end
|
61
58
|
|
@@ -73,31 +70,24 @@ class AllSaj < Oj::Saj
|
|
73
70
|
end # AllSaj
|
74
71
|
|
75
72
|
class NoSaj < Oj::Saj
|
76
|
-
def initialize()
|
77
|
-
end
|
78
73
|
end # NoSaj
|
79
74
|
|
80
75
|
class NoHandler < Oj::ScHandler
|
81
|
-
def initialize()
|
82
|
-
end
|
83
76
|
end # NoHandler
|
84
77
|
|
85
78
|
class AllHandler < Oj::ScHandler
|
86
|
-
def
|
79
|
+
def hash_start
|
80
|
+
nil
|
87
81
|
end
|
88
82
|
|
89
|
-
def
|
90
|
-
return nil
|
83
|
+
def hash_end
|
91
84
|
end
|
92
85
|
|
93
|
-
def
|
86
|
+
def array_start
|
87
|
+
nil
|
94
88
|
end
|
95
89
|
|
96
|
-
def
|
97
|
-
return nil
|
98
|
-
end
|
99
|
-
|
100
|
-
def array_end()
|
90
|
+
def array_end
|
101
91
|
end
|
102
92
|
|
103
93
|
def add_value(value)
|
@@ -118,35 +108,33 @@ sc_handler = AllHandler.new()
|
|
118
108
|
no_handler = NoHandler.new()
|
119
109
|
|
120
110
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
$failed[tag] = "#{e.class}: #{e.message}"
|
126
|
-
end
|
111
|
+
obj = blk.call(orig)
|
112
|
+
raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
|
113
|
+
rescue Exception => e
|
114
|
+
@failed[tag] = "#{e.class}: #{e.message}"
|
127
115
|
end
|
128
116
|
|
129
117
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
130
|
-
capture_error('Yajl',
|
131
|
-
capture_error('JSON::Ext',
|
118
|
+
# capture_error('Yajl', @obj, 'encode', 'parse') { |o| Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
|
119
|
+
capture_error('JSON::Ext', @obj, 'generate', 'parse') { |o| JSON.generator = JSON::Ext::Generator; JSON::Ext::Parser.new(JSON.generate(o)).parse }
|
132
120
|
|
133
|
-
if
|
134
|
-
puts "json:\n#{
|
121
|
+
if @verbose
|
122
|
+
puts "json:\n#{@json}\n"
|
135
123
|
end
|
136
124
|
|
137
125
|
puts '-' * 80
|
138
|
-
puts
|
126
|
+
puts 'Parse Performance'
|
139
127
|
perf = Perf.new()
|
140
|
-
perf.add('Oj::Saj.all', 'all') { Oj.saj_parse(saj_handler,
|
141
|
-
perf.add('Oj::Saj.none', 'none') { Oj.saj_parse(no_saj,
|
142
|
-
perf.add('Oj::Scp.all', 'all') { Oj.sc_parse(sc_handler,
|
143
|
-
perf.add('Oj::Scp.none', 'none') { Oj.sc_parse(no_handler,
|
144
|
-
perf.add('Oj::load', 'none') { Oj.wab_load(
|
145
|
-
perf.add('Yajl', 'parse') { Yajl::Parser.parse(
|
146
|
-
perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new(
|
147
|
-
perf.run(
|
148
|
-
|
149
|
-
unless
|
150
|
-
puts
|
151
|
-
|
128
|
+
perf.add('Oj::Saj.all', 'all') { Oj.saj_parse(saj_handler, @json) }
|
129
|
+
perf.add('Oj::Saj.none', 'none') { Oj.saj_parse(no_saj, @json) }
|
130
|
+
perf.add('Oj::Scp.all', 'all') { Oj.sc_parse(sc_handler, @json) }
|
131
|
+
perf.add('Oj::Scp.none', 'none') { Oj.sc_parse(no_handler, @json) }
|
132
|
+
perf.add('Oj::load', 'none') { Oj.wab_load(@json) }
|
133
|
+
# perf.add('Yajl', 'parse') { Yajl::Parser.parse(@json) } unless @failed.has_key?('Yajl')
|
134
|
+
perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new(@json).parse } unless @failed.key?('JSON::Ext')
|
135
|
+
perf.run(@iter)
|
136
|
+
|
137
|
+
unless @failed.empty?
|
138
|
+
puts 'The following packages were not included for the reason listed'
|
139
|
+
@failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
152
140
|
end
|