gitlab-org--gitlab-foss/rubocop/cop/redis_queue_usage.rb

38 lines
1.5 KiB
Ruby

# frozen_string_literal: true
module RuboCop
module Cop
# This class complements Rubocop::Cop::SidekiqRedisCall by disallowing the use of
# Gitlab::Redis::Queues with the exception of initialising Sidekiq and monitoring.
class RedisQueueUsage < RuboCop::Cop::Base
MSG = 'Gitlab::Redis::Queues should only be used by Sidekiq initializers. '\
'Assignments or using its params to initialise another connection is not allowed.'
def_node_matcher :calling_redis_queue_module_methods?, <<~PATTERN
(send (const (const (const nil? :Gitlab) :Redis) :Queues) ...)
PATTERN
def_node_matcher :using_redis_queue_module_as_parameter?, <<~PATTERN
(send ... (const (const (const nil? :Gitlab) :Redis) :Queues))
PATTERN
def_node_matcher :redis_queue_assignment?, <<~PATTERN
({lvasgn | ivasgn | cvasgn | gvasgn | casgn | masgn | op_asgn | or_asgn | and_asgn } ...
`(const (const (const nil? :Gitlab) :Redis) :Queues))
PATTERN
def on_send(node)
return unless using_redis_queue_module_as_parameter?(node) || calling_redis_queue_module_methods?(node)
add_offense(node, message: MSG)
end
# offenses caught in assignment may overlap with on_send
%i[on_lvasgn on_ivasgn on_cvasgn on_gvasgn on_casgn on_masgn on_op_asgn on_or_asgn on_and_asgn].each do |name|
define_method(name) do |node|
add_offense(node, message: MSG) if redis_queue_assignment?(node)
end
end
end
end
end