oj 3.13.11 → 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 +74 -0
- data/README.md +4 -2
- data/ext/oj/buf.h +11 -6
- data/ext/oj/cache.c +25 -24
- data/ext/oj/cache8.c +10 -9
- data/ext/oj/circarray.c +8 -6
- data/ext/oj/circarray.h +2 -2
- data/ext/oj/code.c +17 -24
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +17 -44
- data/ext/oj/custom.c +70 -141
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +128 -118
- data/ext/oj/dump.h +12 -8
- data/ext/oj/dump_compat.c +564 -641
- data/ext/oj/dump_leaf.c +17 -63
- data/ext/oj/dump_object.c +70 -199
- data/ext/oj/dump_strict.c +22 -46
- 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 +14 -5
- data/ext/oj/fast.c +75 -103
- data/ext/oj/intern.c +52 -50
- data/ext/oj/intern.h +4 -8
- data/ext/oj/mem.c +318 -0
- data/ext/oj/mem.h +53 -0
- data/ext/oj/mimic_json.c +75 -47
- data/ext/oj/object.c +49 -66
- data/ext/oj/odd.c +89 -67
- data/ext/oj/odd.h +15 -15
- data/ext/oj/oj.c +140 -99
- data/ext/oj/oj.h +80 -51
- data/ext/oj/parse.c +162 -184
- data/ext/oj/parse.h +7 -10
- data/ext/oj/parser.c +89 -34
- data/ext/oj/parser.h +18 -7
- data/ext/oj/rails.c +82 -146
- data/ext/oj/rails.h +1 -1
- data/ext/oj/reader.c +11 -12
- data/ext/oj/reader.h +4 -2
- data/ext/oj/resolve.c +3 -4
- data/ext/oj/rxclass.c +6 -5
- data/ext/oj/rxclass.h +1 -1
- data/ext/oj/saj.c +20 -31
- data/ext/oj/saj2.c +329 -93
- data/ext/oj/saj2.h +23 -0
- data/ext/oj/scp.c +3 -14
- data/ext/oj/sparse.c +26 -70
- data/ext/oj/stream_writer.c +12 -22
- data/ext/oj/strict.c +20 -52
- data/ext/oj/string_writer.c +21 -21
- data/ext/oj/trace.h +31 -4
- data/ext/oj/usual.c +105 -150
- data/ext/oj/usual.h +68 -0
- data/ext/oj/util.h +1 -1
- data/ext/oj/val_stack.c +1 -1
- data/ext/oj/val_stack.h +8 -7
- data/ext/oj/validate.c +21 -26
- data/ext/oj/wab.c +31 -68
- 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/saj.rb +20 -6
- data/lib/oj/state.rb +9 -6
- data/lib/oj/version.rb +1 -2
- data/lib/oj.rb +2 -0
- data/pages/Compatibility.md +1 -1
- data/pages/InstallOptions.md +20 -0
- data/pages/Options.md +10 -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/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
- data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
- data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
- data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
- data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
- data/test/files.rb +15 -15
- data/test/foo.rb +9 -71
- data/test/helper.rb +11 -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 +48 -36
- data/test/json_gem/json_generic_object_test.rb +11 -11
- data/test/json_gem/json_parser_test.rb +54 -47
- data/test/json_gem/json_string_matching_test.rb +9 -9
- data/test/json_gem/test_helper.rb +7 -3
- data/test/mem.rb +13 -12
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +31 -33
- data/test/perf_dump.rb +50 -0
- 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 +42 -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 +76 -42
- data/test/test_custom.rb +72 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +86 -90
- data/test/test_file.rb +41 -30
- data/test/test_gc.rb +16 -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 +85 -96
- data/test/test_parser.rb +6 -22
- data/test/test_parser_debug.rb +27 -0
- data/test/test_parser_saj.rb +115 -23
- 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 +37 -39
- data/test/test_strict.rb +30 -32
- data/test/test_various.rb +147 -99
- data/test/test_wab.rb +48 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +13 -4
- data/test/tests_mimic.rb +12 -3
- data/test/tests_mimic_addition.rb +12 -3
- metadata +33 -144
- 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/test_helper.rb +0 -72
- data/test/bar.rb +0 -16
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
data/test/perf_wab.rb
CHANGED
@@ -1,131 +1,129 @@
|
|
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'
|
10
10
|
require 'oj'
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
@verbose = false
|
13
|
+
@indent = 0
|
14
|
+
@iter = 20_000
|
15
|
+
@with_bignum = false
|
16
|
+
@with_nums = true
|
17
|
+
@size = 0
|
18
18
|
|
19
19
|
opts = OptionParser.new
|
20
|
-
opts.on(
|
21
|
-
opts.on(
|
22
|
-
opts.on(
|
23
|
-
opts.on(
|
24
|
-
opts.on(
|
25
|
-
opts.on(
|
26
|
-
|
20
|
+
opts.on('-v', 'verbose') { @verbose = true }
|
21
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
|
22
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = 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('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
26
|
+
opts.parse(ARGV)
|
27
27
|
|
28
|
-
|
28
|
+
@obj = {
|
29
29
|
a: 'Alpha', # string
|
30
30
|
b: true, # boolean
|
31
|
-
c:
|
32
|
-
d: [ true, [false, [-
|
31
|
+
c: 12_345, # number
|
32
|
+
d: [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
|
33
33
|
e: { zero: nil, one: 1, two: 2, three: [3], four: [0, 1, 2, 3, 4] }, # hash
|
34
34
|
f: nil, # nil
|
35
35
|
h: { a: { b: { c: { d: {e: { f: { g: nil }}}}}}}, # deep hash, not that deep
|
36
36
|
i: [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
37
37
|
}
|
38
|
-
|
38
|
+
@obj[:g] = 12_345_678_901_234_567_890_123_456_789 if @with_bignum
|
39
39
|
|
40
|
-
Oj.default_options = { :indent =>
|
40
|
+
Oj.default_options = { :indent => @indent, :mode => :wab }
|
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
|
-
|
51
|
-
|
52
|
-
#puts "*** size: #{
|
53
|
-
#puts "*** #{
|
54
|
-
|
50
|
+
@json = Oj.dump(@obj)
|
51
|
+
@obj_json = Oj.dump(@obj, :mode => :object)
|
52
|
+
# puts "*** size: #{@obj_json.size}"
|
53
|
+
# puts "*** #{@obj_json}"
|
54
|
+
@failed = {} # key is same as String used in tests later
|
55
55
|
|
56
56
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
$failed[tag] = "#{e.class}: #{e.message}"
|
62
|
-
end
|
57
|
+
obj = blk.call(orig)
|
58
|
+
raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
|
59
|
+
rescue Exception => e
|
60
|
+
@failed[tag] = "#{e.class}: #{e.message}"
|
63
61
|
end
|
64
62
|
|
65
63
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
66
|
-
capture_error('Oj:wab',
|
67
|
-
capture_error('Yajl',
|
68
|
-
capture_error('JSON::Ext',
|
64
|
+
capture_error('Oj:wab', @obj, 'load', 'dump') { |o| Oj.wab_load(Oj.dump(o, :mode => :wab)) }
|
65
|
+
capture_error('Yajl', @obj, 'encode', 'parse') { |o| require 'yajl'; Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
|
66
|
+
capture_error('JSON::Ext', @obj, 'generate', 'parse') { |o|
|
69
67
|
require 'json'
|
70
68
|
require 'json/ext'
|
71
69
|
JSON.generator = JSON::Ext::Generator
|
72
70
|
JSON.parser = JSON::Ext::Parser
|
73
71
|
JSON.parse(JSON.generate(o))
|
74
72
|
}
|
75
|
-
capture_error('JSON::Pure',
|
73
|
+
capture_error('JSON::Pure', @obj, 'generate', 'parse') { |o|
|
76
74
|
require 'json/pure'
|
77
75
|
JSON.generator = JSON::Pure::Generator
|
78
76
|
JSON.parser = JSON::Pure::Parser
|
79
77
|
JSON.parse(JSON.generate(o))
|
80
78
|
}
|
81
79
|
|
82
|
-
if
|
83
|
-
puts "json:\n#{
|
84
|
-
puts "object json:\n#{
|
85
|
-
puts "Oj loaded object:\n#{Oj.wab_load(
|
86
|
-
puts "Yajl loaded object:\n#{Yajl::Parser.parse(
|
87
|
-
puts "JSON loaded object:\n#{JSON::Ext::Parser.new(
|
80
|
+
if @verbose
|
81
|
+
puts "json:\n#{@json}\n"
|
82
|
+
puts "object json:\n#{@obj_json}\n"
|
83
|
+
puts "Oj loaded object:\n#{Oj.wab_load(@json)}\n"
|
84
|
+
puts "Yajl loaded object:\n#{Yajl::Parser.parse(@json)}\n"
|
85
|
+
puts "JSON loaded object:\n#{JSON::Ext::Parser.new(@json).parse}\n"
|
88
86
|
end
|
89
87
|
|
90
88
|
puts '-' * 80
|
91
|
-
puts
|
89
|
+
puts 'Wab Parse Performance'
|
92
90
|
perf = Perf.new()
|
93
|
-
unless
|
94
|
-
perf.add('JSON::Ext', 'parse') { JSON.parse(
|
91
|
+
unless @failed.key?('JSON::Ext')
|
92
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse(@json) }
|
95
93
|
perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
|
96
94
|
end
|
97
|
-
unless
|
98
|
-
perf.add('JSON::Pure', 'parse') { JSON.parse(
|
95
|
+
unless @failed.key?('JSON::Pure')
|
96
|
+
perf.add('JSON::Pure', 'parse') { JSON.parse(@json) }
|
99
97
|
perf.before('JSON::Pure') { JSON.parser = JSON::Pure::Parser }
|
100
98
|
end
|
101
|
-
unless
|
102
|
-
perf.add('Oj:wab', 'wab_load') { Oj.wab_load(
|
99
|
+
unless @failed.key?('Oj:wab')
|
100
|
+
perf.add('Oj:wab', 'wab_load') { Oj.wab_load(@json) }
|
103
101
|
end
|
104
|
-
perf.add('Yajl', 'parse') { Yajl::Parser.parse(
|
105
|
-
perf.run(
|
102
|
+
perf.add('Yajl', 'parse') { Yajl::Parser.parse(@json) } unless @failed.key?('Yajl')
|
103
|
+
perf.run(@iter)
|
106
104
|
|
107
105
|
puts '-' * 80
|
108
|
-
puts
|
106
|
+
puts 'Wab Dump Performance'
|
109
107
|
perf = Perf.new()
|
110
|
-
unless
|
111
|
-
perf.add('JSON::Ext', 'dump') { JSON.generate(
|
108
|
+
unless @failed.key?('JSON::Ext')
|
109
|
+
perf.add('JSON::Ext', 'dump') { JSON.generate(@obj) }
|
112
110
|
perf.before('JSON::Ext') { JSON.generator = JSON::Ext::Generator }
|
113
111
|
end
|
114
|
-
unless
|
115
|
-
perf.add('JSON::Pure', 'generate') { JSON.generate(
|
112
|
+
unless @failed.key?('JSON::Pure')
|
113
|
+
perf.add('JSON::Pure', 'generate') { JSON.generate(@obj) }
|
116
114
|
perf.before('JSON::Pure') { JSON.generator = JSON::Pure::Generator }
|
117
115
|
end
|
118
|
-
unless
|
119
|
-
perf.add('Oj:wab', 'dump') { Oj.dump(
|
116
|
+
unless @failed.key?('Oj:wab')
|
117
|
+
perf.add('Oj:wab', 'dump') { Oj.dump(@obj, :mode => :wab) }
|
120
118
|
end
|
121
|
-
perf.add('Yajl', 'encode') { Yajl::Encoder.encode(
|
122
|
-
perf.run(
|
119
|
+
perf.add('Yajl', 'encode') { Yajl::Encoder.encode(@obj) } unless @failed.key?('Yajl')
|
120
|
+
perf.run(@iter)
|
123
121
|
|
124
122
|
puts
|
125
123
|
puts '-' * 80
|
126
124
|
puts
|
127
125
|
|
128
|
-
unless
|
129
|
-
puts
|
130
|
-
|
126
|
+
unless @failed.empty?
|
127
|
+
puts 'The following packages were not included for the reason listed'
|
128
|
+
@failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
131
129
|
end
|
data/test/prec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'oj'
|
4
4
|
|
5
|
-
extras = {
|
5
|
+
extras = {'locationLng' => -97.14690769100295}
|
6
6
|
|
7
7
|
Oj.default_options = {float_precision: 17}
|
8
8
|
|
@@ -10,13 +10,13 @@ encoded = Oj.dump(extras)
|
|
10
10
|
puts encoded
|
11
11
|
puts Oj.load(encoded)
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'active_record'
|
14
14
|
|
15
15
|
Oj::Rails.set_encoder()
|
16
16
|
Oj::Rails.set_decoder()
|
17
17
|
|
18
18
|
Oj.default_options = {float_precision: 17}
|
19
|
-
# Using Oj rails encoder, gets the correct value: {
|
19
|
+
# Using Oj rails encoder, gets the correct value: {'locationLng':-97.14690769100295}
|
20
20
|
encoded = ActiveSupport::JSON.encode(extras)
|
21
21
|
puts encoded
|
22
22
|
puts ActiveSupport::JSON.decode(encoded)
|
data/test/sample/change.rb
CHANGED
data/test/sample/dir.rb
CHANGED
data/test/sample/doc.rb
CHANGED
data/test/sample/file.rb
CHANGED
data/test/sample/group.rb
CHANGED
data/test/sample/hasprops.rb
CHANGED
data/test/sample/layer.rb
CHANGED
data/test/sample/rect.rb
CHANGED
data/test/sample/shape.rb
CHANGED
data/test/sample/text.rb
CHANGED
data/test/sample.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
#!/usr/bin/env ruby -wW2
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
if $
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
if $PROGRAM_NAME == __FILE__
|
5
|
+
$LOAD_PATH << '.'
|
6
|
+
$LOAD_PATH << '..'
|
7
|
+
$LOAD_PATH << '../lib'
|
8
|
+
$LOAD_PATH << '../ext'
|
8
9
|
end
|
9
10
|
|
10
|
-
require 'pp'
|
11
11
|
require 'sample/doc'
|
12
12
|
|
13
13
|
def sample_doc(size=3)
|
14
14
|
colors = [ :black, :gray, :white, :red, :blue, :yellow, :green, :purple, :orange ]
|
15
15
|
|
16
|
-
d =
|
16
|
+
d = Sample::Doc.new('Sample')
|
17
17
|
|
18
18
|
# add some history
|
19
19
|
(0..size * 10).each do |i|
|
@@ -22,22 +22,22 @@ def sample_doc(size=3)
|
|
22
22
|
|
23
23
|
# add some layers
|
24
24
|
(1..size).each do |i|
|
25
|
-
layer =
|
25
|
+
layer = Sample::Layer.new("Layer-#{i}")
|
26
26
|
(1..size).each do |j|
|
27
|
-
g =
|
27
|
+
g = Sample::Group.new
|
28
28
|
(1..size).each do |k|
|
29
|
-
g2 =
|
30
|
-
r =
|
31
|
-
|
29
|
+
g2 = Sample::Group.new
|
30
|
+
r = Sample::Rect.new((j * 40) + 10.0, i * 10.0,
|
31
|
+
10.123456 / k, 10.0 / k, colors[(i + j + k) % colors.size])
|
32
32
|
r.add_prop(:part_of, layer.name)
|
33
33
|
g2 << r
|
34
|
-
g2 <<
|
34
|
+
g2 << Sample::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
|
35
35
|
g << g2
|
36
36
|
end
|
37
|
-
g2 =
|
37
|
+
g2 = Sample::Group.new
|
38
38
|
(1..size).each do |k|
|
39
|
-
o =
|
40
|
-
|
39
|
+
o = Sample::Oval.new((j * 40) + 12.0, (i * 10.0) + 2.0,
|
40
|
+
6.0 / k, 6.0 / k, colors[(i + j + k) % colors.size])
|
41
41
|
o.add_prop(:inside, true)
|
42
42
|
g << o
|
43
43
|
end
|
data/test/sample_json.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
if $
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
if $PROGRAM_NAME == __FILE__
|
5
|
+
$LOAD_PATH << '.'
|
6
|
+
$LOAD_PATH << '..'
|
7
|
+
$LOAD_PATH << '../lib'
|
8
|
+
$LOAD_PATH << '../ext'
|
8
9
|
end
|
9
10
|
|
10
|
-
require 'pp'
|
11
11
|
require 'oj'
|
12
12
|
|
13
13
|
def sample_json(size=3)
|
@@ -32,6 +32,6 @@ def sample_json(size=3)
|
|
32
32
|
container
|
33
33
|
end
|
34
34
|
|
35
|
-
if $
|
36
|
-
File.
|
35
|
+
if $PROGRAM_NAME == __FILE__
|
36
|
+
File.write('sample.json', Oj.dump(sample_json(3), :indent => 2))
|
37
37
|
end
|
data/test/test_compat.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
|
+
@oj_dir = File.dirname(File.expand_path(__dir__))
|
6
6
|
%w(lib ext).each do |dir|
|
7
|
-
|
7
|
+
$LOAD_PATH << File.join(@oj_dir, dir)
|
8
8
|
end
|
9
9
|
|
10
10
|
require 'minitest'
|
@@ -29,18 +29,16 @@ class CompatJuice < Minitest::Test
|
|
29
29
|
end
|
30
30
|
alias == eql?
|
31
31
|
|
32
|
-
def to_json(*
|
33
|
-
%|{"json_class":"#{self.class
|
32
|
+
def to_json(*_a)
|
33
|
+
%|{"json_class":"#{self.class}","x":#{@x},"y":#{@y}}|
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.json_create(h)
|
37
|
-
|
37
|
+
new(h['x'], h['y'])
|
38
38
|
end
|
39
39
|
end # Jeez
|
40
40
|
|
41
41
|
class Argy
|
42
|
-
def initialize()
|
43
|
-
end
|
44
42
|
|
45
43
|
def to_json(*a)
|
46
44
|
%|{"args":"#{a}"}|
|
@@ -48,10 +46,8 @@ class CompatJuice < Minitest::Test
|
|
48
46
|
end # Argy
|
49
47
|
|
50
48
|
class Stringy
|
51
|
-
def initialize()
|
52
|
-
end
|
53
49
|
|
54
|
-
def to_s
|
50
|
+
def to_s
|
55
51
|
%|[1,2]|
|
56
52
|
end
|
57
53
|
end # Stringy
|
@@ -61,20 +57,17 @@ class CompatJuice < Minitest::Test
|
|
61
57
|
module Three
|
62
58
|
class Deep
|
63
59
|
|
64
|
-
def initialize()
|
65
|
-
end
|
66
|
-
|
67
60
|
def eql?(o)
|
68
61
|
self.class == o.class
|
69
62
|
end
|
70
63
|
alias == eql?
|
71
64
|
|
72
|
-
def to_json(*
|
65
|
+
def to_json(*_a)
|
73
66
|
%|{"json_class":"#{self.class.name}"}|
|
74
67
|
end
|
75
68
|
|
76
|
-
def self.json_create(
|
77
|
-
|
69
|
+
def self.json_create(_h)
|
70
|
+
new()
|
78
71
|
end
|
79
72
|
end # Deep
|
80
73
|
end # Three
|
@@ -106,24 +99,30 @@ class CompatJuice < Minitest::Test
|
|
106
99
|
|
107
100
|
def test_fixnum
|
108
101
|
dump_and_load(0, false)
|
109
|
-
dump_and_load(
|
110
|
-
dump_and_load(-
|
102
|
+
dump_and_load(12_345, false)
|
103
|
+
dump_and_load(-54_321, false)
|
111
104
|
dump_and_load(1, false)
|
112
105
|
end
|
113
106
|
|
107
|
+
def test_fixnum_array
|
108
|
+
data = (1..1000).to_a
|
109
|
+
json = Oj.dump(data, mode: :compat)
|
110
|
+
assert_equal("[#{data.join(',')}]", json)
|
111
|
+
end
|
112
|
+
|
114
113
|
def test_float
|
115
114
|
dump_and_load(0.0, false)
|
116
115
|
dump_and_load(0.56, false)
|
117
116
|
dump_and_load(3.0, false)
|
118
|
-
dump_and_load(
|
117
|
+
dump_and_load(12_345.6789, false)
|
119
118
|
dump_and_load(70.35, false)
|
120
|
-
dump_and_load(-
|
119
|
+
dump_and_load(-54_321.012, false)
|
121
120
|
dump_and_load(1.7775, false)
|
122
121
|
dump_and_load(2.5024, false)
|
123
122
|
dump_and_load(2.48e16, false)
|
124
123
|
dump_and_load(2.48e100 * 1.0e10, false)
|
125
124
|
dump_and_load(-2.48e100 * 1.0e10, false)
|
126
|
-
dump_and_load(
|
125
|
+
dump_and_load(1_405_460_727.723866, false)
|
127
126
|
dump_and_load(0.5773, false)
|
128
127
|
dump_and_load(0.6768, false)
|
129
128
|
dump_and_load(0.685, false)
|
@@ -148,7 +147,7 @@ class CompatJuice < Minitest::Test
|
|
148
147
|
def test_encode
|
149
148
|
opts = Oj.default_options
|
150
149
|
Oj.default_options = { :ascii_only => true }
|
151
|
-
json = Oj.dump(
|
150
|
+
json = Oj.dump('ぴーたー')
|
152
151
|
assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
|
153
152
|
Oj.default_options = opts
|
154
153
|
end
|
@@ -170,7 +169,7 @@ class CompatJuice < Minitest::Test
|
|
170
169
|
end
|
171
170
|
|
172
171
|
def test_array_deep
|
173
|
-
dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
|
172
|
+
dump_and_load([1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20]]]]]]]]]]]]]]]]]]]], false)
|
174
173
|
end
|
175
174
|
|
176
175
|
def test_symbol
|
@@ -179,8 +178,8 @@ class CompatJuice < Minitest::Test
|
|
179
178
|
end
|
180
179
|
|
181
180
|
def test_time_xml_schema
|
182
|
-
t = Time.xmlschema(
|
183
|
-
#t = Time.local(2012, 1, 5, 23, 58, 7, 123456)
|
181
|
+
t = Time.xmlschema('2012-01-05T23:58:07.123456000+09:00')
|
182
|
+
# t = Time.local(2012, 1, 5, 23, 58, 7, 123456)
|
184
183
|
json = Oj.dump(t, :mode => :compat)
|
185
184
|
assert_equal(%{"2012-01-05 23:58:07 +0900"}, json)
|
186
185
|
end
|
@@ -199,8 +198,9 @@ class CompatJuice < Minitest::Test
|
|
199
198
|
def test_non_str_hash
|
200
199
|
json = Oj.dump({ 1 => true, 0 => false }, :mode => :compat)
|
201
200
|
h = Oj.load(json, :mode => :strict)
|
202
|
-
assert_equal({
|
201
|
+
assert_equal({ '1' => true, '0' => false }, h)
|
203
202
|
end
|
203
|
+
|
204
204
|
def test_hash
|
205
205
|
dump_and_load({}, false)
|
206
206
|
dump_and_load({ 'true' => true, 'false' => false}, false)
|
@@ -239,12 +239,12 @@ class CompatJuice < Minitest::Test
|
|
239
239
|
def test_invalid_escapes_handled
|
240
240
|
json = '{"subtext":"\"404er\” \w \k \3 \a"}'
|
241
241
|
obj = Oj.compat_load(json)
|
242
|
-
assert_equal({
|
242
|
+
assert_equal({'subtext' => '"404er” w k 3 a'}, obj)
|
243
243
|
end
|
244
244
|
|
245
245
|
def test_hash_escaping
|
246
246
|
json = Oj.to_json({'<>' => '<>'}, mode: :compat)
|
247
|
-
assert_equal(
|
247
|
+
assert_equal('{"<>":"<>"}', json)
|
248
248
|
end
|
249
249
|
|
250
250
|
def test_bignum_object
|
@@ -271,7 +271,7 @@ class CompatJuice < Minitest::Test
|
|
271
271
|
def test_bignum_compat
|
272
272
|
json = Oj.dump(7 ** 55, :mode => :compat)
|
273
273
|
b = Oj.load(json, :mode => :strict)
|
274
|
-
assert_equal(
|
274
|
+
assert_equal(30_226_801_971_775_055_948_247_051_683_954_096_612_865_741_943, b)
|
275
275
|
end
|
276
276
|
|
277
277
|
# BigDecimal
|
@@ -313,7 +313,7 @@ class CompatJuice < Minitest::Test
|
|
313
313
|
if x.is_a?(String)
|
314
314
|
assert_equal(orig.to_s, x)
|
315
315
|
else # better be a Hash
|
316
|
-
assert_equal({
|
316
|
+
assert_equal({'year' => orig.year, 'month' => orig.month, 'day' => orig.day, 'start' => orig.start}, x)
|
317
317
|
end
|
318
318
|
end
|
319
319
|
|
@@ -340,13 +340,13 @@ class CompatJuice < Minitest::Test
|
|
340
340
|
end
|
341
341
|
|
342
342
|
def test_io_file
|
343
|
-
filename = File.join(
|
344
|
-
File.
|
343
|
+
filename = File.join(__dir__, 'open_file_test.json')
|
344
|
+
File.write(filename, %{{
|
345
345
|
"x":true,
|
346
346
|
"y":58,
|
347
347
|
"z": [1,2,3]
|
348
348
|
}
|
349
|
-
})
|
349
|
+
})
|
350
350
|
f = File.new(filename)
|
351
351
|
obj = Oj.compat_load(f)
|
352
352
|
f.close()
|
@@ -410,7 +410,7 @@ class CompatJuice < Minitest::Test
|
|
410
410
|
|
411
411
|
# A child to_json should not be called.
|
412
412
|
def test_json_object_child
|
413
|
-
obj = {
|
413
|
+
obj = { 'child' => Jeez.new(true, 58) }
|
414
414
|
assert_equal('{"child":{"json_class":"CompatJuice::Jeez","x":true,"y":58}}', Oj.dump(obj))
|
415
415
|
end
|
416
416
|
|
@@ -431,10 +431,10 @@ class CompatJuice < Minitest::Test
|
|
431
431
|
begin
|
432
432
|
Oj.compat_load(json, :create_additions => true)
|
433
433
|
rescue Exception => e
|
434
|
-
assert_equal(
|
434
|
+
assert_equal('ArgumentError', e.class().name)
|
435
435
|
return
|
436
436
|
end
|
437
|
-
assert(false,
|
437
|
+
assert(false, '*** expected an exception')
|
438
438
|
end
|
439
439
|
|
440
440
|
def test_json_object_create_cache
|
@@ -450,7 +450,7 @@ class CompatJuice < Minitest::Test
|
|
450
450
|
expected = Jeez.new(true, 58)
|
451
451
|
json = Oj.to_json(expected)
|
452
452
|
json.gsub!('json_class', '_class_')
|
453
|
-
obj = Oj.compat_load(json, :create_id =>
|
453
|
+
obj = Oj.compat_load(json, :create_id => '_class_', :create_additions => true)
|
454
454
|
assert_equal(expected, obj)
|
455
455
|
end
|
456
456
|
|
@@ -485,13 +485,47 @@ class CompatJuice < Minitest::Test
|
|
485
485
|
|
486
486
|
def test_parse_to_s
|
487
487
|
s = Stringy.new
|
488
|
-
assert_equal([1,2], Oj.load(s, :mode => :compat))
|
488
|
+
assert_equal([1, 2], Oj.load(s, :mode => :compat))
|
489
|
+
end
|
490
|
+
|
491
|
+
def test_parse_large_string
|
492
|
+
error = assert_raises() { Oj.load(%|{"a":"aaaaaaaaaa\0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}|) }
|
493
|
+
assert_includes(error.message, 'NULL byte in string')
|
494
|
+
|
495
|
+
error = assert_raises() { Oj.load(%|{"a":"aaaaaaaaaaaaaaaaaaaa }|) }
|
496
|
+
assert_includes(error.message, 'quoted string not terminated')
|
497
|
+
|
498
|
+
json =<<~JSON
|
499
|
+
{
|
500
|
+
"a": "\\u3074\\u30fc\\u305f\\u30fc",
|
501
|
+
"b": "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
502
|
+
}
|
503
|
+
JSON
|
504
|
+
assert_equal('ぴーたー', Oj.load(json)['a'])
|
505
|
+
end
|
506
|
+
|
507
|
+
def test_parse_large_escaped_string
|
508
|
+
invalid_json = %|{"a":"aaaa\\nbbbb\\rcccc\\tddd\\feee\\bf/\\\\\\u3074\\u30fc\\u305f\\u30fc }|
|
509
|
+
error = assert_raises() { Oj.load(invalid_json) }
|
510
|
+
assert_includes(error.message, 'quoted string not terminated')
|
511
|
+
|
512
|
+
json = '"aaaa\\nbbbb\\rcccc\\tddd\\feee\\bf/\\\\\\u3074\\u30fc\\u305f\\u30fc "'
|
513
|
+
assert_equal("aaaa\nbbbb\rcccc\tddd\feee\bf/\\ぴーたー ", Oj.load(json))
|
514
|
+
end
|
515
|
+
|
516
|
+
def test_invalid_to_s
|
517
|
+
obj = Object.new
|
518
|
+
def obj.to_s
|
519
|
+
nil
|
520
|
+
end
|
521
|
+
|
522
|
+
assert_raises(TypeError) { Oj.dump(obj, mode: :compat) }
|
489
523
|
end
|
490
524
|
|
491
525
|
def dump_and_load(obj, trace=false)
|
492
526
|
json = Oj.dump(obj)
|
493
527
|
puts json if trace
|
494
|
-
loaded = Oj.compat_load(json, :create_additions => true)
|
528
|
+
loaded = Oj.compat_load(json, :create_additions => true)
|
495
529
|
if obj.nil?
|
496
530
|
assert_nil(loaded)
|
497
531
|
else
|
@@ -503,7 +537,7 @@ class CompatJuice < Minitest::Test
|
|
503
537
|
def dump_to_json_and_load(obj, trace=false)
|
504
538
|
json = Oj.to_json(obj, :indent => ' ')
|
505
539
|
puts json if trace
|
506
|
-
loaded = Oj.compat_load(json, :create_additions => true)
|
540
|
+
loaded = Oj.compat_load(json, :create_additions => true)
|
507
541
|
if obj.nil?
|
508
542
|
assert_nil(loaded)
|
509
543
|
else
|