oj 3.13.9 → 3.16.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 +101 -0
- data/README.md +13 -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 +19 -33
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +20 -60
- data/ext/oj/custom.c +76 -155
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +203 -213
- data/ext/oj/dump.h +26 -12
- data/ext/oj/dump_compat.c +565 -642
- data/ext/oj/dump_leaf.c +17 -63
- data/ext/oj/dump_object.c +59 -181
- data/ext/oj/dump_strict.c +24 -48
- data/ext/oj/encoder.c +43 -0
- data/ext/oj/err.c +2 -13
- data/ext/oj/err.h +9 -12
- data/ext/oj/extconf.rb +18 -7
- data/ext/oj/fast.c +83 -108
- 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 +104 -81
- data/ext/oj/object.c +50 -67
- data/ext/oj/odd.c +89 -67
- data/ext/oj/odd.h +15 -15
- data/ext/oj/oj.c +171 -106
- data/ext/oj/oj.h +96 -74
- data/ext/oj/parse.c +169 -189
- data/ext/oj/parse.h +23 -24
- data/ext/oj/parser.c +89 -34
- data/ext/oj/parser.h +20 -9
- data/ext/oj/rails.c +86 -151
- data/ext/oj/rails.h +1 -1
- data/ext/oj/reader.c +12 -15
- 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 +21 -32
- 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 -22
- 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 +32 -69
- data/lib/oj/active_support_helper.rb +1 -3
- 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 +162 -150
- data/lib/oj/mimic.rb +6 -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/JsonGem.md +15 -0
- data/pages/Modes.md +6 -3
- data/pages/Options.md +10 -0
- data/pages/Rails.md +12 -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 +15 -15
- 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 +8 -6
- 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 +49 -37
- 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 +95 -43
- data/test/test_custom.rb +72 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +102 -87
- 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 +40 -32
- data/test/test_various.rb +163 -84
- data/test/test_wab.rb +48 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +13 -5
- data/test/tests_mimic.rb +12 -3
- data/test/tests_mimic_addition.rb +12 -3
- metadata +34 -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/test_fast.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
|
6
6
|
require 'helper'
|
7
7
|
|
@@ -51,7 +51,7 @@ class DocTest < Minitest::Test
|
|
51
51
|
json = %{true}
|
52
52
|
Oj::Doc.open(json) do |doc|
|
53
53
|
assert_equal(TrueClass, doc.type)
|
54
|
-
|
54
|
+
assert(doc.fetch())
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -59,7 +59,7 @@ class DocTest < Minitest::Test
|
|
59
59
|
json = %{false}
|
60
60
|
Oj::Doc.open(json) do |doc|
|
61
61
|
assert_equal(FalseClass, doc.type)
|
62
|
-
|
62
|
+
refute(doc.fetch())
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -75,7 +75,7 @@ class DocTest < Minitest::Test
|
|
75
75
|
json = %{"ぴーたー"}
|
76
76
|
Oj::Doc.open(json) do |doc|
|
77
77
|
assert_equal(String, doc.type)
|
78
|
-
assert_equal(
|
78
|
+
assert_equal('ぴーたー', doc.fetch())
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -83,19 +83,15 @@ class DocTest < Minitest::Test
|
|
83
83
|
json = %{"\\u3074\\u30fc\\u305f\\u30fc"}
|
84
84
|
Oj::Doc.open(json) do |doc|
|
85
85
|
assert_equal(String, doc.type)
|
86
|
-
assert_equal(
|
86
|
+
assert_equal('ぴーたー', doc.fetch())
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
90
|
def test_fixnum
|
91
91
|
json = %{12345}
|
92
92
|
Oj::Doc.open(json) do |doc|
|
93
|
-
|
94
|
-
|
95
|
-
else
|
96
|
-
assert_equal(Fixnum, doc.type)
|
97
|
-
end
|
98
|
-
assert_equal(12345, doc.fetch())
|
93
|
+
assert_equal(Integer, doc.type)
|
94
|
+
assert_equal(12_345, doc.fetch())
|
99
95
|
end
|
100
96
|
end
|
101
97
|
|
@@ -103,7 +99,7 @@ class DocTest < Minitest::Test
|
|
103
99
|
json = %{12345.6789}
|
104
100
|
Oj::Doc.open(json) do |doc|
|
105
101
|
assert_equal(Float, doc.type)
|
106
|
-
|
102
|
+
assert_in_delta(12_345.6789, doc.fetch())
|
107
103
|
end
|
108
104
|
end
|
109
105
|
|
@@ -111,8 +107,8 @@ class DocTest < Minitest::Test
|
|
111
107
|
json = %{12345.6789e7}
|
112
108
|
Oj::Doc.open(json) do |doc|
|
113
109
|
assert_equal(Float, doc.type)
|
114
|
-
#assert_equal(12345.6789e7, doc.fetch())
|
115
|
-
assert_equal(
|
110
|
+
# assert_equal(12345.6789e7, doc.fetch())
|
111
|
+
assert_equal(12_345.6789e7.to_i, doc.fetch().to_i)
|
116
112
|
end
|
117
113
|
end
|
118
114
|
|
@@ -120,7 +116,7 @@ class DocTest < Minitest::Test
|
|
120
116
|
json = %{[]}
|
121
117
|
Oj::Doc.open(json) do |doc|
|
122
118
|
assert_equal(Array, doc.type)
|
123
|
-
|
119
|
+
assert_empty(doc.fetch())
|
124
120
|
end
|
125
121
|
end
|
126
122
|
|
@@ -136,7 +132,7 @@ class DocTest < Minitest::Test
|
|
136
132
|
json = %{{}}
|
137
133
|
Oj::Doc.open(json) do |doc|
|
138
134
|
assert_equal(Hash, doc.type)
|
139
|
-
|
135
|
+
assert_empty(doc.fetch())
|
140
136
|
end
|
141
137
|
end
|
142
138
|
|
@@ -171,7 +167,8 @@ class DocTest < Minitest::Test
|
|
171
167
|
|
172
168
|
def test_move
|
173
169
|
Oj::Doc.open(@json1) do |doc|
|
174
|
-
[
|
170
|
+
[
|
171
|
+
'/',
|
175
172
|
'/array',
|
176
173
|
'/boolean',
|
177
174
|
'/array/1/hash/h2/a/3',
|
@@ -204,13 +201,14 @@ class DocTest < Minitest::Test
|
|
204
201
|
|
205
202
|
def test_move_relative
|
206
203
|
Oj::Doc.open(@json1) do |doc|
|
207
|
-
[
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
204
|
+
[
|
205
|
+
['/', 'array', '/array'],
|
206
|
+
['/array', '1/num', '/array/1/num'],
|
207
|
+
['/array/1/hash', 'h2/a', '/array/1/hash/h2/a'],
|
208
|
+
['/array/1', 'hash/h2/a/2', '/array/1/hash/h2/a/2'],
|
209
|
+
['/array/1/hash', '../string', '/array/1/string'],
|
210
|
+
['/array/1/hash', '..', '/array/1'],
|
211
|
+
].each do |start, path, where|
|
214
212
|
doc.move(start)
|
215
213
|
doc.move(path)
|
216
214
|
assert_equal(where, doc.where?)
|
@@ -219,21 +217,17 @@ class DocTest < Minitest::Test
|
|
219
217
|
end
|
220
218
|
|
221
219
|
def test_type
|
222
|
-
if '2.4.0' <= RUBY_VERSION
|
223
|
-
num_class = Integer
|
224
|
-
else
|
225
|
-
num_class = Fixnum
|
226
|
-
end
|
227
220
|
Oj::Doc.open(@json1) do |doc|
|
228
|
-
[
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
221
|
+
[
|
222
|
+
['/', Hash],
|
223
|
+
['/array', Array],
|
224
|
+
['/array/1', Hash],
|
225
|
+
['/array/1/num', Integer],
|
226
|
+
['/array/1/string', String],
|
227
|
+
['/array/1/hash/h2/a', Array],
|
228
|
+
['/array/1/hash/../num', Integer],
|
229
|
+
['/array/1/hash/../..', Array],
|
230
|
+
].each do |path, type|
|
237
231
|
assert_equal(type, doc.type(path))
|
238
232
|
end
|
239
233
|
end
|
@@ -241,16 +235,17 @@ class DocTest < Minitest::Test
|
|
241
235
|
|
242
236
|
def test_local_key
|
243
237
|
Oj::Doc.open(@json1) do |doc|
|
244
|
-
[
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
238
|
+
[
|
239
|
+
['/', nil],
|
240
|
+
['/array', 'array'],
|
241
|
+
['/array/1', 1],
|
242
|
+
['/array/1/num', 'num'],
|
243
|
+
['/array/1/string', 'string'],
|
244
|
+
['/array/1/hash/h2/a', 'a'],
|
245
|
+
['/array/1/hash/../num', 'num'],
|
246
|
+
['/array/1/hash/..', 1],
|
247
|
+
['/array/1/hash/../..', 'array'],
|
248
|
+
].each do |path, key|
|
254
249
|
doc.move(path)
|
255
250
|
if key.nil?
|
256
251
|
assert_nil(doc.local_key())
|
@@ -263,16 +258,17 @@ class DocTest < Minitest::Test
|
|
263
258
|
|
264
259
|
def test_fetch_move
|
265
260
|
Oj::Doc.open(@json1) do |doc|
|
266
|
-
[
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
261
|
+
[
|
262
|
+
['/array/1/num', 3],
|
263
|
+
['/array/1/string', 'message'],
|
264
|
+
['/array/1/hash/h2/a', [1, 2, 3]],
|
265
|
+
['/array/1/hash/../num', 3],
|
266
|
+
['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
|
267
|
+
['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
|
268
|
+
['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
|
269
|
+
['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
|
270
|
+
['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
|
271
|
+
].each do |path, val|
|
276
272
|
doc.move(path)
|
277
273
|
assert_equal(val, doc.fetch())
|
278
274
|
end
|
@@ -281,18 +277,19 @@ class DocTest < Minitest::Test
|
|
281
277
|
|
282
278
|
def test_fetch_path
|
283
279
|
Oj::Doc.open(@json1) do |doc|
|
284
|
-
[
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
280
|
+
[
|
281
|
+
['/array/1/num', 3],
|
282
|
+
['/array/1/string', 'message'],
|
283
|
+
['/array/1/hash/h2/a', [1, 2, 3]],
|
284
|
+
['/array/1/hash/../num', 3],
|
285
|
+
['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
|
286
|
+
['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
|
287
|
+
['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
|
288
|
+
['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
|
289
|
+
['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
|
290
|
+
['/nothing', nil],
|
291
|
+
['/array/10', nil],
|
292
|
+
].each do |path, val|
|
296
293
|
if val.nil?
|
297
294
|
assert_nil(doc.fetch(path))
|
298
295
|
else
|
@@ -309,15 +306,15 @@ class DocTest < Minitest::Test
|
|
309
306
|
assert_nil(doc.fetch('/x'))
|
310
307
|
assert_nil(doc.fetch('/0'))
|
311
308
|
end
|
312
|
-
|
313
309
|
end
|
314
310
|
|
315
311
|
def test_move_fetch_path
|
316
312
|
Oj::Doc.open(@json1) do |doc|
|
317
|
-
[
|
318
|
-
|
319
|
-
|
320
|
-
|
313
|
+
[
|
314
|
+
['/array/1', 'num', 3],
|
315
|
+
['/array/1', 'string', 'message'],
|
316
|
+
['/array/1/hash', 'h2/a', [1, 2, 3]],
|
317
|
+
].each do |path, fetch_path, val|
|
321
318
|
doc.move(path)
|
322
319
|
assert_equal(val, doc.fetch(fetch_path))
|
323
320
|
end
|
@@ -326,13 +323,14 @@ class DocTest < Minitest::Test
|
|
326
323
|
|
327
324
|
def test_exists
|
328
325
|
Oj::Doc.open(@json1) do |doc|
|
329
|
-
[
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
326
|
+
[
|
327
|
+
['/array/1', true],
|
328
|
+
['/array/1', true],
|
329
|
+
['/array/1/hash', true],
|
330
|
+
['/array/1/dash', false],
|
331
|
+
['/array/3', false],
|
332
|
+
['/nothing', false],
|
333
|
+
].each do |path, val|
|
336
334
|
assert_equal(val, doc.exists?(path), "failed for #{path.inspect}")
|
337
335
|
end
|
338
336
|
end
|
@@ -395,6 +393,19 @@ class DocTest < Minitest::Test
|
|
395
393
|
end
|
396
394
|
end
|
397
395
|
|
396
|
+
def test_nested_each_child
|
397
|
+
h = {}
|
398
|
+
Oj::Doc.open('{"a":1,"c":[2],"d":3}') do |doc|
|
399
|
+
doc.each_child('/') do |child|
|
400
|
+
h[child.path] = child.fetch
|
401
|
+
child.each_child do |grandchild|
|
402
|
+
h[grandchild.path] = grandchild.fetch
|
403
|
+
end
|
404
|
+
end
|
405
|
+
end
|
406
|
+
assert_equal({'/a'=>1, '/c'=>[2], '/c/1'=>2, '/d'=>3}, h)
|
407
|
+
end
|
408
|
+
|
398
409
|
def test_size
|
399
410
|
Oj::Doc.open('[1,2,3]') do |doc|
|
400
411
|
assert_equal(4, doc.size)
|
@@ -405,8 +416,8 @@ class DocTest < Minitest::Test
|
|
405
416
|
end
|
406
417
|
|
407
418
|
def test_open_file
|
408
|
-
filename = File.join(
|
409
|
-
File.
|
419
|
+
filename = File.join(__dir__, 'open_file_test.json')
|
420
|
+
File.write(filename, '{"a":[1,2,3]}')
|
410
421
|
Oj::Doc.open_file(filename) do |doc|
|
411
422
|
assert_equal(5, doc.size)
|
412
423
|
end
|
@@ -431,8 +442,8 @@ class DocTest < Minitest::Test
|
|
431
442
|
end
|
432
443
|
|
433
444
|
def test_file_open_close
|
434
|
-
filename = File.join(
|
435
|
-
File.
|
445
|
+
filename = File.join(__dir__, 'open_file_test.json')
|
446
|
+
File.write(filename, '{"a":[1,2,3]}')
|
436
447
|
doc = Oj::Doc.open_file(filename)
|
437
448
|
assert_equal(Oj::Doc, doc.class)
|
438
449
|
assert_equal(5, doc.size)
|
@@ -459,7 +470,6 @@ class DocTest < Minitest::Test
|
|
459
470
|
doc.home()
|
460
471
|
assert_equal(2, doc.fetch('/a/2'))
|
461
472
|
assert_equal(2, doc.fetch('a/2'))
|
462
|
-
doc = nil
|
463
473
|
GC.start
|
464
474
|
# a print statement confirms close is called
|
465
475
|
end
|
@@ -491,6 +501,11 @@ class DocTest < Minitest::Test
|
|
491
501
|
assert_equal({'/a/x' => 2, '/b/y' => 4}, results)
|
492
502
|
end
|
493
503
|
|
504
|
+
def test_doc_empty
|
505
|
+
result = Oj::Doc.open('') { |doc| doc.each_child {} }
|
506
|
+
assert_nil(result)
|
507
|
+
end
|
508
|
+
|
494
509
|
def test_comment
|
495
510
|
json = %{{
|
496
511
|
"x"/*one*/:/*two*/true,//three
|
data/test/test_file.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
|
6
6
|
require 'helper'
|
7
7
|
|
@@ -19,35 +19,29 @@ class FileJuice < Minitest::Test
|
|
19
19
|
end
|
20
20
|
alias == eql?
|
21
21
|
|
22
|
-
end# Jam
|
22
|
+
end # Jam
|
23
23
|
|
24
24
|
class Jeez < Jam
|
25
|
-
def initialize(x, y)
|
26
|
-
super
|
27
|
-
end
|
28
25
|
|
29
|
-
def to_json()
|
26
|
+
def to_json(*_args)
|
30
27
|
%{{"json_class":"#{self.class}","x":#{@x},"y":#{@y}}}
|
31
28
|
end
|
32
29
|
|
33
30
|
def self.json_create(h)
|
34
|
-
|
31
|
+
new(h['x'], h['y'])
|
35
32
|
end
|
36
|
-
end# Jeez
|
33
|
+
end # Jeez
|
37
34
|
|
38
35
|
class Orange < Jam
|
39
|
-
def initialize(x, y)
|
40
|
-
super
|
41
|
-
end
|
42
36
|
|
43
|
-
def as_json
|
37
|
+
def as_json
|
44
38
|
{ :json_class => self.class,
|
45
39
|
:x => @x,
|
46
40
|
:y => @y }
|
47
41
|
end
|
48
42
|
|
49
43
|
def self.json_create(h)
|
50
|
-
|
44
|
+
new(h['x'], h['y'])
|
51
45
|
end
|
52
46
|
end
|
53
47
|
|
@@ -73,8 +67,8 @@ class FileJuice < Minitest::Test
|
|
73
67
|
|
74
68
|
def test_fixnum
|
75
69
|
dump_and_load(0, false)
|
76
|
-
dump_and_load(
|
77
|
-
dump_and_load(-
|
70
|
+
dump_and_load(12_345, false)
|
71
|
+
dump_and_load(-54_321, false)
|
78
72
|
dump_and_load(1, false)
|
79
73
|
end
|
80
74
|
|
@@ -82,9 +76,9 @@ class FileJuice < Minitest::Test
|
|
82
76
|
mode = Oj.default_options()[:mode]
|
83
77
|
Oj.default_options = {:mode => :object}
|
84
78
|
dump_and_load(0.0, false)
|
85
|
-
dump_and_load(
|
79
|
+
dump_and_load(12_345.6789, false)
|
86
80
|
dump_and_load(70.35, false)
|
87
|
-
dump_and_load(-
|
81
|
+
dump_and_load(-54_321.012, false)
|
88
82
|
dump_and_load(1.7775, false)
|
89
83
|
dump_and_load(2.5024, false)
|
90
84
|
dump_and_load(2.48e16, false)
|
@@ -118,9 +112,9 @@ class FileJuice < Minitest::Test
|
|
118
112
|
# Symbol
|
119
113
|
def test_symbol_object
|
120
114
|
Oj.default_options = { :mode => :object }
|
121
|
-
#dump_and_load(''.to_sym, false)
|
115
|
+
# dump_and_load(''.to_sym, false)
|
122
116
|
dump_and_load(:abc, false)
|
123
|
-
dump_and_load(
|
117
|
+
dump_and_load(:":xyz", false)
|
124
118
|
end
|
125
119
|
|
126
120
|
# Time
|
@@ -129,10 +123,11 @@ class FileJuice < Minitest::Test
|
|
129
123
|
Oj.default_options = { :mode => :object, :time_format => :unix_zone }
|
130
124
|
dump_and_load(t, false)
|
131
125
|
end
|
126
|
+
|
132
127
|
def test_time_object_early
|
133
|
-
|
134
|
-
|
135
|
-
t = Time.xmlschema(
|
128
|
+
skip 'Windows does not support dates before 1970.' if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
|
129
|
+
|
130
|
+
t = Time.xmlschema('1954-01-05T00:00:00.123456')
|
136
131
|
Oj.default_options = { :mode => :object, :time_format => :unix_zone }
|
137
132
|
dump_and_load(t, false)
|
138
133
|
end
|
@@ -162,12 +157,10 @@ class FileJuice < Minitest::Test
|
|
162
157
|
def test_range_object
|
163
158
|
Oj.default_options = { :mode => :object }
|
164
159
|
json = Oj.dump(1..7, :mode => :object, :indent => 0)
|
165
|
-
if
|
166
|
-
assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
|
167
|
-
elsif 'jruby' == $ruby
|
168
|
-
assert(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}} == json)
|
169
|
-
else
|
160
|
+
if $ruby == 'ruby'
|
170
161
|
assert_equal(%{{"^u":["Range",1,7,false]}}, json)
|
162
|
+
else
|
163
|
+
assert_equal(%{{"^O":"Range","begin":1,"end":7,"exclude_end?":false}}, json)
|
171
164
|
end
|
172
165
|
dump_and_load(1..7, false)
|
173
166
|
dump_and_load(1..1, false)
|
@@ -212,9 +205,27 @@ class FileJuice < Minitest::Test
|
|
212
205
|
dump_and_load(DateTime.new(2012, 6, 19), false)
|
213
206
|
end
|
214
207
|
|
208
|
+
def test_load_unicode_path
|
209
|
+
json =<<~JSON
|
210
|
+
{
|
211
|
+
"x":true,
|
212
|
+
"y":58,
|
213
|
+
"z": [1,2,3]
|
214
|
+
}
|
215
|
+
JSON
|
216
|
+
|
217
|
+
Tempfile.create('file_test_conceição1.json') do |f|
|
218
|
+
f.write(json)
|
219
|
+
f.close
|
220
|
+
|
221
|
+
objects = Oj.load_file(f.path)
|
222
|
+
assert_equal(Oj.load(json), objects)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
215
226
|
def dump_and_load(obj, trace=false)
|
216
|
-
filename = File.join(
|
217
|
-
File.open(filename,
|
227
|
+
filename = File.join(__dir__, 'file_test.json')
|
228
|
+
File.open(filename, 'w') { |f|
|
218
229
|
Oj.to_stream(f, obj, :indent => 2)
|
219
230
|
}
|
220
231
|
puts "\n*** file: '#{File.read(filename)}'" if trace
|
data/test/test_gc.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
|
6
6
|
require 'helper'
|
7
7
|
|
@@ -14,22 +14,24 @@ class GCTest < Minitest::Test
|
|
14
14
|
@child = child
|
15
15
|
end
|
16
16
|
|
17
|
-
def to_hash
|
18
|
-
{ 'json_class' =>
|
17
|
+
def to_hash
|
18
|
+
{ 'json_class' => self.class.to_s, 'x' => x, 'child' => child }
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.json_create(h)
|
22
22
|
GC.start
|
23
|
-
|
23
|
+
new(h['x'], h['child'])
|
24
24
|
end
|
25
25
|
end # Goo
|
26
26
|
|
27
27
|
def setup
|
28
28
|
@default_options = Oj.default_options
|
29
|
+
GC.stress = true
|
29
30
|
end
|
30
31
|
|
31
32
|
def teardown
|
32
33
|
Oj.default_options = @default_options
|
34
|
+
GC.stress = false
|
33
35
|
end
|
34
36
|
|
35
37
|
# if no crash then the GC marking is working
|
@@ -46,4 +48,13 @@ class GCTest < Minitest::Test
|
|
46
48
|
json = Oj.dump(g, :mode => :object)
|
47
49
|
Oj.object_load(json)
|
48
50
|
end
|
51
|
+
|
52
|
+
def test_parse_gc
|
53
|
+
json = '{"a":"Alpha","b":true,"c":12345,"d":[true,[false,[-123456789,null],3.9676,["Something else.",false],null]],"e":{"zero":null,"one":1,"two":2,"three":[3],"four":[0,1,2,3,4]},"f":null,"h":{"a":{"b":{"c":{"d":{"e":{"f":{"g":null}}}}}}},"i":[[[[[[[null]]]]]]]}'
|
54
|
+
|
55
|
+
50.times do
|
56
|
+
data = Oj.load(json)
|
57
|
+
assert_equal(json, Oj.dump(data))
|
58
|
+
end
|
59
|
+
end
|
49
60
|
end
|
data/test/test_generate.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'
|
@@ -15,7 +15,7 @@ class Generator < Minitest::Test
|
|
15
15
|
|
16
16
|
def test_before
|
17
17
|
json = Oj.generate({})
|
18
|
-
assert_equal(
|
18
|
+
assert_equal('{}', json)
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
data/test/test_hash.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
|
6
6
|
require 'helper'
|
7
7
|
|
@@ -19,7 +19,7 @@ class HashTest < Minitest::Test
|
|
19
19
|
|
20
20
|
def test_load
|
21
21
|
obj = Oj.load(%|{"abc":3}|, :mode => :compat, :hash_class => Oj::EasyHash)
|
22
|
-
|
22
|
+
|
23
23
|
assert_equal(Oj::EasyHash, obj.class)
|
24
24
|
assert_equal(3, obj['abc'])
|
25
25
|
assert_equal(3, obj[:abc])
|
@@ -35,5 +35,5 @@ class HashTest < Minitest::Test
|
|
35
35
|
assert_equal(Oj::EasyHash, obj.class)
|
36
36
|
assert_equal(3, obj[:abc])
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
end # HashTest
|
data/test/test_integer_range.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'
|
@@ -23,19 +23,19 @@ class IntegerRangeTest < Minitest::Test
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_range
|
26
|
-
test = {s: 0, s2: -1, s3: 1, u: -2, u2: 2, u3:
|
26
|
+
test = {s: 0, s2: -1, s3: 1, u: -2, u2: 2, u3: 9_007_199_254_740_993}
|
27
27
|
exp = '{"s":0,"s2":-1,"s3":1,"u":"-2","u2":"2","u3":"9007199254740993"}'
|
28
28
|
assert_equal(exp, Oj.dump(test, integer_range: (-1..1)))
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_bignum
|
32
|
-
test = {u: -
|
32
|
+
test = {u: -10_000_000_000_000_000_000, u2: 10_000_000_000_000_000_000}
|
33
33
|
exp = '{"u":"-10000000000000000000","u2":"10000000000000000000"}'
|
34
34
|
assert_equal(exp, Oj.dump(test, integer_range: (-1..1)))
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_valid_modes
|
38
|
-
test = {safe: 0, unsafe:
|
38
|
+
test = {safe: 0, unsafe: 9_007_199_254_740_993}
|
39
39
|
exp = '{"safe":0,"unsafe":"9007199254740993"}'
|
40
40
|
|
41
41
|
[:strict, :null, :compat, :rails, :custom].each do |mode|
|
@@ -49,7 +49,7 @@ class IntegerRangeTest < Minitest::Test
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def test_modes_without_opt
|
52
|
-
test = {safe:0, unsafe:
|
52
|
+
test = {safe: 0, unsafe: 10_000_000_000_000_000_000}
|
53
53
|
exp = '{"safe":0,"unsafe":10000000000000000000}'
|
54
54
|
|
55
55
|
[:strict, :null, :compat, :rails, :custom].each do |mode|
|
@@ -63,7 +63,7 @@ class IntegerRangeTest < Minitest::Test
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def test_accept_nil_and_false
|
66
|
-
test = {safe:0, unsafe:
|
66
|
+
test = {safe: 0, unsafe: 10_000_000_000_000_000_000}
|
67
67
|
exp = '{"safe":0,"unsafe":10000000000000000000}'
|
68
68
|
|
69
69
|
assert_equal(exp, Oj.dump(test, integer_range: nil))
|