Skip to content

Commit

Permalink
[flori/json] Fix JSON.dump overload combination
Browse files Browse the repository at this point in the history
  • Loading branch information
tompng authored and hsbt committed Dec 5, 2023
1 parent e6b35e8 commit 70740de
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 24 deletions.
23 changes: 11 additions & 12 deletions ext/json/lib/json/common.rb
Expand Up @@ -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
Expand All @@ -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
Expand Down
32 changes: 20 additions & 12 deletions test/json/json_common_interface_test.rb
Expand Up @@ -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
Expand Down

0 comments on commit 70740de

Please sign in to comment.