Skip to content
代码片段 群组 项目
提交 bd6f1b55 编辑于 作者: Steve Abrams's avatar Steve Abrams
浏览文件

Add a new cop Database/DisableReferentialIntegrity

Add a cop to prevent usage of disable_referential_integrity
as this method can lead to data consistency problems and
create unsafe situations where triggers on all tables are
disabled.
上级 8c63ebd9
No related branches found
No related tags found
无相关合并请求
---
Database/DisableReferentialIntegrity:
Exclude:
- 'spec/lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects_spec.rb'
# frozen_string_literal: true
module RuboCop
module Cop
module Database
# Cop that checks if 'disable_referential_integrity' method is called.
class DisableReferentialIntegrity < RuboCop::Cop::Cop
MSG = <<~TEXT
Do not use `disable_referential_integrity`, disable triggers in a safe
transaction instead. Follow the format:
BEGIN;
ALTER TABLE my_table DISABLE TRIGGER ALL;
-- execute query that requires disabled triggers
ALTER TABLE my_table ENABLE TRIGGER ALL;
COMMIT;
TEXT
def_node_matcher :disable_referential_integrity?, <<~PATTERN
(send _ :disable_referential_integrity)
PATTERN
RESTRICT_ON_SEND = %i[disable_referential_integrity].freeze
def on_send(node)
return unless disable_referential_integrity?(node)
add_offense(node)
end
end
end
end
end
# frozen_string_literal: true
require 'fast_spec_helper'
require_relative '../../../../rubocop/cop/database/disable_referential_integrity'
RSpec.describe RuboCop::Cop::Database::DisableReferentialIntegrity do
subject(:cop) { described_class.new }
it 'does not flag the use of disable_referential_integrity with a send receiver' do
expect_offense(<<~SOURCE)
foo.disable_referential_integrity
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `disable_referential_integrity`, [...]
SOURCE
end
it 'flags the use of disable_referential_integrity with a full definition' do
expect_offense(<<~SOURCE)
ActiveRecord::Base.connection.disable_referential_integrity
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `disable_referential_integrity`, [...]
SOURCE
end
it 'flags the use of disable_referential_integrity with a nil receiver' do
expect_offense(<<~SOURCE)
class Foo ; disable_referential_integrity ; end
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `disable_referential_integrity`, [...]
SOURCE
end
it 'flags the use of disable_referential_integrity when passing a block' do
expect_offense(<<~SOURCE)
class Foo ; disable_referential_integrity { :foo } ; end
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use `disable_referential_integrity`, [...]
SOURCE
end
end
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册