json 2.1.0 → 2.6.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 (96) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.md +63 -5
  3. data/LICENSE +56 -0
  4. data/README.md +56 -23
  5. data/VERSION +1 -1
  6. data/ext/json/ext/generator/generator.c +223 -58
  7. data/ext/json/ext/generator/generator.h +5 -2
  8. data/ext/json/ext/parser/extconf.rb +26 -0
  9. data/ext/json/ext/parser/parser.c +2973 -1744
  10. data/ext/json/ext/parser/parser.h +6 -1
  11. data/ext/json/ext/parser/parser.rl +130 -22
  12. data/ext/json/extconf.rb +1 -0
  13. data/json.gemspec +0 -0
  14. data/lib/json/add/bigdecimal.rb +2 -2
  15. data/lib/json/add/complex.rb +2 -3
  16. data/lib/json/add/ostruct.rb +1 -1
  17. data/lib/json/add/rational.rb +2 -3
  18. data/lib/json/add/regexp.rb +2 -2
  19. data/lib/json/add/set.rb +29 -0
  20. data/lib/json/common.rb +372 -125
  21. data/lib/json/pure/generator.rb +31 -10
  22. data/lib/json/pure/parser.rb +32 -6
  23. data/lib/json/version.rb +1 -1
  24. data/lib/json.rb +549 -29
  25. metadata +19 -113
  26. data/.gitignore +0 -17
  27. data/.travis.yml +0 -19
  28. data/Gemfile +0 -16
  29. data/README-json-jruby.md +0 -33
  30. data/Rakefile +0 -408
  31. data/data/example.json +0 -1
  32. data/data/index.html +0 -38
  33. data/data/prototype.js +0 -4184
  34. data/diagrams/.keep +0 -0
  35. data/install.rb +0 -23
  36. data/java/src/json/ext/ByteListTranscoder.java +0 -166
  37. data/java/src/json/ext/Generator.java +0 -443
  38. data/java/src/json/ext/GeneratorMethods.java +0 -231
  39. data/java/src/json/ext/GeneratorService.java +0 -42
  40. data/java/src/json/ext/GeneratorState.java +0 -490
  41. data/java/src/json/ext/OptionsReader.java +0 -113
  42. data/java/src/json/ext/Parser.java +0 -2362
  43. data/java/src/json/ext/Parser.rl +0 -893
  44. data/java/src/json/ext/ParserService.java +0 -34
  45. data/java/src/json/ext/RuntimeInfo.java +0 -116
  46. data/java/src/json/ext/StringDecoder.java +0 -166
  47. data/java/src/json/ext/StringEncoder.java +0 -111
  48. data/java/src/json/ext/Utils.java +0 -88
  49. data/json-java.gemspec +0 -38
  50. data/json_pure.gemspec +0 -38
  51. data/lib/json/ext/.keep +0 -0
  52. data/references/rfc7159.txt +0 -899
  53. data/tests/fixtures/fail10.json +0 -1
  54. data/tests/fixtures/fail11.json +0 -1
  55. data/tests/fixtures/fail12.json +0 -1
  56. data/tests/fixtures/fail13.json +0 -1
  57. data/tests/fixtures/fail14.json +0 -1
  58. data/tests/fixtures/fail18.json +0 -1
  59. data/tests/fixtures/fail19.json +0 -1
  60. data/tests/fixtures/fail2.json +0 -1
  61. data/tests/fixtures/fail20.json +0 -1
  62. data/tests/fixtures/fail21.json +0 -1
  63. data/tests/fixtures/fail22.json +0 -1
  64. data/tests/fixtures/fail23.json +0 -1
  65. data/tests/fixtures/fail24.json +0 -1
  66. data/tests/fixtures/fail25.json +0 -1
  67. data/tests/fixtures/fail27.json +0 -2
  68. data/tests/fixtures/fail28.json +0 -2
  69. data/tests/fixtures/fail3.json +0 -1
  70. data/tests/fixtures/fail4.json +0 -1
  71. data/tests/fixtures/fail5.json +0 -1
  72. data/tests/fixtures/fail6.json +0 -1
  73. data/tests/fixtures/fail7.json +0 -1
  74. data/tests/fixtures/fail8.json +0 -1
  75. data/tests/fixtures/fail9.json +0 -1
  76. data/tests/fixtures/obsolete_fail1.json +0 -1
  77. data/tests/fixtures/pass1.json +0 -56
  78. data/tests/fixtures/pass15.json +0 -1
  79. data/tests/fixtures/pass16.json +0 -1
  80. data/tests/fixtures/pass17.json +0 -1
  81. data/tests/fixtures/pass2.json +0 -1
  82. data/tests/fixtures/pass26.json +0 -1
  83. data/tests/fixtures/pass3.json +0 -6
  84. data/tests/json_addition_test.rb +0 -193
  85. data/tests/json_common_interface_test.rb +0 -126
  86. data/tests/json_encoding_test.rb +0 -107
  87. data/tests/json_ext_parser_test.rb +0 -15
  88. data/tests/json_fixtures_test.rb +0 -32
  89. data/tests/json_generator_test.rb +0 -377
  90. data/tests/json_generic_object_test.rb +0 -82
  91. data/tests/json_parser_test.rb +0 -471
  92. data/tests/json_string_matching_test.rb +0 -38
  93. data/tests/test_helper.rb +0 -21
  94. data/tools/diff.sh +0 -18
  95. data/tools/fuzz.rb +0 -131
  96. data/tools/server.rb +0 -62
@@ -1,377 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
- # frozen_string_literal: false
4
-
5
- require 'test_helper'
6
-
7
- class JSONGeneratorTest < Test::Unit::TestCase
8
- include JSON
9
-
10
- def setup
11
- @hash = {
12
- 'a' => 2,
13
- 'b' => 3.141,
14
- 'c' => 'c',
15
- 'd' => [ 1, "b", 3.14 ],
16
- 'e' => { 'foo' => 'bar' },
17
- 'g' => "\"\0\037",
18
- 'h' => 1000.0,
19
- 'i' => 0.001
20
- }
21
- @json2 = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},' +
22
- '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
23
- @json3 = <<'EOT'.chomp
24
- {
25
- "a": 2,
26
- "b": 3.141,
27
- "c": "c",
28
- "d": [
29
- 1,
30
- "b",
31
- 3.14
32
- ],
33
- "e": {
34
- "foo": "bar"
35
- },
36
- "g": "\"\u0000\u001f",
37
- "h": 1000.0,
38
- "i": 0.001
39
- }
40
- EOT
41
- end
42
-
43
- def test_generate
44
- json = generate(@hash)
45
- assert_equal(parse(@json2), parse(json))
46
- json = JSON[@hash]
47
- assert_equal(parse(@json2), parse(json))
48
- parsed_json = parse(json)
49
- assert_equal(@hash, parsed_json)
50
- json = generate({1=>2})
51
- assert_equal('{"1":2}', json)
52
- parsed_json = parse(json)
53
- assert_equal({"1"=>2}, parsed_json)
54
- assert_equal '666', generate(666)
55
- end
56
-
57
- def test_generate_pretty
58
- json = pretty_generate(@hash)
59
- # hashes aren't (insertion) ordered on every ruby implementation
60
- # assert_equal(@json3, json)
61
- assert_equal(parse(@json3), parse(json))
62
- parsed_json = parse(json)
63
- assert_equal(@hash, parsed_json)
64
- json = pretty_generate({1=>2})
65
- assert_equal(<<'EOT'.chomp, json)
66
- {
67
- "1": 2
68
- }
69
- EOT
70
- parsed_json = parse(json)
71
- assert_equal({"1"=>2}, parsed_json)
72
- assert_equal '666', pretty_generate(666)
73
- end
74
-
75
- def test_generate_custom
76
- state = State.new(:space_before => " ", :space => " ", :indent => "<i>", :object_nl => "\n", :array_nl => "<a_nl>")
77
- json = generate({1=>{2=>3,4=>[5,6]}}, state)
78
- assert_equal(<<'EOT'.chomp, json)
79
- {
80
- <i>"1" : {
81
- <i><i>"2" : 3,
82
- <i><i>"4" : [<a_nl><i><i><i>5,<a_nl><i><i><i>6<a_nl><i><i>]
83
- <i>}
84
- }
85
- EOT
86
- end
87
-
88
- def test_fast_generate
89
- json = fast_generate(@hash)
90
- assert_equal(parse(@json2), parse(json))
91
- parsed_json = parse(json)
92
- assert_equal(@hash, parsed_json)
93
- json = fast_generate({1=>2})
94
- assert_equal('{"1":2}', json)
95
- parsed_json = parse(json)
96
- assert_equal({"1"=>2}, parsed_json)
97
- assert_equal '666', fast_generate(666)
98
- end
99
-
100
- def test_own_state
101
- state = State.new
102
- json = generate(@hash, state)
103
- assert_equal(parse(@json2), parse(json))
104
- parsed_json = parse(json)
105
- assert_equal(@hash, parsed_json)
106
- json = generate({1=>2}, state)
107
- assert_equal('{"1":2}', json)
108
- parsed_json = parse(json)
109
- assert_equal({"1"=>2}, parsed_json)
110
- assert_equal '666', generate(666, state)
111
- end
112
-
113
- def test_states
114
- json = generate({1=>2}, nil)
115
- assert_equal('{"1":2}', json)
116
- s = JSON.state.new
117
- assert s.check_circular?
118
- assert s[:check_circular?]
119
- h = { 1=>2 }
120
- h[3] = h
121
- assert_raise(JSON::NestingError) { generate(h) }
122
- assert_raise(JSON::NestingError) { generate(h, s) }
123
- s = JSON.state.new
124
- a = [ 1, 2 ]
125
- a << a
126
- assert_raise(JSON::NestingError) { generate(a, s) }
127
- assert s.check_circular?
128
- assert s[:check_circular?]
129
- end
130
-
131
- def test_pretty_state
132
- state = PRETTY_STATE_PROTOTYPE.dup
133
- assert_equal({
134
- :allow_nan => false,
135
- :array_nl => "\n",
136
- :ascii_only => false,
137
- :buffer_initial_length => 1024,
138
- :depth => 0,
139
- :indent => " ",
140
- :max_nesting => 100,
141
- :object_nl => "\n",
142
- :space => " ",
143
- :space_before => "",
144
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
145
- end
146
-
147
- def test_safe_state
148
- state = SAFE_STATE_PROTOTYPE.dup
149
- assert_equal({
150
- :allow_nan => false,
151
- :array_nl => "",
152
- :ascii_only => false,
153
- :buffer_initial_length => 1024,
154
- :depth => 0,
155
- :indent => "",
156
- :max_nesting => 100,
157
- :object_nl => "",
158
- :space => "",
159
- :space_before => "",
160
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
161
- end
162
-
163
- def test_fast_state
164
- state = FAST_STATE_PROTOTYPE.dup
165
- assert_equal({
166
- :allow_nan => false,
167
- :array_nl => "",
168
- :ascii_only => false,
169
- :buffer_initial_length => 1024,
170
- :depth => 0,
171
- :indent => "",
172
- :max_nesting => 0,
173
- :object_nl => "",
174
- :space => "",
175
- :space_before => "",
176
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
177
- end
178
-
179
- def test_allow_nan
180
- assert_raise(GeneratorError) { generate([JSON::NaN]) }
181
- assert_equal '[NaN]', generate([JSON::NaN], :allow_nan => true)
182
- assert_raise(GeneratorError) { fast_generate([JSON::NaN]) }
183
- assert_raise(GeneratorError) { pretty_generate([JSON::NaN]) }
184
- assert_equal "[\n NaN\n]", pretty_generate([JSON::NaN], :allow_nan => true)
185
- assert_raise(GeneratorError) { generate([JSON::Infinity]) }
186
- assert_equal '[Infinity]', generate([JSON::Infinity], :allow_nan => true)
187
- assert_raise(GeneratorError) { fast_generate([JSON::Infinity]) }
188
- assert_raise(GeneratorError) { pretty_generate([JSON::Infinity]) }
189
- assert_equal "[\n Infinity\n]", pretty_generate([JSON::Infinity], :allow_nan => true)
190
- assert_raise(GeneratorError) { generate([JSON::MinusInfinity]) }
191
- assert_equal '[-Infinity]', generate([JSON::MinusInfinity], :allow_nan => true)
192
- assert_raise(GeneratorError) { fast_generate([JSON::MinusInfinity]) }
193
- assert_raise(GeneratorError) { pretty_generate([JSON::MinusInfinity]) }
194
- assert_equal "[\n -Infinity\n]", pretty_generate([JSON::MinusInfinity], :allow_nan => true)
195
- end
196
-
197
- def test_depth
198
- ary = []; ary << ary
199
- assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
200
- assert_raise(JSON::NestingError) { generate(ary) }
201
- assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
202
- assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
203
- assert_raise(JSON::NestingError) { JSON.pretty_generate(ary) }
204
- assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
205
- s = JSON.state.new
206
- assert_equal 0, s.depth
207
- assert_raise(JSON::NestingError) { ary.to_json(s) }
208
- assert_equal 100, s.depth
209
- end
210
-
211
- def test_buffer_initial_length
212
- s = JSON.state.new
213
- assert_equal 1024, s.buffer_initial_length
214
- s.buffer_initial_length = 0
215
- assert_equal 1024, s.buffer_initial_length
216
- s.buffer_initial_length = -1
217
- assert_equal 1024, s.buffer_initial_length
218
- s.buffer_initial_length = 128
219
- assert_equal 128, s.buffer_initial_length
220
- end
221
-
222
- def test_gc
223
- if respond_to?(:assert_in_out_err)
224
- assert_in_out_err(%w[-rjson --disable-gems], <<-EOS, [], [])
225
- bignum_too_long_to_embed_as_string = 1234567890123456789012345
226
- expect = bignum_too_long_to_embed_as_string.to_s
227
- GC.stress = true
228
-
229
- 10.times do |i|
230
- tmp = bignum_too_long_to_embed_as_string.to_json
231
- raise "'\#{expect}' is expected, but '\#{tmp}'" unless tmp == expect
232
- end
233
- EOS
234
- end
235
- end if GC.respond_to?(:stress=)
236
-
237
- def test_configure_using_configure_and_merge
238
- numbered_state = {
239
- :indent => "1",
240
- :space => '2',
241
- :space_before => '3',
242
- :object_nl => '4',
243
- :array_nl => '5'
244
- }
245
- state1 = JSON.state.new
246
- state1.merge(numbered_state)
247
- assert_equal '1', state1.indent
248
- assert_equal '2', state1.space
249
- assert_equal '3', state1.space_before
250
- assert_equal '4', state1.object_nl
251
- assert_equal '5', state1.array_nl
252
- state2 = JSON.state.new
253
- state2.configure(numbered_state)
254
- assert_equal '1', state2.indent
255
- assert_equal '2', state2.space
256
- assert_equal '3', state2.space_before
257
- assert_equal '4', state2.object_nl
258
- assert_equal '5', state2.array_nl
259
- end
260
-
261
- def test_configure_hash_conversion
262
- state = JSON.state.new
263
- state.configure(:indent => '1')
264
- assert_equal '1', state.indent
265
- state = JSON.state.new
266
- foo = 'foo'
267
- assert_raise(TypeError) do
268
- state.configure(foo)
269
- end
270
- def foo.to_h
271
- { :indent => '2' }
272
- end
273
- state.configure(foo)
274
- assert_equal '2', state.indent
275
- end
276
-
277
- if defined?(JSON::Ext::Generator)
278
- def test_broken_bignum # [ruby-core:38867]
279
- pid = fork do
280
- x = 1 << 64
281
- x.class.class_eval do
282
- def to_s
283
- end
284
- end
285
- begin
286
- JSON::Ext::Generator::State.new.generate(x)
287
- exit 1
288
- rescue TypeError
289
- exit 0
290
- end
291
- end
292
- _, status = Process.waitpid2(pid)
293
- assert status.success?
294
- rescue NotImplementedError
295
- # forking to avoid modifying core class of a parent process and
296
- # introducing race conditions of tests are run in parallel
297
- end
298
- end
299
-
300
- def test_hash_likeness_set_symbol
301
- state = JSON.state.new
302
- assert_equal nil, state[:foo]
303
- assert_equal nil.class, state[:foo].class
304
- assert_equal nil, state['foo']
305
- state[:foo] = :bar
306
- assert_equal :bar, state[:foo]
307
- assert_equal :bar, state['foo']
308
- state_hash = state.to_hash
309
- assert_kind_of Hash, state_hash
310
- assert_equal :bar, state_hash[:foo]
311
- end
312
-
313
- def test_hash_likeness_set_string
314
- state = JSON.state.new
315
- assert_equal nil, state[:foo]
316
- assert_equal nil, state['foo']
317
- state['foo'] = :bar
318
- assert_equal :bar, state[:foo]
319
- assert_equal :bar, state['foo']
320
- state_hash = state.to_hash
321
- assert_kind_of Hash, state_hash
322
- assert_equal :bar, state_hash[:foo]
323
- end
324
-
325
- def test_json_generate
326
- assert_raise JSON::GeneratorError do
327
- assert_equal true, generate(["\xea"])
328
- end
329
- end
330
-
331
- def test_nesting
332
- too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
333
- too_deep_ary = eval too_deep
334
- assert_raise(JSON::NestingError) { generate too_deep_ary }
335
- assert_raise(JSON::NestingError) { generate too_deep_ary, :max_nesting => 100 }
336
- ok = generate too_deep_ary, :max_nesting => 101
337
- assert_equal too_deep, ok
338
- ok = generate too_deep_ary, :max_nesting => nil
339
- assert_equal too_deep, ok
340
- ok = generate too_deep_ary, :max_nesting => false
341
- assert_equal too_deep, ok
342
- ok = generate too_deep_ary, :max_nesting => 0
343
- assert_equal too_deep, ok
344
- end
345
-
346
- def test_backslash
347
- data = [ '\\.(?i:gif|jpe?g|png)$' ]
348
- json = '["\\\\.(?i:gif|jpe?g|png)$"]'
349
- assert_equal json, generate(data)
350
- #
351
- data = [ '\\"' ]
352
- json = '["\\\\\""]'
353
- assert_equal json, generate(data)
354
- #
355
- data = [ '/' ]
356
- json = '["/"]'
357
- assert_equal json, generate(data)
358
- #
359
- data = ['"']
360
- json = '["\""]'
361
- assert_equal json, generate(data)
362
- #
363
- data = ["'"]
364
- json = '["\\\'"]'
365
- assert_equal '["\'"]', generate(data)
366
- end
367
-
368
- def test_string_subclass
369
- s = Class.new(String) do
370
- def to_s; self; end
371
- undef to_json
372
- end
373
- assert_nothing_raised(SystemStackError) do
374
- assert_equal '["foo"]', JSON.generate([s.new('foo')])
375
- end
376
- end
377
- end
@@ -1,82 +0,0 @@
1
- #frozen_string_literal: false
2
- require 'test_helper'
3
-
4
- class JSONGenericObjectTest < Test::Unit::TestCase
5
- include JSON
6
-
7
- def setup
8
- @go = GenericObject[ :a => 1, :b => 2 ]
9
- end
10
-
11
- def test_attributes
12
- assert_equal 1, @go.a
13
- assert_equal 1, @go[:a]
14
- assert_equal 2, @go.b
15
- assert_equal 2, @go[:b]
16
- assert_nil @go.c
17
- assert_nil @go[:c]
18
- end
19
-
20
- def test_generate_json
21
- switch_json_creatable do
22
- assert_equal @go, JSON(JSON(@go), :create_additions => true)
23
- end
24
- end
25
-
26
- def test_parse_json
27
- assert_kind_of Hash,
28
- JSON(
29
- '{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }',
30
- :create_additions => true
31
- )
32
- switch_json_creatable do
33
- assert_equal @go, l =
34
- JSON(
35
- '{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }',
36
- :create_additions => true
37
- )
38
- assert_equal 1, l.a
39
- assert_equal @go,
40
- l = JSON('{ "a": 1, "b": 2 }', :object_class => GenericObject)
41
- assert_equal 1, l.a
42
- assert_equal GenericObject[:a => GenericObject[:b => 2]],
43
- l = JSON('{ "a": { "b": 2 } }', :object_class => GenericObject)
44
- assert_equal 2, l.a.b
45
- end
46
- end
47
-
48
- def test_from_hash
49
- result = GenericObject.from_hash(
50
- :foo => { :bar => { :baz => true }, :quux => [ { :foobar => true } ] })
51
- assert_kind_of GenericObject, result.foo
52
- assert_kind_of GenericObject, result.foo.bar
53
- assert_equal true, result.foo.bar.baz
54
- assert_kind_of GenericObject, result.foo.quux.first
55
- assert_equal true, result.foo.quux.first.foobar
56
- assert_equal true, GenericObject.from_hash(true)
57
- end
58
-
59
- def test_json_generic_object_load
60
- empty = JSON::GenericObject.load(nil)
61
- assert_kind_of JSON::GenericObject, empty
62
- simple_json = '{"json_class":"JSON::GenericObject","hello":"world"}'
63
- simple = JSON::GenericObject.load(simple_json)
64
- assert_kind_of JSON::GenericObject, simple
65
- assert_equal "world", simple.hello
66
- converting = JSON::GenericObject.load('{ "hello": "world" }')
67
- assert_kind_of JSON::GenericObject, converting
68
- assert_equal "world", converting.hello
69
-
70
- json = JSON::GenericObject.dump(JSON::GenericObject[:hello => 'world'])
71
- assert_equal JSON(json), JSON('{"json_class":"JSON::GenericObject","hello":"world"}')
72
- end
73
-
74
- private
75
-
76
- def switch_json_creatable
77
- JSON::GenericObject.json_creatable = true
78
- yield
79
- ensure
80
- JSON::GenericObject.json_creatable = false
81
- end
82
- end