oj 3.9.1 → 3.16.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.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1452 -0
  3. data/README.md +21 -6
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +50 -68
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +60 -62
  9. data/ext/oj/cache8.h +9 -36
  10. data/ext/oj/circarray.c +38 -42
  11. data/ext/oj/circarray.h +12 -13
  12. data/ext/oj/code.c +158 -179
  13. data/ext/oj/code.h +20 -22
  14. data/ext/oj/compat.c +145 -205
  15. data/ext/oj/custom.c +740 -880
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +1145 -844
  18. data/ext/oj/dump.h +71 -57
  19. data/ext/oj/dump_compat.c +575 -655
  20. data/ext/oj/dump_leaf.c +96 -186
  21. data/ext/oj/dump_object.c +533 -660
  22. data/ext/oj/dump_strict.c +306 -340
  23. data/ext/oj/encode.h +4 -33
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +28 -28
  26. data/ext/oj/err.h +39 -42
  27. data/ext/oj/extconf.rb +28 -7
  28. data/ext/oj/fast.c +1052 -1113
  29. data/ext/oj/intern.c +313 -0
  30. data/ext/oj/intern.h +22 -0
  31. data/ext/oj/mem.c +318 -0
  32. data/ext/oj/mem.h +53 -0
  33. data/ext/oj/mimic_json.c +471 -430
  34. data/ext/oj/object.c +532 -580
  35. data/ext/oj/odd.c +156 -142
  36. data/ext/oj/odd.h +25 -26
  37. data/ext/oj/oj.c +1346 -961
  38. data/ext/oj/oj.h +307 -290
  39. data/ext/oj/parse.c +954 -858
  40. data/ext/oj/parse.h +74 -72
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +103 -0
  43. data/ext/oj/rails.c +819 -836
  44. data/ext/oj/rails.h +8 -11
  45. data/ext/oj/reader.c +136 -147
  46. data/ext/oj/reader.h +69 -83
  47. data/ext/oj/resolve.c +41 -63
  48. data/ext/oj/resolve.h +4 -6
  49. data/ext/oj/rxclass.c +69 -72
  50. data/ext/oj/rxclass.h +12 -13
  51. data/ext/oj/saj.c +440 -485
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +79 -118
  55. data/ext/oj/simd.h +10 -0
  56. data/ext/oj/sparse.c +739 -709
  57. data/ext/oj/stream_writer.c +141 -175
  58. data/ext/oj/strict.c +103 -128
  59. data/ext/oj/string_writer.c +244 -261
  60. data/ext/oj/trace.c +34 -41
  61. data/ext/oj/trace.h +42 -15
  62. data/ext/oj/usual.c +1218 -0
  63. data/ext/oj/usual.h +69 -0
  64. data/ext/oj/util.c +107 -107
  65. data/ext/oj/util.h +4 -3
  66. data/ext/oj/val_stack.c +61 -78
  67. data/ext/oj/val_stack.h +80 -114
  68. data/ext/oj/validate.c +46 -0
  69. data/ext/oj/wab.c +316 -361
  70. data/lib/oj/active_support_helper.rb +1 -3
  71. data/lib/oj/bag.rb +8 -1
  72. data/lib/oj/easy_hash.rb +9 -9
  73. data/lib/oj/error.rb +1 -2
  74. data/lib/oj/json.rb +162 -150
  75. data/lib/oj/mimic.rb +54 -20
  76. data/lib/oj/saj.rb +20 -6
  77. data/lib/oj/schandler.rb +5 -4
  78. data/lib/oj/state.rb +12 -8
  79. data/lib/oj/version.rb +1 -2
  80. data/lib/oj.rb +2 -8
  81. data/pages/Compatibility.md +1 -1
  82. data/pages/Encoding.md +1 -1
  83. data/pages/InstallOptions.md +20 -0
  84. data/pages/JsonGem.md +15 -0
  85. data/pages/Modes.md +9 -3
  86. data/pages/Options.md +62 -12
  87. data/pages/Parser.md +309 -0
  88. data/pages/Rails.md +73 -22
  89. metadata +68 -192
  90. data/ext/oj/hash.c +0 -163
  91. data/ext/oj/hash.h +0 -46
  92. data/ext/oj/hash_test.c +0 -512
  93. data/test/_test_active.rb +0 -76
  94. data/test/_test_active_mimic.rb +0 -96
  95. data/test/_test_mimic_rails.rb +0 -126
  96. data/test/activerecord/result_test.rb +0 -27
  97. data/test/activesupport4/decoding_test.rb +0 -108
  98. data/test/activesupport4/encoding_test.rb +0 -531
  99. data/test/activesupport4/test_helper.rb +0 -41
  100. data/test/activesupport5/decoding_test.rb +0 -125
  101. data/test/activesupport5/encoding_test.rb +0 -485
  102. data/test/activesupport5/encoding_test_cases.rb +0 -90
  103. data/test/activesupport5/test_helper.rb +0 -50
  104. data/test/activesupport5/time_zone_test_helpers.rb +0 -24
  105. data/test/bar.rb +0 -25
  106. data/test/files.rb +0 -29
  107. data/test/foo.rb +0 -21
  108. data/test/helper.rb +0 -26
  109. data/test/isolated/shared.rb +0 -308
  110. data/test/isolated/test_mimic_after.rb +0 -13
  111. data/test/isolated/test_mimic_alone.rb +0 -12
  112. data/test/isolated/test_mimic_as_json.rb +0 -45
  113. data/test/isolated/test_mimic_before.rb +0 -13
  114. data/test/isolated/test_mimic_define.rb +0 -28
  115. data/test/isolated/test_mimic_rails_after.rb +0 -22
  116. data/test/isolated/test_mimic_rails_before.rb +0 -21
  117. data/test/isolated/test_mimic_redefine.rb +0 -15
  118. data/test/json_gem/json_addition_test.rb +0 -216
  119. data/test/json_gem/json_common_interface_test.rb +0 -148
  120. data/test/json_gem/json_encoding_test.rb +0 -107
  121. data/test/json_gem/json_ext_parser_test.rb +0 -20
  122. data/test/json_gem/json_fixtures_test.rb +0 -35
  123. data/test/json_gem/json_generator_test.rb +0 -383
  124. data/test/json_gem/json_generic_object_test.rb +0 -90
  125. data/test/json_gem/json_parser_test.rb +0 -470
  126. data/test/json_gem/json_string_matching_test.rb +0 -42
  127. data/test/json_gem/test_helper.rb +0 -18
  128. data/test/perf.rb +0 -107
  129. data/test/perf_compat.rb +0 -130
  130. data/test/perf_fast.rb +0 -164
  131. data/test/perf_file.rb +0 -64
  132. data/test/perf_object.rb +0 -138
  133. data/test/perf_saj.rb +0 -109
  134. data/test/perf_scp.rb +0 -151
  135. data/test/perf_simple.rb +0 -287
  136. data/test/perf_strict.rb +0 -145
  137. data/test/perf_wab.rb +0 -131
  138. data/test/sample/change.rb +0 -14
  139. data/test/sample/dir.rb +0 -19
  140. data/test/sample/doc.rb +0 -36
  141. data/test/sample/file.rb +0 -48
  142. data/test/sample/group.rb +0 -16
  143. data/test/sample/hasprops.rb +0 -16
  144. data/test/sample/layer.rb +0 -12
  145. data/test/sample/line.rb +0 -20
  146. data/test/sample/oval.rb +0 -10
  147. data/test/sample/rect.rb +0 -10
  148. data/test/sample/shape.rb +0 -35
  149. data/test/sample/text.rb +0 -20
  150. data/test/sample.rb +0 -54
  151. data/test/sample_json.rb +0 -37
  152. data/test/test_compat.rb +0 -509
  153. data/test/test_custom.rb +0 -503
  154. data/test/test_debian.rb +0 -53
  155. data/test/test_fast.rb +0 -470
  156. data/test/test_file.rb +0 -239
  157. data/test/test_gc.rb +0 -49
  158. data/test/test_hash.rb +0 -29
  159. data/test/test_integer_range.rb +0 -73
  160. data/test/test_null.rb +0 -376
  161. data/test/test_object.rb +0 -1018
  162. data/test/test_saj.rb +0 -186
  163. data/test/test_scp.rb +0 -433
  164. data/test/test_strict.rb +0 -410
  165. data/test/test_various.rb +0 -741
  166. data/test/test_wab.rb +0 -307
  167. data/test/test_writer.rb +0 -380
  168. data/test/tests.rb +0 -24
  169. data/test/tests_mimic.rb +0 -14
  170. data/test/tests_mimic_addition.rb +0 -7
  171. data/test/zoo.rb +0 -13
data/test/test_strict.rb DELETED
@@ -1,410 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << File.dirname(__FILE__)
5
- $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
6
- %w(lib ext).each do |dir|
7
- $: << File.join($oj_dir, dir)
8
- end
9
-
10
- require 'minitest'
11
- require 'minitest/autorun'
12
- require 'stringio'
13
- require 'date'
14
- require 'bigdecimal'
15
- require 'oj'
16
-
17
- class StrictJuice < Minitest::Test
18
-
19
- module TestModule
20
- end
21
-
22
- class Jeez
23
- attr_accessor :x, :y
24
-
25
- def initialize(x, y)
26
- @x = x
27
- @y = y
28
- end
29
- end
30
-
31
- def setup
32
- @default_options = Oj.default_options
33
- # in strict mode other options other than the number formats are not used.
34
- Oj.default_options = { :mode => :strict }
35
- end
36
-
37
- def teardown
38
- Oj.default_options = @default_options
39
- end
40
-
41
- def test_nil
42
- dump_and_load(nil, false)
43
- end
44
-
45
- def test_true
46
- dump_and_load(true, false)
47
- end
48
-
49
- def test_false
50
- dump_and_load(false, false)
51
- end
52
-
53
- def test_fixnum
54
- dump_and_load(0, false)
55
- dump_and_load(12345, false)
56
- dump_and_load(-54321, false)
57
- dump_and_load(1, false)
58
- end
59
-
60
- def test_float
61
- dump_and_load(0.0, false)
62
- dump_and_load(12345.6789, false)
63
- dump_and_load(70.35, false)
64
- dump_and_load(-54321.012, false)
65
- dump_and_load(1.7775, false)
66
- dump_and_load(2.5024, false)
67
- dump_and_load(2.48e16, false)
68
- dump_and_load(2.48e100 * 1.0e10, false)
69
- dump_and_load(-2.48e100 * 1.0e10, false)
70
- end
71
-
72
- def test_nan_dump
73
- assert_equal('null', Oj.dump(0/0.0, :nan => :null))
74
- assert_equal('3.3e14159265358979323846', Oj.dump(0/0.0, :nan => :huge))
75
- begin
76
- Oj.dump(0/0.0, :nan => :word)
77
- rescue Exception
78
- assert(true)
79
- return
80
- end
81
- assert(false, "*** expected an exception")
82
- end
83
-
84
- def test_infinity_dump
85
- assert_equal('null', Oj.dump(1/0.0, :nan => :null))
86
- assert_equal('3.0e14159265358979323846', Oj.dump(1/0.0, :nan => :huge))
87
- begin
88
- Oj.dump(1/0.0, :nan => :word)
89
- rescue Exception
90
- assert(true)
91
- return
92
- end
93
- assert(false, "*** expected an exception")
94
- end
95
-
96
- def test_neg_infinity_dump
97
- assert_equal('null', Oj.dump(-1/0.0, :nan => :null))
98
- assert_equal('-3.0e14159265358979323846', Oj.dump(-1/0.0, :nan => :huge))
99
- begin
100
- Oj.dump(-1/0.0, :nan => :word)
101
- rescue Exception
102
- assert(true)
103
- return
104
- end
105
- assert(false, "*** expected an exception")
106
- end
107
-
108
- def test_string
109
- dump_and_load('', false)
110
- dump_and_load('abc', false)
111
- dump_and_load("abc\ndef", false)
112
- dump_and_load("a\u0041", false)
113
- end
114
-
115
- def test_encode
116
- opts = Oj.default_options
117
- Oj.default_options = { :ascii_only => false }
118
- unless 'jruby' == $ruby
119
- dump_and_load("ぴーたー", false)
120
- end
121
- Oj.default_options = { :ascii_only => true }
122
- json = Oj.dump("ぴーたー")
123
- assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
124
- unless 'jruby' == $ruby
125
- dump_and_load("ぴーたー", false)
126
- end
127
- Oj.default_options = opts
128
- end
129
-
130
- def test_unicode
131
- # hits the 3 normal ranges and one extended surrogate pair
132
- json = %{"\\u019f\\u05e9\\u3074\\ud834\\udd1e"}
133
- obj = Oj.load(json)
134
- json2 = Oj.dump(obj, :ascii_only => true)
135
- assert_equal(json, json2)
136
- end
137
-
138
- def test_unicode_long
139
- # tests buffer overflow
140
- json = %{"\\u019f\\u05e9\\u3074\\ud834\\udd1e #{'x' * 2000}"}
141
- obj = Oj.load(json)
142
- json2 = Oj.dump(obj, :ascii_only => true)
143
- assert_equal(json, json2)
144
- end
145
-
146
- def test_array
147
- dump_and_load([], false)
148
- dump_and_load([true, false], false)
149
- dump_and_load(['a', 1, nil], false)
150
- dump_and_load([[nil]], false)
151
- dump_and_load([[nil], 58], false)
152
- end
153
-
154
- def test_array_deep
155
- dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
156
- end
157
-
158
- def test_deep_nest
159
- begin
160
- n = 10000
161
- Oj.strict_load('[' * n + ']' * n)
162
- rescue Exception => e
163
- assert(false, e.message)
164
- end
165
- end
166
-
167
- # Hash
168
- def test_hash
169
- dump_and_load({}, false)
170
- dump_and_load({ 'true' => true, 'false' => false}, false)
171
- dump_and_load({ 'true' => true, 'array' => [], 'hash' => { }}, false)
172
- end
173
-
174
- def test_hash_deep
175
- dump_and_load({'1' => {
176
- '2' => {
177
- '3' => {
178
- '4' => {
179
- '5' => {
180
- '6' => {
181
- '7' => {
182
- '8' => {
183
- '9' => {
184
- '10' => {
185
- '11' => {
186
- '12' => {
187
- '13' => {
188
- '14' => {
189
- '15' => {
190
- '16' => {
191
- '17' => {
192
- '18' => {
193
- '19' => {
194
- '20' => {}}}}}}}}}}}}}}}}}}}}}, false)
195
- end
196
-
197
- def test_hash_escaped_key
198
- json = %{{"a\nb":true,"c\td":false}}
199
- obj = Oj.strict_load(json)
200
- assert_equal({"a\nb" => true, "c\td" => false}, obj)
201
- end
202
-
203
- def test_non_str_hash
204
- begin
205
- Oj.dump({ 1 => true, 0 => false })
206
- rescue Exception
207
- assert(true)
208
- return
209
- end
210
- assert(false, "*** expected an exception")
211
- end
212
-
213
- def test_bignum_object
214
- dump_and_load(7 ** 55, false)
215
- end
216
-
217
- # BigDecimal
218
- def test_bigdecimal_strict
219
- Oj.default_options = { :bigdecimal_load => true}
220
- dump_and_load(BigDecimal('3.14159265358979323846'), false)
221
- end
222
-
223
- def test_bigdecimal_load
224
- orig = BigDecimal('80.51')
225
- json = Oj.dump(orig, :mode => :strict, :bigdecimal_as_decimal => true)
226
- bg = Oj.load(json, :mode => :strict, :bigdecimal_load => true)
227
- assert_equal(BigDecimal, bg.class)
228
- assert_equal(orig, bg)
229
- end
230
-
231
- def test_json_object
232
- obj = Jeez.new(true, 58)
233
- begin
234
- Oj.dump(obj)
235
- rescue Exception
236
- assert(true)
237
- return
238
- end
239
- assert(false, "*** expected an exception")
240
- end
241
-
242
- def test_range
243
- begin
244
- Oj.dump(1..7)
245
- rescue Exception
246
- assert(true)
247
- return
248
- end
249
- assert(false, "*** expected an exception")
250
- end
251
-
252
- # Stream IO
253
- def test_io_string
254
- json = %{{
255
- "x":true,
256
- "y":58,
257
- "z": [1,2,3]
258
- }
259
- }
260
- input = StringIO.new(json)
261
- obj = Oj.strict_load(input)
262
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
263
- end
264
-
265
- def test_io_file
266
- filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
267
- File.open(filename, 'w') { |f| f.write(%{{
268
- "x":true,
269
- "y":58,
270
- "z": [1,2,3]
271
- }
272
- }) }
273
- f = File.new(filename)
274
- obj = Oj.strict_load(f)
275
- f.close()
276
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
277
- end
278
-
279
- def test_symbol
280
- json = Oj.dump(:abc)
281
- assert_equal('"abc"', json)
282
- end
283
-
284
- def test_time
285
- t = Time.local(2012, 1, 5, 23, 58, 7)
286
- begin
287
- Oj.dump(t)
288
- rescue Exception
289
- assert(true)
290
- return
291
- end
292
- assert(false, "*** expected an exception")
293
- end
294
-
295
- def test_class
296
- begin
297
- Oj.dump(StrictJuice)
298
- rescue Exception
299
- assert(true)
300
- return
301
- end
302
- assert(false, "*** expected an exception")
303
- end
304
-
305
- def test_module
306
- begin
307
- Oj.dump(TestModule)
308
- rescue Exception
309
- assert(true)
310
- return
311
- end
312
- assert(false, "*** expected an exception")
313
- end
314
-
315
- # symbol_keys option
316
- def test_symbol_keys
317
- json = %{{
318
- "x":true,
319
- "y":58,
320
- "z": [1,2,3]
321
- }
322
- }
323
- obj = Oj.strict_load(json, :symbol_keys => true)
324
- assert_equal({ :x => true, :y => 58, :z => [1, 2, 3]}, obj)
325
- end
326
-
327
- def test_symbol_keys_safe
328
- json = %{{
329
- "x":true,
330
- "y":58,
331
- "z": [1,2,3]
332
- }
333
- }
334
- obj = Oj.safe_load(json)
335
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
336
- end
337
-
338
- # comments
339
- def test_comment_slash
340
- json = %{{
341
- "x":true,//three
342
- "y":58,
343
- "z": [1,2,
344
- 3 // six
345
- ]}
346
- }
347
- obj = Oj.strict_load(json)
348
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
349
- end
350
-
351
- def test_comment_c
352
- json = %{{
353
- "x"/*one*/:/*two*/true,
354
- "y":58,
355
- "z": [1,2,3]}
356
- }
357
- obj = Oj.strict_load(json)
358
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
359
- end
360
-
361
- def test_comment
362
- json = %{{
363
- "x"/*one*/:/*two*/true,//three
364
- "y":58/*four*/,
365
- "z": [1,2/*five*/,
366
- 3 // six
367
- ]
368
- }
369
- }
370
- obj = Oj.strict_load(json)
371
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
372
- end
373
-
374
- def test_double
375
- json = %{{ "x": 1}{ "y": 2}}
376
- results = []
377
- Oj.load(json, :mode => :strict) { |x| results << x }
378
-
379
- assert_equal([{ 'x' => 1 }, { 'y' => 2 }], results)
380
- end
381
-
382
- def test_circular_hash
383
- h = { 'a' => 7 }
384
- h['b'] = h
385
- json = Oj.dump(h, :indent => 2, :circular => true)
386
- assert_equal(%|{
387
- "a":7,
388
- "b":null
389
- }
390
- |, json)
391
- end
392
-
393
- def test_omit_nil
394
- json = Oj.dump({'x' => {'a' => 1, 'b' => nil }, 'y' => nil}, :omit_nil => true)
395
- assert_equal(%|{"x":{"a":1}}|, json)
396
- end
397
-
398
- def dump_and_load(obj, trace=false)
399
- json = Oj.dump(obj, :indent => 2)
400
- puts json if trace
401
- loaded = Oj.strict_load(json);
402
- if obj.nil?
403
- assert_nil(loaded)
404
- else
405
- assert_equal(obj, loaded)
406
- end
407
- loaded
408
- end
409
-
410
- end