atpsoft/dohtest

View on GitHub
lib/dohtest/backtrace_parser.rb

Summary

Maintainability
A
1 hr
Test Coverage
module DohTest

class BacktraceParser
  def initialize(backtrace)
    @backtrace = backtrace
  end

  def relevant_stack
    @relevant_stack ||= find_relevant_stack
  end

  def summary
    @summary ||= build_summary
  end

private
  def find_relevant_stack
    retval = []
    found_start = false
    @backtrace.each do |location|
      has_doh_test = location.index('dohtest')
      if found_start && has_doh_test
        break
      elsif has_doh_test
        # just ignore it and continue
      else
        found_start = true
        info = location.rpartition(':in').first
        parts = info.partition(':')
        raise "unexpected backtrace element: #{location}" if parts.first.nil? || parts.last.nil?
        retval << [parts.first, parts.last]
      end
    end
    retval
  end

  def build_summary
    retval = ''
    prev_filename = ''
    prev_simplified = ''
    relevant_stack.each do |path, line_number|
      filename = File.basename(path)
      simplified = "#{filename}:#{line_number}"
      if simplified == prev_simplified
        # ignore it
      elsif filename == prev_filename
        retval += ",#{line_number}"
      elsif retval.empty?
        retval = simplified
      else
        retval += ";#{simplified}"
      end
      prev_filename = filename
      prev_simplified = simplified
    end
    retval
  end
end

def self.backtrace_summary(excpt)
  BacktraceParser.new(excpt.backtrace).summary
end

end