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 | |
parent | 10c3a6495753e36edad093139593a78dfdd0ae19 (diff) | |
download | psych-88ad4d50169306f4120ed41a1de9f081255c50fa.tar.gz |
Add :symbolize_names option to Psych.load
like JSON.parse.
-rw-r--r-- | lib/psych.rb | 19 | ||||
-rw-r--r-- | test/psych/test_psych.rb | 18 |
2 files changed, 35 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 diff --git a/test/psych/test_psych.rb b/test/psych/test_psych.rb index d0de956..ff5ffba 100644 --- a/test/psych/test_psych.rb +++ b/test/psych/test_psych.rb @@ -182,4 +182,22 @@ class TestPsych < Psych::TestCase ["tag:example.com,2002:foo", "bar"] ], types end + + def test_symbolize_names + result = Psych.load(<<-eoyml) +foo: + bar: baz +hoge: + - fuga: piyo + eoyml + assert_equal result, { "foo" => { "bar" => "baz"}, "hoge" => [{ "fuga" => "piyo" }] } + + result = Psych.load(<<-eoyml, symbolize_names: true) +foo: + bar: baz +hoge: + - fuga: piyo + eoyml + assert_equal result, { foo: { bar: "baz" }, hoge: [{ fuga: "piyo" }] } + end end |