class PryMoves::Backtrace

Public Class Methods

filter() click to toggle source
# File lib/pry-moves/backtrace.rb, line 9
def filter
  @filter || /(\/gems\/|\/rubygems\/|\/bin\/|\/lib\/ruby\/)/
end
filter=(f) click to toggle source
# File lib/pry-moves/backtrace.rb, line 12
def filter=(f); @filter = f; end
format(&block) click to toggle source
# File lib/pry-moves/backtrace.rb, line 14
def format(&block)
  @formatter = block
end
formatter() click to toggle source
# File lib/pry-moves/backtrace.rb, line 18
def formatter
  @formatter || lambda do |line|
    # not used
  end
end
lines_count() click to toggle source
# File lib/pry-moves/backtrace.rb, line 6
def lines_count; @lines_count || 5; end
lines_count=(f) click to toggle source
# File lib/pry-moves/backtrace.rb, line 7
def lines_count=(f); @lines_count = f; end
new(binding, pry) click to toggle source
# File lib/pry-moves/backtrace.rb, line 25
def initialize(binding, pry)
   @binding, @pry = binding, pry
end

Public Instance Methods

run_command(param, param2) click to toggle source
# File lib/pry-moves/backtrace.rb, line 29
def run_command(param, param2)
  if param.is_a?(String) and (match = param.match /^>(.*)/)
    suffix = match[1].size > 0 ? match[1] : param2
    write_to_file build, suffix
  else
    @colorize = true
    if param.is_a? String and param.match /\d+/
      param = param.to_i
    end
    @lines_count = param || PryMoves::Backtrace::lines_count
    @pry.output.puts build
  end
end

Private Instance Methods

build() click to toggle source
# File lib/pry-moves/backtrace.rb, line 45
def build
  result = []
  show_vapid = %w(+ all hidden vapid).include? @lines_count
  stack = stack_bindings(show_vapid)
            .reverse.reject do |binding|
              binding.eval('__FILE__').match self.class::filter
            end

  if @lines_count.is_a?(Numeric) and stack.count > @lines_count
    result << "Latest #{@lines_count} lines: (`bt all` for full tracing)"
    stack = stack.last(@lines_count)
  end

  build_result stack, result
end
build_line(binding) click to toggle source
# File lib/pry-moves/backtrace.rb, line 84
def build_line(binding)
  file = PryMoves::Helpers.shorten_path "#{binding.eval('__FILE__')}"

  signature = PryMoves::Helpers.method_signature binding
  signature = ":#{binding.frame_type}" if !signature or signature.length < 1

  indent = frame_manager.current_frame == binding ?
      ' => ': '    '

  line = binding.eval('__LINE__')
  "#{indent}#{file}:#{line} #{signature}"
end
build_result(stack, result) click to toggle source
# File lib/pry-moves/backtrace.rb, line 61
def build_result(stack, result)
  current_object = nil
  stack.each do |binding|
    obj, debug_snapshot = binding.eval '[self, (debug_snapshot rescue nil)]'
    # Comparison of objects directly may raise exception
    if current_object.object_id != obj.object_id
      result << "#{debug_snapshot || format_obj(obj)}:"
      current_object = obj
    end

    result << build_line(binding)
  end
  result
end
format_obj(obj) click to toggle source
# File lib/pry-moves/backtrace.rb, line 76
def format_obj(obj)
  if @colorize
    PryMoves::Painter.colorize obj
  else
    obj.inspect
  end
end
frame_manager() click to toggle source
# File lib/pry-moves/backtrace.rb, line 97
def frame_manager
  PryStackExplorer.frame_manager(@pry)
end
log_path(file_suffix) click to toggle source
# File lib/pry-moves/backtrace.rb, line 111
def log_path(file_suffix)
  root = defined?(Rails) ? Rails.root.to_s : '.'
  root += '/log'
  FileUtils.mkdir_p root
  "#{root}/backtrace_#{file_suffix}.log"
end
stack_bindings(vapid_frames) click to toggle source
# File lib/pry-moves/backtrace.rb, line 101
def stack_bindings(vapid_frames)
  frame_manager.filter_bindings vapid_frames: vapid_frames
end
write_to_file(lines, file_suffix) click to toggle source
# File lib/pry-moves/backtrace.rb, line 105
def write_to_file(lines, file_suffix)
  log_path = log_path file_suffix
  File.write log_path, lines.join("\n")
  puts "Backtrace logged to #{log_path}"
end