Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-09-01 21:08:49 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-09-01 21:08:49 +0300
commitd551c55bb0e691f06655bcda5fe9566164fd3e46 (patch)
tree66320e68b9c2d3567bfbde9ad171e9543186a462 /rubocop/cop
parent9c191c0b942eb08360f4d64c038c435b1156e15f (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'rubocop/cop')
-rw-r--r--rubocop/cop/migration/versioned_migration_class.rb55
1 files changed, 55 insertions, 0 deletions
diff --git a/rubocop/cop/migration/versioned_migration_class.rb b/rubocop/cop/migration/versioned_migration_class.rb
new file mode 100644
index 00000000000..5a2c4f11ece
--- /dev/null
+++ b/rubocop/cop/migration/versioned_migration_class.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require_relative '../../migration_helpers'
+
+module RuboCop
+ module Cop
+ module Migration
+ class VersionedMigrationClass < RuboCop::Cop::Cop
+ include MigrationHelpers
+
+ ENFORCED_SINCE = 2021_09_02_00_00_00
+
+ MSG_INHERIT = 'Don\'t inherit from ActiveRecord::Migration but use Gitlab::Database::Migration[1.0] instead. See https://docs.gitlab.com/ee/development/migration_style_guide.html#migration-helpers-and-versioning.'
+ MSG_INCLUDE = 'Don\'t include migration helper modules directly. Inherit from Gitlab::Database::Migration[1.0] instead. See https://docs.gitlab.com/ee/development/migration_style_guide.html#migration-helpers-and-versioning.'
+
+ MIGRATION_CLASS = 'Gitlab::Database::Migration'
+
+ def_node_search :includes_helpers?, <<~PATTERN
+ (send nil? :include
+ (const
+ (const
+ (const nil? :Gitlab) :Database) :MigrationHelpers))
+ PATTERN
+
+ def on_class(node)
+ return unless relevant_migration?(node)
+
+ add_offense(node, location: :expression, message: MSG_INHERIT) unless gitlab_migration_class?(node)
+ end
+
+ def on_send(node)
+ return unless relevant_migration?(node)
+
+ add_offense(node, location: :expression, message: MSG_INCLUDE) if includes_helpers?(node)
+ end
+
+ private
+
+ def relevant_migration?(node)
+ in_migration?(node) && version(node) >= ENFORCED_SINCE
+ end
+
+ def gitlab_migration_class?(node)
+ superclass(node) == MIGRATION_CLASS
+ end
+
+ def superclass(class_node)
+ _, *others = class_node.descendants
+
+ others.find { |node| node.const_type? && node&.const_name != 'Types' }&.const_name
+ end
+ end
+ end
+ end
+end