summaryrefslogtreecommitdiff
path: root/lib/psych.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2017-11-24 23:32:37 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2017-11-25 00:11:36 +0900
commit88ad4d50169306f4120ed41a1de9f081255c50fa (patch)
treec538eb6c6e5cceb70a5d5e5334754800bc18251e /lib/psych.rb
parent10c3a6495753e36edad093139593a78dfdd0ae19 (diff)
downloadpsych-88ad4d50169306f4120ed41a1de9f081255c50fa.zip
Add :symbolize_names option to Psych.load
like JSON.parse.
Diffstat (limited to 'lib/psych.rb')
-rw-r--r--lib/psych.rb19
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/psych.rb b/lib/psych.rb
index 2888774..dfb6c1b 100644
--- a/lib/psych.rb
+++ b/lib/psych.rb
@@ -252,9 +252,11 @@ module Psych
# ex.file # => 'file.txt'
# ex.message # => "(file.txt): found character that cannot start any token"
# end
- def self.load yaml, filename = nil, fallback = false
+ def self.load yaml, filename = nil, fallback = false, symbolize_names: false
result = parse(yaml, filename, fallback)
- result ? result.to_ruby : result
+ result = result.to_ruby if result
+ symbolize_names!(result) if symbolize_names
+ result
end
###
@@ -503,6 +505,19 @@ 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!
+
class << self
attr_accessor :load_tags
attr_accessor :dump_tags