summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2023-12-01 11:46:16 +0100
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2023-12-05 12:04:07 +0900
commita22ed8943859963c67533bb0edc13a27bfdac00c (patch)
treee4decf646df2fad4c5736f5a45479b691984b6e7
parent5a2d70ef73d4d17f5999f5087499a5eda1126567 (diff)
[flori/json] 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. https://github.com/flori/json/commit/8e0076a3f2
-rw-r--r--ext/json/lib/json/common.rb10
-rwxr-xr-xtest/json/json_generator_test.rb4
2 files changed, 12 insertions, 2 deletions
diff --git a/ext/json/lib/json/common.rb b/ext/json/lib/json/common.rb
index 53b66a9bf6..f51f02d4df 100644
--- a/ext/json/lib/json/common.rb
+++ b/ext/json/lib/json/common.rb
@@ -611,7 +611,7 @@ module JSON
# 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 @@ module JSON
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 @@ module JSON
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/test/json/json_generator_test.rb b/test/json/json_generator_test.rb
index 46cbf9c7f7..0ce5142327 100755
--- a/test/json/json_generator_test.rb
+++ b/test/json/json_generator_test.rb
@@ -62,6 +62,10 @@ EOT
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)