class AmazingPrint::Inspector
def self.reload_dotfile
Unload the cached dotfile and load it again.
#
def self.reload_dotfile @@dotfile = nil new.send :load_dotfile true end
def awesome(object)
Dispatcher that detects data nesting and invokes object-aware formatter.
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
def colorize?
Return true if we are to colorize the output.
def colorize? AmazingPrint.force_colors ||= false AmazingPrint.force_colors || ( if defined? @colorize_stdout @colorize_stdout else @colorize_stdout = $stdout.tty? && ( ( ENV['TERM'] && ENV['TERM'] != 'dumb' ) || ENV['ANSICON'] ) end ) end
def current_indentation
def current_indentation indentator.indentation end
def dotfile_readable?(dotfile)
def dotfile_readable?(dotfile) @@dotfile_readable = File.readable?(@@dotfile = dotfile) if @@dotfile_readable.nil? || @@dotfile != dotfile @@dotfile_readable end
def find_dotfile
def find_dotfile xdg_config_home = File.expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config')) xdg_config_path = File.join(xdg_config_home, 'aprc') # ${XDG_CONFIG_HOME}/aprc return xdg_config_path if File.exist?(xdg_config_path) # default to ~/.aprc File.join(Dir.home, '.aprc') end
def increase_indentation(&blk)
def increase_indentation(&blk) indentator.indent(&blk) end
def initialize(options = {})
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: :whiteish, array: :white, bigdecimal: :blue, class: :yellow, date: :greenish, falseclass: :red, fixnum: :blue, integer: :blue, float: :blue, hash: :whiteish, keyword: :cyan, method: :purpleish, nilclass: :red, rational: :blue, string: :yellowish, struct: :whiteish, 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 = AmazingPrint::Formatter.new(self) @indentator = AmazingPrint::Indentator.new(@options[:indent].abs) Thread.current[AP] ||= [] end
def load_dotfile
predictable values
This method needs to be mocked during testing so that it always loads
def load_dotfile return if @@dotfile # Load the dotfile only once. dotfile = find_dotfile load dotfile if dotfile_readable?(dotfile) end
def merge_custom_defaults!
Load ~/.aprc file with custom defaults that override default options.
def merge_custom_defaults! load_dotfile merge_options!(AmazingPrint.defaults) if AmazingPrint.defaults.is_a?(Hash) rescue StandardError => e warn "Could not load '.aprc' from ENV['HOME']: #{e}" end
def merge_options!(options = {})
keys.
Update @options by first merging the :color hash and then the remaining
def merge_options!(options = {}) @options[:color].merge!(options.delete(:color) || {}) @options.merge!(options) end
def nested(object)
=> { :a => 1, :b => {...} }
hash = { :a => 1 }; hash[:b] = hash
=> [1,2, [...]]
arr = [1, 2]; arr << arr
Format nested data, for example:
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
def printable(object)
base class.
that inherit from Array, Hash, File, Dir, and Struct are treated as the
Turn class name into symbol, ex: Hello::World => :hello_world. Classes
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
def unnested(object)
def unnested(object) @formatter.format(object, printable(object)) end