oj 3.13.7 → 3.13.11
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 +25 -0
- data/README.md +9 -0
- data/ext/oj/custom.c +4 -4
- data/ext/oj/dump.c +63 -88
- data/ext/oj/dump.h +14 -1
- data/ext/oj/dump_compat.c +1 -1
- data/ext/oj/dump_object.c +46 -39
- data/ext/oj/dump_strict.c +2 -2
- data/ext/oj/encoder.c +43 -0
- data/ext/oj/fast.c +13 -3
- data/ext/oj/intern.c +7 -1
- data/ext/oj/mimic_json.c +48 -59
- data/ext/oj/object.c +27 -46
- data/ext/oj/oj.c +109 -153
- data/ext/oj/oj.h +1 -0
- data/ext/oj/parse.c +9 -1
- data/ext/oj/rails.c +5 -5
- data/ext/oj/usual.c +4 -2
- data/ext/oj/wab.c +1 -1
- data/lib/oj/version.rb +1 -1
- data/pages/JsonGem.md +15 -0
- data/pages/Modes.md +6 -3
- data/pages/Rails.md +12 -0
- data/test/bug.rb +16 -0
- data/test/foo.rb +71 -7
- data/test/test_fast.rb +37 -7
- data/test/test_saj.rb +1 -1
- data/test/test_various.rb +27 -2
- data/test/tests.rb +0 -1
- metadata +5 -2
data/test/foo.rb
CHANGED
@@ -1,13 +1,77 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
$: << '.'
|
4
|
+
$: << File.join(File.dirname(__FILE__), "../lib")
|
5
|
+
$: << File.join(File.dirname(__FILE__), "../ext")
|
4
6
|
|
5
|
-
|
7
|
+
require "oj"
|
8
|
+
require "socket"
|
9
|
+
require 'io/nonblock'
|
6
10
|
|
7
|
-
|
8
|
-
|
11
|
+
=begin
|
12
|
+
#pid = spawn("nc -d 0.1 -l 5000", out: "/dev/null")
|
13
|
+
pid = spawn("nc -i 1 -l 7777", out: "/dev/null")
|
14
|
+
at_exit { Process.kill 9, pid }
|
15
|
+
sleep 0.2
|
16
|
+
s = Socket.tcp("localhost", 7777)
|
17
|
+
#s.nonblock = false
|
18
|
+
1_000_000.times do |x|
|
19
|
+
Oj.to_stream(s, { x: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]})
|
20
|
+
end
|
21
|
+
=end
|
9
22
|
|
10
|
-
|
11
|
-
|
23
|
+
=begin
|
24
|
+
IO.pipe do |r, w|
|
25
|
+
if fork
|
26
|
+
r.close
|
27
|
+
#w.nonblock = false
|
28
|
+
1_000_000.times do |i|
|
29
|
+
begin
|
30
|
+
Oj.to_stream(w, { x: i})
|
31
|
+
rescue IOError => e
|
32
|
+
puts "*** #{i} raised #{e.class}: #{e}"
|
33
|
+
IO.select(nil, [w])
|
34
|
+
retry
|
35
|
+
end
|
36
|
+
w.puts
|
37
|
+
end
|
38
|
+
else
|
39
|
+
w.close
|
40
|
+
sleep(0.1)
|
41
|
+
r.each_line { |b|
|
42
|
+
#print b
|
43
|
+
}
|
44
|
+
r.close
|
45
|
+
Process.exit(0)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
=end
|
12
49
|
|
13
|
-
|
50
|
+
IO.pipe do |r, w|
|
51
|
+
if fork
|
52
|
+
r.close
|
53
|
+
#w.nonblock = false
|
54
|
+
a = []
|
55
|
+
10_000.times do |i|
|
56
|
+
a << i
|
57
|
+
end
|
58
|
+
begin
|
59
|
+
Oj.to_stream(w, a, indent: 2)
|
60
|
+
rescue IOError => e
|
61
|
+
puts "*** raised #{e.class}: #{e}"
|
62
|
+
puts "*** fileno: #{w.fileno}"
|
63
|
+
puts "*** is an IO?: #{w.kind_of?(IO)}"
|
64
|
+
IO.select(nil, [w])
|
65
|
+
retry
|
66
|
+
end
|
67
|
+
w.puts
|
68
|
+
else
|
69
|
+
w.close
|
70
|
+
sleep(0.5)
|
71
|
+
r.each_line { |b|
|
72
|
+
#print b
|
73
|
+
}
|
74
|
+
r.close
|
75
|
+
Process.exit(0)
|
76
|
+
end
|
77
|
+
end
|
data/test/test_fast.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# coding: utf-8
|
3
|
+
# frozen_string_literal: true
|
3
4
|
|
4
5
|
$: << File.dirname(__FILE__)
|
5
6
|
|
@@ -36,6 +37,17 @@ class DocTest < Minitest::Test
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
40
|
+
def test_leaf_of_existing_path
|
41
|
+
json = %{{"foo": 1, "fizz": true}}
|
42
|
+
Oj::Doc.open(json) do |doc|
|
43
|
+
%w(/foo/bar /fizz/bar).each do |path|
|
44
|
+
assert_nil(doc.fetch(path))
|
45
|
+
assert_equal(:default, doc.fetch(path, :default))
|
46
|
+
refute(doc.exists?(path))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
39
51
|
def test_true
|
40
52
|
json = %{true}
|
41
53
|
Oj::Doc.open(json) do |doc|
|
@@ -282,11 +294,11 @@ class DocTest < Minitest::Test
|
|
282
294
|
['/nothing', nil],
|
283
295
|
['/array/10', nil],
|
284
296
|
].each do |path,val|
|
285
|
-
|
286
|
-
|
287
|
-
|
297
|
+
if val.nil?
|
298
|
+
assert_nil(doc.fetch(path))
|
299
|
+
else
|
288
300
|
assert_equal(val, doc.fetch(path))
|
289
|
-
|
301
|
+
end
|
290
302
|
end
|
291
303
|
end
|
292
304
|
# verify empty hash and arrays return nil when a member is requested
|
@@ -313,7 +325,7 @@ class DocTest < Minitest::Test
|
|
313
325
|
end
|
314
326
|
end
|
315
327
|
|
316
|
-
def
|
328
|
+
def test_exists
|
317
329
|
Oj::Doc.open(@json1) do |doc|
|
318
330
|
[['/array/1', true],
|
319
331
|
['/array/1', true],
|
@@ -322,7 +334,7 @@ class DocTest < Minitest::Test
|
|
322
334
|
['/array/3', false],
|
323
335
|
['/nothing', false],
|
324
336
|
].each do |path,val|
|
325
|
-
assert_equal(val, doc.exists?(path))
|
337
|
+
assert_equal(val, doc.exists?(path), "failed for #{path.inspect}")
|
326
338
|
end
|
327
339
|
end
|
328
340
|
end
|
@@ -384,6 +396,19 @@ class DocTest < Minitest::Test
|
|
384
396
|
end
|
385
397
|
end
|
386
398
|
|
399
|
+
def test_nested_each_child
|
400
|
+
h = {}
|
401
|
+
Oj::Doc.open('{"a":1,"c":[2],"d":3}') do |doc|
|
402
|
+
doc.each_child('/') do |child|
|
403
|
+
h[child.path] = child.fetch
|
404
|
+
child.each_child do |grandchild|
|
405
|
+
h[grandchild.path] = grandchild.fetch
|
406
|
+
end
|
407
|
+
end
|
408
|
+
end
|
409
|
+
assert_equal({"/a"=>1, "/c"=>[2], "/c/1"=>2, "/d"=>3}, h)
|
410
|
+
end
|
411
|
+
|
387
412
|
def test_size
|
388
413
|
Oj::Doc.open('[1,2,3]') do |doc|
|
389
414
|
assert_equal(4, doc.size)
|
@@ -480,6 +505,11 @@ class DocTest < Minitest::Test
|
|
480
505
|
assert_equal({'/a/x' => 2, '/b/y' => 4}, results)
|
481
506
|
end
|
482
507
|
|
508
|
+
def test_doc_empty
|
509
|
+
result = Oj::Doc.open("") { |doc| doc.each_child {} }
|
510
|
+
assert_nil(result)
|
511
|
+
end
|
512
|
+
|
483
513
|
def test_comment
|
484
514
|
json = %{{
|
485
515
|
"x"/*one*/:/*two*/true,//three
|
data/test/test_saj.rb
CHANGED
@@ -180,7 +180,7 @@ class SajTest < Minitest::Test
|
|
180
180
|
assert_equal([:add_value, 12345, nil], handler.calls.first)
|
181
181
|
type, message, line, column = handler.calls.last
|
182
182
|
assert_equal([:error, 1, 6], [type, line, column])
|
183
|
-
assert_match(%r{invalid format, extra characters at line 1, column 6 \[(?:[a-z\.]+/)*saj\.c:\d+\]}, message)
|
183
|
+
assert_match(%r{invalid format, extra characters at line 1, column 6 \[(?:[A-Za-z]:\/)?(?:[a-z\.]+/)*saj\.c:\d+\]}, message)
|
184
184
|
end
|
185
185
|
|
186
186
|
end
|
data/test/test_various.rb
CHANGED
@@ -528,7 +528,7 @@ class Juice < Minitest::Test
|
|
528
528
|
assert_equal(58, obj.y)
|
529
529
|
end
|
530
530
|
|
531
|
-
# Stream Deeply Nested
|
531
|
+
# Stream Deeply Nested
|
532
532
|
def test_deep_nest_dump
|
533
533
|
begin
|
534
534
|
a = []
|
@@ -541,7 +541,7 @@ class Juice < Minitest::Test
|
|
541
541
|
assert(false, "*** expected an exception")
|
542
542
|
end
|
543
543
|
|
544
|
-
# Stream IO
|
544
|
+
# Stream IO
|
545
545
|
def test_io_string
|
546
546
|
src = { 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}
|
547
547
|
output = StringIO.open("", "w+")
|
@@ -553,6 +553,9 @@ class Juice < Minitest::Test
|
|
553
553
|
end
|
554
554
|
|
555
555
|
def test_io_file
|
556
|
+
# Windows does not support fork
|
557
|
+
return if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
|
558
|
+
|
556
559
|
src = { 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}
|
557
560
|
filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
|
558
561
|
File.open(filename, "w") { |f|
|
@@ -564,6 +567,28 @@ class Juice < Minitest::Test
|
|
564
567
|
assert_equal(src, obj)
|
565
568
|
end
|
566
569
|
|
570
|
+
def test_io_stream
|
571
|
+
IO.pipe do |r, w|
|
572
|
+
if fork
|
573
|
+
r.close
|
574
|
+
#w.nonblock = false
|
575
|
+
a = []
|
576
|
+
10_000.times do |i|
|
577
|
+
a << i
|
578
|
+
end
|
579
|
+
Oj.to_stream(w, a, indent: 2)
|
580
|
+
w.close
|
581
|
+
else
|
582
|
+
w.close
|
583
|
+
sleep(0.1) # to force a busy
|
584
|
+
cnt = 0
|
585
|
+
r.each_line { cnt += 1 }
|
586
|
+
r.close
|
587
|
+
Process.exit(0)
|
588
|
+
end
|
589
|
+
end
|
590
|
+
end
|
591
|
+
|
567
592
|
# comments
|
568
593
|
def test_comment_slash
|
569
594
|
json = %{{
|
data/test/tests.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.13.
|
4
|
+
version: 3.13.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- ext/oj/dump_object.c
|
118
118
|
- ext/oj/dump_strict.c
|
119
119
|
- ext/oj/encode.h
|
120
|
+
- ext/oj/encoder.c
|
120
121
|
- ext/oj/err.c
|
121
122
|
- ext/oj/err.h
|
122
123
|
- ext/oj/extconf.rb
|
@@ -201,6 +202,7 @@ files:
|
|
201
202
|
- test/activesupport6/time_zone_test_helpers.rb
|
202
203
|
- test/bar.rb
|
203
204
|
- test/baz.rb
|
205
|
+
- test/bug.rb
|
204
206
|
- test/files.rb
|
205
207
|
- test/foo.rb
|
206
208
|
- test/helper.rb
|
@@ -332,6 +334,7 @@ test_files:
|
|
332
334
|
- test/activesupport6/time_zone_test_helpers.rb
|
333
335
|
- test/bar.rb
|
334
336
|
- test/baz.rb
|
337
|
+
- test/bug.rb
|
335
338
|
- test/files.rb
|
336
339
|
- test/foo.rb
|
337
340
|
- test/helper.rb
|