psych 3.2.0-java → 4.0.0-java
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/Gemfile +1 -1
- data/README.md +2 -2
- data/Rakefile +9 -2
- data/ext/psych/psych.c +3 -0
- data/ext/psych/yaml/loader.c +1 -1
- data/ext/psych/yaml/scanner.c +2 -2
- data/ext/psych/yaml/yaml.h +7 -7
- data/ext/psych/yaml/yaml_private.h +1 -1
- data/lib/psych.rb +114 -82
- data/lib/psych/class_loader.rb +6 -4
- data/lib/psych/handler.rb +1 -1
- data/lib/psych/nodes/scalar.rb +1 -1
- data/lib/psych/versions.rb +3 -3
- data/lib/psych/visitors/to_ruby.rb +9 -7
- data/lib/psych/visitors/visitor.rb +17 -3
- data/lib/psych/visitors/yaml_tree.rb +3 -3
- data/psych.gemspec +0 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5149acda4b0d41732db12bc694d4e72b0f5a511b628389ec0add96cef04d3b23
|
4
|
+
data.tar.gz: 4706cd6d83b23b106bdf5b5ef5953cdb416992bfa5ae774bb5f57e2f5394c1c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 109458fa5a2da076004e322aa34f8b777be41d9dd3f51e27e4f6282e14896d84b8c9964f5a748803ba4873fbcf3857e72aa9993952997ea962c9104f9a4af969
|
7
|
+
data.tar.gz: cf2cb03494fade26c250914388b11ade2d529e81ddfa4bee119c9a5a149681239c6d9c81261f5ec247540a40a137a14e96fcaac4190b9db94ca0a92167410fe8
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -12,8 +12,8 @@ serialize and de-serialize most Ruby objects to and from the YAML format.
|
|
12
12
|
## Examples
|
13
13
|
|
14
14
|
```ruby
|
15
|
-
#
|
16
|
-
Psych.
|
15
|
+
# Safely load YAML in to a Ruby object
|
16
|
+
Psych.safe_load('--- foo') # => 'foo'
|
17
17
|
|
18
18
|
# Emit YAML from a Ruby object
|
19
19
|
Psych.dump("foo") # => "--- foo\n...\n"
|
data/Rakefile
CHANGED
@@ -3,8 +3,8 @@ Bundler::GemHelper.install_tasks
|
|
3
3
|
|
4
4
|
require "rake/testtask"
|
5
5
|
Rake::TestTask.new(:test) do |t|
|
6
|
-
t.libs << "test"
|
7
|
-
t.
|
6
|
+
t.libs << "test/lib" << "test"
|
7
|
+
t.ruby_opts << "-rhelper"
|
8
8
|
t.test_files = FileList['test/**/test_*.rb']
|
9
9
|
t.verbose = true
|
10
10
|
t.warning = true
|
@@ -31,4 +31,11 @@ else
|
|
31
31
|
Rake::ExtensionTask.new("psych")
|
32
32
|
end
|
33
33
|
|
34
|
+
task :sync_tool do
|
35
|
+
require 'fileutils'
|
36
|
+
FileUtils.cp "../ruby/tool/lib/test/unit/core_assertions.rb", "./test/lib"
|
37
|
+
FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
|
38
|
+
FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
|
39
|
+
end
|
40
|
+
|
34
41
|
task :default => [:compile, :test]
|
data/ext/psych/psych.c
CHANGED
data/ext/psych/yaml/loader.c
CHANGED
data/ext/psych/yaml/scanner.c
CHANGED
@@ -273,7 +273,7 @@
|
|
273
273
|
* The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
|
274
274
|
* increase that precedes a block collection (cf. the INDENT token in Python).
|
275
275
|
* The token BLOCK-END denote indentation decrease that ends a block collection
|
276
|
-
* (cf. the DEDENT token in Python). However YAML has some syntax
|
276
|
+
* (cf. the DEDENT token in Python). However YAML has some syntax peculiarities
|
277
277
|
* that makes detections of these tokens more complex.
|
278
278
|
*
|
279
279
|
* The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
|
@@ -3287,7 +3287,7 @@ yaml_parser_scan_flow_scalar(yaml_parser_t *parser, yaml_token_t *token,
|
|
3287
3287
|
|
3288
3288
|
/* Check if we are at the end of the scalar. */
|
3289
3289
|
|
3290
|
-
/* Fix for crash
|
3290
|
+
/* Fix for crash uninitialized value crash
|
3291
3291
|
* Credit for the bug and input is to OSS Fuzz
|
3292
3292
|
* Credit for the fix to Alex Gaynor
|
3293
3293
|
*/
|
data/ext/psych/yaml/yaml.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/**
|
2
2
|
* @file yaml.h
|
3
3
|
* @brief Public interface for libyaml.
|
4
|
-
*
|
4
|
+
*
|
5
5
|
* Include the header file with the code:
|
6
6
|
* @code
|
7
7
|
* #include <yaml.h>
|
@@ -390,7 +390,7 @@ typedef struct yaml_event_s {
|
|
390
390
|
|
391
391
|
/** The event data. */
|
392
392
|
union {
|
393
|
-
|
393
|
+
|
394
394
|
/** The stream parameters (for @c YAML_STREAM_START_EVENT). */
|
395
395
|
struct {
|
396
396
|
/** The document encoding. */
|
@@ -726,7 +726,7 @@ struct yaml_node_s {
|
|
726
726
|
|
727
727
|
/** The node data. */
|
728
728
|
union {
|
729
|
-
|
729
|
+
|
730
730
|
/** The scalar parameters (for @c YAML_SCALAR_NODE). */
|
731
731
|
struct {
|
732
732
|
/** The scalar value. */
|
@@ -1095,7 +1095,7 @@ typedef struct yaml_parser_s {
|
|
1095
1095
|
yaml_error_type_t error;
|
1096
1096
|
/** Error description. */
|
1097
1097
|
const char *problem;
|
1098
|
-
/** The byte about which the problem
|
1098
|
+
/** The byte about which the problem occurred. */
|
1099
1099
|
size_t problem_offset;
|
1100
1100
|
/** The problematic value (@c -1 is none). */
|
1101
1101
|
int problem_value;
|
@@ -1335,7 +1335,7 @@ yaml_parser_delete(yaml_parser_t *parser);
|
|
1335
1335
|
* Set a string input.
|
1336
1336
|
*
|
1337
1337
|
* Note that the @a input pointer must be valid while the @a parser object
|
1338
|
-
* exists. The application is responsible for
|
1338
|
+
* exists. The application is responsible for destroying @a input after
|
1339
1339
|
* destroying the @a parser.
|
1340
1340
|
*
|
1341
1341
|
* @param[in,out] parser A parser object.
|
@@ -1734,7 +1734,7 @@ typedef struct yaml_emitter_s {
|
|
1734
1734
|
size_t length;
|
1735
1735
|
/** Does the scalar contain line breaks? */
|
1736
1736
|
int multiline;
|
1737
|
-
/** Can the scalar be
|
1737
|
+
/** Can the scalar be expressed in the flow plain style? */
|
1738
1738
|
int flow_plain_allowed;
|
1739
1739
|
/** Can the scalar be expressed in the block plain style? */
|
1740
1740
|
int block_plain_allowed;
|
@@ -1950,7 +1950,7 @@ yaml_emitter_close(yaml_emitter_t *emitter);
|
|
1950
1950
|
/**
|
1951
1951
|
* Emit a YAML document.
|
1952
1952
|
*
|
1953
|
-
* The
|
1953
|
+
* The document object may be generated using the yaml_parser_load() function
|
1954
1954
|
* or the yaml_document_initialize() function. The emitter takes the
|
1955
1955
|
* responsibility for the document object and destroys its content after
|
1956
1956
|
* it is emitted. The document object is destroyed even if the function fails.
|
data/lib/psych.rb
CHANGED
@@ -74,12 +74,15 @@ require 'psych/class_loader'
|
|
74
74
|
#
|
75
75
|
# ==== Reading from a string
|
76
76
|
#
|
77
|
-
# Psych.
|
78
|
-
# Psych.
|
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
|
79
81
|
#
|
80
82
|
# ==== Reading from a file
|
81
83
|
#
|
82
|
-
# Psych.
|
84
|
+
# Psych.safe_load_file("data.yml", permitted_classes: [Date])
|
85
|
+
# Psych.load_file("trusted_database.yml")
|
83
86
|
#
|
84
87
|
# ==== Exception handling
|
85
88
|
#
|
@@ -230,10 +233,7 @@ require 'psych/class_loader'
|
|
230
233
|
|
231
234
|
module Psych
|
232
235
|
# The version of libyaml Psych is using
|
233
|
-
LIBYAML_VERSION = Psych.libyaml_version.join
|
234
|
-
# Deprecation guard
|
235
|
-
NOT_GIVEN = Object.new
|
236
|
-
private_constant :NOT_GIVEN
|
236
|
+
LIBYAML_VERSION = Psych.libyaml_version.join('.').freeze
|
237
237
|
|
238
238
|
###
|
239
239
|
# Load +yaml+ in to a Ruby data structure. If multiple documents are
|
@@ -246,11 +246,11 @@ module Psych
|
|
246
246
|
#
|
247
247
|
# Example:
|
248
248
|
#
|
249
|
-
# Psych.
|
250
|
-
# Psych.
|
249
|
+
# Psych.unsafe_load("--- a") # => 'a'
|
250
|
+
# Psych.unsafe_load("---\n - a\n - b") # => ['a', 'b']
|
251
251
|
#
|
252
252
|
# begin
|
253
|
-
# Psych.
|
253
|
+
# Psych.unsafe_load("--- `", filename: "file.txt")
|
254
254
|
# rescue Psych::SyntaxError => ex
|
255
255
|
# ex.file # => 'file.txt'
|
256
256
|
# ex.message # => "(file.txt): found character that cannot start any token"
|
@@ -259,26 +259,21 @@ module Psych
|
|
259
259
|
# When the optional +symbolize_names+ keyword argument is set to a
|
260
260
|
# true value, returns symbols for keys in Hash objects (default: strings).
|
261
261
|
#
|
262
|
-
# Psych.
|
263
|
-
# Psych.
|
262
|
+
# Psych.unsafe_load("---\n foo: bar") # => {"foo"=>"bar"}
|
263
|
+
# Psych.unsafe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"}
|
264
264
|
#
|
265
265
|
# Raises a TypeError when `yaml` parameter is NilClass
|
266
266
|
#
|
267
267
|
# NOTE: This method *should not* be used to parse untrusted documents, such as
|
268
268
|
# YAML documents that are supplied via user input. Instead, please use the
|
269
|
-
# safe_load method.
|
269
|
+
# load method or the safe_load method.
|
270
270
|
#
|
271
|
-
def self.
|
272
|
-
if legacy_filename != NOT_GIVEN
|
273
|
-
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
|
-
filename = legacy_filename
|
275
|
-
end
|
276
|
-
|
271
|
+
def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: false, freeze: false
|
277
272
|
result = parse(yaml, filename: filename)
|
278
273
|
return fallback unless result
|
279
|
-
result
|
280
|
-
result
|
274
|
+
result.to_ruby(symbolize_names: symbolize_names, freeze: freeze)
|
281
275
|
end
|
276
|
+
class << self; alias :load :unsafe_load; end
|
282
277
|
|
283
278
|
###
|
284
279
|
# Safely load the yaml string in +yaml+. By default, only the following
|
@@ -324,27 +319,7 @@ module Psych
|
|
324
319
|
# Psych.safe_load("---\n foo: bar") # => {"foo"=>"bar"}
|
325
320
|
# Psych.safe_load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"}
|
326
321
|
#
|
327
|
-
def self.safe_load yaml,
|
328
|
-
if legacy_permitted_classes != NOT_GIVEN
|
329
|
-
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
|
330
|
-
permitted_classes = legacy_permitted_classes
|
331
|
-
end
|
332
|
-
|
333
|
-
if legacy_permitted_symbols != NOT_GIVEN
|
334
|
-
warn_with_uplevel 'Passing permitted_symbols with the 3rd argument of Psych.safe_load is deprecated. Use keyword argument like Psych.safe_load(yaml, permitted_symbols: ...) instead.', uplevel: 1 if $VERBOSE
|
335
|
-
permitted_symbols = legacy_permitted_symbols
|
336
|
-
end
|
337
|
-
|
338
|
-
if legacy_aliases != NOT_GIVEN
|
339
|
-
warn_with_uplevel 'Passing aliases with the 4th argument of Psych.safe_load is deprecated. Use keyword argument like Psych.safe_load(yaml, aliases: ...) instead.', uplevel: 1 if $VERBOSE
|
340
|
-
aliases = legacy_aliases
|
341
|
-
end
|
342
|
-
|
343
|
-
if legacy_filename != NOT_GIVEN
|
344
|
-
warn_with_uplevel 'Passing filename with the 5th argument of Psych.safe_load is deprecated. Use keyword argument like Psych.safe_load(yaml, filename: ...) instead.', uplevel: 1 if $VERBOSE
|
345
|
-
filename = legacy_filename
|
346
|
-
end
|
347
|
-
|
322
|
+
def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false
|
348
323
|
result = parse(yaml, filename: filename)
|
349
324
|
return fallback unless result
|
350
325
|
|
@@ -360,6 +335,46 @@ module Psych
|
|
360
335
|
result
|
361
336
|
end
|
362
337
|
|
338
|
+
###
|
339
|
+
# Load +yaml+ in to a Ruby data structure. If multiple documents are
|
340
|
+
# provided, the object contained in the first document will be returned.
|
341
|
+
# +filename+ will be used in the exception message if any exception
|
342
|
+
# is raised while parsing. If +yaml+ is empty, it returns
|
343
|
+
# the specified +fallback+ return value, which defaults to +false+.
|
344
|
+
#
|
345
|
+
# Raises a Psych::SyntaxError when a YAML syntax error is detected.
|
346
|
+
#
|
347
|
+
# Example:
|
348
|
+
#
|
349
|
+
# Psych.load("--- a") # => 'a'
|
350
|
+
# Psych.load("---\n - a\n - b") # => ['a', 'b']
|
351
|
+
#
|
352
|
+
# begin
|
353
|
+
# Psych.load("--- `", filename: "file.txt")
|
354
|
+
# rescue Psych::SyntaxError => ex
|
355
|
+
# ex.file # => 'file.txt'
|
356
|
+
# ex.message # => "(file.txt): found character that cannot start any token"
|
357
|
+
# end
|
358
|
+
#
|
359
|
+
# When the optional +symbolize_names+ keyword argument is set to a
|
360
|
+
# true value, returns symbols for keys in Hash objects (default: strings).
|
361
|
+
#
|
362
|
+
# Psych.load("---\n foo: bar") # => {"foo"=>"bar"}
|
363
|
+
# Psych.load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"}
|
364
|
+
#
|
365
|
+
# Raises a TypeError when `yaml` parameter is NilClass. This method is
|
366
|
+
# similar to `safe_load` except that `Symbol` objects are allowed by default.
|
367
|
+
#
|
368
|
+
def self.load yaml, permitted_classes: [Symbol], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false
|
369
|
+
safe_load yaml, permitted_classes: permitted_classes,
|
370
|
+
permitted_symbols: permitted_symbols,
|
371
|
+
aliases: aliases,
|
372
|
+
filename: filename,
|
373
|
+
fallback: fallback,
|
374
|
+
symbolize_names: symbolize_names,
|
375
|
+
freeze: freeze
|
376
|
+
end
|
377
|
+
|
363
378
|
###
|
364
379
|
# Parse a YAML string in +yaml+. Returns the Psych::Nodes::Document.
|
365
380
|
# +filename+ is used in the exception message if a Psych::SyntaxError is
|
@@ -379,22 +394,12 @@ module Psych
|
|
379
394
|
# end
|
380
395
|
#
|
381
396
|
# See Psych::Nodes for more information about YAML AST.
|
382
|
-
def self.parse yaml,
|
383
|
-
if legacy_filename != NOT_GIVEN
|
384
|
-
warn_with_uplevel 'Passing filename with the 2nd argument of Psych.parse is deprecated. Use keyword argument like Psych.parse(yaml, filename: ...) instead.', uplevel: 1 if $VERBOSE
|
385
|
-
filename = legacy_filename
|
386
|
-
end
|
387
|
-
|
397
|
+
def self.parse yaml, filename: nil
|
388
398
|
parse_stream(yaml, filename: filename) do |node|
|
389
399
|
return node
|
390
400
|
end
|
391
401
|
|
392
|
-
|
393
|
-
warn_with_uplevel 'Passing the `fallback` keyword argument of Psych.parse is deprecated.', uplevel: 1 if $VERBOSE
|
394
|
-
fallback
|
395
|
-
else
|
396
|
-
false
|
397
|
-
end
|
402
|
+
false
|
398
403
|
end
|
399
404
|
|
400
405
|
###
|
@@ -443,12 +448,7 @@ module Psych
|
|
443
448
|
# Raises a TypeError when NilClass is passed.
|
444
449
|
#
|
445
450
|
# See Psych::Nodes for more information about YAML AST.
|
446
|
-
def self.parse_stream yaml,
|
447
|
-
if legacy_filename != NOT_GIVEN
|
448
|
-
warn_with_uplevel 'Passing filename with the 2nd argument of Psych.parse_stream is deprecated. Use keyword argument like Psych.parse_stream(yaml, filename: ...) instead.', uplevel: 1 if $VERBOSE
|
449
|
-
filename = legacy_filename
|
450
|
-
end
|
451
|
-
|
451
|
+
def self.parse_stream yaml, filename: nil, &block
|
452
452
|
if block_given?
|
453
453
|
parser = Psych::Parser.new(Handlers::DocumentStream.new(&block))
|
454
454
|
parser.parse yaml, filename
|
@@ -549,18 +549,13 @@ module Psych
|
|
549
549
|
# end
|
550
550
|
# list # => ['foo', 'bar']
|
551
551
|
#
|
552
|
-
def self.load_stream yaml,
|
553
|
-
if legacy_filename != NOT_GIVEN
|
554
|
-
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
|
555
|
-
filename = legacy_filename
|
556
|
-
end
|
557
|
-
|
552
|
+
def self.load_stream yaml, filename: nil, fallback: [], **kwargs
|
558
553
|
result = if block_given?
|
559
554
|
parse_stream(yaml, filename: filename) do |node|
|
560
|
-
yield node.to_ruby
|
555
|
+
yield node.to_ruby(**kwargs)
|
561
556
|
end
|
562
557
|
else
|
563
|
-
parse_stream(yaml, filename: filename).children.map(
|
558
|
+
parse_stream(yaml, filename: filename).children.map { |node| node.to_ruby(**kwargs) }
|
564
559
|
end
|
565
560
|
|
566
561
|
return fallback if result.is_a?(Array) && result.empty?
|
@@ -571,35 +566,49 @@ module Psych
|
|
571
566
|
# Load the document contained in +filename+. Returns the yaml contained in
|
572
567
|
# +filename+ as a Ruby object, or if the file is empty, it returns
|
573
568
|
# the specified +fallback+ return value, which defaults to +false+.
|
574
|
-
|
569
|
+
#
|
570
|
+
# NOTE: This method *should not* be used to parse untrusted documents, such as
|
571
|
+
# YAML documents that are supplied via user input. Instead, please use the
|
572
|
+
# safe_load_file method.
|
573
|
+
def self.unsafe_load_file filename, **kwargs
|
574
|
+
File.open(filename, 'r:bom|utf-8') { |f|
|
575
|
+
self.unsafe_load f, filename: filename, **kwargs
|
576
|
+
}
|
577
|
+
end
|
578
|
+
class << self; alias :load_file :unsafe_load_file; end
|
579
|
+
|
580
|
+
###
|
581
|
+
# Safely loads the document contained in +filename+. Returns the yaml contained in
|
582
|
+
# +filename+ as a Ruby object, or if the file is empty, it returns
|
583
|
+
# the specified +fallback+ return value, which defaults to +false+.
|
584
|
+
# See safe_load for options.
|
585
|
+
def self.safe_load_file filename, **kwargs
|
575
586
|
File.open(filename, 'r:bom|utf-8') { |f|
|
576
|
-
self.
|
587
|
+
self.safe_load f, filename: filename, **kwargs
|
577
588
|
}
|
578
589
|
end
|
590
|
+
class << self; alias load_file safe_load_file end
|
579
591
|
|
580
592
|
# :stopdoc:
|
581
|
-
@domain_types = {}
|
582
593
|
def self.add_domain_type domain, type_tag, &block
|
583
594
|
key = ['tag', domain, type_tag].join ':'
|
584
|
-
|
585
|
-
|
595
|
+
domain_types[key] = [key, block]
|
596
|
+
domain_types["tag:#{type_tag}"] = [key, block]
|
586
597
|
end
|
587
598
|
|
588
599
|
def self.add_builtin_type type_tag, &block
|
589
600
|
domain = 'yaml.org,2002'
|
590
601
|
key = ['tag', domain, type_tag].join ':'
|
591
|
-
|
602
|
+
domain_types[key] = [key, block]
|
592
603
|
end
|
593
604
|
|
594
605
|
def self.remove_type type_tag
|
595
|
-
|
606
|
+
domain_types.delete type_tag
|
596
607
|
end
|
597
608
|
|
598
|
-
@load_tags = {}
|
599
|
-
@dump_tags = {}
|
600
609
|
def self.add_tag tag, klass
|
601
|
-
|
602
|
-
|
610
|
+
load_tags[tag] = klass.name
|
611
|
+
dump_tags[klass] = tag
|
603
612
|
end
|
604
613
|
|
605
614
|
# Workaround for emulating `warn '...', uplevel: 1` in Ruby 2.4 or lower.
|
@@ -618,9 +627,32 @@ module Psych
|
|
618
627
|
private_class_method :warn_with_uplevel, :parse_caller
|
619
628
|
|
620
629
|
class << self
|
621
|
-
|
622
|
-
|
623
|
-
|
630
|
+
if defined?(Ractor)
|
631
|
+
require 'forwardable'
|
632
|
+
extend Forwardable
|
633
|
+
|
634
|
+
class Config
|
635
|
+
attr_accessor :load_tags, :dump_tags, :domain_types
|
636
|
+
def initialize
|
637
|
+
@load_tags = {}
|
638
|
+
@dump_tags = {}
|
639
|
+
@domain_types = {}
|
640
|
+
end
|
641
|
+
end
|
642
|
+
|
643
|
+
def config
|
644
|
+
Ractor.current[:PsychConfig] ||= Config.new
|
645
|
+
end
|
646
|
+
|
647
|
+
def_delegators :config, :load_tags, :dump_tags, :domain_types, :load_tags=, :dump_tags=, :domain_types=
|
648
|
+
else
|
649
|
+
attr_accessor :load_tags
|
650
|
+
attr_accessor :dump_tags
|
651
|
+
attr_accessor :domain_types
|
652
|
+
end
|
624
653
|
end
|
654
|
+
self.load_tags = {}
|
655
|
+
self.dump_tags = {}
|
656
|
+
self.domain_types = {}
|
625
657
|
# :startdoc:
|
626
658
|
end
|
data/lib/psych/class_loader.rb
CHANGED
@@ -35,9 +35,11 @@ module Psych
|
|
35
35
|
|
36
36
|
constants.each do |const|
|
37
37
|
konst = const_get const
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
class_eval <<~RUBY
|
39
|
+
def #{const.to_s.downcase}
|
40
|
+
load #{konst.inspect}
|
41
|
+
end
|
42
|
+
RUBY
|
41
43
|
end
|
42
44
|
|
43
45
|
private
|
@@ -69,7 +71,7 @@ module Psych
|
|
69
71
|
rescue
|
70
72
|
nil
|
71
73
|
end
|
72
|
-
}.compact]
|
74
|
+
}.compact].freeze
|
73
75
|
|
74
76
|
class Restricted < ClassLoader
|
75
77
|
def initialize classes, symbols
|
data/lib/psych/handler.rb
CHANGED
@@ -119,7 +119,7 @@ module Psych
|
|
119
119
|
# +tag+ is an associated tag or nil
|
120
120
|
# +plain+ is a boolean value
|
121
121
|
# +quoted+ is a boolean value
|
122
|
-
# +style+ is an integer
|
122
|
+
# +style+ is an integer indicating the string style
|
123
123
|
#
|
124
124
|
# See the constants in Psych::Nodes::Scalar for the possible values of
|
125
125
|
# +style+
|
data/lib/psych/nodes/scalar.rb
CHANGED
data/lib/psych/versions.rb
CHANGED
@@ -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 = '
|
5
|
+
VERSION = '4.0.0'
|
6
6
|
|
7
7
|
if RUBY_ENGINE == 'jruby'
|
8
|
-
DEFAULT_SNAKEYAML_VERSION = '1.
|
8
|
+
DEFAULT_SNAKEYAML_VERSION = '1.28'.freeze
|
9
9
|
end
|
10
10
|
end
|
@@ -24,6 +24,7 @@ module Psych
|
|
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
|
29
30
|
@symbolize_names = symbolize_names
|
@@ -48,7 +49,7 @@ module Psych
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def deserialize o
|
51
|
-
if klass = resolve_class(
|
52
|
+
if klass = resolve_class(@load_tags[o.tag])
|
52
53
|
instance = klass.allocate
|
53
54
|
|
54
55
|
if instance.respond_to?(:init_with)
|
@@ -128,7 +129,7 @@ module Psych
|
|
128
129
|
end
|
129
130
|
|
130
131
|
def visit_Psych_Nodes_Sequence o
|
131
|
-
if klass = resolve_class(
|
132
|
+
if klass = resolve_class(@load_tags[o.tag])
|
132
133
|
instance = klass.allocate
|
133
134
|
|
134
135
|
if instance.respond_to?(:init_with)
|
@@ -160,8 +161,8 @@ module Psych
|
|
160
161
|
end
|
161
162
|
|
162
163
|
def visit_Psych_Nodes_Mapping o
|
163
|
-
if
|
164
|
-
return revive(resolve_class(
|
164
|
+
if @load_tags[o.tag]
|
165
|
+
return revive(resolve_class(@load_tags[o.tag]), o)
|
165
166
|
end
|
166
167
|
return revive_hash(register(o, {}), o) unless o.tag
|
167
168
|
|
@@ -326,6 +327,7 @@ module Psych
|
|
326
327
|
end
|
327
328
|
|
328
329
|
private
|
330
|
+
|
329
331
|
def register node, object
|
330
332
|
@st[node.anchor] = object if node.anchor
|
331
333
|
object
|
@@ -337,7 +339,7 @@ module Psych
|
|
337
339
|
list
|
338
340
|
end
|
339
341
|
|
340
|
-
def revive_hash hash, o
|
342
|
+
def revive_hash hash, o, tagged= false
|
341
343
|
o.children.each_slice(2) { |k,v|
|
342
344
|
key = accept(k)
|
343
345
|
val = accept(v)
|
@@ -364,7 +366,7 @@ module Psych
|
|
364
366
|
hash[key] = val
|
365
367
|
end
|
366
368
|
else
|
367
|
-
if @symbolize_names
|
369
|
+
if !tagged && @symbolize_names && key.is_a?(String)
|
368
370
|
key = key.to_sym
|
369
371
|
elsif !@freeze
|
370
372
|
key = deduplicate(key)
|
@@ -402,7 +404,7 @@ module Psych
|
|
402
404
|
|
403
405
|
def revive klass, node
|
404
406
|
s = register(node, klass.allocate)
|
405
|
-
init_with(s, revive_hash({}, node), node)
|
407
|
+
init_with(s, revive_hash({}, node, true), node)
|
406
408
|
end
|
407
409
|
|
408
410
|
def init_with o, h, node
|
@@ -8,12 +8,26 @@ module Psych
|
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
|
-
|
12
|
-
|
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
|
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
|
@@ -509,9 +509,9 @@ module Psych
|
|
509
509
|
def emit_coder c, o
|
510
510
|
case c.type
|
511
511
|
when :scalar
|
512
|
-
@emitter.scalar c.scalar, nil, c.tag, c.tag.nil?, false,
|
512
|
+
@emitter.scalar c.scalar, nil, c.tag, c.tag.nil?, false, c.style
|
513
513
|
when :seq
|
514
|
-
@emitter.start_sequence nil, c.tag, c.tag.nil?,
|
514
|
+
@emitter.start_sequence nil, c.tag, c.tag.nil?, c.style
|
515
515
|
c.seq.each do |thing|
|
516
516
|
accept thing
|
517
517
|
end
|
data/psych.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: psych
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Aaron Patterson
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2021-05-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
requirements:
|
140
|
-
- jar org.yaml:snakeyaml, 1.
|
140
|
+
- jar org.yaml:snakeyaml, 1.28
|
141
141
|
rubygems_version: 3.0.6
|
142
142
|
signing_key:
|
143
143
|
specification_version: 4
|