class LetItCrash::Builders::FileBuilder

Constants

ROOT

Attributes

file[R]
rewriter[R]

Public Class Methods

build(file:, rewriter:) click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 13
def self.build(file:, rewriter:)
  new(file: file, rewriter: rewriter).build
end
new(file:, rewriter:) click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 17
def initialize(file:, rewriter:)
  @file = file
  @rewriter = rewriter
end

Public Instance Methods

build() click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 22
def build
  Proto::File.new(
    path: path,
    digest: digest,
    lines: relevant_lines,
    coverage: coverage,
  )
end

Private Instance Methods

coverage() click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 50
def coverage
  return 1 if relevant_lines.empty?
  relevant_lines.values.count(&:positive?) / relevant_lines.count.to_f
end
digest() click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 64
def digest
  Digest::SHA256.file(filename).hexdigest
end
path() click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 35
def path
  Proto::File::Path.new(
    relative: relative,
    rewritten: rewritten,
  )
end
relative() click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 55
def relative
  pathname = Pathname.new(filename)
  pathname.absolute? ? pathname.relative_path_from(ROOT).to_s : filename
end
relevant_lines() click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 42
def relevant_lines
  @relevant_lines ||= lines.each_with_object({}) do |line, ret|
    number = line.line_number
    relevant = sanitizer.include?(number) && !line.skipped?
    ret[number] = line.coverage.to_i if relevant
  end
end
rewritten() click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 60
def rewritten
  rewriter ? rewriter.call(relative) : ''
end
sanitizer() click to toggle source
# File lib/letitcrash/builders/file_builder.rb, line 68
def sanitizer
  @sanitizer ||= Sanitizer.from_path(path: filename)
end