class AwesomePrint::Formatters::ArrayFormatter

Attributes

array[R]
inspector[R]
options[R]

Public Class Methods

new(array, inspector) click to toggle source
# File lib/awesome_print/formatters/array_formatter.rb, line 9
def initialize(array, inspector)
  @array = array
  @inspector = inspector
  @options = inspector.options
end

Public Instance Methods

format() click to toggle source
# File lib/awesome_print/formatters/array_formatter.rb, line 15
def format
  return "[]" if array == []

  if array.instance_variable_defined?('@__awesome_methods__')
    methods_array(array)
  elsif options[:multiline]
    width = (array.size - 1).to_s.size

    data = array.inject([]) do |arr, item|
      index = indent
      index << colorize("[#{arr.size.to_s.rjust(width)}] ", :array) if options[:index]
      indented do
        arr << (index << inspector.awesome(item))
      end
    end

    data = limited(data, width) if should_be_limited?
    "[\n" << data.join(",\n") << "\n#{outdent}]"
  else
    "[ " << array.map{ |item| inspector.awesome(item) }.join(", ") << " ]"
  end
end

Private Instance Methods

methods_array(a) click to toggle source
# File lib/awesome_print/formatters/array_formatter.rb, line 40
def methods_array(a)
  a.sort! { |x, y| x.to_s <=> y.to_s }                  # Can't simply a.sort! because of o.methods << [ :blah ]
  object = a.instance_variable_get('@__awesome_methods__')
  tuples = a.map do |name|
    if name.is_a?(Symbol) || name.is_a?(String)         # Ignore garbage, ex. 42.methods << [ :blah ]
      tuple = if object.respond_to?(name, true)         # Is this a regular method?
        the_method = object.method(name) rescue nil     # Avoid potential ArgumentError if object#method is overridden.
        if the_method && the_method.respond_to?(:arity) # Is this original object#method?
          method_tuple(the_method)                      # Yes, we are good.
        end
      elsif object.respond_to?(:instance_method)              # Is this an unbound method?
        method_tuple(object.instance_method(name)) rescue nil # Rescue to avoid NameError when the method is not
      end                                                     # available (ex. File.lchmod on Ubuntu 12).
    end
    tuple || [ name.to_s, '(?)', '?' ]                  # Return WTF default if all the above fails.
  end

  width = (tuples.size - 1).to_s.size
  name_width = tuples.map { |item| item[0].size }.max || 0
  args_width = tuples.map { |item| item[1].size }.max || 0

  data = tuples.inject([]) do |arr, item|
    index = indent
    index << "[#{arr.size.to_s.rjust(width)}]" if @options[:index]
    indented do
      arr << "#{index} #{colorize(item[0].rjust(name_width), :method)}#{colorize(item[1].ljust(args_width), :args)} #{colorize(item[2], :class)}"
    end
  end

  "[\n" << data.join("\n") << "\n#{outdent}]"
end