backtrace.rb 703 Bytes
class Backtrace
  include Mongoid::Document
  include Mongoid::Timestamps

  IN_APP_PATH = %r{^\[PROJECT_ROOT\](?!(\/vendor))/?}
  GEMS_PATH = %r{\[GEM_ROOT\]\/gems\/([^\/]+)}

  field :fingerprint
  field :lines

  index fingerprint: 1

  def self.find_or_create(lines)
    fingerprint = generate_fingerprint(lines)

    where(fingerprint: fingerprint).find_one_and_update(
      { '$setOnInsert' => { fingerprint: fingerprint, lines: lines } },
      return_document: :after, upsert: true)
  end

  def self.generate_fingerprint(lines)
    Digest::SHA1.hexdigest(lines.map(&:to_s).join)
  end

  private def generate_fingerprint
    self.fingerprint = self.class.generate_fingerprint(lines)
  end
end