diff options
Diffstat (limited to 'rubocop/cop/migration/unfinished_dependencies.rb')
-rw-r--r-- | rubocop/cop/migration/unfinished_dependencies.rb | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/rubocop/cop/migration/unfinished_dependencies.rb b/rubocop/cop/migration/unfinished_dependencies.rb new file mode 100644 index 00000000000..1e0741c8411 --- /dev/null +++ b/rubocop/cop/migration/unfinished_dependencies.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require_relative '../../migration_helpers' +require_relative '../../batched_background_migrations' + +module RuboCop + module Cop + module Migration + # Checks if there are any unfinished dependent batched bg migrations + class UnfinishedDependencies < RuboCop::Cop::Base + include MigrationHelpers + + NOT_FINALIZED_MSG = <<-MESSAGE.delete("\n").squeeze(' ').strip + Dependent migration with queued version %{version} is not yet finalized. + Consider finalizing the dependent migration and update it's finalized_by attr in the dictionary. + MESSAGE + + FINALIZED_BY_LATER_MIGRATION_MSG = <<-MESSAGE.delete("\n").squeeze(' ').strip + Dependent migration with queued version %{version} is finalized by later migration, + it has to be finalized before the current migration. + MESSAGE + + def_node_matcher :dependent_migration_versions, <<~PATTERN + (casgn nil? :DEPENDENT_BATCHED_BACKGROUND_MIGRATIONS (array $...)) + PATTERN + + def on_casgn(node) + return unless in_migration?(node) + + migration_version = version(node) + + dependent_migration_versions(node)&.each do |dependent_migration_version_node| + dependent_migration_version = dependent_migration_version_node.value + finalized_by_version = fetch_finalized_by(dependent_migration_version) + + next if finalized_by_version.present? && finalized_by_version.to_s < migration_version.to_s + + msg = finalized_by_version.present? ? FINALIZED_BY_LATER_MIGRATION_MSG : NOT_FINALIZED_MSG + add_offense(node, message: format(msg, version: dependent_migration_version)) + end + end + + private + + def fetch_finalized_by(queued_migration_version) + BatchedBackgroundMigrations.new(queued_migration_version).finalized_by + end + end + end + end +end |