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.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +101 -0
  3. data/README.md +13 -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 +19 -33
  10. data/ext/oj/code.h +2 -2
  11. data/ext/oj/compat.c +20 -60
  12. data/ext/oj/custom.c +76 -155
  13. data/ext/oj/debug.c +3 -9
  14. data/ext/oj/dump.c +203 -213
  15. data/ext/oj/dump.h +26 -12
  16. data/ext/oj/dump_compat.c +565 -642
  17. data/ext/oj/dump_leaf.c +17 -63
  18. data/ext/oj/dump_object.c +59 -181
  19. data/ext/oj/dump_strict.c +24 -48
  20. data/ext/oj/encoder.c +43 -0
  21. data/ext/oj/err.c +2 -13
  22. data/ext/oj/err.h +9 -12
  23. data/ext/oj/extconf.rb +18 -7
  24. data/ext/oj/fast.c +83 -108
  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 +104 -81
  30. data/ext/oj/object.c +50 -67
  31. data/ext/oj/odd.c +89 -67
  32. data/ext/oj/odd.h +15 -15
  33. data/ext/oj/oj.c +171 -106
  34. data/ext/oj/oj.h +96 -74
  35. data/ext/oj/parse.c +169 -189
  36. data/ext/oj/parse.h +23 -24
  37. data/ext/oj/parser.c +89 -34
  38. data/ext/oj/parser.h +20 -9
  39. data/ext/oj/rails.c +86 -151
  40. data/ext/oj/rails.h +1 -1
  41. data/ext/oj/reader.c +12 -15
  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 +21 -32
  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 -22
  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 +32 -69
  62. data/lib/oj/active_support_helper.rb +1 -3
  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 +162 -150
  67. data/lib/oj/mimic.rb +6 -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/JsonGem.md +15 -0
  75. data/pages/Modes.md +6 -3
  76. data/pages/Options.md +10 -0
  77. data/pages/Rails.md +12 -0
  78. data/test/_test_active.rb +8 -9
  79. data/test/_test_active_mimic.rb +7 -8
  80. data/test/_test_mimic_rails.rb +17 -20
  81. data/test/activerecord/result_test.rb +5 -6
  82. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  83. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  84. data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
  85. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  86. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  87. data/test/files.rb +15 -15
  88. data/test/foo.rb +15 -15
  89. data/test/helper.rb +11 -8
  90. data/test/isolated/shared.rb +3 -2
  91. data/test/json_gem/json_addition_test.rb +2 -2
  92. data/test/json_gem/json_common_interface_test.rb +8 -6
  93. data/test/json_gem/json_encoding_test.rb +0 -0
  94. data/test/json_gem/json_ext_parser_test.rb +1 -0
  95. data/test/json_gem/json_fixtures_test.rb +3 -2
  96. data/test/json_gem/json_generator_test.rb +49 -37
  97. data/test/json_gem/json_generic_object_test.rb +11 -11
  98. data/test/json_gem/json_parser_test.rb +54 -47
  99. data/test/json_gem/json_string_matching_test.rb +9 -9
  100. data/test/json_gem/test_helper.rb +7 -3
  101. data/test/mem.rb +13 -12
  102. data/test/perf.rb +21 -26
  103. data/test/perf_compat.rb +31 -33
  104. data/test/perf_dump.rb +50 -0
  105. data/test/perf_fast.rb +80 -82
  106. data/test/perf_file.rb +27 -29
  107. data/test/perf_object.rb +65 -69
  108. data/test/perf_once.rb +12 -11
  109. data/test/perf_parser.rb +42 -48
  110. data/test/perf_saj.rb +46 -54
  111. data/test/perf_scp.rb +57 -69
  112. data/test/perf_simple.rb +41 -39
  113. data/test/perf_strict.rb +68 -70
  114. data/test/perf_wab.rb +67 -69
  115. data/test/prec.rb +3 -3
  116. data/test/sample/change.rb +0 -1
  117. data/test/sample/dir.rb +0 -1
  118. data/test/sample/doc.rb +0 -1
  119. data/test/sample/file.rb +0 -1
  120. data/test/sample/group.rb +0 -1
  121. data/test/sample/hasprops.rb +0 -1
  122. data/test/sample/layer.rb +0 -1
  123. data/test/sample/rect.rb +0 -1
  124. data/test/sample/shape.rb +0 -1
  125. data/test/sample/text.rb +0 -1
  126. data/test/sample.rb +16 -16
  127. data/test/sample_json.rb +8 -8
  128. data/test/test_compat.rb +95 -43
  129. data/test/test_custom.rb +72 -51
  130. data/test/test_debian.rb +7 -10
  131. data/test/test_fast.rb +102 -87
  132. data/test/test_file.rb +41 -30
  133. data/test/test_gc.rb +16 -5
  134. data/test/test_generate.rb +5 -5
  135. data/test/test_hash.rb +4 -4
  136. data/test/test_integer_range.rb +9 -9
  137. data/test/test_null.rb +20 -20
  138. data/test/test_object.rb +85 -96
  139. data/test/test_parser.rb +6 -22
  140. data/test/test_parser_debug.rb +27 -0
  141. data/test/test_parser_saj.rb +115 -23
  142. data/test/test_parser_usual.rb +6 -6
  143. data/test/test_rails.rb +2 -2
  144. data/test/test_saj.rb +10 -8
  145. data/test/test_scp.rb +37 -39
  146. data/test/test_strict.rb +40 -32
  147. data/test/test_various.rb +163 -84
  148. data/test/test_wab.rb +48 -44
  149. data/test/test_writer.rb +47 -47
  150. data/test/tests.rb +13 -5
  151. data/test/tests_mimic.rb +12 -3
  152. data/test/tests_mimic_addition.rb +12 -3
  153. metadata +34 -144
  154. data/test/activesupport4/decoding_test.rb +0 -108
  155. data/test/activesupport4/encoding_test.rb +0 -531
  156. data/test/activesupport4/test_helper.rb +0 -41
  157. data/test/activesupport5/test_helper.rb +0 -72
  158. data/test/bar.rb +0 -16
  159. data/test/baz.rb +0 -16
  160. data/test/bug.rb +0 -16
  161. 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
- $: << File.dirname(__FILE__)
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
- assert_equal(true, doc.fetch())
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
- assert_equal(false, doc.fetch())
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("ぴーたー", doc.fetch())
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("ぴーたー", doc.fetch())
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
- if '2.4.0' <= RUBY_VERSION
94
- assert_equal(Integer, doc.type)
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
- assert_equal(12345.6789, doc.fetch())
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(12345.6789e7.to_i, doc.fetch().to_i)
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
- assert_equal([], doc.fetch())
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
- assert_equal({}, doc.fetch())
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
- [['/', 'array', '/array'],
208
- ['/array', '1/num', '/array/1/num'],
209
- ['/array/1/hash', 'h2/a', '/array/1/hash/h2/a'],
210
- ['/array/1', 'hash/h2/a/2', '/array/1/hash/h2/a/2'],
211
- ['/array/1/hash', '../string', '/array/1/string'],
212
- ['/array/1/hash', '..', '/array/1'],
213
- ].each do |start,path,where|
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
- [['/', Hash],
229
- ['/array', Array],
230
- ['/array/1', Hash],
231
- ['/array/1/num', num_class],
232
- ['/array/1/string', String],
233
- ['/array/1/hash/h2/a', Array],
234
- ['/array/1/hash/../num', num_class],
235
- ['/array/1/hash/../..', Array],
236
- ].each do |path,type|
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
- [['/', nil],
245
- ['/array', 'array'],
246
- ['/array/1', 1],
247
- ['/array/1/num', 'num'],
248
- ['/array/1/string', 'string'],
249
- ['/array/1/hash/h2/a', 'a'],
250
- ['/array/1/hash/../num', 'num'],
251
- ['/array/1/hash/..', 1],
252
- ['/array/1/hash/../..', 'array'],
253
- ].each do |path,key|
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
- [['/array/1/num', 3],
267
- ['/array/1/string', 'message'],
268
- ['/array/1/hash/h2/a', [1, 2, 3]],
269
- ['/array/1/hash/../num', 3],
270
- ['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
271
- ['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
272
- ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
273
- ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
274
- ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
275
- ].each do |path,val|
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
- [['/array/1/num', 3],
285
- ['/array/1/string', 'message'],
286
- ['/array/1/hash/h2/a', [1, 2, 3]],
287
- ['/array/1/hash/../num', 3],
288
- ['/array/1/hash/..', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
289
- ['/array/1/hash/../..', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
290
- ['/array/1', {'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}],
291
- ['/array', [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}]],
292
- ['/', {'array' => [{'num' => 3, 'string' => 'message', 'hash' => {'h2' => {'a' => [1, 2, 3]}}}], 'boolean' => true}],
293
- ['/nothing', nil],
294
- ['/array/10', nil],
295
- ].each do |path,val|
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
- [['/array/1', 'num', 3],
318
- ['/array/1', 'string', 'message'],
319
- ['/array/1/hash', 'h2/a', [1, 2, 3]],
320
- ].each do |path,fetch_path,val|
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
- [['/array/1', true],
330
- ['/array/1', true],
331
- ['/array/1/hash', true],
332
- ['/array/1/dash', false],
333
- ['/array/3', false],
334
- ['/nothing', false],
335
- ].each do |path,val|
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(File.dirname(__FILE__), 'open_file_test.json')
409
- File.open(filename, 'w') { |f| f.write('{"a":[1,2,3]}') }
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(File.dirname(__FILE__), 'open_file_test.json')
435
- File.open(filename, 'w') { |f| f.write('{"a":[1,2,3]}') }
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
- # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
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
- self.new(h['x'], h['y'])
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
- self.new(h['x'], h['y'])
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(12345, false)
77
- dump_and_load(-54321, false)
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(12345.6789, false)
79
+ dump_and_load(12_345.6789, false)
86
80
  dump_and_load(70.35, false)
87
- dump_and_load(-54321.012, false)
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(':xyz'.to_sym, false)
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
- # Windows does not support dates before 1970.
134
- return if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
135
- t = Time.xmlschema("1954-01-05T00:00:00.123456")
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 'rubinius' == $ruby
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(File.dirname(__FILE__), 'file_test.json')
217
- File.open(filename, "w") { |f|
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
- # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
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' => "#{self.class}", 'x' => x, 'child' => child }
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
- self.new(h['x'], h['child'])
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
@@ -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'
@@ -15,7 +15,7 @@ class Generator < Minitest::Test
15
15
 
16
16
  def test_before
17
17
  json = Oj.generate({})
18
- assert_equal("{}", json)
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
- # encoding: UTF-8
2
+ # frozen_string_literal: true
3
3
 
4
- $: << File.dirname(__FILE__)
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
@@ -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'
@@ -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: 9007199254740993}
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: -10000000000000000000, u2: 10000000000000000000}
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: 9007199254740993}
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: 10000000000000000000}
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: 10000000000000000000}
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))