123456789_123456789_123456789_123456789_123456789_

Class: SimpleCov::LinesClassifier

Relationships & Source Files
Inherits: Object
Defined in: lib/simplecov/lines_classifier.rb

Overview

Classifies whether lines are relevant for code coverage analysis. Comments & whitespace lines, and :nocov: token blocks, are considered not relevant.

Constant Summary

Class Method Summary

Instance Method Summary

Class Method Details

.no_cov_line

[ GitHub ]

  
# File 'lib/simplecov/lines_classifier.rb', line 17

def self.no_cov_line
  /^(\s*)#(\s*)(:#{SimpleCov.current_nocov_token}:)/o
end

.no_cov_line?(line) ⇒ Boolean

[ GitHub ]

  
# File 'lib/simplecov/lines_classifier.rb', line 21

def self.no_cov_line?(line)
  no_cov_line.match?(line)
rescue ArgumentError
  # E.g., line contains an invalid byte sequence in UTF-8
  false
end

.whitespace_line?(line) ⇒ Boolean

[ GitHub ]

  
# File 'lib/simplecov/lines_classifier.rb', line 28

def self.whitespace_line?(line)
  WHITESPACE_OR_COMMENT_LINE.match?(line)
rescue ArgumentError
  # E.g., line contains an invalid byte sequence in UTF-8
  false
end

Instance Method Details

#classify(lines)

[ GitHub ]

  
# File 'lib/simplecov/lines_classifier.rb', line 35

def classify(lines)
  lines = lines.to_a
  directive_disabled = directive_disabled_line_set(lines)
  skipping = false

  lines.map.with_index(1) do |line, line_number|
    skipping = !skipping if self.class.no_cov_line?(line)
    not_relevant_line?(line, line_number, skipping, directive_disabled) ? NOT_RELEVANT : RELEVANT
  end
end

#directive_disabled_line_set(lines) (private)

[ GitHub ]

  
# File 'lib/simplecov/lines_classifier.rb', line 55

def directive_disabled_line_set(lines)
  Directive.disabled_ranges(lines).fetch(:line).each_with_object(Set.new) do |range, set|
    range.each { |line_number| set.add(line_number) }
  end
end

#not_relevant_line?(line, line_number, skipping, directive_disabled) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/simplecov/lines_classifier.rb', line 48

def not_relevant_line?(line, line_number, skipping, directive_disabled)
  skipping ||
    self.class.no_cov_line?(line) ||
    directive_disabled.include?(line_number) ||
    self.class.whitespace_line?(line)
end