psych 3.1.0 → 3.3.4

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.
@@ -1,10 +1,10 @@
1
-
2
1
  # frozen_string_literal: true
2
+
3
3
  module Psych
4
4
  # The version of Psych you are using
5
- VERSION = '3.1.0' unless defined?(::Psych::VERSION)
5
+ VERSION = '3.3.4'
6
6
 
7
7
  if RUBY_ENGINE == 'jruby'
8
- DEFAULT_SNAKEYAML_VERSION = '1.23'.freeze
8
+ DEFAULT_SNAKEYAML_VERSION = '1.33'.freeze
9
9
  end
10
10
  end
@@ -12,39 +12,44 @@ module Psych
12
12
  ###
13
13
  # This class walks a YAML AST, converting each node to Ruby
14
14
  class ToRuby < Psych::Visitors::Visitor
15
- def self.create
15
+ def self.create(symbolize_names: false, freeze: false)
16
16
  class_loader = ClassLoader.new
17
17
  scanner = ScalarScanner.new class_loader
18
- new(scanner, class_loader)
18
+ new(scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze)
19
19
  end
20
20
 
21
21
  attr_reader :class_loader
22
22
 
23
- def initialize ss, class_loader
23
+ def initialize ss, class_loader, symbolize_names: false, freeze: false
24
24
  super()
25
25
  @st = {}
26
26
  @ss = ss
27
+ @load_tags = Psych.load_tags
27
28
  @domain_types = Psych.domain_types
28
29
  @class_loader = class_loader
30
+ @symbolize_names = symbolize_names
31
+ @freeze = freeze
29
32
  end
30
33
 
31
34
  def accept target
32
35
  result = super
33
- return result if @domain_types.empty? || !target.tag
34
36
 
35
- key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:')
36
- key = "tag:#{key}" unless key =~ /^(?:tag:|x-private)/
37
+ unless @domain_types.empty? || !target.tag
38
+ key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:')
39
+ key = "tag:#{key}" unless key =~ /^(?:tag:|x-private)/
37
40
 
38
- if @domain_types.key? key
39
- value, block = @domain_types[key]
40
- return block.call value, result
41
+ if @domain_types.key? key
42
+ value, block = @domain_types[key]
43
+ result = block.call value, result
44
+ end
41
45
  end
42
46
 
47
+ result = deduplicate(result).freeze if @freeze
43
48
  result
44
49
  end
45
50
 
46
51
  def deserialize o
47
- if klass = resolve_class(Psych.load_tags[o.tag])
52
+ if klass = resolve_class(@load_tags[o.tag])
48
53
  instance = klass.allocate
49
54
 
50
55
  if instance.respond_to?(:init_with)
@@ -75,7 +80,9 @@ module Psych
75
80
  when "!ruby/object:DateTime"
76
81
  class_loader.date_time
77
82
  require 'date' unless defined? DateTime
78
- @ss.parse_time(o.value).to_datetime
83
+ t = @ss.parse_time(o.value)
84
+ DateTime.civil(*t.to_a[0, 6].reverse, Rational(t.utc_offset, 86400)) +
85
+ (t.subsec/86400)
79
86
  when '!ruby/encoding'
80
87
  ::Encoding.find o.value
81
88
  when "!ruby/object:Complex"
@@ -124,7 +131,7 @@ module Psych
124
131
  end
125
132
 
126
133
  def visit_Psych_Nodes_Sequence o
127
- if klass = resolve_class(Psych.load_tags[o.tag])
134
+ if klass = resolve_class(@load_tags[o.tag])
128
135
  instance = klass.allocate
129
136
 
130
137
  if instance.respond_to?(:init_with)
@@ -156,8 +163,8 @@ module Psych
156
163
  end
157
164
 
158
165
  def visit_Psych_Nodes_Mapping o
159
- if Psych.load_tags[o.tag]
160
- return revive(resolve_class(Psych.load_tags[o.tag]), o)
166
+ if @load_tags[o.tag]
167
+ return revive(resolve_class(@load_tags[o.tag]), o)
161
168
  end
162
169
  return revive_hash(register(o, {}), o) unless o.tag
163
170
 
@@ -252,6 +259,8 @@ module Psych
252
259
 
253
260
  e = build_exception((resolve_class($1) || class_loader.exception),
254
261
  h.delete('message'))
262
+
263
+ e.set_backtrace h.delete('backtrace') if h.key? 'backtrace'
255
264
  init_with(e, h, o)
256
265
 
257
266
  when '!set', 'tag:yaml.org,2002:set'
@@ -320,6 +329,7 @@ module Psych
320
329
  end
321
330
 
322
331
  private
332
+
323
333
  def register node, object
324
334
  @st[node.anchor] = object if node.anchor
325
335
  object
@@ -331,13 +341,12 @@ module Psych
331
341
  list
332
342
  end
333
343
 
334
- SHOVEL = '<<'
335
- def revive_hash hash, o
344
+ def revive_hash hash, o, tagged= false
336
345
  o.children.each_slice(2) { |k,v|
337
346
  key = accept(k)
338
347
  val = accept(v)
339
348
 
340
- if key == SHOVEL && k.tag != "tag:yaml.org,2002:str"
349
+ if key == '<<' && k.tag != "tag:yaml.org,2002:str"
341
350
  case v
342
351
  when Nodes::Alias, Nodes::Mapping
343
352
  begin
@@ -359,6 +368,12 @@ module Psych
359
368
  hash[key] = val
360
369
  end
361
370
  else
371
+ if !tagged && @symbolize_names && key.is_a?(String)
372
+ key = key.to_sym
373
+ elsif !@freeze
374
+ key = deduplicate(key)
375
+ end
376
+
362
377
  hash[key] = val
363
378
  end
364
379
 
@@ -366,12 +381,32 @@ module Psych
366
381
  hash
367
382
  end
368
383
 
384
+ if RUBY_VERSION < '2.7'
385
+ def deduplicate key
386
+ if key.is_a?(String)
387
+ # It is important to untaint the string, otherwise it won't
388
+ # be deduplicated into an fstring, but simply frozen.
389
+ -(key.untaint)
390
+ else
391
+ key
392
+ end
393
+ end
394
+ else
395
+ def deduplicate key
396
+ if key.is_a?(String)
397
+ -key
398
+ else
399
+ key
400
+ end
401
+ end
402
+ end
403
+
369
404
  def merge_key hash, key, val
370
405
  end
371
406
 
372
407
  def revive klass, node
373
408
  s = register(node, klass.allocate)
374
- init_with(s, revive_hash({}, node), node)
409
+ init_with(s, revive_hash({}, node, true), node)
375
410
  end
376
411
 
377
412
  def init_with o, h, node
@@ -8,12 +8,26 @@ module Psych
8
8
 
9
9
  private
10
10
 
11
- DISPATCH = Hash.new do |hash, klass|
12
- hash[klass] = "visit_#{klass.name.gsub('::', '_')}"
11
+ # @api private
12
+ def self.dispatch_cache
13
+ Hash.new do |hash, klass|
14
+ hash[klass] = :"visit_#{klass.name.gsub('::', '_')}"
15
+ end.compare_by_identity
16
+ end
17
+
18
+ if defined?(Ractor)
19
+ def dispatch
20
+ @dispatch_cache ||= (Ractor.current[:Psych_Visitors_Visitor] ||= Visitor.dispatch_cache)
21
+ end
22
+ else
23
+ DISPATCH = dispatch_cache
24
+ def dispatch
25
+ DISPATCH
26
+ end
13
27
  end
14
28
 
15
29
  def visit target
16
- send DISPATCH[target.class], target
30
+ send dispatch[target.class], target
17
31
  end
18
32
  end
19
33
  end
@@ -80,7 +80,7 @@ module Psych
80
80
  raise(TypeError, "Can't dump #{target.class}") unless method
81
81
 
82
82
  h[klass] = method
83
- end
83
+ end.compare_by_identity
84
84
  end
85
85
 
86
86
  def start encoding = Nodes::Stream::UTF8
@@ -181,53 +181,24 @@ module Psych
181
181
  end
182
182
 
183
183
  def visit_Exception o
184
- tag = ['!ruby/exception', o.class.name].join ':'
185
-
186
- @emitter.start_mapping nil, tag, false, Nodes::Mapping::BLOCK
187
-
188
- {
189
- 'message' => private_iv_get(o, 'mesg'),
190
- 'backtrace' => private_iv_get(o, 'backtrace'),
191
- }.each do |k,v|
192
- next unless v
193
- @emitter.scalar k, nil, nil, true, false, Nodes::Scalar::ANY
194
- accept v
195
- end
196
-
197
- dump_ivars o
198
-
199
- @emitter.end_mapping
184
+ dump_exception o, o.message.to_s
200
185
  end
201
186
 
202
187
  def visit_NameError o
203
- tag = ['!ruby/exception', o.class.name].join ':'
204
-
205
- @emitter.start_mapping nil, tag, false, Nodes::Mapping::BLOCK
206
-
207
- {
208
- 'message' => o.message.to_s,
209
- 'backtrace' => private_iv_get(o, 'backtrace'),
210
- }.each do |k,v|
211
- next unless v
212
- @emitter.scalar k, nil, nil, true, false, Nodes::Scalar::ANY
213
- accept v
214
- end
215
-
216
- dump_ivars o
217
-
218
- @emitter.end_mapping
188
+ dump_exception o, o.message.to_s
219
189
  end
220
190
 
221
191
  def visit_Regexp o
222
192
  register o, @emitter.scalar(o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY)
223
193
  end
224
194
 
195
+ def visit_Date o
196
+ register o, visit_Integer(o.gregorian)
197
+ end
198
+
225
199
  def visit_DateTime o
226
- formatted = if o.offset.zero?
227
- o.strftime("%Y-%m-%d %H:%M:%S.%9N Z".freeze)
228
- else
229
- o.strftime("%Y-%m-%d %H:%M:%S.%9N %:z".freeze)
230
- end
200
+ t = o.italy
201
+ formatted = format_time t, t.offset.zero?
231
202
  tag = '!ruby/object:DateTime'
232
203
  register o, @emitter.scalar(formatted, nil, tag, false, false, Nodes::Scalar::ANY)
233
204
  end
@@ -265,7 +236,6 @@ module Psych
265
236
  end
266
237
  alias :visit_TrueClass :visit_Integer
267
238
  alias :visit_FalseClass :visit_Integer
268
- alias :visit_Date :visit_Integer
269
239
 
270
240
  def visit_Float o
271
241
  if o.nan?
@@ -458,15 +428,6 @@ module Psych
458
428
  node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK)
459
429
  register(o, node)
460
430
 
461
- # Dump the elements
462
- accept 'elements'
463
- @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK
464
- o.each do |k,v|
465
- accept k
466
- accept v
467
- end
468
- @emitter.end_mapping
469
-
470
431
  # Dump the ivars
471
432
  accept 'ivars'
472
433
  @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK
@@ -476,6 +437,15 @@ module Psych
476
437
  end
477
438
  @emitter.end_mapping
478
439
 
440
+ # Dump the elements
441
+ accept 'elements'
442
+ @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK
443
+ o.each do |k,v|
444
+ accept k
445
+ accept v
446
+ end
447
+ @emitter.end_mapping
448
+
479
449
  @emitter.end_mapping
480
450
  else
481
451
  tag = "!ruby/hash:#{o.class}"
@@ -492,8 +462,26 @@ module Psych
492
462
  def dump_list o
493
463
  end
494
464
 
495
- def format_time time
496
- if time.utc?
465
+ def dump_exception o, msg
466
+ tag = ['!ruby/exception', o.class.name].join ':'
467
+
468
+ @emitter.start_mapping nil, tag, false, Nodes::Mapping::BLOCK
469
+
470
+ if msg
471
+ @emitter.scalar 'message', nil, nil, true, false, Nodes::Scalar::ANY
472
+ accept msg
473
+ end
474
+
475
+ @emitter.scalar 'backtrace', nil, nil, true, false, Nodes::Scalar::ANY
476
+ accept o.backtrace
477
+
478
+ dump_ivars o
479
+
480
+ @emitter.end_mapping
481
+ end
482
+
483
+ def format_time time, utc = time.utc?
484
+ if utc
497
485
  time.strftime("%Y-%m-%d %H:%M:%S.%9N Z")
498
486
  else
499
487
  time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z")
@@ -521,9 +509,9 @@ module Psych
521
509
  def emit_coder c, o
522
510
  case c.type
523
511
  when :scalar
524
- @emitter.scalar c.scalar, nil, c.tag, c.tag.nil?, false, Nodes::Scalar::ANY
512
+ @emitter.scalar c.scalar, nil, c.tag, c.tag.nil?, false, c.style
525
513
  when :seq
526
- @emitter.start_sequence nil, c.tag, c.tag.nil?, Nodes::Sequence::BLOCK
514
+ @emitter.start_sequence nil, c.tag, c.tag.nil?, c.style
527
515
  c.seq.each do |thing|
528
516
  accept thing
529
517
  end
data/lib/psych.rb CHANGED
@@ -10,11 +10,7 @@ when 'jruby'
10
10
  org.jruby.ext.psych.PsychLibrary.new.load(JRuby.runtime, false)
11
11
  end
12
12
  else
13
- begin
14
- require "#{RUBY_VERSION[/\d+\.\d+/]}/psych.so"
15
- rescue LoadError
16
- require 'psych.so'
17
- end
13
+ require 'psych.so'
18
14
  end
19
15
  require 'psych/nodes'
20
16
  require 'psych/streaming'
@@ -78,12 +74,15 @@ require 'psych/class_loader'
78
74
  #
79
75
  # ==== Reading from a string
80
76
  #
81
- # Psych.load("--- a") # => 'a'
82
- # Psych.load("---\n - a\n - b") # => ['a', 'b']
77
+ # Psych.safe_load("--- a") # => 'a'
78
+ # Psych.safe_load("---\n - a\n - b") # => ['a', 'b']
79
+ # # From a trusted string:
80
+ # Psych.load("--- !ruby/range\nbegin: 0\nend: 42\nexcl: false\n") # => 0..42
83
81
  #
84
82
  # ==== Reading from a file
85
83
  #
86
- # Psych.load_file("database.yml")
84
+ # Psych.safe_load_file("data.yml", permitted_classes: [Date])
85
+ # Psych.load_file("trusted_database.yml")
87
86
  #
88
87
  # ==== Exception handling
89
88
  #
@@ -234,9 +233,9 @@ require 'psych/class_loader'
234
233
 
235
234
  module Psych
236
235
  # The version of libyaml Psych is using
237
- LIBYAML_VERSION = Psych.libyaml_version.join '.'
236
+ LIBYAML_VERSION = Psych.libyaml_version.join('.').freeze
238
237
  # Deprecation guard
239
- NOT_GIVEN = Object.new
238
+ NOT_GIVEN = Object.new.freeze
240
239
  private_constant :NOT_GIVEN
241
240
 
242
241
  ###
@@ -268,7 +267,11 @@ module Psych
268
267
  #
269
268
  # Raises a TypeError when `yaml` parameter is NilClass
270
269
  #
271
- def self.load yaml, legacy_filename = NOT_GIVEN, filename: nil, fallback: false, symbolize_names: false
270
+ # NOTE: This method *should not* be used to parse untrusted documents, such as
271
+ # YAML documents that are supplied via user input. Instead, please use the
272
+ # safe_load method.
273
+ #
274
+ def self.unsafe_load yaml, legacy_filename = NOT_GIVEN, filename: nil, fallback: false, symbolize_names: false, freeze: false
272
275
  if legacy_filename != NOT_GIVEN
273
276
  warn_with_uplevel 'Passing filename with the 2nd argument of Psych.load is deprecated. Use keyword argument like Psych.load(yaml, filename: ...) instead.', uplevel: 1 if $VERBOSE
274
277
  filename = legacy_filename
@@ -276,10 +279,9 @@ module Psych
276
279
 
277
280
  result = parse(yaml, filename: filename)
278
281
  return fallback unless result
279
- result = result.to_ruby if result
280
- symbolize_names!(result) if symbolize_names
281
- result
282
+ result.to_ruby(symbolize_names: symbolize_names, freeze: freeze)
282
283
  end
284
+ class << self; alias :load :unsafe_load; end
283
285
 
284
286
  ###
285
287
  # Safely load the yaml string in +yaml+. By default, only the following
@@ -325,7 +327,7 @@ module Psych
325
327
  # Psych.safe_load("---\n foo: bar") # => {"foo"=>"bar"}
326
328
  # Psych.safe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"}
327
329
  #
328
- def self.safe_load yaml, legacy_permitted_classes = NOT_GIVEN, legacy_permitted_symbols = NOT_GIVEN, legacy_aliases = NOT_GIVEN, legacy_filename = NOT_GIVEN, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false
330
+ def self.safe_load yaml, legacy_permitted_classes = NOT_GIVEN, legacy_permitted_symbols = NOT_GIVEN, legacy_aliases = NOT_GIVEN, legacy_filename = NOT_GIVEN, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false
329
331
  if legacy_permitted_classes != NOT_GIVEN
330
332
  warn_with_uplevel 'Passing permitted_classes with the 2nd argument of Psych.safe_load is deprecated. Use keyword argument like Psych.safe_load(yaml, permitted_classes: ...) instead.', uplevel: 1 if $VERBOSE
331
333
  permitted_classes = legacy_permitted_classes
@@ -353,12 +355,11 @@ module Psych
353
355
  permitted_symbols.map(&:to_s))
354
356
  scanner = ScalarScanner.new class_loader
355
357
  visitor = if aliases
356
- Visitors::ToRuby.new scanner, class_loader
358
+ Visitors::ToRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze
357
359
  else
358
- Visitors::NoAliasRuby.new scanner, class_loader
360
+ Visitors::NoAliasRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze
359
361
  end
360
362
  result = visitor.accept result
361
- symbolize_names!(result) if symbolize_names
362
363
  result
363
364
  end
364
365
 
@@ -551,7 +552,7 @@ module Psych
551
552
  # end
552
553
  # list # => ['foo', 'bar']
553
554
  #
554
- def self.load_stream yaml, legacy_filename = NOT_GIVEN, filename: nil, fallback: []
555
+ def self.load_stream yaml, legacy_filename = NOT_GIVEN, filename: nil, fallback: [], **kwargs
555
556
  if legacy_filename != NOT_GIVEN
556
557
  warn_with_uplevel 'Passing filename with the 2nd argument of Psych.load_stream is deprecated. Use keyword argument like Psych.load_stream(yaml, filename: ...) instead.', uplevel: 1 if $VERBOSE
557
558
  filename = legacy_filename
@@ -559,10 +560,10 @@ module Psych
559
560
 
560
561
  result = if block_given?
561
562
  parse_stream(yaml, filename: filename) do |node|
562
- yield node.to_ruby
563
+ yield node.to_ruby(**kwargs)
563
564
  end
564
565
  else
565
- parse_stream(yaml, filename: filename).children.map(&:to_ruby)
566
+ parse_stream(yaml, filename: filename).children.map { |node| node.to_ruby(**kwargs) }
566
567
  end
567
568
 
568
569
  return fallback if result.is_a?(Array) && result.empty?
@@ -573,50 +574,50 @@ module Psych
573
574
  # Load the document contained in +filename+. Returns the yaml contained in
574
575
  # +filename+ as a Ruby object, or if the file is empty, it returns
575
576
  # the specified +fallback+ return value, which defaults to +false+.
576
- def self.load_file filename, fallback: false
577
+ #
578
+ # NOTE: This method *should not* be used to parse untrusted documents, such as
579
+ # YAML documents that are supplied via user input. Instead, please use the
580
+ # safe_load_file method.
581
+ def self.unsafe_load_file filename, **kwargs
582
+ File.open(filename, 'r:bom|utf-8') { |f|
583
+ self.unsafe_load f, filename: filename, **kwargs
584
+ }
585
+ end
586
+ class << self; alias :load_file :unsafe_load_file; end
587
+
588
+ ###
589
+ # Safely loads the document contained in +filename+. Returns the yaml contained in
590
+ # +filename+ as a Ruby object, or if the file is empty, it returns
591
+ # the specified +fallback+ return value, which defaults to +false+.
592
+ # See safe_load for options.
593
+ def self.safe_load_file filename, **kwargs
577
594
  File.open(filename, 'r:bom|utf-8') { |f|
578
- self.load f, filename: filename, fallback: fallback
595
+ self.safe_load f, filename: filename, **kwargs
579
596
  }
580
597
  end
581
598
 
582
599
  # :stopdoc:
583
- @domain_types = {}
584
600
  def self.add_domain_type domain, type_tag, &block
585
601
  key = ['tag', domain, type_tag].join ':'
586
- @domain_types[key] = [key, block]
587
- @domain_types["tag:#{type_tag}"] = [key, block]
602
+ domain_types[key] = [key, block]
603
+ domain_types["tag:#{type_tag}"] = [key, block]
588
604
  end
589
605
 
590
606
  def self.add_builtin_type type_tag, &block
591
607
  domain = 'yaml.org,2002'
592
608
  key = ['tag', domain, type_tag].join ':'
593
- @domain_types[key] = [key, block]
609
+ domain_types[key] = [key, block]
594
610
  end
595
611
 
596
612
  def self.remove_type type_tag
597
- @domain_types.delete type_tag
613
+ domain_types.delete type_tag
598
614
  end
599
615
 
600
- @load_tags = {}
601
- @dump_tags = {}
602
616
  def self.add_tag tag, klass
603
- @load_tags[tag] = klass.name
604
- @dump_tags[klass] = tag
617
+ load_tags[tag] = klass.name
618
+ dump_tags[klass] = tag
605
619
  end
606
620
 
607
- def self.symbolize_names!(result)
608
- case result
609
- when Hash
610
- result.keys.each do |key|
611
- result[key.to_sym] = symbolize_names!(result.delete(key))
612
- end
613
- when Array
614
- result.map! { |r| symbolize_names!(r) }
615
- end
616
- result
617
- end
618
- private_class_method :symbolize_names!
619
-
620
621
  # Workaround for emulating `warn '...', uplevel: 1` in Ruby 2.4 or lower.
621
622
  def self.warn_with_uplevel(message, uplevel: 1)
622
623
  at = parse_caller(caller[uplevel]).join(':')
@@ -633,9 +634,32 @@ module Psych
633
634
  private_class_method :warn_with_uplevel, :parse_caller
634
635
 
635
636
  class << self
636
- attr_accessor :load_tags
637
- attr_accessor :dump_tags
638
- attr_accessor :domain_types
637
+ if defined?(Ractor)
638
+ require 'forwardable'
639
+ extend Forwardable
640
+
641
+ class Config
642
+ attr_accessor :load_tags, :dump_tags, :domain_types
643
+ def initialize
644
+ @load_tags = {}
645
+ @dump_tags = {}
646
+ @domain_types = {}
647
+ end
648
+ end
649
+
650
+ def config
651
+ Ractor.current[:PsychConfig] ||= Config.new
652
+ end
653
+
654
+ def_delegators :config, :load_tags, :dump_tags, :domain_types, :load_tags=, :dump_tags=, :domain_types=
655
+ else
656
+ attr_accessor :load_tags
657
+ attr_accessor :dump_tags
658
+ attr_accessor :domain_types
659
+ end
639
660
  end
661
+ self.load_tags = {}
662
+ self.dump_tags = {}
663
+ self.domain_types = {}
640
664
  # :startdoc:
641
665
  end
data/psych.gemspec CHANGED
@@ -1,16 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
3
 
4
- begin
5
- require_relative 'lib/psych/versions'
6
- rescue LoadError
7
- # for Ruby core repository
8
- require_relative 'versions'
4
+ version_module = Module.new do
5
+ version_rb = File.join(__dir__, "lib/psych/versions.rb")
6
+ module_eval(File.read(version_rb), version_rb)
9
7
  end
10
8
 
11
9
  Gem::Specification.new do |s|
12
10
  s.name = "psych"
13
- s.version = Psych::VERSION
11
+ s.version = version_module::Psych::VERSION
14
12
  s.authors = ["Aaron Patterson", "SHIBATA Hiroshi", "Charles Oliver Nutter"]
15
13
  s.email = ["aaron@tenderlovemaking.com", "hsbt@ruby-lang.org", "headius@headius.com"]
16
14
  s.summary = "Psych is a YAML parser and emitter"
@@ -25,7 +23,7 @@ DESCRIPTION
25
23
 
26
24
  # for ruby core repository. It was generated by `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
25
  s.files = [
28
- ".gitignore", ".travis.yml", "CHANGELOG.rdoc", "Gemfile", "Mavenfile", "README.md", "Rakefile", "bin/console",
26
+ ".gitignore", "Gemfile", "LICENSE", "Mavenfile", "README.md", "Rakefile", "bin/console",
29
27
  "bin/setup", "ext/psych/depend", "ext/psych/extconf.rb", "ext/psych/psych.c", "ext/psych/psych.h",
30
28
  "ext/psych/psych_emitter.c", "ext/psych/psych_emitter.h", "ext/psych/psych_parser.c", "ext/psych/psych_parser.h",
31
29
  "ext/psych/psych_to_ruby.c", "ext/psych/psych_to_ruby.h", "ext/psych/psych_yaml_tree.c", "ext/psych/psych_yaml_tree.h",
@@ -45,15 +43,11 @@ DESCRIPTION
45
43
  ]
46
44
 
47
45
  s.rdoc_options = ["--main", "README.md"]
48
- s.extra_rdoc_files = ["CHANGELOG.rdoc", "README.md"]
46
+ s.extra_rdoc_files = ["README.md"]
49
47
 
50
- s.required_ruby_version = Gem::Requirement.new(">= 2.2.2")
51
- s.rubygems_version = "2.5.1"
48
+ s.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
52
49
  s.required_rubygems_version = Gem::Requirement.new(">= 0")
53
50
 
54
- s.add_development_dependency 'rake-compiler', ">= 0.4.1"
55
- s.add_development_dependency 'minitest', "~> 5.0"
56
-
57
51
  if RUBY_ENGINE == 'jruby'
58
52
  s.platform = 'java'
59
53
  s.files.concat [
@@ -65,11 +59,9 @@ DESCRIPTION
65
59
  "lib/psych_jars.rb",
66
60
  "lib/psych.jar"
67
61
  ]
68
- s.requirements = "jar org.yaml:snakeyaml, #{Psych::DEFAULT_SNAKEYAML_VERSION}"
62
+ s.requirements = "jar org.yaml:snakeyaml, #{version_module::Psych::DEFAULT_SNAKEYAML_VERSION}"
69
63
  s.add_dependency 'jar-dependencies', '>= 0.1.7'
70
- s.add_development_dependency 'ruby-maven'
71
64
  else
72
65
  s.extensions = ["ext/psych/extconf.rb"]
73
- s.add_development_dependency 'rake-compiler-dock', ">= 0.6.3"
74
66
  end
75
67
  end