oj 2.18.5 → 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 (166) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1452 -0
  3. data/README.md +53 -221
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +54 -72
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +61 -63
  9. data/ext/oj/cache8.h +12 -39
  10. data/ext/oj/circarray.c +38 -67
  11. data/ext/oj/circarray.h +16 -42
  12. data/ext/oj/code.c +214 -0
  13. data/ext/oj/code.h +40 -0
  14. data/ext/oj/compat.c +194 -110
  15. data/ext/oj/custom.c +1074 -0
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +1276 -2494
  18. data/ext/oj/dump.h +110 -0
  19. data/ext/oj/dump_compat.c +897 -0
  20. data/ext/oj/dump_leaf.c +162 -0
  21. data/ext/oj/dump_object.c +710 -0
  22. data/ext/oj/dump_strict.c +399 -0
  23. data/ext/oj/encode.h +7 -42
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +28 -53
  26. data/ext/oj/err.h +49 -46
  27. data/ext/oj/extconf.rb +33 -32
  28. data/ext/oj/fast.c +1082 -1098
  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 +919 -0
  34. data/ext/oj/object.c +545 -625
  35. data/ext/oj/odd.c +158 -168
  36. data/ext/oj/odd.h +32 -58
  37. data/ext/oj/oj.c +1727 -2080
  38. data/ext/oj/oj.h +334 -259
  39. data/ext/oj/parse.c +974 -753
  40. data/ext/oj/parse.h +97 -90
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +103 -0
  43. data/ext/oj/rails.c +1478 -0
  44. data/ext/oj/rails.h +18 -0
  45. data/ext/oj/reader.c +136 -163
  46. data/ext/oj/reader.h +76 -112
  47. data/ext/oj/resolve.c +45 -94
  48. data/ext/oj/resolve.h +7 -34
  49. data/ext/oj/rxclass.c +144 -0
  50. data/ext/oj/rxclass.h +26 -0
  51. data/ext/oj/saj.c +445 -511
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +82 -143
  55. data/ext/oj/simd.h +10 -0
  56. data/ext/oj/sparse.c +749 -644
  57. data/ext/oj/stream_writer.c +329 -0
  58. data/ext/oj/strict.c +114 -112
  59. data/ext/oj/string_writer.c +517 -0
  60. data/ext/oj/trace.c +72 -0
  61. data/ext/oj/trace.h +55 -0
  62. data/ext/oj/usual.c +1218 -0
  63. data/ext/oj/usual.h +69 -0
  64. data/ext/oj/util.c +136 -0
  65. data/ext/oj/util.h +20 -0
  66. data/ext/oj/val_stack.c +75 -72
  67. data/ext/oj/val_stack.h +94 -127
  68. data/ext/oj/validate.c +46 -0
  69. data/ext/oj/wab.c +586 -0
  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 +21 -13
  73. data/lib/oj/error.rb +10 -12
  74. data/lib/oj/json.rb +188 -0
  75. data/lib/oj/mimic.rb +165 -26
  76. data/lib/oj/saj.rb +20 -6
  77. data/lib/oj/schandler.rb +5 -4
  78. data/lib/oj/state.rb +135 -0
  79. data/lib/oj/version.rb +2 -3
  80. data/lib/oj.rb +3 -31
  81. data/pages/Advanced.md +22 -0
  82. data/pages/Compatibility.md +25 -0
  83. data/pages/Custom.md +23 -0
  84. data/pages/Encoding.md +65 -0
  85. data/pages/InstallOptions.md +20 -0
  86. data/pages/JsonGem.md +94 -0
  87. data/pages/Modes.md +161 -0
  88. data/pages/Options.md +337 -0
  89. data/pages/Parser.md +309 -0
  90. data/pages/Rails.md +167 -0
  91. data/pages/Security.md +20 -0
  92. data/pages/WAB.md +13 -0
  93. metadata +126 -163
  94. data/ext/oj/hash.c +0 -163
  95. data/ext/oj/hash.h +0 -46
  96. data/ext/oj/hash_test.c +0 -512
  97. data/test/_test_active.rb +0 -76
  98. data/test/_test_active_mimic.rb +0 -96
  99. data/test/_test_mimic_rails.rb +0 -126
  100. data/test/activesupport_datetime_test.rb +0 -23
  101. data/test/bug.rb +0 -51
  102. data/test/bug2.rb +0 -10
  103. data/test/bug3.rb +0 -46
  104. data/test/bug_fast.rb +0 -32
  105. data/test/bug_load.rb +0 -24
  106. data/test/crash.rb +0 -111
  107. data/test/curl/curl_oj.rb +0 -46
  108. data/test/curl/get_oj.rb +0 -24
  109. data/test/curl/just_curl.rb +0 -31
  110. data/test/curl/just_oj.rb +0 -51
  111. data/test/example.rb +0 -11
  112. data/test/files.rb +0 -29
  113. data/test/foo.rb +0 -24
  114. data/test/helper.rb +0 -27
  115. data/test/io.rb +0 -48
  116. data/test/isolated/shared.rb +0 -310
  117. data/test/isolated/test_mimic_after.rb +0 -13
  118. data/test/isolated/test_mimic_alone.rb +0 -12
  119. data/test/isolated/test_mimic_as_json.rb +0 -45
  120. data/test/isolated/test_mimic_before.rb +0 -13
  121. data/test/isolated/test_mimic_define.rb +0 -28
  122. data/test/isolated/test_mimic_rails_after.rb +0 -22
  123. data/test/isolated/test_mimic_rails_before.rb +0 -21
  124. data/test/isolated/test_mimic_rails_datetime.rb +0 -27
  125. data/test/isolated/test_mimic_redefine.rb +0 -15
  126. data/test/mod.rb +0 -16
  127. data/test/perf.rb +0 -107
  128. data/test/perf_compat.rb +0 -128
  129. data/test/perf_fast.rb +0 -164
  130. data/test/perf_file.rb +0 -64
  131. data/test/perf_object.rb +0 -138
  132. data/test/perf_saj.rb +0 -109
  133. data/test/perf_scp.rb +0 -151
  134. data/test/perf_simple.rb +0 -287
  135. data/test/perf_strict.rb +0 -128
  136. data/test/rails.rb +0 -50
  137. data/test/russian.rb +0 -18
  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 -55
  151. data/test/sample_json.rb +0 -37
  152. data/test/struct.rb +0 -29
  153. data/test/test_compat.rb +0 -398
  154. data/test/test_debian.rb +0 -53
  155. data/test/test_fast.rb +0 -458
  156. data/test/test_file.rb +0 -245
  157. data/test/test_gc.rb +0 -49
  158. data/test/test_hash.rb +0 -29
  159. data/test/test_object.rb +0 -745
  160. data/test/test_saj.rb +0 -186
  161. data/test/test_scp.rb +0 -396
  162. data/test/test_serializer.rb +0 -59
  163. data/test/test_strict.rb +0 -254
  164. data/test/test_various.rb +0 -1383
  165. data/test/test_writer.rb +0 -308
  166. data/test/write_timebars.rb +0 -31
data/test/test_compat.rb DELETED
@@ -1,398 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << File.dirname(__FILE__)
5
-
6
- require 'helper'
7
-
8
- class CompatJuice < Minitest::Test
9
-
10
- class Jeez
11
- attr_accessor :x, :y
12
-
13
- def initialize(x, y)
14
- @x = x
15
- @y = y
16
- end
17
-
18
- def eql?(o)
19
- self.class == o.class && @x == o.x && @y == o.y
20
- end
21
- alias == eql?
22
-
23
- def as_json()
24
- {"json_class" => self.class.to_s,"x" => @x,"y" => @y}
25
- end
26
-
27
- def self.json_create(h)
28
- self.new(h['x'], h['y'])
29
- end
30
- end # Jeez
31
-
32
- module One
33
- module Two
34
- module Three
35
- class Deep
36
-
37
- def initialize()
38
- end
39
-
40
- def eql?(o)
41
- self.class == o.class
42
- end
43
- alias == eql?
44
-
45
- def to_hash()
46
- {'json_class' => "#{self.class.name}"}
47
- end
48
-
49
- def to_json(*a)
50
- %{{"json_class":"#{self.class.name}"}}
51
- end
52
-
53
- def self.json_create(h)
54
- self.new()
55
- end
56
- end # Deep
57
- end # Three
58
- end # Two
59
- end # One
60
-
61
- def setup
62
- @default_options = Oj.default_options
63
- end
64
-
65
- def teardown
66
- Oj.default_options = @default_options
67
- end
68
-
69
- def test_nil
70
- dump_and_load(nil, false)
71
- end
72
-
73
- def test_true
74
- dump_and_load(true, false)
75
- end
76
-
77
- def test_false
78
- dump_and_load(false, false)
79
- end
80
-
81
- def test_fixnum
82
- dump_and_load(0, false)
83
- dump_and_load(12345, false)
84
- dump_and_load(-54321, false)
85
- dump_and_load(1, false)
86
- end
87
-
88
- def test_float
89
- dump_and_load(0.0, false)
90
- dump_and_load(12345.6789, false)
91
- dump_and_load(70.35, false)
92
- dump_and_load(-54321.012, false)
93
- dump_and_load(1.7775, false)
94
- dump_and_load(2.5024, false)
95
- dump_and_load(2.48e16, false)
96
- dump_and_load(2.48e100 * 1.0e10, false)
97
- dump_and_load(-2.48e100 * 1.0e10, false)
98
- end
99
-
100
- def test_string
101
- dump_and_load('', false)
102
- dump_and_load('abc', false)
103
- dump_and_load("abc\ndef", false)
104
- dump_and_load("a\u0041", false)
105
- end
106
-
107
- def test_encode
108
- opts = Oj.default_options
109
- Oj.default_options = { :ascii_only => false }
110
- unless 'jruby' == $ruby
111
- dump_and_load("ぴーたー", false)
112
- end
113
- Oj.default_options = { :ascii_only => true }
114
- json = Oj.dump("ぴーたー")
115
- assert_equal(%{"\\u3074\\u30fc\\u305f\\u30fc"}, json)
116
- unless 'jruby' == $ruby
117
- dump_and_load("ぴーたー", false)
118
- end
119
- Oj.default_options = opts
120
- end
121
-
122
- def test_unicode
123
- # hits the 3 normal ranges and one extended surrogate pair
124
- json = %{"\\u019f\\u05e9\\u3074\\ud834\\udd1e"}
125
- obj = Oj.load(json)
126
- json2 = Oj.dump(obj, :ascii_only => true)
127
- assert_equal(json, json2)
128
- end
129
-
130
- def test_array
131
- dump_and_load([], false)
132
- dump_and_load([true, false], false)
133
- dump_and_load(['a', 1, nil], false)
134
- dump_and_load([[nil]], false)
135
- dump_and_load([[nil], 58], false)
136
- end
137
-
138
- def test_array_deep
139
- dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
140
- end
141
-
142
- # Hash
143
- def test_hash
144
- dump_and_load({}, false)
145
- dump_and_load({ 'true' => true, 'false' => false}, false)
146
- dump_and_load({ 'true' => true, 'array' => [], 'hash' => { }}, false)
147
- end
148
-
149
- def test_hash_deep
150
- dump_and_load({'1' => {
151
- '2' => {
152
- '3' => {
153
- '4' => {
154
- '5' => {
155
- '6' => {
156
- '7' => {
157
- '8' => {
158
- '9' => {
159
- '10' => {
160
- '11' => {
161
- '12' => {
162
- '13' => {
163
- '14' => {
164
- '15' => {
165
- '16' => {
166
- '17' => {
167
- '18' => {
168
- '19' => {
169
- '20' => {}}}}}}}}}}}}}}}}}}}}}, false)
170
- end
171
-
172
- def test_hash_escaped_key
173
- json = %{{"a\nb":true,"c\td":false}}
174
- obj = Oj.compat_load(json)
175
- assert_equal({"a\nb" => true, "c\td" => false}, obj)
176
- end
177
-
178
- def test_bignum_object
179
- dump_and_load(7 ** 55, false)
180
- end
181
-
182
- # BigDecimal
183
- def test_bigdecimal_compat
184
- dump_and_load(BigDecimal.new('3.14159265358979323846'), false)
185
- end
186
-
187
- def test_bigdecimal_load
188
- orig = BigDecimal.new('80.51')
189
- json = Oj.dump(orig, :mode => :compat, :bigdecimal_as_decimal => true)
190
- bg = Oj.load(json, :mode => :compat, :bigdecimal_load => true)
191
- assert_equal(BigDecimal, bg.class)
192
- assert_equal(orig, bg)
193
- end
194
-
195
- # Time
196
- def test_time_ruby
197
- if RUBY_VERSION.start_with?('1.8')
198
- t = Time.parse('2015-01-05T21:37:07.123456-08:00')
199
- else
200
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
201
- end
202
- expect = '"' + t.to_s + '"'
203
- json = Oj.dump(t, :mode => :compat, :time_format => :ruby)
204
- assert_equal(expect, json)
205
- end
206
- def test_time_xml
207
- if RUBY_VERSION.start_with?('1.8')
208
- t = Time.parse('2015-01-05T21:37:07.123456-08:00')
209
- else
210
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
211
- end
212
- json = Oj.dump(t, :mode => :compat, :time_format => :xmlschema, :second_precision => 6)
213
- assert_equal('"2015-01-05T21:37:07.123456-08:00"', json)
214
- end
215
- unless RUBY_VERSION.start_with?('1.8')
216
- def test_time_xml_12345
217
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, 12345)
218
- json = Oj.dump(t, :mode => :compat, :time_format => :xmlschema, :second_precision => 6)
219
- assert_equal('"2015-01-05T21:37:07.123456+03:25"', json)
220
- end
221
- end
222
- def test_time_unix
223
- if RUBY_VERSION.start_with?('1.8')
224
- t = Time.parse('2015-01-05T21:37:07.123456-08:00')
225
- else
226
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
227
- end
228
- json = Oj.dump(t, :mode => :compat, :time_format => :unix, :second_precision => 6)
229
- assert_equal('1420522627.123456', json)
230
- end
231
- def test_time_unix_zone
232
- if RUBY_VERSION.start_with?('1.8')
233
- t = Time.parse('2015-01-05T21:37:07.123456-08:00')
234
- else
235
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, -8 * 3600)
236
- end
237
- json = Oj.dump(t, :mode => :compat, :time_format => :unix_zone, :second_precision => 6)
238
- assert_equal('1420522627.123456e-28800', json)
239
- end
240
- unless RUBY_VERSION.start_with?('1.8')
241
- def test_time_unix_zone_12345
242
- t = Time.new(2015, 1, 5, 21, 37, 7.123456, 12345)
243
- json = Oj.dump(t, :mode => :compat, :time_format => :unix_zone, :second_precision => 6)
244
- assert_equal('1420481482.123456e12345', json)
245
- end
246
- end
247
- def test_time_unix_zone_early
248
- if RUBY_VERSION.start_with?('1.8')
249
- t = Time.parse('1954-01-05T21:37:07.123456-08:00')
250
- else
251
- t = Time.new(1954, 1, 5, 21, 37, 7.123456, -8 * 3600)
252
- end
253
- json = Oj.dump(t, :mode => :compat, :time_format => :unix_zone, :second_precision => 6)
254
- assert_equal('-504469372.876544e-28800', json)
255
- end
256
-
257
- # Stream IO
258
- def test_io_string
259
- json = %{{
260
- "x":true,
261
- "y":58,
262
- "z": [1,2,3]
263
- }
264
- }
265
- input = StringIO.new(json)
266
- obj = Oj.compat_load(input)
267
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
268
- end
269
-
270
- def test_io_file
271
- filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
272
- File.open(filename, 'w') { |f| f.write(%{{
273
- "x":true,
274
- "y":58,
275
- "z": [1,2,3]
276
- }
277
- }) }
278
- f = File.new(filename)
279
- obj = Oj.compat_load(f)
280
- f.close()
281
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
282
- end
283
-
284
- # symbol_keys option
285
- def test_symbol_keys
286
- json = %{{
287
- "x":true,
288
- "y":58,
289
- "z": [1,2,3]
290
- }
291
- }
292
- obj = Oj.compat_load(json, :symbol_keys => true)
293
- assert_equal({ :x => true, :y => 58, :z => [1, 2, 3]}, obj)
294
- end
295
-
296
- # comments
297
- def test_comment_slash
298
- json = %{{
299
- "x":true,//three
300
- "y":58,
301
- "z": [1,2,
302
- 3 // six
303
- ]}
304
- }
305
- obj = Oj.compat_load(json)
306
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
307
- end
308
-
309
- def test_comment_c
310
- json = %{{
311
- "x"/*one*/:/*two*/true,
312
- "y":58,
313
- "z": [1,2,3]}
314
- }
315
- obj = Oj.compat_load(json)
316
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
317
- end
318
-
319
- def test_comment
320
- json = %{{
321
- "x"/*one*/:/*two*/true,//three
322
- "y":58/*four*/,
323
- "z": [1,2/*five*/,
324
- 3 // six
325
- ]
326
- }
327
- }
328
- obj = Oj.compat_load(json)
329
- assert_equal({ 'x' => true, 'y' => 58, 'z' => [1, 2, 3]}, obj)
330
- end
331
-
332
- def test_json_object_compat
333
- obj = Jeez.new(true, 58)
334
- Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
335
- dump_and_load(obj, false)
336
- end
337
-
338
- def test_json_module_object
339
- Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
340
- obj = One::Two::Three::Deep.new()
341
- dump_and_load(obj, false)
342
- end
343
-
344
- def test_json_object_create_id
345
- Oj.default_options = { :mode => :compat, :use_as_json => false, :use_to_json => false }
346
- expected = Jeez.new(true, 58)
347
- json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_to_json => true, :use_as_json => true)
348
- obj = Oj.compat_load(json)
349
- assert_equal(expected, obj)
350
- end
351
-
352
- def test_json_object_bad
353
- json = %{{"json_class":"CompatJuice::Junk","x":true}}
354
- begin
355
- Oj.compat_load(json)
356
- rescue Exception => e
357
- assert_equal("Oj::ParseError", e.class().name)
358
- return
359
- end
360
- assert(false, "*** expected an exception")
361
- end
362
-
363
- def test_json_object_create_cache
364
- Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
365
- expected = Jeez.new(true, 58)
366
- json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_to_json => true)
367
- obj = Oj.compat_load(json, :class_cache => true)
368
- assert_equal(expected, obj)
369
- obj = Oj.compat_load(json, :class_cache => false)
370
- assert_equal(expected, obj)
371
- end
372
-
373
- def test_json_object_create_id_other
374
- Oj.default_options = { :mode => :compat, :use_as_json => false, :use_to_json => false }
375
- expected = Jeez.new(true, 58)
376
- json = Oj.dump(expected, :indent => 2, :mode => :compat, :use_as_json => true)
377
- json.gsub!('json_class', '_class_')
378
- obj = Oj.compat_load(json, :create_id => "_class_")
379
- assert_equal(expected, obj)
380
- end
381
-
382
- def test_json_object_create_deep
383
- Oj.default_options = { :mode => :compat, :use_as_json => true, :use_to_json => true }
384
- expected = One::Two::Three::Deep.new()
385
- json = Oj.dump(expected, :indent => 2, :mode => :compat)
386
- obj = Oj.compat_load(json)
387
- assert_equal(expected, obj)
388
- end
389
-
390
- def dump_and_load(obj, trace=false)
391
- json = Oj.dump(obj, :indent => 2, :mode => :compat)
392
- puts json if trace
393
- loaded = Oj.compat_load(json);
394
- assert_equal(obj, loaded)
395
- loaded
396
- end
397
-
398
- end
data/test/test_debian.rb DELETED
@@ -1,53 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'helper'
4
-
5
- class DebJuice < Minitest::Test
6
- class Jam
7
- attr_accessor :x, :y
8
-
9
- def initialize(x, y)
10
- @x = x
11
- @y = y
12
- end
13
-
14
- def eql?(o)
15
- self.class == o.class && @x == o.x && @y == o.y
16
- end
17
- alias == eql?
18
-
19
- end# Jam
20
-
21
- # contributed by sauliusg to fix as_json
22
- class Orange < Jam
23
- def initialize(x, y)
24
- super
25
- end
26
-
27
- def as_json()
28
- { :json_class => self.class,
29
- :x => @x,
30
- :y => @y }
31
- end
32
-
33
- def self.json_create(h)
34
- self.new(h['x'], h['y'])
35
- end
36
- end
37
-
38
- def test_as_json_object_compat_hash_cached
39
- Oj.default_options = { :mode => :compat, :class_cache => true, :use_as_json => true }
40
- obj = Orange.new(true, 58)
41
- json = Oj.dump(obj, :indent => 2)
42
- assert(!json.nil?)
43
- dump_and_load(obj, true)
44
- end
45
-
46
- def dump_and_load(obj, trace=false)
47
- json = Oj.dump(obj, :indent => 2)
48
- loaded = Oj.load(json);
49
- assert_equal(obj, loaded)
50
- loaded
51
- end
52
-
53
- end