class AwesomePrint::Inspector

Constants

AP

Attributes

indentator[RW]
options[RW]

Public Class Methods

new(options = {}) click to toggle source
# File lib/awesome_print/inspector.rb, line 14
def initialize(options = {})
  @options = {
    indent:        4,      # Number of spaces for indenting.
    index:         true,   # Display array indices.
    html:          false,  # Use ANSI color codes rather than HTML.
    multiline:     true,   # Display in multiple lines.
    plain:         false,  # Use colors.
    raw:           false,  # Do not recursively format instance variables.
    sort_keys:     false,  # Do not sort hash keys.
    sort_vars:     true,   # Sort instance variables.
    limit:         false,  # Limit arrays & hashes. Accepts bool or int.
    ruby19_syntax: false,  # Use Ruby 1.9 hash syntax in output.
    class_name:    :class, # Method used to get Instance class name.
    object_id:     true,   # Show object_id.
    color: {
      args:       :pale,
      array:      :white,
      bigdecimal: :blue,
      class:      :yellow,
      date:       :greenish,
      falseclass: :red,
      fixnum:     :blue,
      integer:    :blue,
      float:      :blue,
      hash:       :pale,
      keyword:    :cyan,
      method:     :purpleish,
      nilclass:   :red,
      rational:   :blue,
      string:     :yellowish,
      struct:     :pale,
      symbol:     :cyanish,
      time:       :greenish,
      trueclass:  :green,
      variable:   :cyanish
    }
  }

  # Merge custom defaults and let explicit options parameter override them.
  merge_custom_defaults!
  merge_options!(options)

  @formatter = AwesomePrint::Formatter.new(self)
  @indentator = AwesomePrint::Indentator.new(@options[:indent].abs)
  Thread.current[AP] ||= []
end

Public Instance Methods

awesome(object) click to toggle source

Dispatcher that detects data nesting and invokes object-aware formatter.

# File lib/awesome_print/inspector.rb, line 71
def awesome(object)
  if Thread.current[AP].include?(object.object_id)
    nested(object)
  else
    begin
      Thread.current[AP] << object.object_id
      unnested(object)
    ensure
      Thread.current[AP].pop
    end
  end
end
colorize?() click to toggle source

Return true if we are to colorize the output.

# File lib/awesome_print/inspector.rb, line 86
def colorize?
  AwesomePrint.force_colors ||= false
  AwesomePrint.force_colors || (
    STDOUT.tty? && (
      (
        ENV['TERM'] &&
        ENV['TERM'] != 'dumb'
      ) ||
      ENV['ANSICON']
    )
  )
end
current_indentation() click to toggle source
# File lib/awesome_print/inspector.rb, line 61
def current_indentation
  indentator.indentation
end
increase_indentation(&block) click to toggle source
# File lib/awesome_print/inspector.rb, line 65
def increase_indentation(&block)
  indentator.indent(&block)
end

Private Instance Methods

dotfile_readable?(dotfile) click to toggle source
# File lib/awesome_print/inspector.rb, line 152
def dotfile_readable? dotfile
  if @@dotfile_readable.nil? || @@dotfile != dotfile
    @@dotfile_readable = File.readable?(@@dotfile = dotfile)
  end
  @@dotfile_readable
end
load_dotfile() click to toggle source

This method needs to be mocked during testing so that it always loads predictable values

# File lib/awesome_print/inspector.rb, line 147
def load_dotfile
  dotfile = File.join(ENV['HOME'], '.aprc')
  load dotfile if dotfile_readable?(dotfile)
end
merge_custom_defaults!() click to toggle source

Load ~/.aprc file with custom defaults that override default options.

# File lib/awesome_print/inspector.rb, line 162
def merge_custom_defaults!
  load_dotfile
  merge_options!(AwesomePrint.defaults) if AwesomePrint.defaults.is_a?(Hash)
rescue => e
  $stderr.puts "Could not load '.aprc' from ENV['HOME']: #{e}"
end
merge_options!(options = {}) click to toggle source

Update @options by first merging the :color hash and then the remaining keys.

# File lib/awesome_print/inspector.rb, line 139
def merge_options!(options = {})
  @options[:color].merge!(options.delete(:color) || {})
  @options.merge!(options)
end
nested(object) click to toggle source

Format nested data, for example:

arr = [1, 2]; arr << arr
=> [1,2, [...]]
hash = { :a => 1 }; hash[:b] = hash
=> { :a => 1, :b => {...} }
# File lib/awesome_print/inspector.rb, line 107
def nested(object)
  case printable(object)
  when :array  then @formatter.colorize('[...]', :array)
  when :hash   then @formatter.colorize('{...}', :hash)
  when :struct then @formatter.colorize('{...}', :struct)
  else @formatter.colorize("...#{object.class}...", :class)
  end
end
printable(object) click to toggle source

Turn class name into symbol, ex: Hello::World => :hello_world. Classes that inherit from Array, Hash, File, Dir, and Struct are treated as the base class.

# File lib/awesome_print/inspector.rb, line 125
def printable(object)
  case object
  when Array  then :array
  when Hash   then :hash
  when File   then :file
  when Dir    then :dir
  when Struct then :struct
  else object.class.to_s.gsub(/:+/, '_').downcase.to_sym
  end
end
unnested(object) click to toggle source
# File lib/awesome_print/inspector.rb, line 117
def unnested(object)
  @formatter.format(object, printable(object))
end