2021-07-14 15:09:57 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module RuboCop
|
|
|
|
module Cop
|
|
|
|
module Database
|
|
|
|
# @example
|
|
|
|
# # bad
|
|
|
|
# ActiveRecord::Base.connection
|
|
|
|
#
|
|
|
|
# # good
|
|
|
|
# ApplicationRecord.connection
|
|
|
|
#
|
|
|
|
class MultipleDatabases < RuboCop::Cop::Cop
|
|
|
|
AR_BASE_MESSAGE = <<~EOF
|
|
|
|
Do not use methods from ActiveRecord::Base, use the ApplicationRecord class instead
|
|
|
|
For fixing offenses related to the ActiveRecord::Base.transaction method, see our guidelines:
|
|
|
|
https://docs.gitlab.com/ee/development/database/transaction_guidelines.html
|
|
|
|
EOF
|
|
|
|
|
2022-03-03 12:14:02 +00:00
|
|
|
ALLOWED_METHODS = %i[
|
|
|
|
no_touching
|
|
|
|
].freeze
|
|
|
|
|
2021-07-14 15:09:57 +00:00
|
|
|
def_node_matcher :active_record_base_method_is_used?, <<~PATTERN
|
2022-04-29 09:09:48 +00:00
|
|
|
(send (const (const _ :ActiveRecord) :Base) $_)
|
2021-07-14 15:09:57 +00:00
|
|
|
PATTERN
|
|
|
|
|
|
|
|
def on_send(node)
|
|
|
|
return unless active_record_base_method_is_used?(node)
|
|
|
|
|
2022-03-03 12:14:02 +00:00
|
|
|
active_record_base_method = node.children[1]
|
|
|
|
return if method_is_allowed?(active_record_base_method)
|
|
|
|
|
2021-07-14 15:09:57 +00:00
|
|
|
add_offense(node, location: :expression, message: AR_BASE_MESSAGE)
|
|
|
|
end
|
2022-03-03 12:14:02 +00:00
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def method_is_allowed?(method_name)
|
|
|
|
ALLOWED_METHODS.include?(method_name.to_sym)
|
|
|
|
end
|
2021-07-14 15:09:57 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|