1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Convert the db:abort_if_pending_migrations task to be multi-DB aware

This commit is contained in:
Mark Lee 2019-06-07 11:13:18 -07:00
parent 0542e0608f
commit cb8b57d07e
3 changed files with 55 additions and 1 deletions

View file

@ -1,3 +1,7 @@
* Add support for multiple databases to `rails db:abort_if_pending_migrations`.
*Mark Lee*
* Fix sqlite3 collation parsing when using decimal columns.
*Martin R. Schuster*

View file

@ -250,7 +250,11 @@ db_namespace = namespace :db do
# desc "Raises an error if there are pending migrations"
task abort_if_pending_migrations: :load_config do
pending_migrations = ActiveRecord::Base.connection.migration_context.open.pending_migrations
pending_migrations = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).flat_map do |db_config|
ActiveRecord::Base.establish_connection(db_config.config)
ActiveRecord::Base.connection.migration_context.open.pending_migrations
end
if pending_migrations.any?
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
@ -261,6 +265,26 @@ db_namespace = namespace :db do
end
end
namespace :abort_if_pending_migrations do
ActiveRecord::Tasks::DatabaseTasks.for_each do |spec_name|
# desc "Raises an error if there are pending migrations for #{spec_name} database"
task spec_name => :load_config do
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name)
ActiveRecord::Base.establish_connection(db_config.config)
pending_migrations = ActiveRecord::Base.connection.migration_context.open.pending_migrations
if pending_migrations.any?
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
pending_migrations.each do |pending_migration|
puts " %4d %s" % [pending_migration.version, pending_migration.name]
end
abort %{Run `rails db:migrate:#{spec_name}` to update your database then try again.}
end
end
end
end
desc "Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)"
task setup: ["db:schema:load_if_ruby", "db:structure:load_if_sql", :seed]

View file

@ -299,6 +299,32 @@ module ApplicationTests
db_migrate_and_schema_cache_dump_and_schema_cache_clear
end
test "db:abort_if_pending_migrations works on all databases" do
require "#{app_path}/config/environment"
app_file "db/animals_migrate/02_two_migration.rb", <<-MIGRATION
class TwoMigration < ActiveRecord::Migration::Current
end
MIGRATION
output = rails("db:abort_if_pending_migrations", allow_failure: true)
assert_match(/You have 1 pending migration/, output)
end
test "db:abort_if_pending_migrations:namespace works" do
require "#{app_path}/config/environment"
app_file "db/animals_migrate/02_two_migration.rb", <<-MIGRATION
class TwoMigration < ActiveRecord::Migration::Current
end
MIGRATION
output = rails("db:abort_if_pending_migrations:primary")
assert_no_match(/You have \d+ pending migration/, output)
output = rails("db:abort_if_pending_migrations:animals", allow_failure: true)
assert_match(/You have 1 pending migration/, output)
end
test "db:prepare works on all databases" do
require "#{app_path}/config/environment"
db_prepare