1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Merge Psych-3.2.1 from ruby/psych

This commit is contained in:
Hiroshi SHIBATA 2020-12-14 20:13:12 +09:00
parent 27520a1e1e
commit c2a60fec2f
No known key found for this signature in database
GPG key ID: F9CF13417264FAC2
5 changed files with 48 additions and 7 deletions

View file

@ -74,12 +74,15 @@ require 'psych/class_loader'
#
# ==== Reading from a string
#
# Psych.load("--- a") # => 'a'
# Psych.load("---\n - a\n - b") # => ['a', 'b']
# Psych.safe_load("--- a") # => 'a'
# Psych.safe_load("---\n - a\n - b") # => ['a', 'b']
# # From a trusted string:
# Psych.load("--- !ruby/range\nbegin: 0\nend: 42\nexcl: false\n") # => 0..42
#
# ==== Reading from a file
#
# Psych.load_file("database.yml")
# Psych.safe_load_file("data.yml", permitted_classes: [Date])
# Psych.load_file("trusted_database.yml")
#
# ==== Exception handling
#
@ -276,8 +279,7 @@ module Psych
result = parse(yaml, filename: filename)
return fallback unless result
result = result.to_ruby(symbolize_names: symbolize_names, freeze: freeze) if result
result
result.to_ruby(symbolize_names: symbolize_names, freeze: freeze)
end
###
@ -571,12 +573,27 @@ module Psych
# Load the document contained in +filename+. Returns the yaml contained in
# +filename+ as a Ruby object, or if the file is empty, it returns
# the specified +fallback+ return value, which defaults to +false+.
#
# NOTE: This method *should not* be used to parse untrusted documents, such as
# YAML documents that are supplied via user input. Instead, please use the
# safe_load_file method.
def self.load_file filename, **kwargs
File.open(filename, 'r:bom|utf-8') { |f|
self.load f, filename: filename, **kwargs
}
end
###
# Safely loads the document contained in +filename+. Returns the yaml contained in
# +filename+ as a Ruby object, or if the file is empty, it returns
# the specified +fallback+ return value, which defaults to +false+.
# See safe_load for options.
def self.safe_load_file filename, **kwargs
File.open(filename, 'r:bom|utf-8') { |f|
self.safe_load f, filename: filename, **kwargs
}
end
# :stopdoc:
@domain_types = {}
def self.add_domain_type domain, type_tag, &block

View file

@ -2,7 +2,7 @@
# frozen_string_literal: true
module Psych
# The version of Psych you are using
VERSION = '3.2.0'
VERSION = '3.2.1'
if RUBY_ENGINE == 'jruby'
DEFAULT_SNAKEYAML_VERSION = '1.26'.freeze

View file

@ -541,4 +541,4 @@ yaml_parser_load_mapping_end(yaml_parser_t *parser, yaml_event_t *event,
(void)POP(parser, *ctx);
return 1;
}
}

View file

@ -118,6 +118,18 @@ module Psych
}
end
def test_safe_load_file_exception
Tempfile.create(['loadfile', 'yml']) {|t|
t.binmode
t.write '--- `'
t.close
ex = assert_raises(Psych::SyntaxError) do
Psych.safe_load_file t.path
end
assert_equal t.path, ex.file
}
end
def test_psych_parse_takes_file
ex = assert_raises(Psych::SyntaxError) do
Psych.parse '--- `'

View file

@ -319,6 +319,18 @@ class TestPsych < Psych::TestCase
}
end
def test_safe_load_file_with_permitted_classe
Tempfile.create(['false', 'yml']) {|t|
t.binmode
t.write("--- !ruby/range\nbegin: 0\nend: 42\nexcl: false\n")
t.close
assert_equal 0..42, Psych.safe_load_file(t.path, permitted_classes: [Range])
assert_raises(Psych::DisallowedClass) {
Psych.safe_load_file(t.path)
}
}
end
def test_parse_file
Tempfile.create(['yikes', 'yml']) {|t|
t.binmode