summaryrefslogtreecommitdiff
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
parent10c3a6495753e36edad093139593a78dfdd0ae19 (diff)
downloadpsych-88ad4d50169306f4120ed41a1de9f081255c50fa.tar.gz
Add :symbolize_names option to Psych.load
like JSON.parse.
-rw-r--r--lib/psych.rb19
-rw-r--r--test/psych/test_psych.rb18
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