debian-mirror-gitlab/rubocop/cop/migration/background_migration_missing_active_concern.rb
2022-11-25 23:54:43 +05:30

58 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