From b470e33b3db165224cf0a881f9e1789edcfdbbc5 Mon Sep 17 00:00:00 2001 From: Aninder Makkar Date: Thu, 28 Apr 2016 14:24:39 +1000 Subject: [PATCH 1/3] add support for BasicObject --- lib/hirb/formatter.rb | 16 ++++++++++++++-- test/formatter_test.rb | 4 ++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/hirb/formatter.rb b/lib/hirb/formatter.rb index 4fd05fb..a68f10b 100644 --- a/lib/hirb/formatter.rb +++ b/lib/hirb/formatter.rb @@ -84,8 +84,15 @@ def parse_console_options(options) #:nodoc: end def determine_output_class(output) - output.respond_to?(:to_a) && to_a_classes.any? {|e| output.is_a?(e) } ? - Array(output)[0].class : output.class + output_klass = begin + class << output + self + end + rescue TypeError # Fixnum, Symbol, Float, etc which don't have a singleton class + output.class + end + output_klass.instance_methods.include?(:to_a) && to_a_classes.any? { |e| output.is_a?(e) } ? + Array(output)[0].class : determine_class(output_klass) end def call_output_method(output_method, output) @@ -121,6 +128,11 @@ def add_klass_config_if_true(hash, klass) def reset_klass_config @klass_config = {} end + + private + def determine_class(output_klass) + output_klass.singleton_class? ? output_klass.superclass : output_klass + end #:startdoc: end end diff --git a/test/formatter_test.rb b/test/formatter_test.rb index ca88cb7..0fb372f 100644 --- a/test/formatter_test.rb +++ b/test/formatter_test.rb @@ -76,6 +76,10 @@ def set_formatter(hash={}) class Array2 < Array; end @formatter.determine_output_class(Array2.new(%w{ok dude})).should == String end + + it "#determine_output_class works for BasicObject" do + @formatter.determine_output_class(BasicObject.new).should == BasicObject + end end describe "format_output" do From 24565486700631802e49239672e792de70394b9a Mon Sep 17 00:00:00 2001 From: Aninder Makkar Date: Sat, 30 Apr 2016 22:37:02 +1000 Subject: [PATCH 2/3] workaround incompatibilities between different ruby versions --- lib/hirb/formatter.rb | 14 ++++++++++---- test/formatter_test.rb | 8 +++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/hirb/formatter.rb b/lib/hirb/formatter.rb index a68f10b..fc47f87 100644 --- a/lib/hirb/formatter.rb +++ b/lib/hirb/formatter.rb @@ -84,15 +84,17 @@ def parse_console_options(options) #:nodoc: end def determine_output_class(output) + singleton_class = true output_klass = begin class << output self end rescue TypeError # Fixnum, Symbol, Float, etc which don't have a singleton class + singleton_class = false output.class end - output_klass.instance_methods.include?(:to_a) && to_a_classes.any? { |e| output.is_a?(e) } ? - Array(output)[0].class : determine_class(output_klass) + output_klass.instance_methods.map{|m| m.to_s}.include?('to_a') && to_a_classes.any? { |e| output.is_a?(e) } ? + Array(output)[0].class : determine_class(output, output_klass, singleton_class) end def call_output_method(output_method, output) @@ -130,8 +132,12 @@ def reset_klass_config end private - def determine_class(output_klass) - output_klass.singleton_class? ? output_klass.superclass : output_klass + def determine_class(output, output_klass, singleton_class) + begin + output.class + rescue NoMethodError + output_klass.superclass + end end #:startdoc: end diff --git a/test/formatter_test.rb b/test/formatter_test.rb index 0fb372f..ac3ee14 100644 --- a/test/formatter_test.rb +++ b/test/formatter_test.rb @@ -76,9 +76,11 @@ def set_formatter(hash={}) class Array2 < Array; end @formatter.determine_output_class(Array2.new(%w{ok dude})).should == String end - - it "#determine_output_class works for BasicObject" do - @formatter.determine_output_class(BasicObject.new).should == BasicObject + + if Object.const_defined? "BasicObject" + it "#determine_output_class works for BasicObject" do + @formatter.determine_output_class(BasicObject.new).should == BasicObject + end end end From 0f2995b3a847d01f07d7ac34af2e8c147fdf9b06 Mon Sep 17 00:00:00 2001 From: Aninder Makkar Date: Sat, 30 Apr 2016 22:57:23 +1000 Subject: [PATCH 3/3] cleanup --- lib/hirb/formatter.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/hirb/formatter.rb b/lib/hirb/formatter.rb index fc47f87..5b7dba1 100644 --- a/lib/hirb/formatter.rb +++ b/lib/hirb/formatter.rb @@ -84,17 +84,15 @@ def parse_console_options(options) #:nodoc: end def determine_output_class(output) - singleton_class = true output_klass = begin class << output self end rescue TypeError # Fixnum, Symbol, Float, etc which don't have a singleton class - singleton_class = false output.class end output_klass.instance_methods.map{|m| m.to_s}.include?('to_a') && to_a_classes.any? { |e| output.is_a?(e) } ? - Array(output)[0].class : determine_class(output, output_klass, singleton_class) + Array(output)[0].class : determine_class(output, output_klass) end def call_output_method(output_method, output) @@ -132,7 +130,7 @@ def reset_klass_config end private - def determine_class(output, output_klass, singleton_class) + def determine_class(output, output_klass) begin output.class rescue NoMethodError