59 lines
1.6 KiB
Ruby
59 lines
1.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require_relative '../../migration_helpers'
|
||
|
|
||
|
module RuboCop
|
||
|
module Cop
|
||
|
module Migration
|
||
|
# Cop that checks `ActiveSupport::Concern` is included in EE batched background migrations
|
||
|
# if they define `scope_to`.
|
||
|
class BackgroundMigrationMissingActiveConcern < RuboCop::Cop::Base
|
||
|
include MigrationHelpers
|
||
|
|
||
|
MSG = <<~MSG
|
||
|
Extend `ActiveSupport::Concern` in the EE background migration if it defines `scope_to`.
|
||
|
MSG
|
||
|
|
||
|
def_node_matcher :prepended_block_uses_scope_to?, <<~PATTERN
|
||
|
(:block (:send nil? :prepended) (:args) `(:send nil? :scope_to ...))
|
||
|
PATTERN
|
||
|
|
||
|
def_node_matcher :scope_to?, <<~PATTERN
|
||
|
(:send nil? :scope_to ...)
|
||
|
PATTERN
|
||
|
|
||
|
def_node_matcher :extend_activesupport_concern?, <<~PATTERN
|
||
|
(:send nil? :extend (:const (:const nil? :ActiveSupport) :Concern))
|
||
|
PATTERN
|
||
|
|
||
|
def on_block(node)
|
||
|
return unless in_ee_background_migration?(node)
|
||
|
return unless prepended_block_uses_scope_to?(node)
|
||
|
|
||
|
return if module_extends_activesupport_concern?(node)
|
||
|
|
||
|
node.descendants.each do |descendant|
|
||
|
next unless scope_to?(descendant)
|
||
|
|
||
|
add_offense(descendant)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def module_extends_activesupport_concern?(node)
|
||
|
while node = node.parent
|
||
|
break if node.type == :module
|
||
|
end
|
||
|
|
||
|
return false unless node
|
||
|
|
||
|
node.descendants.any? do |descendant|
|
||
|
extend_activesupport_concern?(descendant)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|