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.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -0
  3. data/README.md +4 -2
  4. data/ext/oj/buf.h +11 -6
  5. data/ext/oj/cache.c +25 -24
  6. data/ext/oj/cache8.c +10 -9
  7. data/ext/oj/circarray.c +8 -6
  8. data/ext/oj/circarray.h +2 -2
  9. data/ext/oj/code.c +17 -24
  10. data/ext/oj/code.h +2 -2
  11. data/ext/oj/compat.c +17 -44
  12. data/ext/oj/custom.c +70 -141
  13. data/ext/oj/debug.c +3 -9
  14. data/ext/oj/dump.c +128 -118
  15. data/ext/oj/dump.h +12 -8
  16. data/ext/oj/dump_compat.c +564 -641
  17. data/ext/oj/dump_leaf.c +17 -63
  18. data/ext/oj/dump_object.c +70 -199
  19. data/ext/oj/dump_strict.c +22 -46
  20. data/ext/oj/encoder.c +1 -1
  21. data/ext/oj/err.c +2 -13
  22. data/ext/oj/err.h +9 -12
  23. data/ext/oj/extconf.rb +14 -5
  24. data/ext/oj/fast.c +75 -103
  25. data/ext/oj/intern.c +52 -50
  26. data/ext/oj/intern.h +4 -8
  27. data/ext/oj/mem.c +318 -0
  28. data/ext/oj/mem.h +53 -0
  29. data/ext/oj/mimic_json.c +75 -47
  30. data/ext/oj/object.c +49 -66
  31. data/ext/oj/odd.c +89 -67
  32. data/ext/oj/odd.h +15 -15
  33. data/ext/oj/oj.c +140 -99
  34. data/ext/oj/oj.h +80 -51
  35. data/ext/oj/parse.c +162 -184
  36. data/ext/oj/parse.h +7 -10
  37. data/ext/oj/parser.c +89 -34
  38. data/ext/oj/parser.h +18 -7
  39. data/ext/oj/rails.c +82 -146
  40. data/ext/oj/rails.h +1 -1
  41. data/ext/oj/reader.c +11 -12
  42. data/ext/oj/reader.h +4 -2
  43. data/ext/oj/resolve.c +3 -4
  44. data/ext/oj/rxclass.c +6 -5
  45. data/ext/oj/rxclass.h +1 -1
  46. data/ext/oj/saj.c +20 -31
  47. data/ext/oj/saj2.c +329 -93
  48. data/ext/oj/saj2.h +23 -0
  49. data/ext/oj/scp.c +3 -14
  50. data/ext/oj/sparse.c +26 -70
  51. data/ext/oj/stream_writer.c +12 -22
  52. data/ext/oj/strict.c +20 -52
  53. data/ext/oj/string_writer.c +21 -21
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +105 -150
  56. data/ext/oj/usual.h +68 -0
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +1 -1
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/validate.c +21 -26
  61. data/ext/oj/wab.c +31 -68
  62. data/lib/oj/active_support_helper.rb +0 -1
  63. data/lib/oj/bag.rb +7 -1
  64. data/lib/oj/easy_hash.rb +4 -5
  65. data/lib/oj/error.rb +0 -1
  66. data/lib/oj/json.rb +4 -2
  67. data/lib/oj/mimic.rb +4 -2
  68. data/lib/oj/saj.rb +20 -6
  69. data/lib/oj/state.rb +9 -6
  70. data/lib/oj/version.rb +1 -2
  71. data/lib/oj.rb +2 -0
  72. data/pages/Compatibility.md +1 -1
  73. data/pages/InstallOptions.md +20 -0
  74. data/pages/Options.md +10 -0
  75. data/test/_test_active.rb +8 -9
  76. data/test/_test_active_mimic.rb +7 -8
  77. data/test/_test_mimic_rails.rb +17 -20
  78. data/test/activerecord/result_test.rb +5 -6
  79. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  80. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  81. data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
  82. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  83. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  84. data/test/files.rb +15 -15
  85. data/test/foo.rb +9 -71
  86. data/test/helper.rb +11 -8
  87. data/test/isolated/shared.rb +3 -2
  88. data/test/json_gem/json_addition_test.rb +2 -2
  89. data/test/json_gem/json_common_interface_test.rb +4 -4
  90. data/test/json_gem/json_encoding_test.rb +0 -0
  91. data/test/json_gem/json_ext_parser_test.rb +1 -0
  92. data/test/json_gem/json_fixtures_test.rb +3 -2
  93. data/test/json_gem/json_generator_test.rb +48 -36
  94. data/test/json_gem/json_generic_object_test.rb +11 -11
  95. data/test/json_gem/json_parser_test.rb +54 -47
  96. data/test/json_gem/json_string_matching_test.rb +9 -9
  97. data/test/json_gem/test_helper.rb +7 -3
  98. data/test/mem.rb +13 -12
  99. data/test/perf.rb +21 -26
  100. data/test/perf_compat.rb +31 -33
  101. data/test/perf_dump.rb +50 -0
  102. data/test/perf_fast.rb +80 -82
  103. data/test/perf_file.rb +27 -29
  104. data/test/perf_object.rb +65 -69
  105. data/test/perf_once.rb +12 -11
  106. data/test/perf_parser.rb +42 -48
  107. data/test/perf_saj.rb +46 -54
  108. data/test/perf_scp.rb +57 -69
  109. data/test/perf_simple.rb +41 -39
  110. data/test/perf_strict.rb +68 -70
  111. data/test/perf_wab.rb +67 -69
  112. data/test/prec.rb +3 -3
  113. data/test/sample/change.rb +0 -1
  114. data/test/sample/dir.rb +0 -1
  115. data/test/sample/doc.rb +0 -1
  116. data/test/sample/file.rb +0 -1
  117. data/test/sample/group.rb +0 -1
  118. data/test/sample/hasprops.rb +0 -1
  119. data/test/sample/layer.rb +0 -1
  120. data/test/sample/rect.rb +0 -1
  121. data/test/sample/shape.rb +0 -1
  122. data/test/sample/text.rb +0 -1
  123. data/test/sample.rb +16 -16
  124. data/test/sample_json.rb +8 -8
  125. data/test/test_compat.rb +76 -42
  126. data/test/test_custom.rb +72 -51
  127. data/test/test_debian.rb +7 -10
  128. data/test/test_fast.rb +86 -90
  129. data/test/test_file.rb +41 -30
  130. data/test/test_gc.rb +16 -5
  131. data/test/test_generate.rb +5 -5
  132. data/test/test_hash.rb +4 -4
  133. data/test/test_integer_range.rb +9 -9
  134. data/test/test_null.rb +20 -20
  135. data/test/test_object.rb +85 -96
  136. data/test/test_parser.rb +6 -22
  137. data/test/test_parser_debug.rb +27 -0
  138. data/test/test_parser_saj.rb +115 -23
  139. data/test/test_parser_usual.rb +6 -6
  140. data/test/test_rails.rb +2 -2
  141. data/test/test_saj.rb +10 -8
  142. data/test/test_scp.rb +37 -39
  143. data/test/test_strict.rb +30 -32
  144. data/test/test_various.rb +147 -99
  145. data/test/test_wab.rb +48 -44
  146. data/test/test_writer.rb +47 -47
  147. data/test/tests.rb +13 -4
  148. data/test/tests_mimic.rb +12 -3
  149. data/test/tests_mimic_addition.rb +12 -3
  150. metadata +33 -144
  151. data/test/activesupport4/decoding_test.rb +0 -108
  152. data/test/activesupport4/encoding_test.rb +0 -531
  153. data/test/activesupport4/test_helper.rb +0 -41
  154. data/test/activesupport5/test_helper.rb +0 -72
  155. data/test/bar.rb +0 -16
  156. data/test/baz.rb +0 -16
  157. data/test/bug.rb +0 -16
  158. data/test/zoo.rb +0 -13
data/test/test_custom.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: utf-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
5
- $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
4
+ $LOAD_PATH << __dir__
5
+ @oj_dir = File.dirname(File.expand_path(__dir__))
6
6
  %w(lib ext).each do |dir|
7
- $: << File.join($oj_dir, dir)
7
+ $LOAD_PATH << File.join(@oj_dir, dir)
8
8
  end
9
9
 
10
10
  require 'minitest'
@@ -27,19 +27,24 @@ class CustomJuice < Minitest::Test
27
27
  @y = y
28
28
  @_z = x.to_s
29
29
  end
30
+
30
31
  def ==(o)
31
32
  self.class == o.class && @x == o.x && @y = o.y
32
33
  end
33
- def to_json(*args)
34
+
35
+ def to_json(*_args)
34
36
  %|{"xx":#{@x},"yy":#{y}}|
35
37
  end
36
- def raw_json(depth, indent)
38
+
39
+ def raw_json(_depth, _indent)
37
40
  %|{"xxx":#{@x},"yyy":#{y}}|
38
41
  end
39
- def as_json(*args)
42
+
43
+ def as_json(*_args)
40
44
  {'a' => @x, :b => @y }
41
45
  end
42
- def to_hash()
46
+
47
+ def to_hash
43
48
  {'b' => @x, 'n' => @y }
44
49
  end
45
50
  end
@@ -51,10 +56,12 @@ class CustomJuice < Minitest::Test
51
56
  @x = x
52
57
  @y = y
53
58
  end
59
+
54
60
  def ==(o)
55
61
  self.class == o.class && @x == o.x && @y = o.y
56
62
  end
57
- def as_json(*args)
63
+
64
+ def as_json(*_args)
58
65
  {'a' => @x, :b => @y }
59
66
  end
60
67
  end
@@ -66,10 +73,12 @@ class CustomJuice < Minitest::Test
66
73
  @x = x
67
74
  @y = y
68
75
  end
76
+
69
77
  def ==(o)
70
78
  self.class == o.class && @x == o.x && @y = o.y
71
79
  end
72
- def as_json(*args)
80
+
81
+ def as_json(*_args)
73
82
  a = @x
74
83
  a = a.as_json if a.respond_to?('as_json')
75
84
  b = @y
@@ -101,16 +110,16 @@ class CustomJuice < Minitest::Test
101
110
 
102
111
  def test_fixnum
103
112
  dump_and_load(0, false)
104
- dump_and_load(12345, false)
105
- dump_and_load(-54321, false)
113
+ dump_and_load(12_345, false)
114
+ dump_and_load(-54_321, false)
106
115
  dump_and_load(1, false)
107
116
  end
108
117
 
109
118
  def test_float
110
119
  dump_and_load(0.0, false)
111
- dump_and_load(12345.6789, false)
120
+ dump_and_load(12_345.6789, false)
112
121
  dump_and_load(70.35, false)
113
- dump_and_load(-54321.012, false)
122
+ dump_and_load(-54_321.012, false)
114
123
  dump_and_load(1.7775, false)
115
124
  dump_and_load(2.5024, false)
116
125
  dump_and_load(2.48e16, false)
@@ -119,12 +128,12 @@ class CustomJuice < Minitest::Test
119
128
  end
120
129
 
121
130
  def test_float_parse
122
- f = Oj.load("12.123456789012345678", mode: :custom, bigdecimal_load: :float);
131
+ f = Oj.load('12.123456789012345678', mode: :custom, bigdecimal_load: :float)
123
132
  assert_equal(Float, f.class)
124
133
  end
125
134
 
126
135
  def test_float_parse_fast
127
- f = Oj.load("12.123456789012345678", mode: :custom, bigdecimal_load: :fast);
136
+ f = Oj.load('12.123456789012345678', mode: :custom, bigdecimal_load: :fast)
128
137
  assert_equal(Float, f.class)
129
138
  assert(12.12345678901234 <= f && f < 12.12345678901236)
130
139
  end
@@ -139,7 +148,7 @@ class CustomJuice < Minitest::Test
139
148
  assert(true)
140
149
  return
141
150
  end
142
- assert(false, "*** expected an exception")
151
+ assert(false, '*** expected an exception')
143
152
  end
144
153
 
145
154
  def test_infinity_dump
@@ -152,7 +161,7 @@ class CustomJuice < Minitest::Test
152
161
  assert(true)
153
162
  return
154
163
  end
155
- assert(false, "*** expected an exception")
164
+ assert(false, '*** expected an exception')
156
165
  end
157
166
 
158
167
  def test_neg_infinity_dump
@@ -165,7 +174,7 @@ class CustomJuice < Minitest::Test
165
174
  assert(true)
166
175
  return
167
176
  end
168
- assert(false, "*** expected an exception")
177
+ assert(false, '*** expected an exception')
169
178
  end
170
179
 
171
180
  def test_string
@@ -176,15 +185,15 @@ class CustomJuice < Minitest::Test
176
185
  end
177
186
 
178
187
  def test_string_ascii
179
- json = Oj.dump("ぴーたー", :escape_mode => :ascii)
188
+ json = Oj.dump('ぴーたー', :escape_mode => :ascii)
180
189
  assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
181
- dump_and_load("ぴーたー", false, :escape_mode => :ascii)
190
+ dump_and_load('ぴーたー', false, :escape_mode => :ascii)
182
191
  end
183
192
 
184
193
  def test_string_json
185
- json = Oj.dump("ぴーたー", :escape_mode => :json)
194
+ json = Oj.dump('ぴーたー', :escape_mode => :json)
186
195
  assert_equal(%{"ぴーたー"}, json)
187
- dump_and_load("ぴーたー", false, :escape_mode => :json)
196
+ dump_and_load('ぴーたー', false, :escape_mode => :json)
188
197
  end
189
198
 
190
199
  def test_array
@@ -196,15 +205,17 @@ class CustomJuice < Minitest::Test
196
205
  end
197
206
 
198
207
  def test_array_deep
199
- dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
208
+ dump_and_load([1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20]]]]]]]]]]]]]]]]]]]], false)
200
209
  end
201
210
 
202
211
  def test_deep_nest
212
+ skip 'TruffleRuby causes SEGV' if RUBY_ENGINE == 'truffleruby'
213
+
203
214
  begin
204
- n = 10000
205
- Oj.strict_load('[' * n + ']' * n)
215
+ n = 10_000
216
+ Oj.strict_load(('[' * n) + (']' * n))
206
217
  rescue Exception => e
207
- assert(false, e.message)
218
+ refute(e.message)
208
219
  end
209
220
  end
210
221
 
@@ -259,11 +270,11 @@ class CustomJuice < Minitest::Test
259
270
 
260
271
  def test_object
261
272
  obj = Jeez.new(true, 58)
262
- json = Oj.dump(obj, create_id: "^o", use_to_json: false, use_as_json: false, use_to_hash: false)
273
+ json = Oj.dump(obj, create_id: '^o', use_to_json: false, use_as_json: false, use_to_hash: false)
263
274
  assert_equal(%|{"x":true,"y":58,"_z":"true"}|, json)
264
- json = Oj.dump(obj, create_id: "^o", use_to_json: false, use_as_json: false, use_to_hash: false, ignore_under: true)
275
+ json = Oj.dump(obj, create_id: '^o', use_to_json: false, use_as_json: false, use_to_hash: false, ignore_under: true)
265
276
  assert_equal(%|{"x":true,"y":58}|, json)
266
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
277
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
267
278
  end
268
279
 
269
280
  def test_object_to_json
@@ -341,7 +352,6 @@ class CustomJuice < Minitest::Test
341
352
  "b":[3]
342
353
  }
343
354
  |, json)
344
-
345
355
  end
346
356
 
347
357
  def test_symbol
@@ -392,24 +402,29 @@ class CustomJuice < Minitest::Test
392
402
  assert_equal(%|{"x":{"a":1}}|, json)
393
403
  end
394
404
 
405
+ def test_omit_null_byte
406
+ json = Oj.dump({ "fo\x00o" => "b\x00ar" }, :omit_null_byte => true)
407
+ assert_equal(%|{"foo":"bar"}|, json)
408
+ end
409
+
395
410
  def test_complex
396
411
  obj = Complex(2, 9)
397
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
412
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
398
413
  end
399
414
 
400
415
  def test_rational
401
416
  obj = Rational(2, 9)
402
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
417
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
403
418
  end
404
419
 
405
420
  def test_range
406
421
  obj = 3..8
407
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
422
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
408
423
  end
409
424
 
410
425
  def test_date
411
426
  obj = Date.new(2017, 1, 5)
412
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
427
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
413
428
  end
414
429
 
415
430
  def test_date_unix
@@ -438,7 +453,7 @@ class CustomJuice < Minitest::Test
438
453
 
439
454
  def test_datetime
440
455
  obj = DateTime.new(2017, 1, 5, 10, 20, 30)
441
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
456
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
442
457
  end
443
458
 
444
459
  def test_datetime_unix
@@ -448,12 +463,9 @@ class CustomJuice < Minitest::Test
448
463
  end
449
464
 
450
465
  def test_datetime_unix_zone
451
- # older versions seems to have issues getting the utc offset.
452
- if '2.4' <= RUBY_VERSION
453
- obj = DateTime.new(2017, 1, 5, 10, 20, 30, '-0500')
454
- json = Oj.dump(obj, :indent => 2, time_format: :unix_zone)
455
- assert_equal('1483629630.000000000e-18000', json)
456
- end
466
+ obj = DateTime.new(2017, 1, 5, 10, 20, 30, '-0500')
467
+ json = Oj.dump(obj, :indent => 2, time_format: :unix_zone)
468
+ assert_equal('1483629630.000000000e-18000', json)
457
469
  end
458
470
 
459
471
  def test_datetime_ruby
@@ -471,20 +483,29 @@ class CustomJuice < Minitest::Test
471
483
  def test_regexp
472
484
  # this notation must be used to get an == match later
473
485
  obj = /(?ix-m:^yes$)/
474
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
486
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
475
487
  end
476
488
 
477
489
  def test_openstruct
478
490
  obj = OpenStruct.new(:a => 1, 'b' => 2)
479
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
491
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
480
492
  end
481
493
 
482
494
  def test_time
495
+ skip 'TruffleRuby fails this spec' if RUBY_ENGINE == 'truffleruby'
496
+
483
497
  obj = Time.now()
484
- dump_load_dump(obj, false, :time_format => :unix, :create_id => "^o", :create_additions => true)
485
- dump_load_dump(obj, false, :time_format => :unix_zone, :create_id => "^o", :create_additions => true)
486
- dump_load_dump(obj, false, :time_format => :xmlschema, :create_id => "^o", :create_additions => true)
487
- dump_load_dump(obj, false, :time_format => :ruby, :create_id => "^o", :create_additions => true)
498
+ # These two forms should be able to recreate the time precisely,
499
+ # so we check they can load a dumped version and recreate the
500
+ # original object correctly.
501
+ dump_and_load(obj, false, :time_format => :unix, :create_id => '^o', :create_additions => true)
502
+ dump_and_load(obj, false, :time_format => :unix_zone, :create_id => '^o', :create_additions => true)
503
+ # These two forms will lose precision while dumping as they don't
504
+ # preserve full precision. We check that a dumped version is equal
505
+ # to that version loaded and dumped a second time, but don't check
506
+ # that the loaded Ruby objects is still the same as the original.
507
+ dump_load_dump(obj, false, :time_format => :xmlschema, :create_id => '^o', :create_additions => true)
508
+ dump_load_dump(obj, false, :time_format => :ruby, :create_id => '^o', :create_additions => true)
488
509
  end
489
510
 
490
511
  def dump_and_load(obj, trace=false, options={})
@@ -492,7 +513,7 @@ class CustomJuice < Minitest::Test
492
513
  json = Oj.dump(obj, options)
493
514
  puts json if trace
494
515
 
495
- loaded = Oj.load(json, options);
516
+ loaded = Oj.load(json, options)
496
517
  if obj.nil?
497
518
  assert_nil(loaded)
498
519
  else
@@ -506,7 +527,7 @@ class CustomJuice < Minitest::Test
506
527
  json = Oj.dump(obj, options)
507
528
  puts json if trace
508
529
 
509
- loaded = Oj.load(json, options);
530
+ loaded = Oj.load(json, options)
510
531
  if obj.nil?
511
532
  assert_nil(loaded)
512
533
  else
@@ -520,7 +541,7 @@ class CustomJuice < Minitest::Test
520
541
  json = Oj.dump(obj, options)
521
542
  puts json if trace
522
543
 
523
- loaded = Oj.load(json, options);
544
+ loaded = Oj.load(json, options)
524
545
  if obj.nil?
525
546
  assert_nil(loaded)
526
547
  else
data/test/test_debian.rb CHANGED
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'helper'
4
4
 
@@ -16,22 +16,19 @@ class DebJuice < Minitest::Test
16
16
  end
17
17
  alias == eql?
18
18
 
19
- end# Jam
19
+ end # Jam
20
20
 
21
21
  # contributed by sauliusg to fix as_json
22
22
  class Orange < Jam
23
- def initialize(x, y)
24
- super
25
- end
26
23
 
27
- def as_json()
24
+ def as_json
28
25
  { :json_class => self.class,
29
26
  :x => @x,
30
27
  :y => @y }
31
28
  end
32
29
 
33
30
  def self.json_create(h)
34
- self.new(h['x'], h['y'])
31
+ new(h['x'], h['y'])
35
32
  end
36
33
  end
37
34
 
@@ -39,13 +36,13 @@ class DebJuice < Minitest::Test
39
36
  Oj.default_options = { :mode => :compat, :class_cache => true, :use_as_json => true }
40
37
  obj = Orange.new(true, 58)
41
38
  json = Oj.dump(obj, :indent => 2)
42
- assert(!json.nil?)
39
+ refute_nil(json)
43
40
  dump_and_load(obj, true)
44
41
  end
45
42
 
46
- def dump_and_load(obj, trace=false)
43
+ def dump_and_load(obj, _trace=false)
47
44
  json = Oj.dump(obj, :indent => 2)
48
- loaded = Oj.load(json);
45
+ loaded = Oj.load(json)
49
46
  assert_equal(obj, loaded)
50
47
  loaded
51
48
  end