зеркало из https://github.com/github/ruby.git
[ruby/psych] Refactor `symbolize_names`
https://github.com/ruby/psych/commit/3e472ab2d7
This commit is contained in:
Родитель
efa8df2886
Коммит
591a3326e3
|
@ -276,8 +276,7 @@ module Psych
|
|||
|
||||
result = parse(yaml, filename: filename)
|
||||
return fallback unless result
|
||||
result = result.to_ruby if result
|
||||
symbolize_names!(result) if symbolize_names
|
||||
result = result.to_ruby(symbolize_names: symbolize_names) if result
|
||||
result
|
||||
end
|
||||
|
||||
|
@ -353,12 +352,11 @@ module Psych
|
|||
permitted_symbols.map(&:to_s))
|
||||
scanner = ScalarScanner.new class_loader
|
||||
visitor = if aliases
|
||||
Visitors::ToRuby.new scanner, class_loader
|
||||
Visitors::ToRuby.new scanner, class_loader, symbolize_names: symbolize_names
|
||||
else
|
||||
Visitors::NoAliasRuby.new scanner, class_loader
|
||||
Visitors::NoAliasRuby.new scanner, class_loader, symbolize_names: symbolize_names
|
||||
end
|
||||
result = visitor.accept result
|
||||
symbolize_names!(result) if symbolize_names
|
||||
result
|
||||
end
|
||||
|
||||
|
@ -604,19 +602,6 @@ module Psych
|
|||
@dump_tags[klass] = tag
|
||||
end
|
||||
|
||||
def self.symbolize_names!(result)
|
||||
case result
|
||||
when Hash
|
||||
result.keys.each do |key|
|
||||
result[key.to_sym] = symbolize_names!(result.delete(key))
|
||||
end
|
||||
when Array
|
||||
result.map! { |r| symbolize_names!(r) }
|
||||
end
|
||||
result
|
||||
end
|
||||
private_class_method :symbolize_names!
|
||||
|
||||
# Workaround for emulating `warn '...', uplevel: 1` in Ruby 2.4 or lower.
|
||||
def self.warn_with_uplevel(message, uplevel: 1)
|
||||
at = parse_caller(caller[uplevel]).join(':')
|
||||
|
|
|
@ -46,8 +46,8 @@ module Psych
|
|||
# Convert this node to Ruby.
|
||||
#
|
||||
# See also Psych::Visitors::ToRuby
|
||||
def to_ruby
|
||||
Visitors::ToRuby.create.accept(self)
|
||||
def to_ruby(symbolize_names: false)
|
||||
Visitors::ToRuby.create(symbolize_names: symbolize_names).accept(self)
|
||||
end
|
||||
alias :transform :to_ruby
|
||||
|
||||
|
|
|
@ -12,20 +12,21 @@ module Psych
|
|||
###
|
||||
# This class walks a YAML AST, converting each node to Ruby
|
||||
class ToRuby < Psych::Visitors::Visitor
|
||||
def self.create
|
||||
def self.create(symbolize_names: false)
|
||||
class_loader = ClassLoader.new
|
||||
scanner = ScalarScanner.new class_loader
|
||||
new(scanner, class_loader)
|
||||
new(scanner, class_loader, symbolize_names: symbolize_names)
|
||||
end
|
||||
|
||||
attr_reader :class_loader
|
||||
|
||||
def initialize ss, class_loader
|
||||
def initialize ss, class_loader, symbolize_names: false
|
||||
super()
|
||||
@st = {}
|
||||
@ss = ss
|
||||
@domain_types = Psych.domain_types
|
||||
@class_loader = class_loader
|
||||
@symbolize_names = symbolize_names
|
||||
end
|
||||
|
||||
def accept target
|
||||
|
@ -336,7 +337,12 @@ module Psych
|
|||
SHOVEL = '<<'
|
||||
def revive_hash hash, o
|
||||
o.children.each_slice(2) { |k,v|
|
||||
key = deduplicate(accept(k))
|
||||
key = accept(k)
|
||||
if @symbolize_names
|
||||
key = key.to_sym
|
||||
else
|
||||
key = deduplicate(key)
|
||||
end
|
||||
val = accept(v)
|
||||
|
||||
if key == SHOVEL && k.tag != "tag:yaml.org,2002:str"
|
||||
|
|
Загрузка…
Ссылка в новой задаче