From 1b0a2258fcbce9ecc24b9c071af4c1a85cb2950f Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Wed, 28 Feb 2024 00:25:27 -0800 Subject: [PATCH] Added ignore option --- CHANGELOG.md | 2 ++ lib/strong_migrations.rb | 2 +- lib/strong_migrations/checker.rb | 25 +++++++++++++++++++++++++ test/multiple_databases_test.rb | 31 +++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 828c3c7..0eddc54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## 1.7.1 (unreleased) +- Added `ignore` option +- Added warning for unsupported adapter - Updated instructions for removing a column to append to `ignored_columns` ## 1.7.0 (2024-01-05) diff --git a/lib/strong_migrations.rb b/lib/strong_migrations.rb index 9763593..ceac463 100644 --- a/lib/strong_migrations.rb +++ b/lib/strong_migrations.rb @@ -29,7 +29,7 @@ class << self :target_postgresql_version, :target_mysql_version, :target_mariadb_version, :enabled_checks, :lock_timeout, :statement_timeout, :check_down, :target_version, :safe_by_default, :target_sql_mode, :lock_timeout_retries, :lock_timeout_retry_delay, - :alphabetize_schema + :alphabetize_schema, :ignore attr_writer :lock_timeout_limit end self.auto_analyze = false diff --git a/lib/strong_migrations/checker.rb b/lib/strong_migrations/checker.rb index ac9ccea..fb5eee4 100644 --- a/lib/strong_migrations/checker.rb +++ b/lib/strong_migrations/checker.rb @@ -28,6 +28,7 @@ def self.safety_assured end def perform(method, *args) + return if !enabled? check_version_supported set_timeouts check_lock_timeout @@ -131,6 +132,30 @@ def version_safe? private + def enabled? + if StrongMigrations.ignore + # Active Record 6.0 supports multiple databases + # but connection.pool.spec.name always returns "primary" + # in migrations with rails db:migrate + if ActiveRecord::VERSION::STRING.to_f < 6.1 + # error class is not shown in db:migrate output so ensure message is descriptive + raise StrongMigrations::Error, "StrongMigrations.ignore is not supported for Active Record < 6.1" + end + + if StrongMigrations.ignore.map(&:to_s).include?(connection.pool.db_config.name) + return false + end + end + + if adapter.instance_of?(Adapters::AbstractAdapter) + # TODO raise error in 2.0 + # TODO add database name for Active Record 6.1+ + warn "[strong_migrations] Unsupported adapter: #{connection.adapter_name}. Use StrongMigrations.ignore to silence this warning." + end + + true + end + def check_version_supported return if defined?(@version_checked) diff --git a/test/multiple_databases_test.rb b/test/multiple_databases_test.rb index a3e780b..247878b 100644 --- a/test/multiple_databases_test.rb +++ b/test/multiple_databases_test.rb @@ -40,6 +40,30 @@ def test_target_version_unsupported end end + def test_ignore + skip unless multiple_dbs? + + with_ignore([:animals]) do + with_database(:primary) do + assert_unsafe ExecuteArbitrarySQL + end + with_database(:animals) do + assert_safe ExecuteArbitrarySQL + end + end + end + + def test_ignore_unsupported + skip if multiple_dbs? + + with_ignore([:animals]) do + error = assert_raises(StrongMigrations::Error) do + assert_safe ExecuteArbitrarySQL + end + assert_equal "StrongMigrations.ignore is not supported for Active Record < 6.1", error.message + end + end + private def with_database(database, &block) @@ -59,6 +83,13 @@ def with_database(database, &block) ActiveRecord::Base.establish_connection(previous_db_config) if previous_db_config end + def with_ignore(databases) + StrongMigrations.ignore = databases + yield + ensure + StrongMigrations.ignore = nil + end + def multiple_dbs? ActiveRecord::VERSION::STRING.to_f >= 6.1 end