json 1.8.3 → 2.0.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.

Potentially problematic release.


This version of json might be problematic. Click here for more details.

Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -10
  3. data/CHANGES +12 -0
  4. data/Gemfile +1 -2
  5. data/{README.rdoc → README.md} +145 -111
  6. data/Rakefile +26 -29
  7. data/VERSION +1 -1
  8. data/ext/json/ext/generator/generator.c +38 -55
  9. data/ext/json/ext/generator/generator.h +7 -1
  10. data/ext/json/ext/parser/extconf.rb +3 -0
  11. data/ext/json/ext/parser/parser.c +309 -439
  12. data/ext/json/ext/parser/parser.h +0 -1
  13. data/ext/json/ext/parser/parser.rl +67 -160
  14. data/ext/json/extconf.rb +0 -1
  15. data/java/src/json/ext/ByteListTranscoder.java +1 -2
  16. data/java/src/json/ext/Generator.java +11 -12
  17. data/java/src/json/ext/GeneratorMethods.java +1 -2
  18. data/java/src/json/ext/GeneratorService.java +1 -2
  19. data/java/src/json/ext/GeneratorState.java +3 -56
  20. data/java/src/json/ext/OptionsReader.java +2 -3
  21. data/java/src/json/ext/Parser.java +110 -411
  22. data/java/src/json/ext/Parser.rl +25 -119
  23. data/java/src/json/ext/ParserService.java +1 -2
  24. data/java/src/json/ext/RuntimeInfo.java +1 -6
  25. data/java/src/json/ext/StringDecoder.java +1 -2
  26. data/java/src/json/ext/StringEncoder.java +5 -0
  27. data/java/src/json/ext/Utils.java +1 -2
  28. data/json-java.gemspec +15 -0
  29. data/json.gemspec +0 -0
  30. data/json_pure.gemspec +23 -26
  31. data/lib/json/add/bigdecimal.rb +1 -0
  32. data/lib/json/add/complex.rb +2 -1
  33. data/lib/json/add/core.rb +1 -0
  34. data/lib/json/add/date.rb +1 -1
  35. data/lib/json/add/date_time.rb +1 -1
  36. data/lib/json/add/exception.rb +1 -1
  37. data/lib/json/add/ostruct.rb +1 -1
  38. data/lib/json/add/range.rb +1 -1
  39. data/lib/json/add/rational.rb +1 -0
  40. data/lib/json/add/regexp.rb +1 -1
  41. data/lib/json/add/struct.rb +1 -1
  42. data/lib/json/add/symbol.rb +1 -1
  43. data/lib/json/add/time.rb +1 -1
  44. data/lib/json/common.rb +24 -52
  45. data/lib/json/ext.rb +0 -6
  46. data/lib/json/generic_object.rb +5 -4
  47. data/lib/json/pure/generator.rb +61 -125
  48. data/lib/json/pure/parser.rb +28 -80
  49. data/lib/json/pure.rb +2 -8
  50. data/lib/json/version.rb +2 -1
  51. data/lib/json.rb +1 -0
  52. data/references/rfc7159.txt +899 -0
  53. data/tests/fixtures/obsolete_fail1.json +1 -0
  54. data/tests/{test_json_addition.rb → json_addition_test.rb} +22 -25
  55. data/tests/json_common_interface_test.rb +126 -0
  56. data/tests/json_encoding_test.rb +105 -0
  57. data/tests/json_ext_parser_test.rb +15 -0
  58. data/tests/{test_json_fixtures.rb → json_fixtures_test.rb} +5 -8
  59. data/tests/{test_json_generate.rb → json_generator_test.rb} +76 -37
  60. data/tests/{test_json_generic_object.rb → json_generic_object_test.rb} +15 -8
  61. data/tests/json_parser_test.rb +448 -0
  62. data/tests/json_string_matching_test.rb +38 -0
  63. data/tests/test_helper.rb +23 -0
  64. data/tools/diff.sh +18 -0
  65. data/tools/fuzz.rb +1 -9
  66. metadata +27 -42
  67. data/COPYING +0 -58
  68. data/COPYING-json-jruby +0 -57
  69. data/GPL +0 -340
  70. data/TODO +0 -1
  71. data/tests/fixtures/fail1.json +0 -1
  72. data/tests/setup_variant.rb +0 -11
  73. data/tests/test_json.rb +0 -553
  74. data/tests/test_json_encoding.rb +0 -65
  75. data/tests/test_json_string_matching.rb +0 -39
  76. data/tests/test_json_unicode.rb +0 -72
@@ -0,0 +1,448 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: false
3
+ require 'test_helper'
4
+ require 'stringio'
5
+ require 'tempfile'
6
+ require 'ostruct'
7
+
8
+ class JSONParserTest < Test::Unit::TestCase
9
+ include JSON
10
+
11
+ def test_construction
12
+ parser = JSON::Parser.new('test')
13
+ assert_equal 'test', parser.source
14
+ end
15
+
16
+ def test_argument_encoding
17
+ source = "{}".encode("UTF-16")
18
+ JSON::Parser.new(source)
19
+ assert_equal Encoding::UTF_16, source.encoding
20
+ end if defined?(Encoding::UTF_16)
21
+
22
+ def test_error_message_encoding
23
+ bug10705 = '[ruby-core:67386] [Bug #10705]'
24
+ json = ".\"\xE2\x88\x9A\"".force_encoding(Encoding::UTF_8)
25
+ e = assert_raise(JSON::ParserError) {
26
+ JSON::Ext::Parser.new(json).parse
27
+ }
28
+ assert_equal(Encoding::UTF_8, e.message.encoding, bug10705)
29
+ assert_include(e.message, json, bug10705)
30
+ end if defined?(Encoding::UTF_8) and defined?(JSON::Ext::Parser)
31
+
32
+ def test_parsing
33
+ parser = JSON::Parser.new('"test"')
34
+ assert_equal 'test', parser.parse
35
+ end
36
+
37
+ def test_parser_reset
38
+ parser = Parser.new('{"a":"b"}')
39
+ assert_equal({ 'a' => 'b' }, parser.parse)
40
+ assert_equal({ 'a' => 'b' }, parser.parse)
41
+ end
42
+
43
+ def test_parse_simple_arrays
44
+ assert_equal([], parse('[]'))
45
+ assert_equal([], parse(' [ ] '))
46
+ assert_equal([ nil ], parse('[null]'))
47
+ assert_equal([ false ], parse('[false]'))
48
+ assert_equal([ true ], parse('[true]'))
49
+ assert_equal([ -23 ], parse('[-23]'))
50
+ assert_equal([ 23 ], parse('[23]'))
51
+ assert_equal_float([ 0.23 ], parse('[0.23]'))
52
+ assert_equal_float([ 0.0 ], parse('[0e0]'))
53
+ assert_equal([""], parse('[""]'))
54
+ assert_equal(["foobar"], parse('["foobar"]'))
55
+ assert_equal([{}], parse('[{}]'))
56
+ end
57
+
58
+ def test_parse_simple_objects
59
+ assert_equal({}, parse('{}'))
60
+ assert_equal({}, parse(' { } '))
61
+ assert_equal({ "a" => nil }, parse('{ "a" : null}'))
62
+ assert_equal({ "a" => nil }, parse('{"a":null}'))
63
+ assert_equal({ "a" => false }, parse('{ "a" : false } '))
64
+ assert_equal({ "a" => false }, parse('{"a":false}'))
65
+ assert_raise(JSON::ParserError) { parse('{false}') }
66
+ assert_equal({ "a" => true }, parse('{"a":true}'))
67
+ assert_equal({ "a" => true }, parse(' { "a" : true } '))
68
+ assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
69
+ assert_equal({ "a" => -23 }, parse(' { "a" : -23 } '))
70
+ assert_equal({ "a" => 23 }, parse('{"a":23 } '))
71
+ assert_equal({ "a" => 23 }, parse(' { "a" : 23 } '))
72
+ assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
73
+ assert_equal({ "a" => 0.23 }, parse(' { "a" : 0.23 } '))
74
+ end
75
+
76
+ def test_parse_numbers
77
+ assert_raise(JSON::ParserError) { parse('+23.2') }
78
+ assert_raise(JSON::ParserError) { parse('+23') }
79
+ assert_raise(JSON::ParserError) { parse('.23') }
80
+ assert_raise(JSON::ParserError) { parse('023') }
81
+ assert_equal 23, parse('23')
82
+ assert_equal -23, parse('-23')
83
+ assert_equal_float 3.141, parse('3.141')
84
+ assert_equal_float -3.141, parse('-3.141')
85
+ assert_equal_float 3.141, parse('3141e-3')
86
+ assert_equal_float 3.141, parse('3141.1e-3')
87
+ assert_equal_float 3.141, parse('3141E-3')
88
+ assert_equal_float 3.141, parse('3141.0E-3')
89
+ assert_equal_float -3.141, parse('-3141.0e-3')
90
+ assert_equal_float -3.141, parse('-3141e-3')
91
+ assert_raise(ParserError) { parse('NaN') }
92
+ assert parse('NaN', :allow_nan => true).nan?
93
+ assert_raise(ParserError) { parse('Infinity') }
94
+ assert_equal 1.0/0, parse('Infinity', :allow_nan => true)
95
+ assert_raise(ParserError) { parse('-Infinity') }
96
+ assert_equal -1.0/0, parse('-Infinity', :allow_nan => true)
97
+ end
98
+
99
+ if Array.method_defined?(:permutation)
100
+ def test_parse_more_complex_arrays
101
+ a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
102
+ a.permutation.each do |perm|
103
+ json = pretty_generate(perm)
104
+ assert_equal perm, parse(json)
105
+ end
106
+ end
107
+
108
+ def test_parse_complex_objects
109
+ a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
110
+ a.permutation.each do |perm|
111
+ s = "a"
112
+ orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
113
+ json = pretty_generate(orig_obj)
114
+ assert_equal orig_obj, parse(json)
115
+ end
116
+ end
117
+ end
118
+
119
+ def test_parse_arrays
120
+ assert_equal([1,2,3], parse('[1,2,3]'))
121
+ assert_equal([1.2,2,3], parse('[1.2,2,3]'))
122
+ assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
123
+ assert_equal([], parse('[]'))
124
+ assert_equal([], parse(' [ ] '))
125
+ assert_equal([1], parse('[1]'))
126
+ assert_equal([1], parse(' [ 1 ] '))
127
+ ary = [[1], ["foo"], [3.14], [4711.0], [2.718], [nil],
128
+ [[1, -2, 3]], [false], [true]]
129
+ assert_equal(ary,
130
+ parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]],[false],[true]]'))
131
+ assert_equal(ary, parse(%Q{ [ [1] , ["foo"] , [3.14] \t , [47.11e+2]\s
132
+ , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ] }))
133
+ end
134
+
135
+ def test_parse_json_primitive_values
136
+ assert_raise(JSON::ParserError) { parse('') }
137
+ assert_raise(TypeError) { parse(nil) }
138
+ assert_raise(JSON::ParserError) { parse(' /* foo */ ') }
139
+ assert_equal nil, parse('null')
140
+ assert_equal false, parse('false')
141
+ assert_equal true, parse('true')
142
+ assert_equal 23, parse('23')
143
+ assert_equal 1, parse('1')
144
+ assert_equal_float 3.141, parse('3.141'), 1E-3
145
+ assert_equal 2 ** 64, parse('18446744073709551616')
146
+ assert_equal 'foo', parse('"foo"')
147
+ assert parse('NaN', :allow_nan => true).nan?
148
+ assert parse('Infinity', :allow_nan => true).infinite?
149
+ assert parse('-Infinity', :allow_nan => true).infinite?
150
+ assert_raise(JSON::ParserError) { parse('[ 1, ]') }
151
+ end
152
+
153
+ def test_parse_some_strings
154
+ assert_equal([""], parse('[""]'))
155
+ assert_equal(["\\"], parse('["\\\\"]'))
156
+ assert_equal(['"'], parse('["\""]'))
157
+ assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
158
+ assert_equal(
159
+ ["\"\b\n\r\t\0\037"],
160
+ parse('["\"\b\n\r\t\u0000\u001f"]')
161
+ )
162
+ end
163
+
164
+ def test_parse_big_integers
165
+ json1 = JSON(orig = (1 << 31) - 1)
166
+ assert_equal orig, parse(json1)
167
+ json2 = JSON(orig = 1 << 31)
168
+ assert_equal orig, parse(json2)
169
+ json3 = JSON(orig = (1 << 62) - 1)
170
+ assert_equal orig, parse(json3)
171
+ json4 = JSON(orig = 1 << 62)
172
+ assert_equal orig, parse(json4)
173
+ json5 = JSON(orig = 1 << 64)
174
+ assert_equal orig, parse(json5)
175
+ end
176
+
177
+ def test_some_wrong_inputs
178
+ assert_raise(ParserError) { parse('[] bla') }
179
+ assert_raise(ParserError) { parse('[] 1') }
180
+ assert_raise(ParserError) { parse('[] []') }
181
+ assert_raise(ParserError) { parse('[] {}') }
182
+ assert_raise(ParserError) { parse('{} []') }
183
+ assert_raise(ParserError) { parse('{} {}') }
184
+ assert_raise(ParserError) { parse('[NULL]') }
185
+ assert_raise(ParserError) { parse('[FALSE]') }
186
+ assert_raise(ParserError) { parse('[TRUE]') }
187
+ assert_raise(ParserError) { parse('[07] ') }
188
+ assert_raise(ParserError) { parse('[0a]') }
189
+ assert_raise(ParserError) { parse('[1.]') }
190
+ assert_raise(ParserError) { parse(' ') }
191
+ end
192
+
193
+ def test_symbolize_names
194
+ assert_equal({ "foo" => "bar", "baz" => "quux" },
195
+ parse('{"foo":"bar", "baz":"quux"}'))
196
+ assert_equal({ :foo => "bar", :baz => "quux" },
197
+ parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
198
+ assert_raise(ArgumentError) do
199
+ parse('{}', :symbolize_names => true, :create_additions => true)
200
+ end
201
+ end
202
+
203
+ def test_parse_comments
204
+ json = <<EOT
205
+ {
206
+ "key1":"value1", // eol comment
207
+ "key2":"value2" /* multi line
208
+ * comment */,
209
+ "key3":"value3" /* multi line
210
+ // nested eol comment
211
+ * comment */
212
+ }
213
+ EOT
214
+ assert_equal(
215
+ { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
216
+ parse(json))
217
+ json = <<EOT
218
+ {
219
+ "key1":"value1" /* multi line
220
+ // nested eol comment
221
+ /* illegal nested multi line comment */
222
+ * comment */
223
+ }
224
+ EOT
225
+ assert_raise(ParserError) { parse(json) }
226
+ json = <<EOT
227
+ {
228
+ "key1":"value1" /* multi line
229
+ // nested eol comment
230
+ closed multi comment */
231
+ and again, throw an Error */
232
+ }
233
+ EOT
234
+ assert_raise(ParserError) { parse(json) }
235
+ json = <<EOT
236
+ {
237
+ "key1":"value1" /*/*/
238
+ }
239
+ EOT
240
+ assert_equal({ "key1" => "value1" }, parse(json))
241
+ end
242
+
243
+ def test_nesting
244
+ too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
245
+ too_deep_ary = eval too_deep
246
+ assert_raise(JSON::NestingError) { parse too_deep }
247
+ assert_raise(JSON::NestingError) { parse too_deep, :max_nesting => 100 }
248
+ ok = parse too_deep, :max_nesting => 101
249
+ assert_equal too_deep_ary, ok
250
+ ok = parse too_deep, :max_nesting => nil
251
+ assert_equal too_deep_ary, ok
252
+ ok = parse too_deep, :max_nesting => false
253
+ assert_equal too_deep_ary, ok
254
+ ok = parse too_deep, :max_nesting => 0
255
+ assert_equal too_deep_ary, ok
256
+ end
257
+
258
+ def test_backslash
259
+ data = [ '\\.(?i:gif|jpe?g|png)$' ]
260
+ json = '["\\\\.(?i:gif|jpe?g|png)$"]'
261
+ assert_equal data, parse(json)
262
+ #
263
+ data = [ '\\"' ]
264
+ json = '["\\\\\""]'
265
+ assert_equal data, parse(json)
266
+ #
267
+ json = '["/"]'
268
+ data = [ '/' ]
269
+ assert_equal data, parse(json)
270
+ #
271
+ json = '["\""]'
272
+ data = ['"']
273
+ assert_equal data, parse(json)
274
+ #
275
+ json = '["\\\'"]'
276
+ data = ["'"]
277
+ assert_equal data, parse(json)
278
+ end
279
+
280
+
281
+ class SubArray < Array
282
+ def <<(v)
283
+ @shifted = true
284
+ super
285
+ end
286
+
287
+ def shifted?
288
+ @shifted
289
+ end
290
+ end
291
+
292
+ class SubArray2 < Array
293
+ def to_json(*a)
294
+ {
295
+ JSON.create_id => self.class.name,
296
+ 'ary' => to_a,
297
+ }.to_json(*a)
298
+ end
299
+
300
+ def self.json_create(o)
301
+ o.delete JSON.create_id
302
+ o['ary']
303
+ end
304
+ end
305
+
306
+ class SubArrayWrapper
307
+ def initialize
308
+ @data = []
309
+ end
310
+
311
+ attr_reader :data
312
+
313
+ def [](index)
314
+ @data[index]
315
+ end
316
+
317
+ def <<(value)
318
+ @data << value
319
+ @shifted = true
320
+ end
321
+
322
+ def shifted?
323
+ @shifted
324
+ end
325
+ end
326
+
327
+ def test_parse_array_custom_array_derived_class
328
+ res = parse('[1,2]', :array_class => SubArray)
329
+ assert_equal([1,2], res)
330
+ assert_equal(SubArray, res.class)
331
+ assert res.shifted?
332
+ end
333
+
334
+ def test_parse_array_custom_non_array_derived_class
335
+ res = parse('[1,2]', :array_class => SubArrayWrapper)
336
+ assert_equal([1,2], res.data)
337
+ assert_equal(SubArrayWrapper, res.class)
338
+ assert res.shifted?
339
+ end
340
+
341
+ def test_parse_object
342
+ assert_equal({}, parse('{}'))
343
+ assert_equal({}, parse(' { } '))
344
+ assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
345
+ assert_equal({'foo'=>'bar'}, parse(' { "foo" : "bar" } '))
346
+ end
347
+
348
+ class SubHash < Hash
349
+ def []=(k, v)
350
+ @item_set = true
351
+ super
352
+ end
353
+
354
+ def item_set?
355
+ @item_set
356
+ end
357
+ end
358
+
359
+ class SubHash2 < Hash
360
+ def to_json(*a)
361
+ {
362
+ JSON.create_id => self.class.name,
363
+ }.merge(self).to_json(*a)
364
+ end
365
+
366
+ def self.json_create(o)
367
+ o.delete JSON.create_id
368
+ self[o]
369
+ end
370
+ end
371
+
372
+ class SubOpenStruct < OpenStruct
373
+ def [](k)
374
+ __send__(k)
375
+ end
376
+
377
+ def []=(k, v)
378
+ @item_set = true
379
+ __send__("#{k}=", v)
380
+ end
381
+
382
+ def item_set?
383
+ @item_set
384
+ end
385
+ end
386
+
387
+ def test_parse_object_custom_hash_derived_class
388
+ res = parse('{"foo":"bar"}', :object_class => SubHash)
389
+ assert_equal({"foo" => "bar"}, res)
390
+ assert_equal(SubHash, res.class)
391
+ assert res.item_set?
392
+ end
393
+
394
+ def test_parse_object_custom_non_hash_derived_class
395
+ res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
396
+ assert_equal "bar", res.foo
397
+ assert_equal(SubOpenStruct, res.class)
398
+ assert res.item_set?
399
+ end
400
+
401
+ def test_parse_generic_object
402
+ res = parse(
403
+ '{"foo":"bar", "baz":{}}',
404
+ :object_class => JSON::GenericObject
405
+ )
406
+ assert_equal(JSON::GenericObject, res.class)
407
+ assert_equal "bar", res.foo
408
+ assert_equal "bar", res["foo"]
409
+ assert_equal "bar", res[:foo]
410
+ assert_equal "bar", res.to_hash[:foo]
411
+ assert_equal(JSON::GenericObject, res.baz.class)
412
+ end
413
+
414
+ def test_generate_core_subclasses_with_new_to_json
415
+ obj = SubHash2["foo" => SubHash2["bar" => true]]
416
+ obj_json = JSON(obj)
417
+ obj_again = parse(obj_json, :create_additions => true)
418
+ assert_kind_of SubHash2, obj_again
419
+ assert_kind_of SubHash2, obj_again['foo']
420
+ assert obj_again['foo']['bar']
421
+ assert_equal obj, obj_again
422
+ assert_equal ["foo"],
423
+ JSON(JSON(SubArray2["foo"]), :create_additions => true)
424
+ end
425
+
426
+ def test_generate_core_subclasses_with_default_to_json
427
+ assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
428
+ assert_equal '["foo"]', JSON(SubArray["foo"])
429
+ end
430
+
431
+ def test_generate_of_core_subclasses
432
+ obj = SubHash["foo" => SubHash["bar" => true]]
433
+ obj_json = JSON(obj)
434
+ obj_again = JSON(obj_json)
435
+ assert_kind_of Hash, obj_again
436
+ assert_kind_of Hash, obj_again['foo']
437
+ assert obj_again['foo']['bar']
438
+ assert_equal obj, obj_again
439
+ end
440
+
441
+ private
442
+
443
+ def assert_equal_float(expected, actual, delta = 1e-2)
444
+ Array === expected and expected = expected.first
445
+ Array === actual and actual = actual.first
446
+ assert_in_delta(expected, actual, delta)
447
+ end
448
+ end
@@ -0,0 +1,38 @@
1
+ #frozen_string_literal: false
2
+ require 'test_helper'
3
+ require 'time'
4
+
5
+ class JSONStringMatchingTest < Test::Unit::TestCase
6
+ include JSON
7
+
8
+ class TestTime < ::Time
9
+ def self.json_create(string)
10
+ Time.parse(string)
11
+ end
12
+
13
+ def to_json(*)
14
+ %{"#{strftime('%FT%T%z')}"}
15
+ end
16
+
17
+ def ==(other)
18
+ to_i == other.to_i
19
+ end
20
+ end
21
+
22
+ def test_match_date
23
+ t = TestTime.new
24
+ t_json = [ t ].to_json
25
+ time_regexp = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/
26
+ assert_equal [ t ],
27
+ parse(
28
+ t_json,
29
+ :create_additions => true,
30
+ :match_string => { time_regexp => TestTime }
31
+ )
32
+ assert_equal [ t.strftime('%FT%T%z') ],
33
+ parse(
34
+ t_json,
35
+ :match_string => { time_regexp => TestTime }
36
+ )
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ gem 'json', File.read('VERSION').chomp
2
+
3
+ case ENV['JSON']
4
+ when 'pure'
5
+ $:.unshift 'lib'
6
+ require 'json/pure'
7
+ when 'ext'
8
+ $:.unshift 'ext', 'lib'
9
+ require 'json/ext'
10
+ else
11
+ $:.unshift 'ext', 'lib'
12
+ require 'json'
13
+ end
14
+
15
+ require 'test/unit'
16
+ begin
17
+ require 'byebug'
18
+ rescue LoadError
19
+ end
20
+ if ENV['START_SIMPLECOV'].to_i == 1
21
+ require 'simplecov'
22
+ SimpleCov.start
23
+ end
data/tools/diff.sh ADDED
@@ -0,0 +1,18 @@
1
+ #!/bin/sh
2
+
3
+ files=`find ext -name '*.[ch]' -o -name parser.rl`
4
+
5
+ for f in $files
6
+ do
7
+ b=`basename $f`
8
+ g=`find ../ruby/ext/json -name $b`
9
+ d=`diff -u $f $g`
10
+ test -z "$d" && continue
11
+ echo "$d"
12
+ read -p "Edit diff of $b? " a
13
+ case $a in
14
+ [yY]*)
15
+ vimdiff $f $g
16
+ ;;
17
+ esac
18
+ done
data/tools/fuzz.rb CHANGED
@@ -1,13 +1,5 @@
1
1
  require 'json'
2
2
 
3
- require 'iconv'
4
- ISO_8859_1_TO_UTF8 = Iconv.new('utf-8', 'iso-8859-15')
5
- class ::String
6
- def to_utf8
7
- ISO_8859_1_TO_UTF8.iconv self
8
- end
9
- end
10
-
11
3
  class Fuzzer
12
4
  def initialize(n, freqs = {})
13
5
  sum = freqs.inject(0.0) { |s, x| s + x.last }
@@ -25,7 +17,7 @@ class Fuzzer
25
17
  def random_string
26
18
  s = ''
27
19
  30.times { s << @alpha[rand(@alpha.size)] }
28
- s.to_utf8
20
+ s
29
21
  end
30
22
 
31
23
  def pick
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-01 00:00:00.000000000 Z
11
+ date: 2016-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: permutation
14
+ name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: sdoc
28
+ name: test-unit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.3.16
33
+ version: '2.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.3.16
40
+ version: '2.0'
41
41
  description: This is a JSON implementation as a Ruby extension in C.
42
42
  email: flori@ping.de
43
43
  executables: []
@@ -46,27 +46,16 @@ extensions:
46
46
  - ext/json/ext/parser/extconf.rb
47
47
  - ext/json/extconf.rb
48
48
  extra_rdoc_files:
49
- - README.rdoc
49
+ - README.md
50
50
  files:
51
- - "./tests/test_json.rb"
52
- - "./tests/test_json_addition.rb"
53
- - "./tests/test_json_encoding.rb"
54
- - "./tests/test_json_fixtures.rb"
55
- - "./tests/test_json_generate.rb"
56
- - "./tests/test_json_generic_object.rb"
57
- - "./tests/test_json_string_matching.rb"
58
- - "./tests/test_json_unicode.rb"
51
+ - "./tests/test_helper.rb"
59
52
  - ".gitignore"
60
53
  - ".travis.yml"
61
54
  - CHANGES
62
- - COPYING
63
- - COPYING-json-jruby
64
- - GPL
65
55
  - Gemfile
66
56
  - README-json-jruby.markdown
67
- - README.rdoc
57
+ - README.md
68
58
  - Rakefile
69
- - TODO
70
59
  - VERSION
71
60
  - data/example.json
72
61
  - data/index.html
@@ -122,7 +111,7 @@ files:
122
111
  - lib/json/pure/generator.rb
123
112
  - lib/json/pure/parser.rb
124
113
  - lib/json/version.rb
125
- - tests/fixtures/fail1.json
114
+ - references/rfc7159.txt
126
115
  - tests/fixtures/fail10.json
127
116
  - tests/fixtures/fail11.json
128
117
  - tests/fixtures/fail12.json
@@ -146,6 +135,7 @@ files:
146
135
  - tests/fixtures/fail7.json
147
136
  - tests/fixtures/fail8.json
148
137
  - tests/fixtures/fail9.json
138
+ - tests/fixtures/obsolete_fail1.json
149
139
  - tests/fixtures/pass1.json
150
140
  - tests/fixtures/pass15.json
151
141
  - tests/fixtures/pass16.json
@@ -153,15 +143,17 @@ files:
153
143
  - tests/fixtures/pass2.json
154
144
  - tests/fixtures/pass26.json
155
145
  - tests/fixtures/pass3.json
156
- - tests/setup_variant.rb
157
- - tests/test_json.rb
158
- - tests/test_json_addition.rb
159
- - tests/test_json_encoding.rb
160
- - tests/test_json_fixtures.rb
161
- - tests/test_json_generate.rb
162
- - tests/test_json_generic_object.rb
163
- - tests/test_json_string_matching.rb
164
- - tests/test_json_unicode.rb
146
+ - tests/json_addition_test.rb
147
+ - tests/json_common_interface_test.rb
148
+ - tests/json_encoding_test.rb
149
+ - tests/json_ext_parser_test.rb
150
+ - tests/json_fixtures_test.rb
151
+ - tests/json_generator_test.rb
152
+ - tests/json_generic_object_test.rb
153
+ - tests/json_parser_test.rb
154
+ - tests/json_string_matching_test.rb
155
+ - tests/test_helper.rb
156
+ - tools/diff.sh
165
157
  - tools/fuzz.rb
166
158
  - tools/server.rb
167
159
  homepage: http://flori.github.com/json
@@ -173,14 +165,14 @@ rdoc_options:
173
165
  - "--title"
174
166
  - JSON implemention for Ruby
175
167
  - "--main"
176
- - README.rdoc
168
+ - README.md
177
169
  require_paths:
178
170
  - lib
179
171
  required_ruby_version: !ruby/object:Gem::Requirement
180
172
  requirements:
181
- - - ">="
173
+ - - "~>"
182
174
  - !ruby/object:Gem::Version
183
- version: '0'
175
+ version: '2.0'
184
176
  required_rubygems_version: !ruby/object:Gem::Requirement
185
177
  requirements:
186
178
  - - ">="
@@ -188,16 +180,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
180
  version: '0'
189
181
  requirements: []
190
182
  rubyforge_project:
191
- rubygems_version: 2.4.6
183
+ rubygems_version: 2.6.4
192
184
  signing_key:
193
185
  specification_version: 4
194
186
  summary: JSON Implementation for Ruby
195
187
  test_files:
196
- - "./tests/test_json.rb"
197
- - "./tests/test_json_addition.rb"
198
- - "./tests/test_json_encoding.rb"
199
- - "./tests/test_json_fixtures.rb"
200
- - "./tests/test_json_generate.rb"
201
- - "./tests/test_json_generic_object.rb"
202
- - "./tests/test_json_string_matching.rb"
203
- - "./tests/test_json_unicode.rb"
188
+ - "./tests/test_helper.rb"