зеркало из https://github.com/github/ruby.git
[ruby/irb] Support inspecting BasicObject
(https://github.com/ruby/irb/pull/541) https://github.com/ruby/irb/commit/1dc2a406a3
This commit is contained in:
Родитель
8c6b349805
Коммит
1095baed34
|
@ -4,6 +4,10 @@ require_relative 'color'
|
|||
|
||||
module IRB
|
||||
class ColorPrinter < ::PP
|
||||
METHOD_IS_A = Object.instance_method(:is_a?)
|
||||
METHOD_RESPOND_TO = Object.instance_method(:respond_to?)
|
||||
METHOD_INSPECT = Object.instance_method(:inspect)
|
||||
|
||||
class << self
|
||||
def pp(obj, out = $>, width = screen_width)
|
||||
q = ColorPrinter.new(out, width)
|
||||
|
@ -22,9 +26,11 @@ module IRB
|
|||
end
|
||||
|
||||
def pp(obj)
|
||||
if obj.is_a?(String)
|
||||
if METHOD_IS_A.bind(obj).call(String)
|
||||
# Avoid calling Ruby 2.4+ String#pretty_print that splits a string by "\n"
|
||||
text(obj.inspect)
|
||||
elsif !METHOD_RESPOND_TO.bind(obj).call(:inspect)
|
||||
text(METHOD_INSPECT.bind(obj).call)
|
||||
else
|
||||
super
|
||||
end
|
||||
|
|
|
@ -129,7 +129,6 @@ module TestIRB
|
|||
failed: [
|
||||
[false, "BasicObject.new", /#<NoMethodError: undefined method `to_s' for/],
|
||||
[:p, "class Foo; undef inspect ;end; Foo.new", /#<NoMethodError: undefined method `inspect' for/],
|
||||
[true, "BasicObject.new", /#<NoMethodError: undefined method `is_a\?' for/],
|
||||
[:yaml, "BasicObject.new", /#<NoMethodError: undefined method `inspect' for/],
|
||||
[:marshal, "[Object.new, Class.new]", /#<TypeError: can't dump anonymous class #<Class:/]
|
||||
]
|
||||
|
@ -150,6 +149,19 @@ module TestIRB
|
|||
end
|
||||
end
|
||||
|
||||
def test_object_inspection_handles_basic_object
|
||||
verbose, $VERBOSE = $VERBOSE, nil
|
||||
irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), TestInputMethod.new(["BasicObject.new"]))
|
||||
out, err = capture_output do
|
||||
irb.eval_input
|
||||
end
|
||||
assert_empty err
|
||||
assert_not_match(/NoMethodError/, out)
|
||||
assert_match(/#<BasicObject:.*>/, out)
|
||||
ensure
|
||||
$VERBOSE = verbose
|
||||
end
|
||||
|
||||
def test_object_inspection_falls_back_to_kernel_inspect_when_errored
|
||||
verbose, $VERBOSE = $VERBOSE, nil
|
||||
main = Object.new
|
||||
|
|
Загрузка…
Ссылка в новой задаче