From 70740deea793274f6e38a7b7fc3688aa709fd1d8 Mon Sep 17 00:00:00 2001 From: tompng Date: Mon, 4 Dec 2023 19:18:14 +0900 Subject: [PATCH] [flori/json] Fix JSON.dump overload combination https://github.com/flori/json/commit/41c2712a3b --- ext/json/lib/json/common.rb | 23 +++++++++--------- test/json/json_common_interface_test.rb | 32 +++++++++++++++---------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/ext/json/lib/json/common.rb b/ext/json/lib/json/common.rb index 5ba2aade0f3fef..090066012d9a26 100644 --- a/ext/json/lib/json/common.rb +++ b/ext/json/lib/json/common.rb @@ -612,16 +612,13 @@ class << self # Output: # {"foo":[0,1],"bar":{"baz":2,"bat":3},"bam":"bad"} 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) - if kwargs.nil? and anIO.is_a?(Hash) - kwargs = anIO - else - limit = anIO - end - anIO = nil - end + io_limit_opt = [anIO, limit, kwargs].compact + kwargs = io_limit_opt.pop if io_limit_opt.last.is_a?(Hash) + anIO, limit = io_limit_opt + if anIO.respond_to?(:to_io) + anIO = anIO.to_io + elsif limit.nil? && !anIO.respond_to?(:write) + anIO, limit = nil, anIO end opts = JSON.dump_default_options opts = opts.merge(:max_nesting => limit) if limit @@ -642,12 +639,14 @@ def self.iconv(to, from, string) string.encode(to, from) end - private - def merge_dump_options(opts, strict: NOT_SET) opts = opts.merge(strict: strict) if NOT_SET != strict opts end + + class << self + private :merge_dump_options + end end module ::Kernel diff --git a/test/json/json_common_interface_test.rb b/test/json/json_common_interface_test.rb index 39d35fa7729346..c16f6ceaaf97d2 100644 --- a/test/json/json_common_interface_test.rb +++ b/test/json/json_common_interface_test.rb @@ -99,18 +99,26 @@ def test_load_null def test_dump too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]' - assert_equal too_deep, dump(eval(too_deep)) - assert_kind_of String, Marshal.dump(eval(too_deep)) - assert_raise(ArgumentError) { dump(eval(too_deep), 100) } - assert_raise(ArgumentError) { Marshal.dump(eval(too_deep), 100) } - assert_equal too_deep, dump(eval(too_deep), 101) - assert_kind_of String, Marshal.dump(eval(too_deep), 101) - output = StringIO.new - dump(eval(too_deep), output) - assert_equal too_deep, output.string - output = StringIO.new - dump(eval(too_deep), output, 101) - assert_equal too_deep, output.string + obj = eval(too_deep) + assert_equal too_deep, dump(obj) + assert_kind_of String, Marshal.dump(obj) + assert_raise(ArgumentError) { dump(obj, 100) } + assert_raise(ArgumentError) { Marshal.dump(obj, 100) } + assert_equal too_deep, dump(obj, 101) + assert_kind_of String, Marshal.dump(obj, 101) + + assert_equal too_deep, JSON.dump(obj, StringIO.new, 101, strict: false).string + assert_equal too_deep, dump(obj, StringIO.new, 101, strict: false).string + assert_raise(JSON::GeneratorError) { JSON.dump(Object.new, StringIO.new, 101, strict: true).string } + assert_raise(JSON::GeneratorError) { dump(Object.new, StringIO.new, 101, strict: true).string } + + assert_equal too_deep, dump(obj, nil, nil, strict: false) + assert_equal too_deep, dump(obj, nil, 101, strict: false) + assert_equal too_deep, dump(obj, StringIO.new, nil, strict: false).string + assert_equal too_deep, dump(obj, nil, strict: false) + assert_equal too_deep, dump(obj, 101, strict: false) + assert_equal too_deep, dump(obj, StringIO.new, strict: false).string + assert_equal too_deep, dump(obj, strict: false) end def test_dump_should_modify_defaults