summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/psych/lib/psych.rb21
-rw-r--r--ext/psych/lib/psych/nodes/node.rb4
-rw-r--r--ext/psych/lib/psych/visitors/to_ruby.rb14
3 files changed, 15 insertions, 24 deletions
diff --git a/ext/psych/lib/psych.rb b/ext/psych/lib/psych.rb
index c719b036d0..67024fbbd5 100644
--- a/ext/psych/lib/psych.rb
+++ b/ext/psych/lib/psych.rb
@@ -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(':')
diff --git a/ext/psych/lib/psych/nodes/node.rb b/ext/psych/lib/psych/nodes/node.rb
index f59fb8916b..7e414e771f 100644
--- a/ext/psych/lib/psych/nodes/node.rb
+++ b/ext/psych/lib/psych/nodes/node.rb
@@ -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
diff --git a/ext/psych/lib/psych/visitors/to_ruby.rb b/ext/psych/lib/psych/visitors/to_ruby.rb
index b72fb4a1dc..3021aa7eda 100644
--- a/ext/psych/lib/psych/visitors/to_ruby.rb
+++ b/ext/psych/lib/psych/visitors/to_ruby.rb
@@ -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"