json 2.7.2 → 2.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,103 +1,105 @@
1
- #frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  module JSON
3
- MAP = {
4
- "\x0" => '\u0000',
5
- "\x1" => '\u0001',
6
- "\x2" => '\u0002',
7
- "\x3" => '\u0003',
8
- "\x4" => '\u0004',
9
- "\x5" => '\u0005',
10
- "\x6" => '\u0006',
11
- "\x7" => '\u0007',
12
- "\b" => '\b',
13
- "\t" => '\t',
14
- "\n" => '\n',
15
- "\xb" => '\u000b',
16
- "\f" => '\f',
17
- "\r" => '\r',
18
- "\xe" => '\u000e',
19
- "\xf" => '\u000f',
20
- "\x10" => '\u0010',
21
- "\x11" => '\u0011',
22
- "\x12" => '\u0012',
23
- "\x13" => '\u0013',
24
- "\x14" => '\u0014',
25
- "\x15" => '\u0015',
26
- "\x16" => '\u0016',
27
- "\x17" => '\u0017',
28
- "\x18" => '\u0018',
29
- "\x19" => '\u0019',
30
- "\x1a" => '\u001a',
31
- "\x1b" => '\u001b',
32
- "\x1c" => '\u001c',
33
- "\x1d" => '\u001d',
34
- "\x1e" => '\u001e',
35
- "\x1f" => '\u001f',
36
- '"' => '\"',
37
- '\\' => '\\\\',
38
- } # :nodoc:
39
-
40
- ESCAPE_PATTERN = /[\/"\\\x0-\x1f]/n # :nodoc:
41
-
42
- SCRIPT_SAFE_MAP = MAP.merge(
43
- '/' => '\\/',
44
- "\u2028".b => '\u2028',
45
- "\u2029".b => '\u2029',
46
- )
47
-
48
- SCRIPT_SAFE_ESCAPE_PATTERN = Regexp.union(ESCAPE_PATTERN, "\u2028".b, "\u2029".b)
49
-
50
- # Convert a UTF8 encoded Ruby string _string_ to a JSON string, encoded with
51
- # UTF16 big endian characters as \u????, and return it.
52
- def utf8_to_json(string, script_safe = false) # :nodoc:
53
- string = string.dup
54
- string.force_encoding(::Encoding::ASCII_8BIT)
55
- if script_safe
56
- string.gsub!(SCRIPT_SAFE_ESCAPE_PATTERN) { SCRIPT_SAFE_MAP[$&] || $& }
57
- else
58
- string.gsub!(ESCAPE_PATTERN) { MAP[$&] || $& }
59
- end
60
- string.force_encoding(::Encoding::UTF_8)
61
- string
62
- end
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
63
64
 
64
- def utf8_to_json_ascii(string, script_safe = false) # :nodoc:
65
- string = string.dup
66
- string.force_encoding(::Encoding::ASCII_8BIT)
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, "invalid utf8 byte: '#{c}'"
78
- s = JSON.iconv('utf-16be', 'utf-8', c).unpack('H*')[0]
79
- s.force_encoding(::Encoding::ASCII_8BIT)
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.wrap(e)
87
- end
65
+ def utf8_to_json_ascii(string, script_safe = false) # :nodoc:
66
+ string = 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, "invalid utf8 byte: '#{c}'"
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.wrap(e)
87
+ end
88
88
 
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?
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?
95
95
 
96
- module Pure
97
- module Generator
98
96
  # This class is used to create State instances, that are use to hold data
99
97
  # while generating a JSON text from a Ruby data structure.
100
98
  class State
99
+ def self.generate(obj, opts = nil)
100
+ new(opts).generate(obj)
101
+ end
102
+
101
103
  # Creates a State object from _opts_, which ought to be Hash to create
102
104
  # a new State instance configured by _opts_, something else to create
103
105
  # an unconfigured instance. If _opts_ is a State object, it is just
@@ -132,7 +134,7 @@ module JSON
132
134
  # * *allow_nan*: true if NaN, Infinity, and -Infinity should be
133
135
  # generated, otherwise an exception is thrown, if these values are
134
136
  # encountered. This options defaults to false.
135
- def initialize(opts = {})
137
+ def initialize(opts = nil)
136
138
  @indent = ''
137
139
  @space = ''
138
140
  @space_before = ''
@@ -140,10 +142,12 @@ module JSON
140
142
  @array_nl = ''
141
143
  @allow_nan = false
142
144
  @ascii_only = false
143
- @script_safe = false
144
- @strict = false
145
+ @depth = 0
145
146
  @buffer_initial_length = 1024
146
- configure opts
147
+ @script_safe = false
148
+ @strict = false
149
+ @max_nesting = 100
150
+ configure(opts) if opts
147
151
  end
148
152
 
149
153
  # This string is used to indent levels in the JSON text.
@@ -219,7 +223,9 @@ module JSON
219
223
  @script_safe
220
224
  end
221
225
 
222
- # Returns true, if forward slashes are escaped. Otherwise returns false.
226
+ # Returns true, if strict mode is enabled. Otherwise returns false.
227
+ # Strict mode only allow serializing JSON native types: Hash, Array,
228
+ # String, Integer, Float, true, false and nil.
223
229
  def strict?
224
230
  @strict
225
231
  end
@@ -237,13 +243,15 @@ module JSON
237
243
  opts.each do |key, value|
238
244
  instance_variable_set "@#{key}", value
239
245
  end
240
- @indent = opts[:indent] if opts.key?(:indent)
241
- @space = opts[:space] if opts.key?(:space)
242
- @space_before = opts[:space_before] if opts.key?(:space_before)
243
- @object_nl = opts[:object_nl] if opts.key?(:object_nl)
244
- @array_nl = opts[:array_nl] if opts.key?(:array_nl)
245
- @allow_nan = !!opts[:allow_nan] if opts.key?(:allow_nan)
246
- @ascii_only = opts[:ascii_only] if opts.key?(:ascii_only)
246
+
247
+ # NOTE: If adding new instance variables here, check whether #generate should check them for #generate_json
248
+ @indent = opts[:indent] || '' if opts.key?(:indent)
249
+ @space = opts[:space] || '' if opts.key?(:space)
250
+ @space_before = opts[:space_before] || '' if opts.key?(:space_before)
251
+ @object_nl = opts[:object_nl] || '' if opts.key?(:object_nl)
252
+ @array_nl = opts[:array_nl] || '' if opts.key?(:array_nl)
253
+ @allow_nan = !!opts[:allow_nan] if opts.key?(:allow_nan)
254
+ @ascii_only = opts[:ascii_only] if opts.key?(:ascii_only)
247
255
  @depth = opts[:depth] || 0
248
256
  @buffer_initial_length ||= opts[:buffer_initial_length]
249
257
 
@@ -286,12 +294,83 @@ module JSON
286
294
  # created this method raises a
287
295
  # GeneratorError exception.
288
296
  def generate(obj)
289
- result = obj.to_json(self)
290
- JSON.valid_utf8?(result) or raise GeneratorError,
297
+ if @indent.empty? and @space.empty? and @space_before.empty? and @object_nl.empty? and @array_nl.empty? and
298
+ !@ascii_only and !@script_safe and @max_nesting == 0 and !@strict
299
+ result = generate_json(obj, ''.dup)
300
+ else
301
+ result = obj.to_json(self)
302
+ end
303
+ JSON::TruffleRuby::Generator.valid_utf8?(result) or raise GeneratorError,
291
304
  "source sequence #{result.inspect} is illegal/malformed utf-8"
292
305
  result
293
306
  end
294
307
 
308
+ # Handles @allow_nan, @buffer_initial_length, other ivars must be the default value (see above)
309
+ private def generate_json(obj, buf)
310
+ case obj
311
+ when Hash
312
+ buf << '{'
313
+ first = true
314
+ obj.each_pair do |k,v|
315
+ buf << ',' unless first
316
+
317
+ key_str = k.to_s
318
+ if key_str.class == String
319
+ fast_serialize_string(key_str, buf)
320
+ elsif key_str.is_a?(String)
321
+ generate_json(key_str, buf)
322
+ else
323
+ raise TypeError, "#{k.class}#to_s returns an instance of #{key_str.class}, expected a String"
324
+ end
325
+
326
+ buf << ':'
327
+ generate_json(v, buf)
328
+ first = false
329
+ end
330
+ buf << '}'
331
+ when Array
332
+ buf << '['
333
+ first = true
334
+ obj.each do |e|
335
+ buf << ',' unless first
336
+ generate_json(e, buf)
337
+ first = false
338
+ end
339
+ buf << ']'
340
+ when String
341
+ if obj.class == String
342
+ fast_serialize_string(obj, buf)
343
+ else
344
+ buf << obj.to_json(self)
345
+ end
346
+ when Integer
347
+ buf << obj.to_s
348
+ else
349
+ # Note: Float is handled this way since Float#to_s is slow anyway
350
+ buf << obj.to_json(self)
351
+ end
352
+ end
353
+
354
+ # Assumes !@ascii_only, !@script_safe
355
+ private def fast_serialize_string(string, buf) # :nodoc:
356
+ buf << '"'
357
+ unless string.encoding == ::Encoding::UTF_8
358
+ begin
359
+ string = string.encode(::Encoding::UTF_8)
360
+ rescue Encoding::UndefinedConversionError => error
361
+ raise GeneratorError, error.message
362
+ end
363
+ end
364
+ raise GeneratorError, "source sequence is illegal/malformed utf-8" unless string.valid_encoding?
365
+
366
+ if /["\\\x0-\x1f]/n.match?(string)
367
+ buf << string.gsub(/["\\\x0-\x1f]/n, MAP)
368
+ else
369
+ buf << string
370
+ end
371
+ buf << '"'
372
+ end
373
+
295
374
  # Return the value returned by method +name+.
296
375
  def [](name)
297
376
  if respond_to?(name)
@@ -316,8 +395,8 @@ module JSON
316
395
  # Converts this object to a string (calling #to_s), converts
317
396
  # it to a JSON string, and returns the result. This is a fallback, if no
318
397
  # special method #to_json was defined for some object.
319
- def to_json(generator_state)
320
- if generator_state.strict?
398
+ def to_json(state = nil, *)
399
+ if state && State.from_state(state).strict?
321
400
  raise GeneratorError, "#{self.class} not allowed in JSON"
322
401
  else
323
402
  to_s.to_json
@@ -345,16 +424,30 @@ module JSON
345
424
  end
346
425
 
347
426
  def json_transform(state)
348
- delim = ",#{state.object_nl}"
349
- result = "{#{state.object_nl}"
350
427
  depth = state.depth += 1
428
+
429
+ if empty?
430
+ state.depth -= 1
431
+ return '{}'
432
+ end
433
+
434
+ delim = ",#{state.object_nl}"
435
+ result = +"{#{state.object_nl}"
351
436
  first = true
352
437
  indent = !state.object_nl.empty?
353
438
  each { |key, value|
354
439
  result << delim unless first
355
440
  result << state.indent * depth if indent
356
- result = "#{result}#{key.to_s.to_json(state)}#{state.space_before}:#{state.space}"
357
- if state.strict?
441
+
442
+ key_str = key.to_s
443
+ if key_str.is_a?(String)
444
+ key_json = key_str.to_json(state)
445
+ else
446
+ raise TypeError, "#{key.class}#to_s returns an instance of #{key_str.class}, expected a String"
447
+ end
448
+
449
+ result = +"#{result}#{key_json}#{state.space_before}:#{state.space}"
450
+ if state.strict? && !(false == value || true == value || nil == value || String === value || Array === value || Hash === value || Integer === value || Float === value)
358
451
  raise GeneratorError, "#{value.class} not allowed in JSON"
359
452
  elsif value.respond_to?(:to_json)
360
453
  result << value.to_json(state)
@@ -387,17 +480,27 @@ module JSON
387
480
  private
388
481
 
389
482
  def json_transform(state)
390
- delim = ','
391
- delim << state.array_nl
392
- result = '['
393
- result << state.array_nl
394
483
  depth = state.depth += 1
484
+
485
+ if empty?
486
+ state.depth -= 1
487
+ return '[]'
488
+ end
489
+
490
+ result = '['.dup
491
+ if state.array_nl.empty?
492
+ delim = ","
493
+ else
494
+ result << state.array_nl
495
+ delim = ",#{state.array_nl}"
496
+ end
497
+
395
498
  first = true
396
499
  indent = !state.array_nl.empty?
397
500
  each { |value|
398
501
  result << delim unless first
399
502
  result << state.indent * depth if indent
400
- if state.strict?
503
+ if state.strict? && !(false == value || true == value || nil == value || String === value || Array === value || Hash === value || Integer === value || Float === value)
401
504
  raise GeneratorError, "#{value.class} not allowed in JSON"
402
505
  elsif value.respond_to?(:to_json)
403
506
  result << value.to_json(state)
@@ -448,15 +551,20 @@ module JSON
448
551
  def to_json(state = nil, *args)
449
552
  state = State.from_state(state)
450
553
  if encoding == ::Encoding::UTF_8
554
+ unless valid_encoding?
555
+ raise GeneratorError, "source sequence is illegal/malformed utf-8"
556
+ end
451
557
  string = self
452
558
  else
453
559
  string = encode(::Encoding::UTF_8)
454
560
  end
455
561
  if state.ascii_only?
456
- '"' << JSON.utf8_to_json_ascii(string, state.script_safe) << '"'
562
+ %("#{JSON::TruffleRuby::Generator.utf8_to_json_ascii(string, state.script_safe)}")
457
563
  else
458
- '"' << JSON.utf8_to_json(string, state.script_safe) << '"'
564
+ %("#{JSON::TruffleRuby::Generator.utf8_to_json(string, state.script_safe)}")
459
565
  end
566
+ rescue Encoding::UndefinedConversionError => error
567
+ raise ::JSON::GeneratorError, error.message
460
568
  end
461
569
 
462
570
  # Module that holds the extending methods if, the String module is
data/lib/json/version.rb CHANGED
@@ -1,9 +1,5 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
+
2
3
  module JSON
3
- # JSON version
4
- VERSION = '2.7.2'
5
- VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
6
- VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
7
- VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
8
- VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
4
+ VERSION = '2.8.2'
9
5
  end
data/lib/json.rb CHANGED
@@ -1,4 +1,4 @@
1
- #frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  require 'json/common'
3
3
 
4
4
  ##
@@ -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 = <<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})
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 = <<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})
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,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.2
4
+ version: 2.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 2024-04-04 00:00:00.000000000 Z
11
+ date: 2024-11-14 00:00:00.000000000 Z
11
12
  dependencies: []
12
13
  description: This is a JSON implementation as a Ruby extension in C.
13
14
  email: flori@ping.de
@@ -15,24 +16,20 @@ executables: []
15
16
  extensions:
16
17
  - ext/json/ext/generator/extconf.rb
17
18
  - ext/json/ext/parser/extconf.rb
18
- - ext/json/extconf.rb
19
19
  extra_rdoc_files:
20
20
  - README.md
21
21
  files:
22
+ - BSDL
22
23
  - CHANGES.md
23
- - LICENSE
24
+ - COPYING
25
+ - LEGAL
24
26
  - README.md
25
27
  - ext/json/ext/fbuffer/fbuffer.h
26
- - ext/json/ext/generator/depend
27
28
  - ext/json/ext/generator/extconf.rb
28
29
  - ext/json/ext/generator/generator.c
29
- - ext/json/ext/generator/generator.h
30
- - ext/json/ext/parser/depend
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
- - ext/json/extconf.rb
36
33
  - json.gemspec
37
34
  - lib/json.rb
38
35
  - lib/json/add/bigdecimal.rb
@@ -51,21 +48,21 @@ files:
51
48
  - lib/json/add/time.rb
52
49
  - lib/json/common.rb
53
50
  - lib/json/ext.rb
51
+ - lib/json/ext/generator/state.rb
54
52
  - lib/json/generic_object.rb
55
- - lib/json/pure.rb
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
- homepage: https://flori.github.io/json
55
+ homepage: https://ruby.github.io/json
60
56
  licenses:
61
57
  - Ruby
62
58
  metadata:
63
- bug_tracker_uri: https://github.com/flori/json/issues
64
- changelog_uri: https://github.com/flori/json/blob/master/CHANGES.md
65
- documentation_uri: https://flori.github.io/json/doc/index.html
66
- homepage_uri: https://flori.github.io/json
67
- source_code_uri: https://github.com/flori/json
68
- wiki_uri: https://github.com/flori/json/wiki
59
+ bug_tracker_uri: https://github.com/ruby/json/issues
60
+ changelog_uri: https://github.com/ruby/json/blob/master/CHANGES.md
61
+ documentation_uri: https://ruby.github.io/json/doc/index.html
62
+ homepage_uri: https://ruby.github.io/json
63
+ source_code_uri: https://github.com/ruby/json
64
+ wiki_uri: https://github.com/ruby/json/wiki
65
+ post_install_message:
69
66
  rdoc_options:
70
67
  - "--title"
71
68
  - JSON implementation for Ruby
@@ -77,14 +74,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
74
  requirements:
78
75
  - - ">="
79
76
  - !ruby/object:Gem::Version
80
- version: '2.3'
77
+ version: '2.7'
81
78
  required_rubygems_version: !ruby/object:Gem::Requirement
82
79
  requirements:
83
80
  - - ">="
84
81
  - !ruby/object:Gem::Version
85
82
  version: '0'
86
83
  requirements: []
87
- rubygems_version: 3.6.0.dev
84
+ rubygems_version: 3.5.11
85
+ signing_key:
88
86
  specification_version: 4
89
87
  summary: JSON Implementation for Ruby
90
88
  test_files: []
@@ -1 +0,0 @@
1
- generator.o: generator.c generator.h $(srcdir)/../fbuffer/fbuffer.h