oj 3.13.23 → 3.16.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +81 -0
  3. data/README.md +2 -2
  4. data/ext/oj/buf.h +7 -6
  5. data/ext/oj/cache.c +29 -26
  6. data/ext/oj/cache.h +3 -2
  7. data/ext/oj/cache8.c +10 -9
  8. data/ext/oj/circarray.c +7 -5
  9. data/ext/oj/circarray.h +2 -2
  10. data/ext/oj/code.c +5 -12
  11. data/ext/oj/code.h +2 -2
  12. data/ext/oj/compat.c +20 -60
  13. data/ext/oj/custom.c +26 -59
  14. data/ext/oj/debug.c +3 -9
  15. data/ext/oj/dump.c +103 -53
  16. data/ext/oj/dump.h +1 -4
  17. data/ext/oj/dump_compat.c +557 -592
  18. data/ext/oj/dump_leaf.c +3 -5
  19. data/ext/oj/dump_object.c +42 -48
  20. data/ext/oj/dump_strict.c +10 -22
  21. data/ext/oj/encoder.c +1 -1
  22. data/ext/oj/err.c +2 -13
  23. data/ext/oj/err.h +9 -12
  24. data/ext/oj/extconf.rb +16 -7
  25. data/ext/oj/fast.c +60 -92
  26. data/ext/oj/intern.c +62 -47
  27. data/ext/oj/intern.h +3 -7
  28. data/ext/oj/mem.c +318 -0
  29. data/ext/oj/mem.h +53 -0
  30. data/ext/oj/mimic_json.c +51 -32
  31. data/ext/oj/object.c +33 -43
  32. data/ext/oj/odd.c +8 -6
  33. data/ext/oj/odd.h +4 -4
  34. data/ext/oj/oj.c +243 -212
  35. data/ext/oj/oj.h +83 -81
  36. data/ext/oj/parse.c +94 -148
  37. data/ext/oj/parse.h +21 -24
  38. data/ext/oj/parser.c +80 -67
  39. data/ext/oj/parser.h +7 -8
  40. data/ext/oj/rails.c +70 -92
  41. data/ext/oj/reader.c +9 -14
  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 +10 -9
  47. data/ext/oj/saj2.c +37 -49
  48. data/ext/oj/saj2.h +1 -1
  49. data/ext/oj/scp.c +3 -14
  50. data/ext/oj/sparse.c +22 -70
  51. data/ext/oj/stream_writer.c +45 -41
  52. data/ext/oj/strict.c +20 -52
  53. data/ext/oj/string_writer.c +64 -38
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +125 -114
  56. data/ext/oj/usual.h +7 -6
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +13 -2
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/wab.c +25 -57
  61. data/lib/oj/active_support_helper.rb +1 -3
  62. data/lib/oj/bag.rb +7 -1
  63. data/lib/oj/easy_hash.rb +4 -5
  64. data/lib/oj/error.rb +0 -1
  65. data/lib/oj/json.rb +162 -150
  66. data/lib/oj/mimic.rb +7 -7
  67. data/lib/oj/schandler.rb +5 -4
  68. data/lib/oj/state.rb +8 -5
  69. data/lib/oj/version.rb +1 -2
  70. data/lib/oj.rb +2 -0
  71. data/pages/InstallOptions.md +20 -0
  72. data/pages/Options.md +4 -0
  73. data/test/_test_active.rb +8 -9
  74. data/test/_test_active_mimic.rb +7 -8
  75. data/test/_test_mimic_rails.rb +17 -20
  76. data/test/activerecord/result_test.rb +5 -6
  77. data/test/activesupport6/encoding_test.rb +63 -28
  78. data/test/activesupport7/abstract_unit.rb +4 -1
  79. data/test/activesupport7/encoding_test.rb +72 -22
  80. data/test/files.rb +15 -15
  81. data/test/foo.rb +18 -69
  82. data/test/helper.rb +5 -8
  83. data/test/isolated/shared.rb +3 -2
  84. data/test/json_gem/json_addition_test.rb +2 -2
  85. data/test/json_gem/json_common_interface_test.rb +8 -6
  86. data/test/json_gem/json_encoding_test.rb +0 -0
  87. data/test/json_gem/json_ext_parser_test.rb +1 -0
  88. data/test/json_gem/json_fixtures_test.rb +3 -2
  89. data/test/json_gem/json_generator_test.rb +50 -33
  90. data/test/json_gem/json_generic_object_test.rb +11 -11
  91. data/test/json_gem/json_parser_test.rb +46 -46
  92. data/test/json_gem/json_string_matching_test.rb +9 -9
  93. data/test/mem.rb +13 -12
  94. data/test/perf.rb +21 -26
  95. data/test/perf_compat.rb +31 -33
  96. data/test/perf_dump.rb +28 -28
  97. data/test/perf_fast.rb +80 -82
  98. data/test/perf_file.rb +27 -29
  99. data/test/perf_object.rb +65 -69
  100. data/test/perf_once.rb +12 -11
  101. data/test/perf_parser.rb +42 -48
  102. data/test/perf_saj.rb +46 -54
  103. data/test/perf_scp.rb +57 -69
  104. data/test/perf_simple.rb +41 -39
  105. data/test/perf_strict.rb +68 -70
  106. data/test/perf_wab.rb +67 -69
  107. data/test/prec.rb +5 -5
  108. data/test/sample/change.rb +0 -1
  109. data/test/sample/dir.rb +0 -1
  110. data/test/sample/doc.rb +0 -1
  111. data/test/sample/file.rb +0 -1
  112. data/test/sample/group.rb +0 -1
  113. data/test/sample/hasprops.rb +0 -1
  114. data/test/sample/layer.rb +0 -1
  115. data/test/sample/rect.rb +0 -1
  116. data/test/sample/shape.rb +0 -1
  117. data/test/sample/text.rb +0 -1
  118. data/test/sample.rb +16 -16
  119. data/test/sample_json.rb +8 -8
  120. data/test/test_compat.rb +81 -54
  121. data/test/test_custom.rb +63 -52
  122. data/test/test_debian.rb +7 -10
  123. data/test/test_fast.rb +86 -90
  124. data/test/test_file.rb +24 -29
  125. data/test/test_gc.rb +5 -5
  126. data/test/test_generate.rb +5 -5
  127. data/test/test_hash.rb +4 -4
  128. data/test/test_integer_range.rb +9 -9
  129. data/test/test_null.rb +20 -20
  130. data/test/test_object.rb +92 -87
  131. data/test/test_parser.rb +4 -4
  132. data/test/test_parser_debug.rb +5 -5
  133. data/test/test_parser_saj.rb +27 -25
  134. data/test/test_parser_usual.rb +44 -6
  135. data/test/test_rails.rb +2 -2
  136. data/test/test_saj.rb +10 -8
  137. data/test/test_scp.rb +35 -35
  138. data/test/test_strict.rb +38 -32
  139. data/test/test_various.rb +146 -97
  140. data/test/test_wab.rb +46 -44
  141. data/test/test_writer.rb +63 -47
  142. data/test/tests.rb +7 -7
  143. data/test/tests_mimic.rb +6 -6
  144. data/test/tests_mimic_addition.rb +6 -6
  145. metadata +46 -26
  146. data/test/activesupport4/decoding_test.rb +0 -108
  147. data/test/activesupport4/encoding_test.rb +0 -531
  148. data/test/activesupport4/test_helper.rb +0 -41
  149. data/test/activesupport5/abstract_unit.rb +0 -45
  150. data/test/activesupport5/decoding_test.rb +0 -133
  151. data/test/activesupport5/encoding_test.rb +0 -500
  152. data/test/activesupport5/encoding_test_cases.rb +0 -98
  153. data/test/activesupport5/test_helper.rb +0 -72
  154. data/test/activesupport5/time_zone_test_helpers.rb +0 -39
  155. data/test/bar.rb +0 -11
  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,17 +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
203
212
  skip 'TruffleRuby causes SEGV' if RUBY_ENGINE == 'truffleruby'
204
213
 
205
214
  begin
206
- n = 10000
207
- Oj.strict_load('[' * n + ']' * n)
215
+ n = 10_000
216
+ Oj.strict_load(('[' * n) + (']' * n))
208
217
  rescue Exception => e
209
- assert(false, e.message)
218
+ refute(e.message)
210
219
  end
211
220
  end
212
221
 
@@ -261,11 +270,11 @@ class CustomJuice < Minitest::Test
261
270
 
262
271
  def test_object
263
272
  obj = Jeez.new(true, 58)
264
- 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)
265
274
  assert_equal(%|{"x":true,"y":58,"_z":"true"}|, json)
266
- 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)
267
276
  assert_equal(%|{"x":true,"y":58}|, json)
268
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
277
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
269
278
  end
270
279
 
271
280
  def test_object_to_json
@@ -343,7 +352,6 @@ class CustomJuice < Minitest::Test
343
352
  "b":[3]
344
353
  }
345
354
  |, json)
346
-
347
355
  end
348
356
 
349
357
  def test_symbol
@@ -394,24 +402,29 @@ class CustomJuice < Minitest::Test
394
402
  assert_equal(%|{"x":{"a":1}}|, json)
395
403
  end
396
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
+
397
410
  def test_complex
398
411
  obj = Complex(2, 9)
399
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
412
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
400
413
  end
401
414
 
402
415
  def test_rational
403
416
  obj = Rational(2, 9)
404
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
417
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
405
418
  end
406
419
 
407
420
  def test_range
408
421
  obj = 3..8
409
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
422
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
410
423
  end
411
424
 
412
425
  def test_date
413
426
  obj = Date.new(2017, 1, 5)
414
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
427
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
415
428
  end
416
429
 
417
430
  def test_date_unix
@@ -440,7 +453,7 @@ class CustomJuice < Minitest::Test
440
453
 
441
454
  def test_datetime
442
455
  obj = DateTime.new(2017, 1, 5, 10, 20, 30)
443
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
456
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
444
457
  end
445
458
 
446
459
  def test_datetime_unix
@@ -450,12 +463,9 @@ class CustomJuice < Minitest::Test
450
463
  end
451
464
 
452
465
  def test_datetime_unix_zone
453
- # older versions seems to have issues getting the utc offset.
454
- if '2.4' <= RUBY_VERSION
455
- obj = DateTime.new(2017, 1, 5, 10, 20, 30, '-0500')
456
- json = Oj.dump(obj, :indent => 2, time_format: :unix_zone)
457
- assert_equal('1483629630.000000000e-18000', json)
458
- 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)
459
469
  end
460
470
 
461
471
  def test_datetime_ruby
@@ -473,12 +483,12 @@ class CustomJuice < Minitest::Test
473
483
  def test_regexp
474
484
  # this notation must be used to get an == match later
475
485
  obj = /(?ix-m:^yes$)/
476
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
486
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
477
487
  end
478
488
 
479
489
  def test_openstruct
480
490
  obj = OpenStruct.new(:a => 1, 'b' => 2)
481
- dump_and_load(obj, false, :create_id => "^o", :create_additions => true)
491
+ dump_and_load(obj, false, :create_id => '^o', :create_additions => true)
482
492
  end
483
493
 
484
494
  def test_time
@@ -488,14 +498,15 @@ class CustomJuice < Minitest::Test
488
498
  # These two forms should be able to recreate the time precisely,
489
499
  # so we check they can load a dumped version and recreate the
490
500
  # original object correctly.
491
- dump_and_load(obj, false, :time_format => :unix, :create_id => "^o", :create_additions => true)
492
- dump_and_load(obj, false, :time_format => :unix_zone, :create_id => "^o", :create_additions => true)
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)
493
503
  # These two forms will lose precision while dumping as they don't
494
504
  # preserve full precision. We check that a dumped version is equal
495
505
  # to that version loaded and dumped a second time, but don't check
496
- # that the loaded Ruby objects is still the same as the original.
497
- dump_load_dump(obj, false, :time_format => :xmlschema, :create_id => "^o", :create_additions => true)
498
- dump_load_dump(obj, false, :time_format => :ruby, :create_id => "^o", :create_additions => true)
506
+ # that the loaded Ruby object 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 => :xmlschema, :create_id => '^o', :create_additions => true, second_precision: 3)
509
+ dump_load_dump(obj, false, :time_format => :ruby, :create_id => '^o', :create_additions => true)
499
510
  end
500
511
 
501
512
  def dump_and_load(obj, trace=false, options={})
@@ -503,7 +514,7 @@ class CustomJuice < Minitest::Test
503
514
  json = Oj.dump(obj, options)
504
515
  puts json if trace
505
516
 
506
- loaded = Oj.load(json, options);
517
+ loaded = Oj.load(json, options)
507
518
  if obj.nil?
508
519
  assert_nil(loaded)
509
520
  else
@@ -517,7 +528,7 @@ class CustomJuice < Minitest::Test
517
528
  json = Oj.dump(obj, options)
518
529
  puts json if trace
519
530
 
520
- loaded = Oj.load(json, options);
531
+ loaded = Oj.load(json, options)
521
532
  if obj.nil?
522
533
  assert_nil(loaded)
523
534
  else
@@ -531,7 +542,7 @@ class CustomJuice < Minitest::Test
531
542
  json = Oj.dump(obj, options)
532
543
  puts json if trace
533
544
 
534
- loaded = Oj.load(json, options);
545
+ loaded = Oj.load(json, options)
535
546
  if obj.nil?
536
547
  assert_nil(loaded)
537
548
  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