diff --git a/lib/pp.rb b/lib/pp.rb index e790f49..71c78f1 100644 --- a/lib/pp.rb +++ b/lib/pp.rb @@ -200,14 +200,17 @@ def pop_inspect_key(id) def pp(obj) # If obj is a Delegator then use the object being delegated to for cycle # detection - obj = obj.__getobj__ if defined?(::Delegator) and ::Delegator === obj + delegated = defined?(::Delegator) && ::Delegator === obj + key = delegated ? obj.__getobj__ : obj - if check_inspect_key(obj) + if check_inspect_key(key) + obj = key if delegated and !obj.respond_to?(:pretty_print_cycle) group {obj.pretty_print_cycle self} return end - guard_inspect(obj) do + guard_inspect(key) do + obj = key if delegated and !obj.respond_to?(:pretty_print) group do obj.pretty_print self rescue NoMethodError diff --git a/test/test_pp.rb b/test/test_pp.rb index 4a273e6..8529ace 100644 --- a/test/test_pp.rb +++ b/test/test_pp.rb @@ -310,6 +310,16 @@ def test_direct_pp class PPDelegateTest < Test::Unit::TestCase class A < DelegateClass(Array); end + class Delegated < SimpleDelegator + def inspect + "" + end + + def pretty_print(q) + q.text inspect + end + end + def test_delegate assert_equal("[]\n", A.new([]).pretty_inspect, "[ruby-core:25804]") end @@ -325,6 +335,12 @@ def test_delegate_cycle assert_equal(cycle_pretty_inspect, delegator_cycle_pretty_inspect) end + + def test_delegate_pretty_print + parent = HasPrettyPrint.new nil + delegated = Delegated.new(parent) + assert_equal("\n", delegated.pretty_inspect) + end end class PPFileStatTest < Test::Unit::TestCase