backtrace_line_normalizer.rb 720 Bytes
class BacktraceLineNormalizer
  def initialize(raw_line)
    @raw_line = raw_line
  end

  def call
    @raw_line.merge 'file' => normalized_file, 'method' => normalized_method
  end

  private
  def normalized_file
    if @raw_line['file'].blank?
      "[unknown source]"
    else
      file = @raw_line['file'].to_s
      # Detect lines from gem
      file.gsub!(/\[PROJECT_ROOT\]\/.*\/ruby\/[0-9.]+\/gems/, '[GEM_ROOT]/gems')
      # Strip any query strings
      file.gsub!(/\?[^\?]*$/, '')
      @raw_line['file'] = file
    end
  end

  def normalized_method
    if @raw_line['method'].blank?
      "[unknown method]"
    else
      @raw_line['method'].to_s.gsub(/[0-9_]{10,}+/, "__FRAGMENT__")
    end
  end

end