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 +4 -4
- data/README.md +10 -0
- data/ext/psych/extconf.rb +5 -2
- data/ext/psych/psych_to_ruby.c +4 -0
- data/lib/psych/class_loader.rb +1 -0
- data/lib/psych/core_ext.rb +19 -2
- data/lib/psych/nodes/node.rb +4 -3
- data/lib/psych/scalar_scanner.rb +3 -2
- data/lib/psych/versions.rb +2 -2
- data/lib/psych/visitors/to_ruby.rb +49 -5
- data/lib/psych/visitors/yaml_tree.rb +45 -2
- data/lib/psych.rb +38 -7
- metadata +3 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ec86c3f6651b1fada82948d0eedf7b90e793b5009000cd1339f59625bea67099
|
|
4
|
+
data.tar.gz: 21add9c5d592cef7b4e2c1510d7f73ef038dd67d96aada5b42c689e1b70bf343
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
40
|
-
|
|
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"
|
data/ext/psych/psych_to_ruby.c
CHANGED
data/lib/psych/class_loader.rb
CHANGED
data/lib/psych/core_ext.rb
CHANGED
|
@@ -14,6 +14,23 @@ class Object
|
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
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
|
data/lib/psych/nodes/node.rb
CHANGED
|
@@ -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
|
data/lib/psych/scalar_scanner.rb
CHANGED
|
@@ -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
|
data/lib/psych/versions.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
100
|
-
source =
|
|
103
|
+
matches = /^\/(?<string>.*)\/(?<options>[mixn]*)$/m.match(o.value)
|
|
104
|
+
source = matches[:string].gsub('\/', '/')
|
|
101
105
|
options = 0
|
|
102
106
|
lang = nil
|
|
103
|
-
|
|
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, "
|
|
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
|
-
|
|
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.
|
|
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:
|
|
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.
|
|
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: []
|