oj 3.14.2 → 3.15.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/CHANGELOG.md +9 -1
- data/README.md +0 -1
- data/ext/oj/buf.h +2 -2
- data/ext/oj/cache.c +16 -16
- data/ext/oj/cache8.c +7 -7
- data/ext/oj/circarray.c +2 -1
- data/ext/oj/circarray.h +2 -2
- data/ext/oj/code.c +2 -2
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +6 -14
- data/ext/oj/custom.c +6 -16
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +43 -18
- data/ext/oj/dump_compat.c +551 -576
- data/ext/oj/dump_leaf.c +3 -5
- data/ext/oj/dump_object.c +35 -36
- data/ext/oj/dump_strict.c +2 -4
- data/ext/oj/encoder.c +1 -1
- data/ext/oj/err.c +2 -13
- data/ext/oj/err.h +9 -12
- data/ext/oj/extconf.rb +1 -1
- data/ext/oj/fast.c +24 -38
- data/ext/oj/intern.c +38 -42
- data/ext/oj/intern.h +3 -7
- data/ext/oj/mem.c +211 -217
- data/ext/oj/mem.h +10 -10
- data/ext/oj/mimic_json.c +39 -24
- data/ext/oj/object.c +12 -26
- data/ext/oj/odd.c +2 -1
- data/ext/oj/odd.h +4 -4
- data/ext/oj/oj.c +80 -81
- data/ext/oj/oj.h +56 -54
- data/ext/oj/parse.c +55 -118
- data/ext/oj/parse.h +5 -10
- data/ext/oj/parser.c +7 -8
- data/ext/oj/parser.h +7 -8
- data/ext/oj/rails.c +28 -59
- data/ext/oj/reader.c +5 -9
- data/ext/oj/reader.h +1 -1
- data/ext/oj/resolve.c +3 -4
- data/ext/oj/rxclass.c +1 -1
- data/ext/oj/rxclass.h +1 -1
- data/ext/oj/saj.c +4 -4
- data/ext/oj/saj2.c +32 -49
- data/ext/oj/saj2.h +1 -1
- data/ext/oj/scp.c +3 -14
- data/ext/oj/sparse.c +18 -67
- data/ext/oj/stream_writer.c +5 -18
- data/ext/oj/strict.c +16 -40
- data/ext/oj/string_writer.c +6 -14
- data/ext/oj/trace.h +27 -16
- data/ext/oj/usual.c +62 -61
- data/ext/oj/usual.h +6 -6
- data/ext/oj/util.h +1 -1
- data/ext/oj/val_stack.h +4 -4
- data/ext/oj/wab.c +16 -36
- data/lib/oj/active_support_helper.rb +0 -1
- data/lib/oj/bag.rb +7 -1
- data/lib/oj/easy_hash.rb +4 -5
- data/lib/oj/error.rb +0 -1
- data/lib/oj/json.rb +4 -2
- data/lib/oj/mimic.rb +4 -2
- data/lib/oj/state.rb +8 -5
- data/lib/oj/version.rb +1 -2
- data/lib/oj.rb +2 -0
- data/pages/Options.md +4 -0
- data/test/_test_active.rb +8 -9
- data/test/_test_active_mimic.rb +7 -8
- data/test/_test_mimic_rails.rb +17 -20
- data/test/activerecord/result_test.rb +5 -6
- data/test/files.rb +15 -15
- data/test/foo.rb +9 -52
- data/test/helper.rb +5 -8
- data/test/isolated/shared.rb +3 -2
- data/test/json_gem/json_addition_test.rb +2 -2
- data/test/json_gem/json_common_interface_test.rb +4 -4
- data/test/json_gem/json_encoding_test.rb +0 -0
- data/test/json_gem/json_ext_parser_test.rb +1 -0
- data/test/json_gem/json_fixtures_test.rb +3 -2
- data/test/json_gem/json_generator_test.rb +43 -32
- data/test/json_gem/json_generic_object_test.rb +11 -11
- data/test/json_gem/json_parser_test.rb +46 -46
- data/test/json_gem/json_string_matching_test.rb +9 -9
- data/test/mem.rb +13 -12
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +31 -33
- data/test/perf_dump.rb +25 -25
- data/test/perf_fast.rb +80 -82
- data/test/perf_file.rb +27 -29
- data/test/perf_object.rb +65 -69
- data/test/perf_once.rb +12 -11
- data/test/perf_parser.rb +41 -48
- data/test/perf_saj.rb +46 -54
- data/test/perf_scp.rb +57 -69
- data/test/perf_simple.rb +41 -39
- data/test/perf_strict.rb +68 -70
- data/test/perf_wab.rb +67 -69
- data/test/prec.rb +3 -3
- data/test/sample/change.rb +0 -1
- data/test/sample/dir.rb +0 -1
- data/test/sample/doc.rb +0 -1
- data/test/sample/file.rb +0 -1
- data/test/sample/group.rb +0 -1
- data/test/sample/hasprops.rb +0 -1
- data/test/sample/layer.rb +0 -1
- data/test/sample/rect.rb +0 -1
- data/test/sample/shape.rb +0 -1
- data/test/sample/text.rb +0 -1
- data/test/sample.rb +16 -16
- data/test/sample_json.rb +8 -8
- data/test/test_compat.rb +52 -52
- data/test/test_custom.rb +61 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +86 -90
- data/test/test_file.rb +24 -29
- 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 +20 -20
- data/test/test_object.rb +78 -87
- data/test/test_parser.rb +4 -4
- data/test/test_parser_debug.rb +4 -4
- data/test/test_parser_saj.rb +27 -25
- data/test/test_parser_usual.rb +6 -6
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +10 -8
- data/test/test_scp.rb +35 -35
- data/test/test_strict.rb +28 -32
- data/test/test_various.rb +140 -97
- data/test/test_wab.rb +46 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +7 -7
- data/test/tests_mimic.rb +6 -6
- data/test/tests_mimic_addition.rb +6 -6
- metadata +18 -30
- data/test/activesupport4/decoding_test.rb +0 -108
- data/test/activesupport4/encoding_test.rb +0 -531
- data/test/activesupport4/test_helper.rb +0 -41
- data/test/activesupport5/abstract_unit.rb +0 -45
- data/test/activesupport5/decoding_test.rb +0 -133
- data/test/activesupport5/encoding_test.rb +0 -500
- data/test/activesupport5/encoding_test_cases.rb +0 -98
- data/test/activesupport5/test_helper.rb +0 -72
- data/test/activesupport5/time_zone_test_helpers.rb +0 -39
- data/test/bar.rb +0 -11
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
@@ -95,21 +95,21 @@ class JSONParserTest < Test::Unit::TestCase
|
|
95
95
|
assert_raise(JSON::ParserError) { JSON.parse('.23') }
|
96
96
|
assert_raise(JSON::ParserError) { JSON.parse('023') }
|
97
97
|
assert_equal 23, JSON.parse('23')
|
98
|
-
assert_equal
|
98
|
+
assert_equal(-23, JSON.parse('-23'))
|
99
99
|
assert_equal_float 3.141, JSON.parse('3.141')
|
100
|
-
assert_equal_float
|
100
|
+
assert_equal_float(-3.141, JSON.parse('-3.141'))
|
101
101
|
assert_equal_float 3.141, JSON.parse('3141e-3')
|
102
102
|
assert_equal_float 3.141, JSON.parse('3141.1e-3')
|
103
103
|
assert_equal_float 3.141, JSON.parse('3141E-3')
|
104
104
|
assert_equal_float 3.141, JSON.parse('3141.0E-3')
|
105
|
-
assert_equal_float
|
106
|
-
assert_equal_float
|
105
|
+
assert_equal_float(-3.141, JSON.parse('-3141.0e-3'))
|
106
|
+
assert_equal_float(-3.141, JSON.parse('-3141e-3'))
|
107
107
|
assert_raise(JSON::ParserError) { JSON.parse('NaN') }
|
108
108
|
assert JSON.parse('NaN', :allow_nan => true).nan?
|
109
109
|
assert_raise(JSON::ParserError) { JSON.parse('Infinity') }
|
110
110
|
assert_equal 1.0/0, JSON.parse('Infinity', :allow_nan => true)
|
111
111
|
assert_raise(JSON::ParserError) { JSON.parse('-Infinity') }
|
112
|
-
assert_equal
|
112
|
+
assert_equal(-1.0/0, JSON.parse('-Infinity', :allow_nan => true))
|
113
113
|
end
|
114
114
|
|
115
115
|
if Array.method_defined?(:permutation)
|
@@ -133,17 +133,17 @@ class JSONParserTest < Test::Unit::TestCase
|
|
133
133
|
end
|
134
134
|
|
135
135
|
def test_parse_arrays
|
136
|
-
assert_equal([1,2,3], JSON.parse('[1,2,3]'))
|
137
|
-
assert_equal([1.2,2,3], JSON.parse('[1.2,2,3]'))
|
138
|
-
assert_equal([[],[[],[]]], JSON.parse('[[],[[],[]]]'))
|
136
|
+
assert_equal([1, 2, 3], JSON.parse('[1,2,3]'))
|
137
|
+
assert_equal([1.2, 2, 3], JSON.parse('[1.2,2,3]'))
|
138
|
+
assert_equal([[], [[], []]], JSON.parse('[[],[[],[]]]'))
|
139
139
|
assert_equal([], JSON.parse('[]'))
|
140
140
|
assert_equal([], JSON.parse(' [ ] '))
|
141
141
|
assert_equal([1], JSON.parse('[1]'))
|
142
142
|
assert_equal([1], JSON.parse(' [ 1 ] '))
|
143
143
|
ary = [[1], ["foo"], [3.14], [4711.0], [2.718], [nil],
|
144
|
-
|
144
|
+
[[1, -2, 3]], [false], [true]]
|
145
145
|
assert_equal(ary,
|
146
|
-
|
146
|
+
JSON.parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]],[false],[true]]'))
|
147
147
|
assert_equal(ary, JSON.parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]\s
|
148
148
|
, [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
|
149
149
|
end
|
@@ -208,51 +208,51 @@ class JSONParserTest < Test::Unit::TestCase
|
|
208
208
|
|
209
209
|
def test_symbolize_names
|
210
210
|
assert_equal({ "foo" => "bar", "baz" => "quux" },
|
211
|
-
|
211
|
+
JSON.parse('{"foo":"bar", "baz":"quux"}'))
|
212
212
|
assert_equal({ :foo => "bar", :baz => "quux" },
|
213
|
-
|
213
|
+
JSON.parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
|
214
214
|
assert_raise(ArgumentError) do
|
215
215
|
JSON.parse('{}', :symbolize_names => true, :create_additions => true)
|
216
216
|
end
|
217
217
|
end
|
218
218
|
|
219
219
|
def test_parse_comments
|
220
|
-
json =
|
221
|
-
{
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
}
|
229
|
-
EOT
|
220
|
+
json = <<~EOT
|
221
|
+
{
|
222
|
+
"key1":"value1", // eol comment
|
223
|
+
"key2":"value2" /* multi line
|
224
|
+
* comment */,
|
225
|
+
"key3":"value3" /* multi line
|
226
|
+
// nested eol comment
|
227
|
+
* comment */
|
228
|
+
}
|
229
|
+
EOT
|
230
230
|
assert_equal(
|
231
231
|
{ "key1" => "value1", "key2" => "value2", "key3" => "value3" },
|
232
232
|
JSON.parse(json))
|
233
|
-
json =
|
234
|
-
{
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
}
|
240
|
-
EOT
|
233
|
+
json = <<~EOT
|
234
|
+
{
|
235
|
+
"key1":"value1" /* multi line
|
236
|
+
// nested eol comment
|
237
|
+
/* illegal nested multi line comment */
|
238
|
+
* comment */
|
239
|
+
}
|
240
|
+
EOT
|
241
241
|
assert_raise(JSON::ParserError) { JSON.parse(json) }
|
242
|
-
json =
|
243
|
-
{
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
}
|
249
|
-
EOT
|
242
|
+
json = <<~EOT
|
243
|
+
{
|
244
|
+
"key1":"value1" /* multi line
|
245
|
+
// nested eol comment
|
246
|
+
closed multi comment */
|
247
|
+
and again, throw an Error */
|
248
|
+
}
|
249
|
+
EOT
|
250
250
|
assert_raise(JSON::ParserError) { JSON.parse(json) }
|
251
|
-
json =
|
252
|
-
{
|
253
|
-
|
254
|
-
}
|
255
|
-
EOT
|
251
|
+
json = <<~EOT
|
252
|
+
{
|
253
|
+
"key1":"value1" /*/*/
|
254
|
+
}
|
255
|
+
EOT
|
256
256
|
assert_equal({ "key1" => "value1" }, JSON.parse(json))
|
257
257
|
end
|
258
258
|
|
@@ -348,7 +348,7 @@ EOT
|
|
348
348
|
|
349
349
|
def test_parse_array_custom_array_derived_class
|
350
350
|
res = JSON.parse('[1,2]', :array_class => SubArray)
|
351
|
-
assert_equal([1,2], res)
|
351
|
+
assert_equal([1, 2], res)
|
352
352
|
assert_equal(SubArray, res.class)
|
353
353
|
assert res.shifted?
|
354
354
|
end
|
@@ -356,7 +356,7 @@ EOT
|
|
356
356
|
def test_parse_array_custom_non_array_derived_class
|
357
357
|
res = JSON.parse('[1,2]', :array_class => SubArrayWrapper)
|
358
358
|
assert_equal(SubArrayWrapper, res.class)
|
359
|
-
assert_equal([1,2], res.data)
|
359
|
+
assert_equal([1, 2], res.data)
|
360
360
|
assert res.shifted?
|
361
361
|
end
|
362
362
|
|
@@ -442,7 +442,7 @@ EOT
|
|
442
442
|
assert obj_again['foo']['bar']
|
443
443
|
assert_equal obj, obj_again
|
444
444
|
assert_equal ["foo"],
|
445
|
-
|
445
|
+
JSON(JSON(SubArray2["foo"]), :create_additions => true)
|
446
446
|
end
|
447
447
|
|
448
448
|
def test_generate_core_subclasses_with_default_to_json
|
@@ -28,15 +28,15 @@ class JSONStringMatchingTest < Test::Unit::TestCase
|
|
28
28
|
t_json = [ t ].to_json
|
29
29
|
time_regexp = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/
|
30
30
|
assert_equal [ t ],
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
JSON.parse(
|
32
|
+
t_json,
|
33
|
+
:create_additions => true,
|
34
|
+
:match_string => { time_regexp => TestTime }
|
35
|
+
)
|
36
36
|
assert_equal [ t.strftime('%FT%T%z') ],
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
JSON.parse(
|
38
|
+
t_json,
|
39
|
+
:match_string => { time_regexp => TestTime }
|
40
|
+
)
|
41
41
|
end
|
42
42
|
end
|
data/test/mem.rb
CHANGED
@@ -1,29 +1,30 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
require 'English'
|
5
|
+
$LOAD_PATH << '.'
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
7
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
8
|
|
8
9
|
require 'oj'
|
9
10
|
|
10
11
|
Oj.default_options = { mode: :rails, cache_keys: false, cache_str: -1 }
|
11
12
|
|
12
13
|
def mem
|
13
|
-
`ps -o rss= -p #{
|
14
|
+
`ps -o rss= -p #{$PROCESS_ID}`.to_i
|
14
15
|
end
|
15
16
|
|
16
17
|
('a'..'z').each { |a|
|
17
18
|
('a'..'z').each { |b|
|
18
19
|
('a'..'z').each { |c|
|
19
20
|
('a'..'z').each { |d|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
('a'..'z').each { |e|
|
22
|
+
('a'..'z').each { |f|
|
23
|
+
key = "#{a}#{b}#{c}#{d}#{e}#{f}"
|
24
|
+
Oj.load(%|{ "#{key}": 101}|)
|
25
|
+
# Oj.dump(x)
|
26
|
+
}
|
27
|
+
}
|
27
28
|
}
|
28
29
|
}
|
29
30
|
puts "#{a}#{b} #{mem}"
|
data/test/perf.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
class Perf
|
3
4
|
|
4
|
-
def initialize
|
5
|
+
def initialize
|
5
6
|
@items = []
|
6
7
|
end
|
7
8
|
|
@@ -19,7 +20,7 @@ class Perf
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def run(iter)
|
22
|
-
base = Item.new(nil, nil) {
|
23
|
+
base = Item.new(nil, nil) {}
|
23
24
|
base.run(iter, 0.0)
|
24
25
|
@items.each do |i|
|
25
26
|
i.run(iter, base.duration)
|
@@ -32,35 +33,31 @@ class Perf
|
|
32
33
|
summary()
|
33
34
|
end
|
34
35
|
|
35
|
-
def summary
|
36
|
-
fastest = nil
|
37
|
-
slowest = nil
|
36
|
+
def summary
|
38
37
|
width = 6
|
39
38
|
@items.each do |i|
|
40
39
|
next if i.duration.nil?
|
40
|
+
|
41
41
|
width = i.title.size if width < i.title.size
|
42
42
|
end
|
43
43
|
iva = @items.clone
|
44
44
|
iva.delete_if { |i| i.duration.nil? }
|
45
45
|
iva = iva.sort_by { |i| i.duration }
|
46
46
|
puts
|
47
|
-
puts
|
48
|
-
puts
|
47
|
+
puts 'Summary:'
|
48
|
+
puts '%*s time (secs) rate (ops/sec)' % [width, 'System']
|
49
49
|
puts "#{'-' * width} ----------- --------------"
|
50
50
|
iva.each do |i|
|
51
|
-
|
52
|
-
else
|
53
|
-
puts "%*s %11.3f %14.3f" % [width, i.title, i.duration, i.rate ]
|
54
|
-
end
|
51
|
+
puts '%*s %11.3f %14.3f' % [width, i.title, i.duration, i.rate ] unless i.duration.nil?
|
55
52
|
end
|
56
53
|
puts
|
57
54
|
puts "Comparison Matrix\n(performance factor, 2.0 means row is twice as fast as column)"
|
58
|
-
puts ([' ' * width] + iva.map { |i|
|
59
|
-
puts (['-' * width] + iva.map { |
|
55
|
+
puts ([' ' * width] + iva.map { |i| '%*s' % [width, i.title] }).join(' ')
|
56
|
+
puts (['-' * width] + iva.map { |_i| '-' * width }).join(' ')
|
60
57
|
iva.each do |i|
|
61
|
-
line = [
|
58
|
+
line = ['%*s' % [width, i.title]]
|
62
59
|
iva.each do |o|
|
63
|
-
line <<
|
60
|
+
line << ('%*.2f' % [width, o.duration / i.duration])
|
64
61
|
end
|
65
62
|
puts line.join(' ')
|
66
63
|
end
|
@@ -90,17 +87,15 @@ class Perf
|
|
90
87
|
end
|
91
88
|
|
92
89
|
def run(iter, base)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
@error = "#{e.class}: #{e.message}"
|
103
|
-
end
|
90
|
+
GC.start
|
91
|
+
@before.call unless @before.nil?
|
92
|
+
start = Time.now
|
93
|
+
iter.times { @blk.call }
|
94
|
+
@duration = Time.now - start - base
|
95
|
+
@duration = 0.0 if @duration < 0.0
|
96
|
+
@rate = iter / @duration
|
97
|
+
rescue Exception => e
|
98
|
+
@error = "#{e.class}: #{e.message}"
|
104
99
|
end
|
105
100
|
|
106
101
|
end # Item
|
data/test/perf_compat.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'
|
@@ -11,25 +11,23 @@ require 'oj'
|
|
11
11
|
|
12
12
|
$verbose = false
|
13
13
|
$indent = 0
|
14
|
-
$iter =
|
14
|
+
$iter = 20_000
|
15
15
|
$size = 0
|
16
16
|
|
17
17
|
opts = OptionParser.new
|
18
|
-
opts.on(
|
19
|
-
opts.on(
|
20
|
-
opts.on(
|
21
|
-
opts.on(
|
22
|
-
opts.on(
|
23
|
-
|
18
|
+
opts.on('-v', 'verbose') { $verbose = true }
|
19
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| $iter = i }
|
20
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| $indent = i }
|
21
|
+
opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| $size = i }
|
22
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
23
|
+
opts.parse(ARGV)
|
24
24
|
|
25
25
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
$failed[tag] = "#{e.class}: #{e.message}"
|
32
|
-
end
|
26
|
+
obj = blk.call(orig)
|
27
|
+
puts obj unless orig == obj
|
28
|
+
raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
|
29
|
+
rescue Exception => e
|
30
|
+
$failed[tag] = "#{e.class}: #{e.message}"
|
33
31
|
end
|
34
32
|
|
35
33
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
@@ -39,7 +37,7 @@ capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
|
|
39
37
|
require 'json/ext'
|
40
38
|
JSON.generator = JSON::Ext::Generator
|
41
39
|
JSON.parser = JSON::Ext::Parser
|
42
|
-
JSON.
|
40
|
+
JSON.parse(JSON.generate(o))
|
43
41
|
}
|
44
42
|
|
45
43
|
module One
|
@@ -47,7 +45,7 @@ module One
|
|
47
45
|
module Three
|
48
46
|
class Empty
|
49
47
|
|
50
|
-
def initialize
|
48
|
+
def initialize
|
51
49
|
@a = 1
|
52
50
|
@b = 2
|
53
51
|
@c = 3
|
@@ -58,16 +56,16 @@ module One
|
|
58
56
|
end
|
59
57
|
alias == eql?
|
60
58
|
|
61
|
-
def as_json(*
|
59
|
+
def as_json(*_a)
|
62
60
|
{JSON.create_id => self.class.name, 'a' => @a, 'b' => @b, 'c' => @c }
|
63
61
|
end
|
64
|
-
|
65
|
-
def to_json(*
|
62
|
+
|
63
|
+
def to_json(*_a)
|
66
64
|
JSON.generate(as_json())
|
67
65
|
end
|
68
66
|
|
69
|
-
def self.json_create(
|
70
|
-
|
67
|
+
def self.json_create(_h)
|
68
|
+
new()
|
71
69
|
end
|
72
70
|
end # Empty
|
73
71
|
end # Three
|
@@ -77,8 +75,8 @@ end # One
|
|
77
75
|
$obj = {
|
78
76
|
'a' => 'Alpha', # string
|
79
77
|
'b' => true, # boolean
|
80
|
-
'c' =>
|
81
|
-
'd' => [ true, [false, [-
|
78
|
+
'c' => 12_345, # number
|
79
|
+
'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
|
82
80
|
'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
|
83
81
|
'f' => nil, # nil
|
84
82
|
'g' => One::Two::Three::Empty.new(),
|
@@ -109,13 +107,13 @@ if $verbose
|
|
109
107
|
end
|
110
108
|
|
111
109
|
puts '-' * 80
|
112
|
-
puts
|
110
|
+
puts 'Compat Parse Performance'
|
113
111
|
perf = Perf.new()
|
114
|
-
unless $failed.
|
115
|
-
perf.add('JSON::Ext', 'parse') { JSON.
|
112
|
+
unless $failed.key?('JSON::Ext')
|
113
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
|
116
114
|
perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
|
117
115
|
end
|
118
|
-
unless $failed.
|
116
|
+
unless $failed.key?('Oj:compat')
|
119
117
|
perf.add('Oj:compat', 'compat_load') { Oj.compat_load($json) }
|
120
118
|
end
|
121
119
|
perf.run($iter)
|
@@ -125,6 +123,6 @@ puts '-' * 80
|
|
125
123
|
puts
|
126
124
|
|
127
125
|
unless $failed.empty?
|
128
|
-
puts
|
129
|
-
$failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
|
126
|
+
puts 'The following packages were not included for the reason listed'
|
127
|
+
$failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
130
128
|
end
|
data/test/perf_dump.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
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 'oj'
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
@verbose = false
|
12
|
+
@indent = 2
|
13
|
+
@iter = 100_000
|
14
|
+
@size = 2
|
15
15
|
|
16
16
|
opts = OptionParser.new
|
17
|
-
opts.on(
|
18
|
-
opts.on(
|
19
|
-
opts.on(
|
20
|
-
opts.on(
|
21
|
-
opts.on(
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
opts.on('-v', 'verbose') { @verbose = true }
|
18
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
|
19
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = i }
|
20
|
+
opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| @size = i }
|
21
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
22
|
+
opts.parse(ARGV)
|
23
|
+
|
24
|
+
@obj = {
|
25
25
|
'a' => 'Alpha', # string
|
26
26
|
'b' => true, # boolean
|
27
27
|
'c' => 12345, # number
|
@@ -32,19 +32,19 @@ $obj = {
|
|
32
32
|
'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
33
33
|
}
|
34
34
|
|
35
|
-
Oj.default_options = { :indent =>
|
35
|
+
Oj.default_options = { :indent => @indent, :mode => :strict }
|
36
36
|
|
37
|
-
if 0 <
|
38
|
-
o =
|
39
|
-
|
40
|
-
(4 *
|
41
|
-
|
37
|
+
if 0 < @size
|
38
|
+
o = @obj
|
39
|
+
@obj = []
|
40
|
+
(4 * @size).times do
|
41
|
+
@obj << o
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
@json = Oj.dump(@obj)
|
46
46
|
GC.start
|
47
47
|
start = Time.now
|
48
|
-
|
48
|
+
@iter.times { Oj.dump(@obj) }
|
49
49
|
duration = Time.now - start
|
50
|
-
puts "Dumped #{
|
50
|
+
puts "Dumped #{@json.length} byte JSON #{@iter} times in %0.3f seconds or %0.3f iteration/sec." % [duration, @iter / duration]
|