diff --git a/Library/Homebrew/rubocops/all.rb b/Library/Homebrew/rubocops/all.rb index deb66f66a5ff4..85ebc750820b8 100644 --- a/Library/Homebrew/rubocops/all.rb +++ b/Library/Homebrew/rubocops/all.rb @@ -5,6 +5,7 @@ require_relative "../extend/blank" require_relative "blank" require_relative "compact_blank" +require_relative "disable_comment" require_relative "extend/mutable_constant_exclude_unfreezable" require_relative "io_read" require_relative "move_to_extend_os" diff --git a/Library/Homebrew/rubocops/disable_comment.rb b/Library/Homebrew/rubocops/disable_comment.rb new file mode 100644 index 0000000000000..7c710cfc8c72f --- /dev/null +++ b/Library/Homebrew/rubocops/disable_comment.rb @@ -0,0 +1,32 @@ +# typed: strict +# frozen_string_literal: true + +module RuboCop + module Cop + # Checks if rubocop disable comments have a clarifying comment preceding them. + class DisableComment < Base + MSG = "Add a clarifying comment to the RuboCop disable comment" + + def on_new_investigation + super + + processed_source.comments.each do |comment| + next unless disable_comment?(comment) + next if comment?(processed_source[comment.loc.line - 2]) + + add_offense(comment) + end + end + + private + + def disable_comment?(comment) + comment.text.start_with? "# rubocop:disable" + end + + def comment?(line) + line.strip.start_with? "#" + end + end + end +end diff --git a/Library/Homebrew/test/rubocops/disable_comment_spec.rb b/Library/Homebrew/test/rubocops/disable_comment_spec.rb new file mode 100644 index 0000000000000..3ec4c0f71c4e9 --- /dev/null +++ b/Library/Homebrew/test/rubocops/disable_comment_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require "rubocops/disable_comment" + +RSpec.describe RuboCop::Cop::DisableComment, :config do + shared_examples "offense" do |source, correction, message| + it "registers an offense and corrects" do + expect_offense(<<~RUBY, source:, message:) + #{source} + ^{source} #{message} + RUBY + + expect_correction(<<~RUBY) + #{correction} + RUBY + end + end + + it "register a offencse" do + expect_offense(<<~RUBY) + def something; end + # rubocop:disable Naming/AccessorMethodName + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Add a clarifying comment to the RuboCop disable comment + def get_decrypted_io; end + RUBY + end + + it "doesn't register an offencse" do + expect_no_offenses(<<~RUBY) + def something; end + # This is a upstream name that we cannot change. + # rubocop:disable Naming/AccessorMethodName + def get_decrypted_io; end + RUBY + end +end