json 2.7.3 → 2.9.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.
- checksums.yaml +4 -4
- data/CHANGES.md +49 -0
- data/README.md +8 -77
- data/ext/json/ext/fbuffer/fbuffer.h +122 -54
- data/ext/json/ext/generator/generator.c +425 -235
- data/ext/json/ext/parser/extconf.rb +5 -27
- data/ext/json/ext/parser/parser.c +1597 -596
- data/ext/json/ext/parser/parser.rl +726 -258
- data/json.gemspec +4 -1
- data/lib/json/add/bigdecimal.rb +1 -1
- data/lib/json/common.rb +239 -72
- data/lib/json/ext/generator/state.rb +12 -31
- data/lib/json/ext.rb +2 -7
- data/lib/json/{pure → truffle_ruby}/generator.rb +180 -131
- data/lib/json/version.rb +1 -1
- data/lib/json.rb +15 -20
- metadata +4 -8
- data/ext/json/ext/generator/generator.h +0 -129
- data/ext/json/ext/parser/parser.h +0 -60
- data/lib/json/pure/parser.rb +0 -331
- data/lib/json/pure.rb +0 -16
|
@@ -1,101 +1,111 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module JSON
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
3
|
+
module TruffleRuby
|
|
4
|
+
module Generator
|
|
5
|
+
MAP = {
|
|
6
|
+
"\x0" => '\u0000',
|
|
7
|
+
"\x1" => '\u0001',
|
|
8
|
+
"\x2" => '\u0002',
|
|
9
|
+
"\x3" => '\u0003',
|
|
10
|
+
"\x4" => '\u0004',
|
|
11
|
+
"\x5" => '\u0005',
|
|
12
|
+
"\x6" => '\u0006',
|
|
13
|
+
"\x7" => '\u0007',
|
|
14
|
+
"\b" => '\b',
|
|
15
|
+
"\t" => '\t',
|
|
16
|
+
"\n" => '\n',
|
|
17
|
+
"\xb" => '\u000b',
|
|
18
|
+
"\f" => '\f',
|
|
19
|
+
"\r" => '\r',
|
|
20
|
+
"\xe" => '\u000e',
|
|
21
|
+
"\xf" => '\u000f',
|
|
22
|
+
"\x10" => '\u0010',
|
|
23
|
+
"\x11" => '\u0011',
|
|
24
|
+
"\x12" => '\u0012',
|
|
25
|
+
"\x13" => '\u0013',
|
|
26
|
+
"\x14" => '\u0014',
|
|
27
|
+
"\x15" => '\u0015',
|
|
28
|
+
"\x16" => '\u0016',
|
|
29
|
+
"\x17" => '\u0017',
|
|
30
|
+
"\x18" => '\u0018',
|
|
31
|
+
"\x19" => '\u0019',
|
|
32
|
+
"\x1a" => '\u001a',
|
|
33
|
+
"\x1b" => '\u001b',
|
|
34
|
+
"\x1c" => '\u001c',
|
|
35
|
+
"\x1d" => '\u001d',
|
|
36
|
+
"\x1e" => '\u001e',
|
|
37
|
+
"\x1f" => '\u001f',
|
|
38
|
+
'"' => '\"',
|
|
39
|
+
'\\' => '\\\\',
|
|
40
|
+
}.freeze # :nodoc:
|
|
41
|
+
|
|
42
|
+
ESCAPE_PATTERN = /[\/"\\\x0-\x1f]/n # :nodoc:
|
|
43
|
+
|
|
44
|
+
SCRIPT_SAFE_MAP = MAP.merge(
|
|
45
|
+
'/' => '\\/',
|
|
46
|
+
"\u2028".b => '\u2028',
|
|
47
|
+
"\u2029".b => '\u2029',
|
|
48
|
+
).freeze
|
|
49
|
+
|
|
50
|
+
SCRIPT_SAFE_ESCAPE_PATTERN = Regexp.union(ESCAPE_PATTERN, "\u2028".b, "\u2029".b)
|
|
51
|
+
|
|
52
|
+
# Convert a UTF8 encoded Ruby string _string_ to a JSON string, encoded with
|
|
53
|
+
# UTF16 big endian characters as \u????, and return it.
|
|
54
|
+
def utf8_to_json(string, script_safe = false) # :nodoc:
|
|
55
|
+
string = string.b
|
|
56
|
+
if script_safe
|
|
57
|
+
string.gsub!(SCRIPT_SAFE_ESCAPE_PATTERN) { SCRIPT_SAFE_MAP[$&] || $& }
|
|
58
|
+
else
|
|
59
|
+
string.gsub!(ESCAPE_PATTERN) { MAP[$&] || $& }
|
|
60
|
+
end
|
|
61
|
+
string.force_encoding(::Encoding::UTF_8)
|
|
62
|
+
string
|
|
63
|
+
end
|
|
62
64
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
65
|
+
def utf8_to_json_ascii(original_string, script_safe = false) # :nodoc:
|
|
66
|
+
string = original_string.b
|
|
67
|
+
map = script_safe ? SCRIPT_SAFE_MAP : MAP
|
|
68
|
+
string.gsub!(/[\/"\\\x0-\x1f]/n) { map[$&] || $& }
|
|
69
|
+
string.gsub!(/(
|
|
70
|
+
(?:
|
|
71
|
+
[\xc2-\xdf][\x80-\xbf] |
|
|
72
|
+
[\xe0-\xef][\x80-\xbf]{2} |
|
|
73
|
+
[\xf0-\xf4][\x80-\xbf]{3}
|
|
74
|
+
)+ |
|
|
75
|
+
[\x80-\xc1\xf5-\xff] # invalid
|
|
76
|
+
)/nx) { |c|
|
|
77
|
+
c.size == 1 and raise GeneratorError.new("invalid utf8 byte: '#{c}'", original_string)
|
|
78
|
+
s = c.encode(::Encoding::UTF_16BE, ::Encoding::UTF_8).unpack('H*')[0]
|
|
79
|
+
s.force_encoding(::Encoding::BINARY)
|
|
80
|
+
s.gsub!(/.{4}/n, '\\\\u\&')
|
|
81
|
+
s.force_encoding(::Encoding::UTF_8)
|
|
82
|
+
}
|
|
83
|
+
string.force_encoding(::Encoding::UTF_8)
|
|
84
|
+
string
|
|
85
|
+
rescue => e
|
|
86
|
+
raise GeneratorError.new(e.message, original_string)
|
|
87
|
+
end
|
|
86
88
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
def valid_utf8?(string)
|
|
90
|
+
encoding = string.encoding
|
|
91
|
+
(encoding == Encoding::UTF_8 || encoding == Encoding::ASCII) &&
|
|
92
|
+
string.valid_encoding?
|
|
93
|
+
end
|
|
94
|
+
module_function :utf8_to_json, :utf8_to_json_ascii, :valid_utf8?
|
|
93
95
|
|
|
94
|
-
module Pure
|
|
95
|
-
module Generator
|
|
96
96
|
# This class is used to create State instances, that are use to hold data
|
|
97
97
|
# while generating a JSON text from a Ruby data structure.
|
|
98
98
|
class State
|
|
99
|
+
def self.generate(obj, opts = nil, io = nil)
|
|
100
|
+
string = new(opts).generate(obj)
|
|
101
|
+
if io
|
|
102
|
+
io.write(string)
|
|
103
|
+
io
|
|
104
|
+
else
|
|
105
|
+
string
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
99
109
|
# Creates a State object from _opts_, which ought to be Hash to create
|
|
100
110
|
# a new State instance configured by _opts_, something else to create
|
|
101
111
|
# an unconfigured instance. If _opts_ is a State object, it is just
|
|
@@ -130,7 +140,7 @@ module JSON
|
|
|
130
140
|
# * *allow_nan*: true if NaN, Infinity, and -Infinity should be
|
|
131
141
|
# generated, otherwise an exception is thrown, if these values are
|
|
132
142
|
# encountered. This options defaults to false.
|
|
133
|
-
def initialize(opts =
|
|
143
|
+
def initialize(opts = nil)
|
|
134
144
|
@indent = ''
|
|
135
145
|
@space = ''
|
|
136
146
|
@space_before = ''
|
|
@@ -138,10 +148,12 @@ module JSON
|
|
|
138
148
|
@array_nl = ''
|
|
139
149
|
@allow_nan = false
|
|
140
150
|
@ascii_only = false
|
|
141
|
-
@
|
|
142
|
-
@strict = false
|
|
151
|
+
@depth = 0
|
|
143
152
|
@buffer_initial_length = 1024
|
|
144
|
-
|
|
153
|
+
@script_safe = false
|
|
154
|
+
@strict = false
|
|
155
|
+
@max_nesting = 100
|
|
156
|
+
configure(opts) if opts
|
|
145
157
|
end
|
|
146
158
|
|
|
147
159
|
# This string is used to indent levels in the JSON text.
|
|
@@ -239,13 +251,13 @@ module JSON
|
|
|
239
251
|
end
|
|
240
252
|
|
|
241
253
|
# NOTE: If adding new instance variables here, check whether #generate should check them for #generate_json
|
|
242
|
-
@indent = opts[:indent] if opts.key?(:indent)
|
|
243
|
-
@space = opts[:space] if opts.key?(:space)
|
|
244
|
-
@space_before = opts[:space_before] if opts.key?(:space_before)
|
|
245
|
-
@object_nl = opts[:object_nl] if opts.key?(:object_nl)
|
|
246
|
-
@array_nl = opts[:array_nl] if opts.key?(:array_nl)
|
|
247
|
-
@allow_nan = !!opts[:allow_nan]
|
|
248
|
-
@ascii_only = opts[:ascii_only]
|
|
254
|
+
@indent = opts[:indent] || '' if opts.key?(:indent)
|
|
255
|
+
@space = opts[:space] || '' if opts.key?(:space)
|
|
256
|
+
@space_before = opts[:space_before] || '' if opts.key?(:space_before)
|
|
257
|
+
@object_nl = opts[:object_nl] || '' if opts.key?(:object_nl)
|
|
258
|
+
@array_nl = opts[:array_nl] || '' if opts.key?(:array_nl)
|
|
259
|
+
@allow_nan = !!opts[:allow_nan] if opts.key?(:allow_nan)
|
|
260
|
+
@ascii_only = opts[:ascii_only] if opts.key?(:ascii_only)
|
|
249
261
|
@depth = opts[:depth] || 0
|
|
250
262
|
@buffer_initial_length ||= opts[:buffer_initial_length]
|
|
251
263
|
|
|
@@ -294,8 +306,10 @@ module JSON
|
|
|
294
306
|
else
|
|
295
307
|
result = obj.to_json(self)
|
|
296
308
|
end
|
|
297
|
-
JSON.valid_utf8?(result) or raise GeneratorError
|
|
298
|
-
"source sequence #{result.inspect} is illegal/malformed utf-8"
|
|
309
|
+
JSON::TruffleRuby::Generator.valid_utf8?(result) or raise GeneratorError.new(
|
|
310
|
+
"source sequence #{result.inspect} is illegal/malformed utf-8",
|
|
311
|
+
obj
|
|
312
|
+
)
|
|
299
313
|
result
|
|
300
314
|
end
|
|
301
315
|
|
|
@@ -307,7 +321,16 @@ module JSON
|
|
|
307
321
|
first = true
|
|
308
322
|
obj.each_pair do |k,v|
|
|
309
323
|
buf << ',' unless first
|
|
310
|
-
|
|
324
|
+
|
|
325
|
+
key_str = k.to_s
|
|
326
|
+
if key_str.class == String
|
|
327
|
+
fast_serialize_string(key_str, buf)
|
|
328
|
+
elsif key_str.is_a?(String)
|
|
329
|
+
generate_json(key_str, buf)
|
|
330
|
+
else
|
|
331
|
+
raise TypeError, "#{k.class}#to_s returns an instance of #{key_str.class}, expected a String"
|
|
332
|
+
end
|
|
333
|
+
|
|
311
334
|
buf << ':'
|
|
312
335
|
generate_json(v, buf)
|
|
313
336
|
first = false
|
|
@@ -323,7 +346,11 @@ module JSON
|
|
|
323
346
|
end
|
|
324
347
|
buf << ']'
|
|
325
348
|
when String
|
|
326
|
-
|
|
349
|
+
if obj.class == String
|
|
350
|
+
fast_serialize_string(obj, buf)
|
|
351
|
+
else
|
|
352
|
+
buf << obj.to_json(self)
|
|
353
|
+
end
|
|
327
354
|
when Integer
|
|
328
355
|
buf << obj.to_s
|
|
329
356
|
else
|
|
@@ -333,24 +360,23 @@ module JSON
|
|
|
333
360
|
end
|
|
334
361
|
|
|
335
362
|
# Assumes !@ascii_only, !@script_safe
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
buf << string.gsub(/["\\\x0-\x1f]/n, MAP)
|
|
344
|
-
else
|
|
345
|
-
buf << string
|
|
363
|
+
private def fast_serialize_string(string, buf) # :nodoc:
|
|
364
|
+
buf << '"'
|
|
365
|
+
unless string.encoding == ::Encoding::UTF_8
|
|
366
|
+
begin
|
|
367
|
+
string = string.encode(::Encoding::UTF_8)
|
|
368
|
+
rescue Encoding::UndefinedConversionError => error
|
|
369
|
+
raise GeneratorError.new(error.message, string)
|
|
346
370
|
end
|
|
347
|
-
buf << '"'
|
|
348
371
|
end
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
buf << string.
|
|
372
|
+
raise GeneratorError.new("source sequence is illegal/malformed utf-8", string) unless string.valid_encoding?
|
|
373
|
+
|
|
374
|
+
if /["\\\x0-\x1f]/n.match?(string)
|
|
375
|
+
buf << string.gsub(/["\\\x0-\x1f]/n, MAP)
|
|
376
|
+
else
|
|
377
|
+
buf << string
|
|
353
378
|
end
|
|
379
|
+
buf << '"'
|
|
354
380
|
end
|
|
355
381
|
|
|
356
382
|
# Return the value returned by method +name+.
|
|
@@ -379,7 +405,7 @@ module JSON
|
|
|
379
405
|
# special method #to_json was defined for some object.
|
|
380
406
|
def to_json(state = nil, *)
|
|
381
407
|
if state && State.from_state(state).strict?
|
|
382
|
-
raise GeneratorError
|
|
408
|
+
raise GeneratorError.new("#{self.class} not allowed in JSON", self)
|
|
383
409
|
else
|
|
384
410
|
to_s.to_json
|
|
385
411
|
end
|
|
@@ -406,17 +432,31 @@ module JSON
|
|
|
406
432
|
end
|
|
407
433
|
|
|
408
434
|
def json_transform(state)
|
|
435
|
+
depth = state.depth += 1
|
|
436
|
+
|
|
437
|
+
if empty?
|
|
438
|
+
state.depth -= 1
|
|
439
|
+
return '{}'
|
|
440
|
+
end
|
|
441
|
+
|
|
409
442
|
delim = ",#{state.object_nl}"
|
|
410
443
|
result = +"{#{state.object_nl}"
|
|
411
|
-
depth = state.depth += 1
|
|
412
444
|
first = true
|
|
413
445
|
indent = !state.object_nl.empty?
|
|
414
446
|
each { |key, value|
|
|
415
447
|
result << delim unless first
|
|
416
448
|
result << state.indent * depth if indent
|
|
417
|
-
|
|
449
|
+
|
|
450
|
+
key_str = key.to_s
|
|
451
|
+
if key_str.is_a?(String)
|
|
452
|
+
key_json = key_str.to_json(state)
|
|
453
|
+
else
|
|
454
|
+
raise TypeError, "#{key.class}#to_s returns an instance of #{key_str.class}, expected a String"
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
result = +"#{result}#{key_json}#{state.space_before}:#{state.space}"
|
|
418
458
|
if state.strict? && !(false == value || true == value || nil == value || String === value || Array === value || Hash === value || Integer === value || Float === value)
|
|
419
|
-
raise GeneratorError
|
|
459
|
+
raise GeneratorError.new("#{value.class} not allowed in JSON", value)
|
|
420
460
|
elsif value.respond_to?(:to_json)
|
|
421
461
|
result << value.to_json(state)
|
|
422
462
|
else
|
|
@@ -448,6 +488,13 @@ module JSON
|
|
|
448
488
|
private
|
|
449
489
|
|
|
450
490
|
def json_transform(state)
|
|
491
|
+
depth = state.depth += 1
|
|
492
|
+
|
|
493
|
+
if empty?
|
|
494
|
+
state.depth -= 1
|
|
495
|
+
return '[]'
|
|
496
|
+
end
|
|
497
|
+
|
|
451
498
|
result = '['.dup
|
|
452
499
|
if state.array_nl.empty?
|
|
453
500
|
delim = ","
|
|
@@ -455,14 +502,14 @@ module JSON
|
|
|
455
502
|
result << state.array_nl
|
|
456
503
|
delim = ",#{state.array_nl}"
|
|
457
504
|
end
|
|
458
|
-
|
|
505
|
+
|
|
459
506
|
first = true
|
|
460
507
|
indent = !state.array_nl.empty?
|
|
461
508
|
each { |value|
|
|
462
509
|
result << delim unless first
|
|
463
510
|
result << state.indent * depth if indent
|
|
464
511
|
if state.strict? && !(false == value || true == value || nil == value || String === value || Array === value || Hash === value || Integer === value || Float === value)
|
|
465
|
-
raise GeneratorError
|
|
512
|
+
raise GeneratorError.new("#{value.class} not allowed in JSON", value)
|
|
466
513
|
elsif value.respond_to?(:to_json)
|
|
467
514
|
result << value.to_json(state)
|
|
468
515
|
else
|
|
@@ -491,13 +538,13 @@ module JSON
|
|
|
491
538
|
if state.allow_nan?
|
|
492
539
|
to_s
|
|
493
540
|
else
|
|
494
|
-
raise GeneratorError
|
|
541
|
+
raise GeneratorError.new("#{self} not allowed in JSON", self)
|
|
495
542
|
end
|
|
496
543
|
when nan?
|
|
497
544
|
if state.allow_nan?
|
|
498
545
|
to_s
|
|
499
546
|
else
|
|
500
|
-
raise GeneratorError
|
|
547
|
+
raise GeneratorError.new("#{self} not allowed in JSON", self)
|
|
501
548
|
end
|
|
502
549
|
else
|
|
503
550
|
to_s
|
|
@@ -513,17 +560,19 @@ module JSON
|
|
|
513
560
|
state = State.from_state(state)
|
|
514
561
|
if encoding == ::Encoding::UTF_8
|
|
515
562
|
unless valid_encoding?
|
|
516
|
-
raise GeneratorError
|
|
563
|
+
raise GeneratorError.new("source sequence is illegal/malformed utf-8", self)
|
|
517
564
|
end
|
|
518
565
|
string = self
|
|
519
566
|
else
|
|
520
567
|
string = encode(::Encoding::UTF_8)
|
|
521
568
|
end
|
|
522
569
|
if state.ascii_only?
|
|
523
|
-
%("#{JSON.utf8_to_json_ascii(string, state.script_safe)}")
|
|
570
|
+
%("#{JSON::TruffleRuby::Generator.utf8_to_json_ascii(string, state.script_safe)}")
|
|
524
571
|
else
|
|
525
|
-
%("#{JSON.utf8_to_json(string, state.script_safe)}")
|
|
572
|
+
%("#{JSON::TruffleRuby::Generator.utf8_to_json(string, state.script_safe)}")
|
|
526
573
|
end
|
|
574
|
+
rescue Encoding::UndefinedConversionError => error
|
|
575
|
+
raise ::JSON::GeneratorError.new(error.message, self)
|
|
527
576
|
end
|
|
528
577
|
|
|
529
578
|
# Module that holds the extending methods if, the String module is
|
data/lib/json/version.rb
CHANGED
data/lib/json.rb
CHANGED
|
@@ -378,13 +378,13 @@ require 'json/common'
|
|
|
378
378
|
# json1 = JSON.generate(ruby)
|
|
379
379
|
# ruby1 = JSON.parse(json1, create_additions: true)
|
|
380
380
|
# # Make a nice display.
|
|
381
|
-
# display =
|
|
382
|
-
#
|
|
383
|
-
#
|
|
384
|
-
#
|
|
385
|
-
#
|
|
386
|
-
#
|
|
387
|
-
#
|
|
381
|
+
# display = <<~EOT
|
|
382
|
+
# Generated JSON:
|
|
383
|
+
# Without addition: #{json0} (#{json0.class})
|
|
384
|
+
# With addition: #{json1} (#{json1.class})
|
|
385
|
+
# Parsed JSON:
|
|
386
|
+
# Without addition: #{ruby0.inspect} (#{ruby0.class})
|
|
387
|
+
# With addition: #{ruby1.inspect} (#{ruby1.class})
|
|
388
388
|
# EOT
|
|
389
389
|
# puts display
|
|
390
390
|
#
|
|
@@ -562,13 +562,13 @@ require 'json/common'
|
|
|
562
562
|
# json1 = JSON.generate(foo1)
|
|
563
563
|
# obj1 = JSON.parse(json1, create_additions: true)
|
|
564
564
|
# # Make a nice display.
|
|
565
|
-
# display =
|
|
566
|
-
#
|
|
567
|
-
#
|
|
568
|
-
#
|
|
569
|
-
#
|
|
570
|
-
#
|
|
571
|
-
#
|
|
565
|
+
# display = <<~EOT
|
|
566
|
+
# Generated JSON:
|
|
567
|
+
# Without custom addition: #{json0} (#{json0.class})
|
|
568
|
+
# With custom addition: #{json1} (#{json1.class})
|
|
569
|
+
# Parsed JSON:
|
|
570
|
+
# Without custom addition: #{obj0.inspect} (#{obj0.class})
|
|
571
|
+
# With custom addition: #{obj1.inspect} (#{obj1.class})
|
|
572
572
|
# EOT
|
|
573
573
|
# puts display
|
|
574
574
|
#
|
|
@@ -583,10 +583,5 @@ require 'json/common'
|
|
|
583
583
|
#
|
|
584
584
|
module JSON
|
|
585
585
|
require 'json/version'
|
|
586
|
-
|
|
587
|
-
begin
|
|
588
|
-
require 'json/ext'
|
|
589
|
-
rescue LoadError
|
|
590
|
-
require 'json/pure'
|
|
591
|
-
end
|
|
586
|
+
require 'json/ext'
|
|
592
587
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: json
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.9.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Florian Frank
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-
|
|
11
|
+
date: 2024-12-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: This is a JSON implementation as a Ruby extension in C.
|
|
14
14
|
email: flori@ping.de
|
|
@@ -27,10 +27,8 @@ files:
|
|
|
27
27
|
- ext/json/ext/fbuffer/fbuffer.h
|
|
28
28
|
- ext/json/ext/generator/extconf.rb
|
|
29
29
|
- ext/json/ext/generator/generator.c
|
|
30
|
-
- ext/json/ext/generator/generator.h
|
|
31
30
|
- ext/json/ext/parser/extconf.rb
|
|
32
31
|
- ext/json/ext/parser/parser.c
|
|
33
|
-
- ext/json/ext/parser/parser.h
|
|
34
32
|
- ext/json/ext/parser/parser.rl
|
|
35
33
|
- json.gemspec
|
|
36
34
|
- lib/json.rb
|
|
@@ -52,9 +50,7 @@ files:
|
|
|
52
50
|
- lib/json/ext.rb
|
|
53
51
|
- lib/json/ext/generator/state.rb
|
|
54
52
|
- lib/json/generic_object.rb
|
|
55
|
-
- lib/json/
|
|
56
|
-
- lib/json/pure/generator.rb
|
|
57
|
-
- lib/json/pure/parser.rb
|
|
53
|
+
- lib/json/truffle_ruby/generator.rb
|
|
58
54
|
- lib/json/version.rb
|
|
59
55
|
homepage: https://ruby.github.io/json
|
|
60
56
|
licenses:
|
|
@@ -78,7 +74,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
78
74
|
requirements:
|
|
79
75
|
- - ">="
|
|
80
76
|
- !ruby/object:Gem::Version
|
|
81
|
-
version: '2.
|
|
77
|
+
version: '2.7'
|
|
82
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
79
|
requirements:
|
|
84
80
|
- - ">="
|