From ee180f4d46cf5c830fe44a94a1c7de6d7dfc9143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Peignier?= Date: Mon, 28 Aug 2023 11:17:44 -0700 Subject: [PATCH] Support nocov comment at the end of a line --- lib/simplecov/lines_classifier.rb | 17 ++++++++++++++--- spec/lines_classifier_spec.rb | 26 +++++++++++++++++++++----- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/lib/simplecov/lines_classifier.rb b/lib/simplecov/lines_classifier.rb index 41026840..11c8fbe4 100644 --- a/lib/simplecov/lines_classifier.rb +++ b/lib/simplecov/lines_classifier.rb @@ -12,10 +12,14 @@ class LinesClassifier COMMENT_LINE = /^\s*#/.freeze WHITESPACE_OR_COMMENT_LINE = Regexp.union(WHITESPACE_LINE, COMMENT_LINE) - def self.no_cov_line + def self.no_cov_block /^(\s*)#(\s*)(:#{SimpleCov.nocov_token}:)/o end + def self.no_cov_line + /#(\s*)(:#{SimpleCov.nocov_token}:)(\s*)$/o + end + def self.no_cov_line?(line) no_cov_line.match?(line) rescue ArgumentError @@ -23,6 +27,13 @@ def self.no_cov_line?(line) false end + def self.no_cov_block?(line) + no_cov_block.match?(line) + rescue ArgumentError + # E.g., line contains an invalid byte sequence in UTF-8 + false + end + def self.whitespace_line?(line) WHITESPACE_OR_COMMENT_LINE.match?(line) rescue ArgumentError @@ -34,10 +45,10 @@ def classify(lines) skipping = false lines.map do |line| - if self.class.no_cov_line?(line) + if self.class.no_cov_block?(line) skipping = !skipping NOT_RELEVANT - elsif skipping || self.class.whitespace_line?(line) + elsif skipping || self.class.no_cov_line?(line) || self.class.whitespace_line?(line) NOT_RELEVANT else RELEVANT diff --git a/spec/lines_classifier_spec.rb b/spec/lines_classifier_spec.rb index 1003388d..d1e65c57 100644 --- a/spec/lines_classifier_spec.rb +++ b/spec/lines_classifier_spec.rb @@ -65,6 +65,20 @@ end end + describe ":nocov: one liner" do + it "determines :nocov: lines are not-relevant" do + classified_lines = subject.classify [ + "def hi", + "raise NotImplementedError # :nocov:", + "end", + "" + ] + + expect(classified_lines.length).to eq 4 + expect(classified_lines[1]).to be_irrelevant + end + end + describe ":nocov: blocks" do it "determines :nocov: blocks are not-relevant" do classified_lines = subject.classify [ @@ -80,21 +94,23 @@ it "determines all lines after a non-closing :nocov: as not-relevant" do classified_lines = subject.classify [ + "puts 'Not relevant' # :nocov:", "# :nocov:", "puts 'Not relevant'", "# :nocov:", "puts 'Relevant again'", "puts 'Still relevant'", "# :nocov:", - "puts 'Not relevant till the end'", + "puts 'Not relevant till the end' # :nocov:", "puts 'Ditto'" ] - expect(classified_lines.length).to eq 8 + expect(classified_lines.length).to eq 9 - expect(classified_lines[0..2]).to all be_irrelevant - expect(classified_lines[3..4]).to all be_relevant - expect(classified_lines[5..7]).to all be_irrelevant + expect(classified_lines[0]).to be_irrelevant + expect(classified_lines[1..3]).to all be_irrelevant + expect(classified_lines[4..5]).to all be_relevant + expect(classified_lines[6..8]).to all be_irrelevant end end end