Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions lib/hirb/formatter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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.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)
end

def call_output_method(output_method, output)
Expand Down Expand Up @@ -121,6 +128,15 @@ def add_klass_config_if_true(hash, klass)
def reset_klass_config
@klass_config = {}
end

private
def determine_class(output, output_klass)
begin
output.class
rescue NoMethodError
output_klass.superclass
end
end
#:startdoc:
end
end
6 changes: 6 additions & 0 deletions test/formatter_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ def set_formatter(hash={})
class Array2 < Array; end
@formatter.determine_output_class(Array2.new(%w{ok dude})).should == String
end

if Object.const_defined? "BasicObject"
it "#determine_output_class works for BasicObject" do
@formatter.determine_output_class(BasicObject.new).should == BasicObject
end
end
end

describe "format_output" do
Expand Down