From 5b964ed45780f28d18418cd60899fbd69b1fa103 Mon Sep 17 00:00:00 2001 From: pbair <pbair@gitlab.com> Date: Thu, 24 Feb 2022 17:31:55 -0500 Subject: [PATCH] Update MultipleDatabase cop to allow some methods Add for specified methods to be allowed on ActiveRecord::Base in the Database/MultipleDatabases cop. Also add `no_touching` as the first method in the allowlist. --- .rubocop_todo/database/multiple_databases.yml | 2 -- rubocop/cop/database/multiple_databases.rb | 13 +++++++++++++ .../rubocop/cop/database/multiple_databases_spec.rb | 10 ++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.rubocop_todo/database/multiple_databases.yml b/.rubocop_todo/database/multiple_databases.yml index e390f81f0304a..38a6ccb3ef4b4 100644 --- a/.rubocop_todo/database/multiple_databases.yml +++ b/.rubocop_todo/database/multiple_databases.yml @@ -18,10 +18,8 @@ Database/MultipleDatabases: - lib/gitlab/database/migrations/observers/query_log.rb - lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb - lib/gitlab/database.rb - - lib/gitlab/gitlab_import/importer.rb - lib/gitlab/health_checks/db_check.rb - lib/gitlab/import_export/group/relation_tree_restorer.rb - - lib/gitlab/legacy_github_import/importer.rb - lib/gitlab/seeder.rb - spec/db/schema_spec.rb - spec/initializers/database_config_spec.rb diff --git a/rubocop/cop/database/multiple_databases.rb b/rubocop/cop/database/multiple_databases.rb index fb6e81f984581..f20348d9d1fea 100644 --- a/rubocop/cop/database/multiple_databases.rb +++ b/rubocop/cop/database/multiple_databases.rb @@ -17,6 +17,10 @@ class MultipleDatabases < RuboCop::Cop::Cop https://docs.gitlab.com/ee/development/database/transaction_guidelines.html EOF + ALLOWED_METHODS = %i[ + no_touching + ].freeze + def_node_matcher :active_record_base_method_is_used?, <<~PATTERN (send (const (const nil? :ActiveRecord) :Base) $_) PATTERN @@ -24,8 +28,17 @@ class MultipleDatabases < RuboCop::Cop::Cop def on_send(node) return unless active_record_base_method_is_used?(node) + active_record_base_method = node.children[1] + return if method_is_allowed?(active_record_base_method) + add_offense(node, location: :expression, message: AR_BASE_MESSAGE) end + + private + + def method_is_allowed?(method_name) + ALLOWED_METHODS.include?(method_name.to_sym) + end end end end diff --git a/spec/rubocop/cop/database/multiple_databases_spec.rb b/spec/rubocop/cop/database/multiple_databases_spec.rb index 16b916d61dba0..8bcd4710305ad 100644 --- a/spec/rubocop/cop/database/multiple_databases_spec.rb +++ b/spec/rubocop/cop/database/multiple_databases_spec.rb @@ -12,4 +12,14 @@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use methods from ActiveRecord::Base, [...] SOURCE end + + described_class::ALLOWED_METHODS.each do |method_name| + it "does not flag use of ActiveRecord::Base.#{method_name}" do + expect_no_offenses(<<~SOURCE) + ActiveRecord::Base.#{method_name} do + Project.save + end + SOURCE + end + end end -- GitLab