class SimpleCov::SourceFile
source lines and featuring helpers to interpret that data.
Representation of a source file including it’s coverage data, source code,
def build_lines
def build_lines coverage_exceeding_source_warn if coverage.size > src.size lines = src.map.with_index(1) do |src, i| SimpleCov::SourceFile::Line.new(src, i, coverage[i - 1]) end process_skipped_lines(lines) end
def coverage_exceeding_source_warn
def coverage_exceeding_source_warn $stderr.puts "Warning: coverage data provided by Coverage [#{coverage.size}] exceeds number of lines in #{filename} [#{src.size}]" end
def covered_lines
def covered_lines @covered_lines ||= lines.select(&:covered?) end
def covered_percent
def covered_percent return 100.0 if no_lines? return 0.0 if relevant_lines.zero? Float(covered_lines.size * 100.0 / relevant_lines.to_f) end
def covered_strength
def covered_strength return 0.0 if relevant_lines.zero? round_float(lines_strength / relevant_lines.to_f, 1) end
def initialize(filename, coverage)
def initialize(filename, coverage) @filename = filename @coverage = coverage end
def line(number)
def line(number) lines[number - 1] end
def lines
Returns all source lines for this file as instances of SimpleCov::SourceFile::Line,
def lines @lines ||= build_lines end
def lines_of_code
def lines_of_code covered_lines.size + missed_lines.size end
def lines_strength
def lines_strength lines.map(&:coverage).compact.reduce(:+) end
def missed_lines
Returns all lines that should have been, but were not covered
def missed_lines @missed_lines ||= lines.select(&:missed?) end
def never_lines
Returns all lines that are not relevant for coverage as
def never_lines @never_lines ||= lines.select(&:never?) end
def no_lines?
def no_lines? lines.length.zero? || (lines.length == never_lines.size) end
def process_skipped_lines(lines)
Will go through all source files and mark lines that are wrapped within # :nocov: comment blocks
def process_skipped_lines(lines) skipping = false lines.each do |line| if SimpleCov::LinesClassifier.no_cov_line?(line.src) skipping = !skipping line.skipped! elsif skipping line.skipped! end end end
def project_filename
def project_filename @filename.sub(/^#{SimpleCov.root}/, "") end
def relevant_lines
def relevant_lines lines.size - never_lines.size - skipped_lines.size end
def round_float(float, places)
-
(Float)
-
def round_float(float, places) factor = Float(10 * places) Float((float * factor).round / factor) end
def skipped_lines
def skipped_lines @skipped_lines ||= lines.select(&:skipped?) end
def src
def src # We intentionally read source code lazily to # suppress reading unused source code. @src ||= File.open(filename, "rb", &:readlines) end