From b1212b6d0e45478aa07288a102695f32d9e19f4a Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Tue, 24 Nov 2020 06:47:51 +0900 Subject: [PATCH 1/2] Import `EnforceSuperclass` module --- lib/rubocop/cop/mixin/enforce_superclass.rb | 32 +++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 lib/rubocop/cop/mixin/enforce_superclass.rb diff --git a/lib/rubocop/cop/mixin/enforce_superclass.rb b/lib/rubocop/cop/mixin/enforce_superclass.rb new file mode 100644 index 0000000000..1667e78312 --- /dev/null +++ b/lib/rubocop/cop/mixin/enforce_superclass.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # Common functionality for enforcing a specific superclass. + module EnforceSuperclass + def self.included(base) + base.def_node_matcher :class_definition, <<~PATTERN + (class (const _ !:#{base::SUPERCLASS}) #{base::BASE_PATTERN} ...) + PATTERN + + base.def_node_matcher :class_new_definition, <<~PATTERN + [!^(casgn {nil? cbase} :#{base::SUPERCLASS} ...) + !^^(casgn {nil? cbase} :#{base::SUPERCLASS} (block ...)) + (send (const {nil? cbase} :Class) :new #{base::BASE_PATTERN})] + PATTERN + end + + def on_class(node) + class_definition(node) do + add_offense(node.children[1]) + end + end + + def on_send(node) + class_new_definition(node) do + add_offense(node.children.last) + end + end + end + end +end From 52b84803f3ecaac09e7aa3961c10400fa68be9c0 Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Tue, 24 Nov 2020 06:59:55 +0900 Subject: [PATCH 2/2] Use `Cop::Base` API for `EnforceSuperclass` Follow rubocop-hq/rubocop#7868. This PR uses `Cop::Base` API for cops mixing `EnforceSuperclass` module. --- lib/rubocop/cop/mixin/enforce_superclass.rb | 12 ++++++++++-- lib/rubocop/cop/rails/application_controller.rb | 10 +++------- lib/rubocop/cop/rails/application_job.rb | 3 ++- lib/rubocop/cop/rails/application_mailer.rb | 9 ++------- lib/rubocop/cop/rails/application_record.rb | 9 ++------- lib/rubocop/cop/rails_cops.rb | 1 + 6 files changed, 20 insertions(+), 24 deletions(-) diff --git a/lib/rubocop/cop/mixin/enforce_superclass.rb b/lib/rubocop/cop/mixin/enforce_superclass.rb index 1667e78312..b534f37dc7 100644 --- a/lib/rubocop/cop/mixin/enforce_superclass.rb +++ b/lib/rubocop/cop/mixin/enforce_superclass.rb @@ -18,13 +18,21 @@ def self.included(base) def on_class(node) class_definition(node) do - add_offense(node.children[1]) + register_offense(node.children[1]) end end def on_send(node) class_new_definition(node) do - add_offense(node.children.last) + register_offense(node.children.last) + end + end + + private + + def register_offense(offense_node) + add_offense(offense_node) do |corrector| + corrector.replace(offense_node.source_range, self.class::SUPERCLASS) end end end diff --git a/lib/rubocop/cop/rails/application_controller.rb b/lib/rubocop/cop/rails/application_controller.rb index 2e0c6df956..968536e951 100644 --- a/lib/rubocop/cop/rails/application_controller.rb +++ b/lib/rubocop/cop/rails/application_controller.rb @@ -16,7 +16,9 @@ module Rails # class MyController < ActionController::Base # # ... # end - class ApplicationController < Cop + class ApplicationController < Base + extend AutoCorrector + MSG = 'Controllers should subclass `ApplicationController`.' SUPERCLASS = 'ApplicationController' BASE_PATTERN = '(const (const nil? :ActionController) :Base)' @@ -24,12 +26,6 @@ class ApplicationController < Cop # rubocop:disable Layout/ClassStructure include RuboCop::Cop::EnforceSuperclass # rubocop:enable Layout/ClassStructure - - def autocorrect(node) - lambda do |corrector| - corrector.replace(node.source_range, self.class::SUPERCLASS) - end - end end end end diff --git a/lib/rubocop/cop/rails/application_job.rb b/lib/rubocop/cop/rails/application_job.rb index e9cf6fa2c7..b2791a317b 100644 --- a/lib/rubocop/cop/rails/application_job.rb +++ b/lib/rubocop/cop/rails/application_job.rb @@ -16,7 +16,8 @@ module Rails # class Rails4Job < ActiveJob::Base # # ... # end - class ApplicationJob < Cop + class ApplicationJob < Base + extend AutoCorrector extend TargetRailsVersion minimum_target_rails_version 5.0 diff --git a/lib/rubocop/cop/rails/application_mailer.rb b/lib/rubocop/cop/rails/application_mailer.rb index bc451da738..409424d761 100644 --- a/lib/rubocop/cop/rails/application_mailer.rb +++ b/lib/rubocop/cop/rails/application_mailer.rb @@ -16,7 +16,8 @@ module Rails # class MyMailer < ActionMailer::Base # # ... # end - class ApplicationMailer < Cop + class ApplicationMailer < Base + extend AutoCorrector extend TargetRailsVersion minimum_target_rails_version 5.0 @@ -28,12 +29,6 @@ class ApplicationMailer < Cop # rubocop:disable Layout/ClassStructure include RuboCop::Cop::EnforceSuperclass # rubocop:enable Layout/ClassStructure - - def autocorrect(node) - lambda do |corrector| - corrector.replace(node.source_range, self.class::SUPERCLASS) - end - end end end end diff --git a/lib/rubocop/cop/rails/application_record.rb b/lib/rubocop/cop/rails/application_record.rb index 7d75cdaf5f..c2fe267076 100644 --- a/lib/rubocop/cop/rails/application_record.rb +++ b/lib/rubocop/cop/rails/application_record.rb @@ -16,7 +16,8 @@ module Rails # class Rails4Model < ActiveRecord::Base # # ... # end - class ApplicationRecord < Cop + class ApplicationRecord < Base + extend AutoCorrector extend TargetRailsVersion minimum_target_rails_version 5.0 @@ -28,12 +29,6 @@ class ApplicationRecord < Cop # rubocop:disable Layout/ClassStructure include RuboCop::Cop::EnforceSuperclass # rubocop:enable Layout/ClassStructure - - def autocorrect(node) - lambda do |corrector| - corrector.replace(node.source_range, self.class::SUPERCLASS) - end - end end end end diff --git a/lib/rubocop/cop/rails_cops.rb b/lib/rubocop/cop/rails_cops.rb index 46a4678115..c8302a37ea 100644 --- a/lib/rubocop/cop/rails_cops.rb +++ b/lib/rubocop/cop/rails_cops.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require_relative 'mixin/active_record_helper' +require_relative 'mixin/enforce_superclass' require_relative 'mixin/index_method' require_relative 'mixin/target_rails_version'