json 2.1.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.md +74 -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