From 7bb609b55020f499275825020dda0611f930062c 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 1/2] 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 410268400..11c8fbe47 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 1003388dd..d1e65c572 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 From 185410f27b511ab403837fc1d1ccb9a8d32786d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Peignier?= Date: Sat, 4 Apr 2026 09:12:45 -0700 Subject: [PATCH 2/2] Avoid changing API --- lib/simplecov/lines_classifier.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/simplecov/lines_classifier.rb b/lib/simplecov/lines_classifier.rb index 11c8fbe47..6a0c43817 100644 --- a/lib/simplecov/lines_classifier.rb +++ b/lib/simplecov/lines_classifier.rb @@ -12,12 +12,12 @@ class LinesClassifier COMMENT_LINE = /^\s*#/.freeze WHITESPACE_OR_COMMENT_LINE = Regexp.union(WHITESPACE_LINE, COMMENT_LINE) - def self.no_cov_block + def self.no_cov_line /^(\s*)#(\s*)(:#{SimpleCov.nocov_token}:)/o end - def self.no_cov_line - /#(\s*)(:#{SimpleCov.nocov_token}:)(\s*)$/o + def self.no_cov_inline + /\S.*#\s*:#{SimpleCov.nocov_token}:\s*$/o end def self.no_cov_line?(line) @@ -27,8 +27,8 @@ def self.no_cov_line?(line) false end - def self.no_cov_block?(line) - no_cov_block.match?(line) + def self.no_cov_inline?(line) + no_cov_inline.match?(line) rescue ArgumentError # E.g., line contains an invalid byte sequence in UTF-8 false @@ -45,10 +45,10 @@ def classify(lines) skipping = false lines.map do |line| - if self.class.no_cov_block?(line) + if self.class.no_cov_line?(line) skipping = !skipping NOT_RELEVANT - elsif skipping || self.class.no_cov_line?(line) || self.class.whitespace_line?(line) + elsif skipping || self.class.no_cov_inline?(line) || self.class.whitespace_line?(line) NOT_RELEVANT else RELEVANT