psych 5.2.3 → 5.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8c48b70d7c4ff53b1d536997a6e63173cb7e123e3f6e70f82c5de8596d93c4c
4
- data.tar.gz: c49d610314f1628a1e84267010dcfac5a076276eac2cad8dbbba9079ede9e08f
3
+ metadata.gz: ec86c3f6651b1fada82948d0eedf7b90e793b5009000cd1339f59625bea67099
4
+ data.tar.gz: 21add9c5d592cef7b4e2c1510d7f73ef038dd67d96aada5b42c689e1b70bf343
5
5
  SHA512:
6
- metadata.gz: 2d3d710995bfd6eb317994dd13024e5e3fd2967dbd379a1d510f86f7517177d2cc5e292a7d3b14c999071cc35ce625715ee3549fab90ce966567ba6e91f2475c
7
- data.tar.gz: f1570e565d5dd8c9e5984155dfbc1418a594aaa871fab7b7fabe62f05bc0a3e72ab141dd9f39c09689f8f4949a5c6e58fa9b1ca99c26db3552b0c9866a6032ad
6
+ metadata.gz: 5a72478d1e959e4d226dbee171299753064d3714b0d07f222b1aba87d0dc45de82c8f88b3c70e70c55da64017313bc143676a76f64ffd30423d5740396bbed46
7
+ data.tar.gz: fd64458ae3b633ac079bec30a94bef77bca75b694f93f4d3dae37da35ec49911e46de7d1ce871e1665e3da8570fa01f5616722a5b064a649d7186d8d74305380
data/README.md CHANGED
@@ -57,6 +57,16 @@ gem 'psych'
57
57
 
58
58
  JRuby ships with a pure Java implementation of Psych.
59
59
 
60
+ ## Release
61
+
62
+ We used the trusted publisher and [rubygems/release-gem](https://github.com/rubygems/release-gem) workflow.
63
+
64
+ We can release the new version with:
65
+
66
+ ```bash
67
+ git tag vXXX && git push origin vXXX
68
+ ```
69
+
60
70
  ## License
61
71
 
62
72
  Copyright 2009 Aaron Patterson, et al.
data/ext/psych/extconf.rb CHANGED
@@ -36,8 +36,11 @@ if yaml_source
36
36
  libyaml = "libyaml.#$LIBEXT"
37
37
  $cleanfiles << libyaml
38
38
  $LOCAL_LIBS.prepend("$(LIBYAML) ")
39
- else # default to pre-installed libyaml
40
- pkg_config('yaml-0.1')
39
+
40
+ # default to pre-installed libyaml
41
+ elsif pkg_config('yaml-0.1')
42
+ # found with pkg-config
43
+ else
41
44
  dir_config('libyaml')
42
45
  find_header('yaml.h') or abort "yaml.h not found"
43
46
  find_library('yaml', 'yaml_get_version') or abort "libyaml not found"
@@ -10,7 +10,11 @@ static VALUE build_exception(VALUE self, VALUE klass, VALUE mesg)
10
10
  {
11
11
  VALUE e = rb_obj_alloc(klass);
12
12
 
13
+ #ifdef TRUFFLERUBY
14
+ rb_exc_set_message(e, mesg);
15
+ #else
13
16
  rb_iv_set(e, "mesg", mesg);
17
+ #endif
14
18
 
15
19
  return e;
16
20
  }
@@ -6,6 +6,7 @@ module Psych
6
6
  class ClassLoader # :nodoc:
7
7
  BIG_DECIMAL = 'BigDecimal'
8
8
  COMPLEX = 'Complex'
9
+ DATA = 'Data' unless RUBY_VERSION < "3.2"
9
10
  DATE = 'Date'
10
11
  DATE_TIME = 'DateTime'
11
12
  EXCEPTION = 'Exception'
@@ -14,6 +14,23 @@ class Object
14
14
  end
15
15
  end
16
16
 
17
- if defined?(::IRB)
18
- require_relative 'y'
17
+ # Up to Ruby 3.4, Set was a regular object and was dumped as such
18
+ # by Pysch.
19
+ # Starting from Ruby 4.0 it's a core class written in C, so we have to implement
20
+ # #encode_with / #init_with to preserve backward compatibility.
21
+ if defined?(::Set) && Set.new.instance_variables.empty?
22
+ class Set
23
+ def encode_with(coder)
24
+ hash = {}
25
+ each do |m|
26
+ hash[m] = true
27
+ end
28
+ coder["hash"] = hash
29
+ coder
30
+ end
31
+
32
+ def init_with(coder)
33
+ replace(coder["hash"].keys)
34
+ end
35
+ end
19
36
  end
@@ -45,8 +45,8 @@ module Psych
45
45
  # Convert this node to Ruby.
46
46
  #
47
47
  # See also Psych::Visitors::ToRuby
48
- def to_ruby(symbolize_names: false, freeze: false, strict_integer: false)
49
- Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer).accept(self)
48
+ def to_ruby(symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true)
49
+ Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer, parse_symbols: parse_symbols).accept(self)
50
50
  end
51
51
  alias :transform :to_ruby
52
52
 
@@ -55,7 +55,8 @@ module Psych
55
55
  #
56
56
  # See also Psych::Visitors::Emitter
57
57
  def yaml io = nil, options = {}
58
- require "stringio"
58
+ require "stringio" unless defined?(StringIO)
59
+
59
60
  real_io = io || StringIO.new(''.encode('utf-8'))
60
61
 
61
62
  Visitors::Emitter.new(real_io, options).accept self
@@ -27,10 +27,11 @@ module Psych
27
27
  attr_reader :class_loader
28
28
 
29
29
  # Create a new scanner
30
- def initialize class_loader, strict_integer: false
30
+ def initialize class_loader, strict_integer: false, parse_symbols: true
31
31
  @symbol_cache = {}
32
32
  @class_loader = class_loader
33
33
  @strict_integer = strict_integer
34
+ @parse_symbols = parse_symbols
34
35
  end
35
36
 
36
37
  # Tokenize +string+ returning the Ruby object
@@ -72,7 +73,7 @@ module Psych
72
73
  -Float::INFINITY
73
74
  elsif string.match?(/^\.nan$/i)
74
75
  Float::NAN
75
- elsif string.match?(/^:./)
76
+ elsif @parse_symbols && string.match?(/^:./)
76
77
  if string =~ /^:(["'])(.*)\1/
77
78
  @symbol_cache[string] = class_loader.symbolize($2.sub(/^:/, ''))
78
79
  else
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Psych
4
4
  # The version of Psych you are using
5
- VERSION = '5.2.3'
5
+ VERSION = '5.3.1'
6
6
 
7
7
  if RUBY_ENGINE == 'jruby'
8
- DEFAULT_SNAKEYAML_VERSION = '2.9'.freeze
8
+ DEFAULT_SNAKEYAML_VERSION = '2.10'.freeze
9
9
  end
10
10
  end
@@ -12,9 +12,13 @@ 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(symbolize_names: false, freeze: false, strict_integer: false)
15
+ unless RUBY_VERSION < "3.2"
16
+ DATA_INITIALIZE = Data.instance_method(:initialize)
17
+ end
18
+
19
+ def self.create(symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true)
16
20
  class_loader = ClassLoader.new
17
- scanner = ScalarScanner.new class_loader, strict_integer: strict_integer
21
+ scanner = ScalarScanner.new class_loader, strict_integer: strict_integer, parse_symbols: parse_symbols
18
22
  new(scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze)
19
23
  end
20
24
 
@@ -96,11 +100,11 @@ module Psych
96
100
  Float(@ss.tokenize(o.value))
97
101
  when "!ruby/regexp"
98
102
  klass = class_loader.regexp
99
- o.value =~ /^\/(.*)\/([mixn]*)$/m
100
- source = $1
103
+ matches = /^\/(?<string>.*)\/(?<options>[mixn]*)$/m.match(o.value)
104
+ source = matches[:string].gsub('\/', '/')
101
105
  options = 0
102
106
  lang = nil
103
- $2&.each_char do |option|
107
+ matches[:options].each_char do |option|
104
108
  case option
105
109
  when 'x' then options |= Regexp::EXTENDED
106
110
  when 'i' then options |= Regexp::IGNORECASE
@@ -197,6 +201,32 @@ module Psych
197
201
  s
198
202
  end
199
203
 
204
+ when /^!ruby\/data(-with-ivars)?(?::(.*))?$/
205
+ data = register(o, resolve_class($2).allocate) if $2
206
+ members = {}
207
+
208
+ if $1 # data-with-ivars
209
+ ivars = {}
210
+ o.children.each_slice(2) do |type, vars|
211
+ case accept(type)
212
+ when 'members'
213
+ revive_data_members(members, vars)
214
+ data ||= allocate_anon_data(o, members)
215
+ when 'ivars'
216
+ revive_hash(ivars, vars)
217
+ end
218
+ end
219
+ ivars.each do |ivar, v|
220
+ data.instance_variable_set ivar, v
221
+ end
222
+ else
223
+ revive_data_members(members, o)
224
+ end
225
+ data ||= allocate_anon_data(o, members)
226
+ DATA_INITIALIZE.bind_call(data, **members)
227
+ data.freeze
228
+ data
229
+
200
230
  when /^!ruby\/object:?(.*)?$/
201
231
  name = $1 || 'Object'
202
232
 
@@ -340,6 +370,20 @@ module Psych
340
370
  list
341
371
  end
342
372
 
373
+ def allocate_anon_data node, members
374
+ klass = class_loader.data.define(*members.keys)
375
+ register(node, klass.allocate)
376
+ end
377
+
378
+ def revive_data_members hash, o
379
+ o.children.each_slice(2) do |k,v|
380
+ name = accept(k)
381
+ value = accept(v)
382
+ hash[class_loader.symbolize(name)] = value
383
+ end
384
+ hash
385
+ end
386
+
343
387
  def revive_hash hash, o, tagged= false
344
388
  o.children.each_slice(2) { |k,v|
345
389
  key = accept(k)
@@ -73,7 +73,7 @@ module Psych
73
73
 
74
74
  method = respond_to?(method) ? method : h[klass.superclass]
75
75
 
76
- raise(TypeError, "Can't dump #{target.class}") unless method
76
+ raise(TypeError, "can't dump #{klass.name}") unless method
77
77
 
78
78
  h[klass] = method
79
79
  end.compare_by_identity
@@ -162,6 +162,44 @@ module Psych
162
162
 
163
163
  alias :visit_Delegator :visit_Object
164
164
 
165
+ def visit_Data o
166
+ ivars = o.instance_variables
167
+ if ivars.empty?
168
+ tag = ['!ruby/data', o.class.name].compact.join(':')
169
+ register o, @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK)
170
+ o.members.each do |member|
171
+ @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY
172
+ accept o.send member
173
+ end
174
+ @emitter.end_mapping
175
+
176
+ else
177
+ tag = ['!ruby/data-with-ivars', o.class.name].compact.join(':')
178
+ node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK)
179
+ register(o, node)
180
+
181
+ # Dump the members
182
+ accept 'members'
183
+ @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK
184
+ o.members.each do |member|
185
+ @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY
186
+ accept o.send member
187
+ end
188
+ @emitter.end_mapping
189
+
190
+ # Dump the ivars
191
+ accept 'ivars'
192
+ @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK
193
+ ivars.each do |ivar|
194
+ accept ivar.to_s
195
+ accept o.instance_variable_get ivar
196
+ end
197
+ @emitter.end_mapping
198
+
199
+ @emitter.end_mapping
200
+ end
201
+ end unless RUBY_VERSION < "3.2"
202
+
165
203
  def visit_Struct o
166
204
  tag = ['!ruby/struct', o.class.name].compact.join(':')
167
205
 
@@ -189,7 +227,8 @@ module Psych
189
227
  end
190
228
 
191
229
  def visit_Date o
192
- register o, visit_Integer(o.gregorian)
230
+ formatted = format_date o
231
+ register o, @emitter.scalar(formatted, nil, nil, true, false, Nodes::Scalar::ANY)
193
232
  end
194
233
 
195
234
  def visit_DateTime o
@@ -486,6 +525,10 @@ module Psych
486
525
  end
487
526
  end
488
527
 
528
+ def format_date date
529
+ date.strftime("%Y-%m-%d")
530
+ end
531
+
489
532
  def register target, yaml_obj
490
533
  @st.register target, yaml_obj
491
534
  yaml_obj
data/lib/psych.rb CHANGED
@@ -23,7 +23,6 @@ require_relative 'psych/parser'
23
23
  require_relative 'psych/omap'
24
24
  require_relative 'psych/set'
25
25
  require_relative 'psych/coder'
26
- require_relative 'psych/core_ext'
27
26
  require_relative 'psych/stream'
28
27
  require_relative 'psych/json/tree_builder'
29
28
  require_relative 'psych/json/stream'
@@ -270,10 +269,10 @@ module Psych
270
269
  # YAML documents that are supplied via user input. Instead, please use the
271
270
  # load method or the safe_load method.
272
271
  #
273
- def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: false, freeze: false, strict_integer: false
272
+ def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true
274
273
  result = parse(yaml, filename: filename)
275
274
  return fallback unless result
276
- result.to_ruby(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer)
275
+ result.to_ruby(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer, parse_symbols: parse_symbols)
277
276
  end
278
277
 
279
278
  ###
@@ -321,13 +320,13 @@ module Psych
321
320
  # Psych.safe_load("---\n foo: bar") # => {"foo"=>"bar"}
322
321
  # Psych.safe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"}
323
322
  #
324
- def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false
323
+ def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true
325
324
  result = parse(yaml, filename: filename)
326
325
  return fallback unless result
327
326
 
328
327
  class_loader = ClassLoader::Restricted.new(permitted_classes.map(&:to_s),
329
328
  permitted_symbols.map(&:to_s))
330
- scanner = ScalarScanner.new class_loader, strict_integer: strict_integer
329
+ scanner = ScalarScanner.new class_loader, strict_integer: strict_integer, parse_symbols: parse_symbols
331
330
  visitor = if aliases
332
331
  Visitors::ToRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze
333
332
  else
@@ -367,7 +366,7 @@ module Psych
367
366
  # Raises a TypeError when `yaml` parameter is NilClass. This method is
368
367
  # similar to `safe_load` except that `Symbol` objects are allowed by default.
369
368
  #
370
- def self.load yaml, permitted_classes: [Symbol], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false
369
+ def self.load yaml, permitted_classes: [Symbol], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false, parse_symbols: true
371
370
  safe_load yaml, permitted_classes: permitted_classes,
372
371
  permitted_symbols: permitted_symbols,
373
372
  aliases: aliases,
@@ -375,7 +374,8 @@ module Psych
375
374
  fallback: fallback,
376
375
  symbolize_names: symbolize_names,
377
376
  freeze: freeze,
378
- strict_integer: strict_integer
377
+ strict_integer: strict_integer,
378
+ parse_symbols: parse_symbols
379
379
  end
380
380
 
381
381
  ###
@@ -654,6 +654,35 @@ module Psych
654
654
  result
655
655
  end
656
656
 
657
+ ###
658
+ # Load multiple documents given in +yaml+. Returns the parsed documents
659
+ # as a list.
660
+ #
661
+ # Example:
662
+ #
663
+ # Psych.safe_load_stream("--- foo\n...\n--- bar\n...") # => ['foo', 'bar']
664
+ #
665
+ # list = []
666
+ # Psych.safe_load_stream("--- foo\n...\n--- bar\n...") do |ruby|
667
+ # list << ruby
668
+ # end
669
+ # list # => ['foo', 'bar']
670
+ #
671
+ def self.safe_load_stream yaml, filename: nil, permitted_classes: [], aliases: false
672
+ documents = parse_stream(yaml, filename: filename).children.map do |child|
673
+ stream = Psych::Nodes::Stream.new
674
+ stream.children << child
675
+ safe_load(stream.to_yaml, permitted_classes: permitted_classes, aliases: aliases)
676
+ end
677
+
678
+ if block_given?
679
+ documents.each { |doc| yield doc }
680
+ nil
681
+ else
682
+ documents
683
+ end
684
+ end
685
+
657
686
  ###
658
687
  # Load the document contained in +filename+. Returns the yaml contained in
659
688
  # +filename+ as a Ruby object, or if the file is empty, it returns
@@ -761,3 +790,5 @@ module Psych
761
790
  self.domain_types = {}
762
791
  # :startdoc:
763
792
  end
793
+
794
+ require_relative 'psych/core_ext'
metadata CHANGED
@@ -1,16 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: psych
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.3
4
+ version: 5.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Patterson
8
8
  - SHIBATA Hiroshi
9
9
  - Charles Oliver Nutter
10
- autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2025-01-17 00:00:00.000000000 Z
12
+ date: 1980-01-02 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: stringio
@@ -112,7 +111,6 @@ licenses:
112
111
  metadata:
113
112
  msys2_mingw_dependencies: libyaml
114
113
  changelog_uri: https://github.com/ruby/psych/releases
115
- post_install_message:
116
114
  rdoc_options:
117
115
  - "--main"
118
116
  - README.md
@@ -129,8 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
127
  - !ruby/object:Gem::Version
130
128
  version: '0'
131
129
  requirements: []
132
- rubygems_version: 3.5.11
133
- signing_key:
130
+ rubygems_version: 3.6.9
134
131
  specification_version: 4
135
132
  summary: Psych is a YAML parser and emitter
136
133
  test_files: []