Skip to content

Instantly share code, notes, and snippets.

@fnordfish
Last active February 22, 2023 16:22
Show Gist options
  • Save fnordfish/5ece8532766e46c884bb791b611c7a2c to your computer and use it in GitHub Desktop.
Save fnordfish/5ece8532766e46c884bb791b611c7a2c to your computer and use it in GitHub Desktop.
Add :stringify_names option to Psych.safe_dump
diff --git a/lib/psych/visitors/yaml_tree.rb b/lib/psych/visitors/yaml_tree.rb
index 5149178..673c8bc 100644
--- a/lib/psych/visitors/yaml_tree.rb
+++ b/lib/psych/visitors/yaml_tree.rb
@@ -70,6 +70,7 @@ module Psych
fail(ArgumentError, "Invalid line_width #{@line_width}, must be non-negative or -1 for unlimited.")
end
end
+ @stringify_names = options[:stringify_names]
@coders = []
@dispatch_cache = Hash.new do |h,klass|
@@ -328,7 +329,7 @@ module Psych
if o.class == ::Hash
register(o, @emitter.start_mapping(nil, nil, true, Psych::Nodes::Mapping::BLOCK))
o.each do |k,v|
- accept k
+ accept(@stringify_names && Symbol === k ? k.to_s : k)
accept v
end
@emitter.end_mapping
@@ -341,7 +342,7 @@ module Psych
register(o, @emitter.start_mapping(nil, '!set', false, Psych::Nodes::Mapping::BLOCK))
o.each do |k,v|
- accept k
+ accept(@stringify_names && Symbol === k ? k.to_s : k)
accept v
end
Psych.safe_dump({foo: { bar: "bar"} }, permitted_classes: [Symbol])
=> "---\n:foo:\n :bar: bar\n"
Psych.safe_dump({foo: { bar: "bar"} }, stringify_names: true)
=> "---\nfoo:\n bar: bar\n"
Psych.safe_dump({foo: { bar: "bar", narf: :crash} }, stringify_names: true)
[...]/psych/lib/psych/visitors/yaml_tree.rb:580:in `visit_Symbol': Tried to dump unspecified class: Symbol(:crash) (Psych::DisallowedClass)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment