diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2017-11-24 23:32:37 +0900 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2017-11-25 00:11:36 +0900 |
commit | 88ad4d50169306f4120ed41a1de9f081255c50fa (patch) | |
tree | c538eb6c6e5cceb70a5d5e5334754800bc18251e /lib/psych.rb | |
parent | 10c3a6495753e36edad093139593a78dfdd0ae19 (diff) | |
download | psych-88ad4d50169306f4120ed41a1de9f081255c50fa.zip |
Add :symbolize_names option to Psych.load
like JSON.parse.
Diffstat (limited to 'lib/psych.rb')
-rw-r--r-- | lib/psych.rb | 19 |
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 |