From 8e0076a3f2f8a7277e659607ab195845ce505a01 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Fri, 1 Dec 2023 11:46:16 +0100 Subject: [PATCH] JSON.dump: handle unenclosed hashes regression Fix: https://github.com/flori/json/issues/553 We can never add keyword arguments to `dump` otherwise existing code using unenclosed hash will break. --- lib/json/common.rb | 10 ++++++++-- tests/json_generator_test.rb | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/json/common.rb b/lib/json/common.rb index 53b66a9bf..f51f02d4d 100644 --- a/lib/json/common.rb +++ b/lib/json/common.rb @@ -611,7 +611,7 @@ class << self # puts File.read(path) # Output: # {"foo":[0,1],"bar":{"baz":2,"bat":3},"bam":"bad"} - def dump(obj, anIO = nil, limit = nil, strict: NOT_SET) + def dump(obj, anIO = nil, limit = nil, kwargs = nil) if anIO and limit.nil? anIO = anIO.to_io if anIO.respond_to?(:to_io) unless anIO.respond_to?(:write) @@ -621,7 +621,7 @@ def dump(obj, anIO = nil, limit = nil, strict: NOT_SET) end opts = JSON.dump_default_options opts = opts.merge(:max_nesting => limit) if limit - opts[:strict] = strict if NOT_SET != strict + merge_dump_options(opts, **kwargs) if kwargs result = generate(obj, opts) if anIO anIO.write result @@ -637,6 +637,12 @@ def dump(obj, anIO = nil, limit = nil, strict: NOT_SET) def self.iconv(to, from, string) string.encode(to, from) end + + private + + def merge_dump_options(opts, strict: NOT_SET) + opts[:strict] = strict if NOT_SET != strict + end end module ::Kernel diff --git a/tests/json_generator_test.rb b/tests/json_generator_test.rb index 46cbf9c7f..0ce514232 100755 --- a/tests/json_generator_test.rb +++ b/tests/json_generator_test.rb @@ -62,6 +62,10 @@ def test_generate assert_equal '666', generate(666) end + def test_dump_unenclosed_hash + assert_equal '{"a":1,"b":2}', dump(a: 1, b: 2) + end + def test_generate_pretty json = pretty_generate({}) assert_equal(<<'EOT'.chomp, json)