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 covered_lines
def covered_lines @covered_lines ||= lines.select(&:covered?) end
def covered_percent
def covered_percent return 100.0 if lines.length.zero? || lines.length == never_lines.count relevant_lines = lines.count - never_lines.count - skipped_lines.count if relevant_lines.zero? 0.0 else Float((covered_lines.count) * 100.0 / relevant_lines.to_f) end end
def covered_strength
def covered_strength return 0.0 if lines.length.zero? || lines.length == never_lines.count lines_strength = 0 lines.each do |c| lines_strength += c.coverage if c.coverage end effective_lines_count = Float(lines.count - never_lines.count - skipped_lines.count) if effective_lines_count.zero? 0.0 else strength = lines_strength / effective_lines_count round_float(strength, 1) end end
def initialize(filename, coverage)
def initialize(filename, coverage) @filename = filename @coverage = coverage File.open(filename, "rb") { |f| @src = f.readlines } 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 return @lines if defined? @lines # Warning to identify condition from Issue #56 if coverage.size > src.size $stderr.puts "Warning: coverage data provided by Coverage [#{coverage.size}] exceeds number of lines in #{filename} [#{src.size}]" end # Initialize lines @lines = [] src.each_with_index do |src, i| @lines << SimpleCov::SourceFile::Line.new(src, i + 1, coverage[i]) end process_skipped_lines! @lines end
def lines_of_code
def lines_of_code covered_lines.count + missed_lines.count 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 process_skipped_lines!
Will go through all source files and mark lines that are wrapped within # :nocov: comment blocks
def process_skipped_lines! skipping = false lines.each do |line| if line.src =~ /^([\s]*)#([\s]*)(\:#{SimpleCov.nocov_token}\:)/ skipping = !skipping else line.skipped! if skipping end end 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