diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 404bd3ad..40b232ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,6 +17,7 @@ jobs: gemfile: - gemfiles/rails_6.1.gemfile - gemfiles/rails_7.0.gemfile + - gemfiles/rails_7.1.0.alpha.gemfile runs-on: ubuntu-latest env: BUNDLE_GEMFILE: ${{ matrix.gemfile }} diff --git a/Appraisals b/Appraisals index 9bb5a4ba..f8722491 100644 --- a/Appraisals +++ b/Appraisals @@ -5,3 +5,7 @@ end appraise 'rails-7.0' do gem 'rails', '~> 7.0' end + +appraise 'rails-7.1.0.alpha' do + gem 'rails', git: "https://github.com/rails/rails.git", branch: "main" +end diff --git a/Changelog.md b/Changelog.md index 1cf5a438..704dd79f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,7 @@ ## 11.0.0 - Commit *.lock files - Remove support for Rails 6.0 +- Support Rails 7.1 ## 9.1.0 diff --git a/gemfiles/rails_7.1.0.alpha.gemfile b/gemfiles/rails_7.1.0.alpha.gemfile new file mode 100644 index 00000000..bcccc8a3 --- /dev/null +++ b/gemfiles/rails_7.1.0.alpha.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "http://rubygems.org" + +gem "sqlite3", "~> 1.4" +gem "rails", git: "https://github.com/rails/rails.git", branch: "main" + +gemspec path: "../" diff --git a/gemfiles/rails_7.1.0.alpha.gemfile.lock b/gemfiles/rails_7.1.0.alpha.gemfile.lock new file mode 100644 index 00000000..9b78be9c --- /dev/null +++ b/gemfiles/rails_7.1.0.alpha.gemfile.lock @@ -0,0 +1,252 @@ +GIT + remote: https://github.com/rails/rails.git + revision: 5f3eb2195ba503919665028c01e4c76125e59fac + branch: main + specs: + actioncable (7.1.0.alpha) + actionpack (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + zeitwerk (~> 2.6) + actionmailbox (7.1.0.alpha) + actionpack (= 7.1.0.alpha) + activejob (= 7.1.0.alpha) + activerecord (= 7.1.0.alpha) + activestorage (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + mail (>= 2.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.1.0.alpha) + actionpack (= 7.1.0.alpha) + actionview (= 7.1.0.alpha) + activejob (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.0) + actionpack (7.1.0.alpha) + actionview (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.6) + actiontext (7.1.0.alpha) + actionpack (= 7.1.0.alpha) + activerecord (= 7.1.0.alpha) + activestorage (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (7.1.0.alpha) + activesupport (= 7.1.0.alpha) + builder (~> 3.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.6) + activejob (7.1.0.alpha) + activesupport (= 7.1.0.alpha) + globalid (>= 0.3.6) + activemodel (7.1.0.alpha) + activesupport (= 7.1.0.alpha) + activerecord (7.1.0.alpha) + activemodel (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + timeout (>= 0.4.0) + activestorage (7.1.0.alpha) + actionpack (= 7.1.0.alpha) + activejob (= 7.1.0.alpha) + activerecord (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + marcel (~> 1.0) + activesupport (7.1.0.alpha) + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + rails (7.1.0.alpha) + actioncable (= 7.1.0.alpha) + actionmailbox (= 7.1.0.alpha) + actionmailer (= 7.1.0.alpha) + actionpack (= 7.1.0.alpha) + actiontext (= 7.1.0.alpha) + actionview (= 7.1.0.alpha) + activejob (= 7.1.0.alpha) + activemodel (= 7.1.0.alpha) + activerecord (= 7.1.0.alpha) + activestorage (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + bundler (>= 1.15.0) + railties (= 7.1.0.alpha) + railties (7.1.0.alpha) + actionpack (= 7.1.0.alpha) + activesupport (= 7.1.0.alpha) + irb + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) + +PATH + remote: .. + specs: + data_migrate (9.1.0) + activerecord (>= 6.1) + railties (>= 6.1) + +GEM + remote: http://rubygems.org/ + specs: + appraisal (2.5.0) + bundler + rake + thor (>= 0.14.0) + ast (2.4.2) + builder (3.2.4) + childprocess (4.1.0) + coderay (1.1.3) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) + crass (1.0.6) + date (3.3.3) + diff-lcs (1.5.0) + erubi (1.12.0) + globalid (1.1.0) + activesupport (>= 5.0) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + iniparse (1.5.0) + io-console (0.6.0) + irb (1.7.4) + reline (>= 0.3.6) + json (2.6.3) + language_server-protocol (3.17.0.3) + loofah (2.21.3) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.8.1) + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + marcel (1.0.2) + method_source (1.0.0) + mini_mime (1.1.2) + minitest (5.18.1) + net-imap (0.3.6) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.1) + timeout + net-smtp (0.3.3) + net-protocol + nio4r (2.5.9) + nokogiri (1.15.3-arm64-darwin) + racc (~> 1.4) + nokogiri (1.15.3-x86_64-linux) + racc (~> 1.4) + overcommit (0.60.0) + childprocess (>= 0.6.3, < 5) + iniparse (~> 1.4) + rexml (~> 3.2) + parallel (1.23.0) + parser (3.2.2.3) + ast (~> 2.4.1) + racc + pry (0.14.2) + coderay (~> 1.1) + method_source (~> 1.0) + racc (1.7.1) + rack (3.0.8) + rack-session (2.0.0) + rack (>= 3.0.0) + rack-test (2.1.0) + rack (>= 1.3) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + rails-dom-testing (2.1.1) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + rainbow (3.1.1) + rake (13.0.6) + rb-readline (0.5.5) + regexp_parser (2.8.1) + reline (0.3.6) + io-console (~> 0.5) + rexml (3.2.5) + rspec (3.12.0) + rspec-core (~> 3.12.0) + rspec-expectations (~> 3.12.0) + rspec-mocks (~> 3.12.0) + rspec-core (3.12.2) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.3) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.6) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-support (3.12.1) + rubocop (1.54.2) + json (~> 2.3) + language_server-protocol (>= 3.17.0) + parallel (~> 1.10) + parser (>= 3.2.2.3) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.28.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.29.0) + parser (>= 3.2.1.0) + ruby-progressbar (1.13.0) + sqlite3 (1.6.3-arm64-darwin) + sqlite3 (1.6.3-x86_64-linux) + thor (1.2.2) + timecop (0.9.6) + timeout (0.4.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (2.4.2) + webrick (1.8.1) + websocket-driver (0.7.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + zeitwerk (2.6.8) + +PLATFORMS + arm64-darwin-22 + x86_64-linux + +DEPENDENCIES + appraisal + data_migrate! + overcommit + pry + rails! + rake + rb-readline + rspec + rspec-core + rubocop + sqlite3 (~> 1.4) + timecop + +BUNDLED WITH + 2.4.17 diff --git a/lib/data_migrate.rb b/lib/data_migrate.rb index d78eed37..18705c2d 100644 --- a/lib/data_migrate.rb +++ b/lib/data_migrate.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +require File.join(File.dirname(__FILE__), "data_migrate", "rails_helper") require File.join(File.dirname(__FILE__), "data_migrate", "data_migrator") require File.join(File.dirname(__FILE__), "data_migrate", "data_schema_migration") require File.join(File.dirname(__FILE__), "data_migrate", "data_schema") @@ -9,7 +10,6 @@ require File.join(File.dirname(__FILE__), "data_migrate", "migration_context") require File.join(File.dirname(__FILE__), "data_migrate", "railtie") require File.join(File.dirname(__FILE__), "data_migrate", "tasks/data_migrate_tasks") -require File.join(File.dirname(__FILE__), "data_migrate", "legacy_migrator") require File.join(File.dirname(__FILE__), "data_migrate", "config") require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration") diff --git a/lib/data_migrate/data_migrator.rb b/lib/data_migrate/data_migrator.rb index 78cfe86e..300cde73 100644 --- a/lib/data_migrate/data_migrator.rb +++ b/lib/data_migrate/data_migrator.rb @@ -5,32 +5,20 @@ module DataMigrate class DataMigrator < ActiveRecord::Migrator - def self.migrations_paths - [DataMigrate.config.data_migrations_path] - end - - def self.create_data_schema_table - DataMigrate::DataSchemaMigration.create_table - end - - def initialize(direction, migrations, target_version = nil) - @direction = direction - @target_version = target_version - @migrated_versions = nil - @migrations = migrations - - validate(@migrations) - - DataMigrate::DataSchemaMigration.create_table - ActiveRecord::InternalMetadata.create_table - end - def load_migrated @migrated_versions = - DataMigrate::DataSchemaMigration.normalized_versions.map(&:to_i).sort + DataMigrate::RailsHelper.data_schema_migration.normalized_versions.map(&:to_i).sort end class << self + def migrations_paths + [DataMigrate.config.data_migrations_path] + end + + def create_data_schema_table + DataMigrate::RailsHelper.data_schema_migration.create_table + end + def current_version DataMigrate::MigrationContext.new(migrations_paths).current_version end @@ -79,10 +67,10 @@ def rollback(migrations_path, steps) def record_version_state_after_migrating(version) if down? migrated.delete(version) - DataMigrate::DataSchemaMigration.where(version: version.to_s).delete_all + DataMigrate::RailsHelper.data_schema_delete_version(version.to_s) else migrated << version - DataMigrate::DataSchemaMigration.create!(version: version.to_s) + DataMigrate::RailsHelper.data_schema_migration.create_version(version.to_s) end end end diff --git a/lib/data_migrate/data_schema.rb b/lib/data_migrate/data_schema.rb index 07e9fb78..a77bd56a 100644 --- a/lib/data_migrate/data_schema.rb +++ b/lib/data_migrate/data_schema.rb @@ -57,7 +57,7 @@ def sm_table end def table_name - DataMigrate::DataSchemaMigration.table_name + DataMigrate::RailsHelper.data_schema_migration.table_name end end end diff --git a/lib/data_migrate/data_schema_migration.rb b/lib/data_migrate/data_schema_migration.rb index c04c470e..0fb72ece 100644 --- a/lib/data_migrate/data_schema_migration.rb +++ b/lib/data_migrate/data_schema_migration.rb @@ -1,6 +1,8 @@ module DataMigrate class DataSchemaMigration < ActiveRecord::SchemaMigration - class << self + # In Rails 7.1+, ActiveRecord::SchemaMigration methods are instance methods + # So we only load the appropriate methods depending on Rails version. + if DataMigrate::RailsHelper.rails_version_equal_to_or_higher_than_7_1 def table_name ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix end @@ -8,6 +10,22 @@ def table_name def primary_key "version" end + else + class << self + def table_name + ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix + end + + def primary_key + "version" + end + + def create_version(version) + # Note that SchemaMigration.create_version in Rails 7.1 does not + # raise an error if validations fail but we retain this behaviour for now. + create!(version: version) + end + end end end end diff --git a/lib/data_migrate/database_tasks.rb b/lib/data_migrate/database_tasks.rb index ee96a7d6..9bf93071 100644 --- a/lib/data_migrate/database_tasks.rb +++ b/lib/data_migrate/database_tasks.rb @@ -100,8 +100,10 @@ def self.forward(step = 1) def self.pending_data_migrations data_migrations = DataMigrate::DataMigrator.migrations(data_migrations_path) - sort_migrations(DataMigrate::DataMigrator.new(:up, data_migrations ). - pending_migrations.map {|m| { version: m.version, name: m.name, kind: :data }}) + data_migrator = DataMigrate::RailsHelper.data_migrator(:up, data_migrations) + sort_migrations( + data_migrator.pending_migrations.map { |m| { version: m.version, name: m.name, kind: :data } } + ) end def self.pending_schema_migrations @@ -109,8 +111,8 @@ def self.pending_schema_migrations end def self.past_migrations(sort = nil) - data_versions = DataMigrate::DataSchemaMigration.table_exists? ? DataMigrate::DataSchemaMigration.normalized_versions : [] - schema_versions = ActiveRecord::SchemaMigration.normalized_versions + data_versions = DataMigrate::RailsHelper.data_schema_migration.table_exists? ? DataMigrate::RailsHelper.data_schema_migration.normalized_versions : [] + schema_versions = DataMigrate::RailsHelper.schema_migration.normalized_versions migrations = data_versions.map { |v| { version: v.to_i, kind: :data } } + schema_versions.map { |v| { version: v.to_i, kind: :schema } } sort&.downcase == "asc" ? sort_migrations(migrations) : sort_migrations(migrations).reverse diff --git a/lib/data_migrate/legacy_migrator.rb b/lib/data_migrate/legacy_migrator.rb deleted file mode 100644 index b1f4ba56..00000000 --- a/lib/data_migrate/legacy_migrator.rb +++ /dev/null @@ -1,22 +0,0 @@ -module DataMigrate - class LegacyMigrator - def initialize(migrations_paths = "db/data") - @migrations_paths = migrations_paths || "db/data" - end - - def migrate - dates = - DataMigrate::DataMigrator.migrations(@migrations_paths).collect(&:version) - legacy = ActiveRecord::SchemaMigration.where(version: dates) - legacy.each do |v| - begin - version = v.version - puts "Creating #{version} in data schema" - DataMigrate::DataSchemaMigration.create(version: version) - rescue ActiveRecord::RecordNotUnique - nil - end - end - end - end -end diff --git a/lib/data_migrate/migration_context.rb b/lib/data_migrate/migration_context.rb index 48d2bbbb..cf6aeda8 100644 --- a/lib/data_migrate/migration_context.rb +++ b/lib/data_migrate/migration_context.rb @@ -11,7 +11,8 @@ def up(target_version = nil) migrations end - DataMigrator.new(:up, selected_migrations, target_version).migrate + data_migrator = DataMigrate::RailsHelper.data_migrator(:up, selected_migrations, DataMigrate::RailsHelper.schema_migration, DataMigrate::RailsHelper.internal_metadata, target_version) + data_migrator.migrate end def down(target_version = nil) @@ -22,11 +23,13 @@ def down(target_version = nil) migrations end - DataMigrator.new(:down, selected_migrations, target_version).migrate + data_migrator = DataMigrate::RailsHelper.data_migrator(:down, selected_migrations, DataMigrate::RailsHelper.schema_migration, DataMigrate::RailsHelper.internal_metadata, target_version) + data_migrator.migrate end def run(direction, target_version) - DataMigrator.new(direction, migrations, target_version).run + data_migrator = DataMigrate::RailsHelper.data_migrator(direction, migrations, DataMigrate::RailsHelper.schema_migration, DataMigrate::RailsHelper.internal_metadata, target_version) + data_migrator.run end def current_version @@ -40,12 +43,12 @@ def migration_files end def migrations_status - db_list = DataSchemaMigration.normalized_versions + db_list = DataMigrate::RailsHelper.data_schema_migration.normalized_versions file_list = migration_files.map do |file| version, name, scope = parse_migration_filename(file) raise ActiveRecord::IllegalMigrationNameError.new(file) unless version - version = ActiveRecord::SchemaMigration.normalize_migration_number(version) + version = DataMigrate::RailsHelper.schema_migration.normalize_migration_number(version) status = db_list.delete(version) ? "up" : "down" [status, version, (name + scope).humanize] end.compact @@ -60,15 +63,15 @@ def migrations_status private def get_all_versions - if DataMigrate::DataSchemaMigration.table_exists? - DataSchemaMigration.normalized_versions.map(&:to_i) + if DataMigrate::RailsHelper.data_schema_migration.table_exists? + DataMigrate::RailsHelper.data_schema_migration.normalized_versions.map(&:to_i) else [] end end def move(direction, steps) - migrator = DataMigrator.new(direction, migrations) + migrator = DataMigrate::RailsHelper.data_migrator(direction, migrations) if current_version != 0 && !migrator.current_migration raise ActiveRecord::UnknownMigrationVersionError.new(current_version) diff --git a/lib/data_migrate/rails_helper.rb b/lib/data_migrate/rails_helper.rb new file mode 100644 index 00000000..470f308e --- /dev/null +++ b/lib/data_migrate/rails_helper.rb @@ -0,0 +1,71 @@ +module DataMigrate + class DataMigrate::RailsHelper + class << self + def rails_version_equal_to_or_higher_than_7_1 + @equal_to_or_higher_than_7_1 ||= Gem::Dependency.new("railties", ">= 7.1.0.alpha").match?("railties", Gem.loaded_specs["railties"].version) + end + + def internal_metadata + if rails_version_equal_to_or_higher_than_7_1 + ActiveRecord::Base.connection.internal_metadata + else + ActiveRecord::InternalMetadata + end + end + + def schema_migration + if rails_version_equal_to_or_higher_than_7_1 + ActiveRecord::Base.connection.schema_migration + else + ActiveRecord::SchemaMigration + end + end + + def schema_migration_versions + if rails_version_equal_to_or_higher_than_7_1 + schema_migration.versions + else + schema_migration.all.pluck(:version) + end + end + + def schema_create_version(version) + if rails_version_equal_to_or_higher_than_7_1 + schema_migration.create_version(version) + else + schema_migration.create(version: version) + end + end + + def data_schema_delete_version(version) + if rails_version_equal_to_or_higher_than_7_1 + data_schema_migration.delete_version(version) + else + data_schema_migration.where(version: version.to_s).delete_all + end + end + + def data_schema_migration + if rails_version_equal_to_or_higher_than_7_1 + DataMigrate::DataSchemaMigration.new(ActiveRecord::Tasks::DatabaseTasks.migration_connection) + else + DataMigrate::DataSchemaMigration + end + end + + def data_migrator( + direction, + migrations, + schema_migration = DataMigrate::RailsHelper.schema_migration, + internal_metadata = DataMigrate::RailsHelper.internal_metadata, + target_version = nil + ) + if rails_version_equal_to_or_higher_than_7_1 + DataMigrate::DataMigrator.new(direction, migrations, schema_migration, internal_metadata, target_version) + else + DataMigrate::DataMigrator.new(direction, migrations, schema_migration, target_version) + end + end + end + end +end diff --git a/lib/data_migrate/schema_dumper.rb b/lib/data_migrate/schema_dumper.rb index 8692a301..cd56cce3 100644 --- a/lib/data_migrate/schema_dumper.rb +++ b/lib/data_migrate/schema_dumper.rb @@ -26,7 +26,7 @@ def dump(stream) def initialize(connection) @connection = connection - all_versions = DataSchemaMigration.normalized_versions + all_versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions @version = begin all_versions.max diff --git a/lib/data_migrate/schema_migration.rb b/lib/data_migrate/schema_migration.rb index f93c0b16..ed461324 100644 --- a/lib/data_migrate/schema_migration.rb +++ b/lib/data_migrate/schema_migration.rb @@ -7,14 +7,14 @@ class SchemaMigration def self.pending_schema_migrations all_migrations = DataMigrate::MigrationContext.new(migrations_paths).migrations sort_migrations( - ActiveRecord::Migrator.new(:up, all_migrations, ActiveRecord::Base.connection.schema_migration). + ActiveRecord::Migrator.new(:up, all_migrations, DataMigrate::RailsHelper.schema_migration, DataMigrate::RailsHelper.internal_metadata). pending_migrations. map {|m| { version: m.version, kind: :schema }} ) end def self.run(direction, migration_paths, version) - ActiveRecord::MigrationContext.new(migration_paths, ActiveRecord::Base.connection.schema_migration).run(direction, version) + ActiveRecord::MigrationContext.new(migration_paths, DataMigrate::RailsHelper.schema_migration).run(direction, version) end def self.sort_migrations(set1, set2 = nil) @@ -24,7 +24,8 @@ def self.sort_migrations(set1, set2 = nil) def self.migrations_paths spec_name = DataMigrate.config.spec_name - if spec_name && Gem::Dependency.new("railties", "~> 7.0").match?("railties", Gem.loaded_specs["railties"].version) + # The positional argument true is to include pre-release versions, such as 7.1.0.alpha + if spec_name && Gem::Dependency.new("railties", ">= 7.0").match?("railties", Gem.loaded_specs["railties"].version, true) ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: spec_name).migrations_paths elsif spec_name && Gem::Dependency.new("railties", "~> 6.1").match?("railties", Gem.loaded_specs["railties"].version) ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name).migrations_paths diff --git a/lib/data_migrate/status_service.rb b/lib/data_migrate/status_service.rb index 6ca148c8..2703eabc 100644 --- a/lib/data_migrate/status_service.rb +++ b/lib/data_migrate/status_service.rb @@ -24,11 +24,11 @@ def dump(stream) private def table_name - DataMigrate::DataSchemaMigration.table_name + DataMigrate::RailsHelper.data_schema_migration.table_name end def output(stream) - unless DataMigrate::DataSchemaMigration.table_exists? + unless DataMigrate::RailsHelper.data_schema_migration.table_exists? stream.puts "Data migrations table does not exist yet." return end diff --git a/lib/data_migrate/tasks/data_migrate_tasks.rb b/lib/data_migrate/tasks/data_migrate_tasks.rb index 1c97bdf8..9143610e 100644 --- a/lib/data_migrate/tasks/data_migrate_tasks.rb +++ b/lib/data_migrate/tasks/data_migrate_tasks.rb @@ -50,9 +50,9 @@ def status def status_with_schema db_list_data = ActiveRecord::Base.connection.select_values( - "SELECT version FROM #{DataMigrate::DataSchemaMigration.table_name}" + "SELECT version FROM #{DataMigrate::RailsHelper.data_schema_migration.table_name}" ) - db_list_schema = ActiveRecord::SchemaMigration.all.pluck(:version) + db_list_schema = DataMigrate::RailsHelper.schema_migration_versions file_list = [] Dir.foreach(File.join(Rails.root, migrations_paths)) do |file| diff --git a/spec/data_migrate/data_migrator_spec.rb b/spec/data_migrate/data_migrator_spec.rb index 82d8a073..649e8d6f 100644 --- a/spec/data_migrate/data_migrator_spec.rb +++ b/spec/data_migrate/data_migrator_spec.rb @@ -3,7 +3,8 @@ require "spec_helper" describe DataMigrate::DataMigrator do - let(:subject) { DataMigrate::DataMigrator } + let(:described_class) { DataMigrate::DataMigrator } + let(:db_config) do { adapter: "sqlite3", @@ -13,8 +14,8 @@ before do ActiveRecord::Base.establish_connection(db_config) - ::ActiveRecord::SchemaMigration.create_table - DataMigrate::DataSchemaMigration.create_table + DataMigrate::RailsHelper.schema_migration.create_table + DataMigrate::RailsHelper.data_schema_migration.create_table end after do @@ -23,12 +24,14 @@ end describe ".load_migrated" do + let(:migrator) { DataMigrate::RailsHelper.data_migrator(:up, []) } + it "loads migrated versions" do - DataMigrate::DataSchemaMigration.create(version: 20090000000000) - ::ActiveRecord::SchemaMigration.create(version: 20100000000000) - DataMigrate::DataSchemaMigration.create(version: 20110000000000) - ::ActiveRecord::SchemaMigration.create(version: 20120000000000) - migrated = subject.new(:up, []).load_migrated + DataMigrate::RailsHelper.data_schema_migration.create_version(20090000000000) + DataMigrate::RailsHelper.schema_create_version(20100000000000) + DataMigrate::RailsHelper.data_schema_migration.create_version(20110000000000) + DataMigrate::RailsHelper.schema_create_version(20120000000000) + migrated = migrator.load_migrated expect(migrated.count).to eq 2 expect(migrated).to include 20090000000000 expect(migrated).to include 20110000000000 @@ -38,7 +41,7 @@ describe :create_data_schema_table do it "creates the data_migrations table" do ActiveRecord::Migration.drop_table("data_migrations") rescue nil - subject.create_data_schema_table + described_class.create_data_schema_table expect( ActiveRecord::Base.connection.table_exists?("data_migrations") ).to eq true @@ -47,7 +50,7 @@ describe "#migrations_status" do it "returns all migrations statuses" do - status = subject.migrations_status + status = described_class.migrations_status expect(status.length).to eq 2 expect(status.first).to eq ["down", "20091231235959", "Some name"] expect(status.second).to eq ["down", "20171231235959", "Super update"] @@ -57,19 +60,19 @@ describe :match do context "when the file does not match" do it "returns nil" do - expect(subject.match("not_a_data_migration_file")).to be_nil + expect(described_class.match("not_a_data_migration_file")).to be_nil end end context "when the file doesn't end in .rb" do it "returns nil" do - expect(subject.match("20091231235959_some_name.rb.un~")).to be_nil + expect(described_class.match("20091231235959_some_name.rb.un~")).to be_nil end end context "when the file matches" do it "returns a valid MatchData object" do - match_data = subject.match("20091231235959_some_name.rb") + match_data = described_class.match("20091231235959_some_name.rb") expect(match_data[0]).to eq "20091231235959_some_name.rb" expect(match_data[1]).to eq "20091231235959" diff --git a/spec/data_migrate/data_schema_migration_spec.rb b/spec/data_migrate/data_schema_migration_spec.rb index f7133b78..5a6cc362 100644 --- a/spec/data_migrate/data_schema_migration_spec.rb +++ b/spec/data_migrate/data_schema_migration_spec.rb @@ -1,16 +1,33 @@ require 'spec_helper' describe DataMigrate::DataSchemaMigration do - let(:subject) { DataMigrate::DataSchemaMigration } - describe :table_name do - it "returns correct table name" do - expect(subject.table_name).to eq("data_migrations") + if DataMigrate::RailsHelper.rails_version_equal_to_or_higher_than_7_1 + let(:connection) { double(:connection) } + let(:subject) { DataMigrate::DataSchemaMigration.new(connection) } + + describe :table_name do + it "returns correct table name" do + expect(subject.table_name).to eq("data_migrations") + end + end + + describe :index_name do + it "returns correct primary key name" do + expect(subject.primary_key).to eq("version") + end + end + else + let(:subject) { DataMigrate::DataSchemaMigration } + describe :table_name do + it "returns correct table name" do + expect(subject.table_name).to eq("data_migrations") + end end - end - describe :index_name do - it "returns correct primary key name" do - expect(subject.primary_key).to eq("version") + describe :index_name do + it "returns correct primary key name" do + expect(subject.primary_key).to eq("version") + end end end end diff --git a/spec/data_migrate/data_spec.rb b/spec/data_migrate/data_spec.rb index f1416f27..1763bc6e 100644 --- a/spec/data_migrate/data_spec.rb +++ b/spec/data_migrate/data_spec.rb @@ -55,7 +55,7 @@ sql_select = <<-SQL SELECT version - FROM #{DataMigrate::DataSchemaMigration.table_name} + FROM #{DataMigrate::RailsHelper.data_schema_migration.table_name} SQL db_list_data = ActiveRecord::Base.connection. diff --git a/spec/data_migrate/database_tasks_spec.rb b/spec/data_migrate/database_tasks_spec.rb index 77afc946..1e0406f1 100644 --- a/spec/data_migrate/database_tasks_spec.rb +++ b/spec/data_migrate/database_tasks_spec.rb @@ -28,13 +28,9 @@ data_migrations_path } ActiveRecord::Base.establish_connection(db_config) - if Gem::Dependency.new("railties", ">= 6.1").match?("railties", Gem.loaded_specs["railties"].version) - hash_config = ActiveRecord::DatabaseConfigurations::HashConfig.new('test', 'test', db_config) - config_obj = ActiveRecord::DatabaseConfigurations.new([hash_config]) - allow(ActiveRecord::Base).to receive(:configurations).and_return(config_obj) - else - ActiveRecord::Base.configurations[:test] = db_config - end + hash_config = ActiveRecord::DatabaseConfigurations::HashConfig.new('test', 'test', db_config) + config_obj = ActiveRecord::DatabaseConfigurations.new([hash_config]) + allow(ActiveRecord::Base).to receive(:configurations).and_return(config_obj) end context "migrations" do @@ -44,7 +40,7 @@ end before do - ActiveRecord::SchemaMigration.create_table + DataMigrate::RailsHelper.schema_migration.create_table allow(DataMigrate::SchemaMigration).to receive(:migrations_paths) { migration_path @@ -72,16 +68,16 @@ it "run forward default amount of times" do subject.forward - versions = DataMigrate::DataSchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions expect(versions.count).to eq(1) end it "run forward defined number of times" do subject.forward(2) - versions = DataMigrate::DataSchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions expect(versions.count).to eq(1) expect(versions.first).to eq "20091231235959" - versions = ActiveRecord::SchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.schema_migration.normalized_versions expect(versions.count).to eq(1) expect(versions.first).to eq "20131111111111" end diff --git a/spec/data_migrate/legacy_migrator_spec.rb b/spec/data_migrate/legacy_migrator_spec.rb deleted file mode 100644 index b9d4ee59..00000000 --- a/spec/data_migrate/legacy_migrator_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -describe DataMigrate::LegacyMigrator do - let(:context) { - DataMigrate::MigrationContext.new("spec/db/data") - } - - before do - ActiveRecord::SchemaMigration.create_table - DataMigrate::DataSchemaMigration.create_table - end - - after do - ActiveRecord::Migration.drop_table("data_migrations") rescue nil - ActiveRecord::Migration.drop_table("schema_migrations") rescue nil - end - - it "migrate legacy migrations to be in correct table" do - # simulate creation of legacy data migration when - # it was recorded in schema table - ActiveRecord::SchemaMigration.create(version: "20091231235959") - - # create one migration in correct place - DataMigrate::DataSchemaMigration.create(version: "20171231235959") - - migrated = DataMigrate::DataMigrator.new(:up, []).load_migrated - expect(migrated.count).to eq 1 - - DataMigrate::LegacyMigrator.new("spec/db/data").migrate - - # after migacy migrator has been run, we should have records - # of both migrations - migrated = DataMigrate::DataMigrator .new(:up, []).load_migrated - expect(migrated.count).to eq 2 - end -end diff --git a/spec/data_migrate/migration_context_spec.rb b/spec/data_migrate/migration_context_spec.rb index 182948fb..c80155d4 100644 --- a/spec/data_migrate/migration_context_spec.rb +++ b/spec/data_migrate/migration_context_spec.rb @@ -5,10 +5,17 @@ describe DataMigrate::DataMigrator do let(:context) { DataMigrate::MigrationContext.new("spec/db/data") } let(:schema_context) { ActiveRecord::MigrationContext.new("spec/db/migrate", ActiveRecord::Base.connection.schema_migration) } + let(:db_config) do + { + adapter: "sqlite3", + database: "spec/db/test.db" + } + end before do - ActiveRecord::SchemaMigration.create_table - DataMigrate::DataSchemaMigration.create_table + ActiveRecord::Base.establish_connection(db_config) + DataMigrate::RailsHelper.schema_migration.create_table + DataMigrate::RailsHelper.data_schema_migration.create_table end after do @@ -20,7 +27,7 @@ it "migrates existing file" do context.migrate(nil) context.migrations_status - versions = DataMigrate::DataSchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions expect(versions.count).to eq(2) expect(versions).to include("20091231235959") expect(versions).to include("20171231235959") @@ -29,7 +36,7 @@ it "undo migration" do context.migrate(nil) context.run(:down, 20171231235959) - versions = DataMigrate::DataSchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions expect(versions.count).to eq(1) expect(versions).to include("20091231235959") end @@ -46,7 +53,7 @@ it "runs a specific migration" do context.run(:up, 20171231235959) - versions = DataMigrate::DataSchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions expect(versions.count).to eq(1) expect(versions).to include("20171231235959") end @@ -74,7 +81,7 @@ expect { context.rollback }.to output(/Undoing SuperUpdate/).to_stdout - versions = DataMigrate::DataSchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions expect(versions.count).to eq(1) expect(versions).to include("20091231235959") end @@ -85,7 +92,7 @@ expect { context.rollback(2) }.to output(/Undoing SomeName/).to_stdout - versions = DataMigrate::DataSchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions expect(versions.count).to eq(0) end @@ -94,7 +101,7 @@ expect { context.rollback(2) }.to output(/Undoing SomeName/).to_stdout - versions = DataMigrate::DataSchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.data_schema_migration.normalized_versions expect(versions.count).to eq(0) end end diff --git a/spec/data_migrate/schema_dumper_spec.rb b/spec/data_migrate/schema_dumper_spec.rb index 1d57588c..c91a4524 100644 --- a/spec/data_migrate/schema_dumper_spec.rb +++ b/spec/data_migrate/schema_dumper_spec.rb @@ -9,9 +9,12 @@ end before do - ActiveRecord::SchemaMigration.create_table - DataMigrate::DataSchemaMigration.create_table - DataMigrate::DataSchemaMigration.create(fixture_file_timestamps.map { |t| { version: t } }) + DataMigrate::RailsHelper.schema_migration.create_table + DataMigrate::RailsHelper.data_schema_migration.create_table + + fixture_file_timestamps.map do |t| + DataMigrate::RailsHelper.data_schema_migration.create_version(t) + end end after do diff --git a/spec/data_migrate/schema_migration_spec.rb b/spec/data_migrate/schema_migration_spec.rb index 6f73e221..989bd82e 100644 --- a/spec/data_migrate/schema_migration_spec.rb +++ b/spec/data_migrate/schema_migration_spec.rb @@ -8,10 +8,17 @@ let(:fixture_file_timestamps) do %w[20091231235959 20101231235959 20111231235959] end + let(:db_config) do + { + adapter: "sqlite3", + database: "spec/db/test.db" + } + end before do - ActiveRecord::SchemaMigration.create_table - DataMigrate::DataSchemaMigration.create_table + ActiveRecord::Base.establish_connection(db_config) + DataMigrate::RailsHelper.schema_migration.create_table + DataMigrate::RailsHelper.data_schema_migration.create_table end after do @@ -38,7 +45,7 @@ expect { subject.run(:up, migration_path, 20202020202011) }.to output(/20202020202011 DbMigration: migrating/).to_stdout - versions = ActiveRecord::SchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.schema_migration.normalized_versions expect(versions.first).to eq("20202020202011") end @@ -49,7 +56,7 @@ subject.run(:down, migration_path, 20202020202011) }.to output(/Undoing DbMigration/).to_stdout - versions = ActiveRecord::SchemaMigration.normalized_versions + versions = DataMigrate::RailsHelper.schema_migration.normalized_versions expect(versions.count).to eq(0) end @@ -63,7 +70,7 @@ let(:config_options) do if Gem::Dependency.new("railties", "~> 6.1").match?("railties", Gem.loaded_specs["railties"].version) { env_name: Rails.env, spec_name: specification_name } - elsif Gem::Dependency.new("railties", "~> 7.0").match?("railties", Gem.loaded_specs["railties"].version) + else { env_name: Rails.env, name: specification_name } end end diff --git a/spec/data_migrate/status_service_spec.rb b/spec/data_migrate/status_service_spec.rb index ad610a89..18339680 100644 --- a/spec/data_migrate/status_service_spec.rb +++ b/spec/data_migrate/status_service_spec.rb @@ -33,9 +33,12 @@ end before do - ActiveRecord::SchemaMigration.create_table - DataMigrate::DataSchemaMigration.create_table - DataMigrate::DataSchemaMigration.create(fixture_file_timestamps.map { |t| { version: t } }) + DataMigrate::RailsHelper.schema_migration.create_table + DataMigrate::RailsHelper.data_schema_migration.create_table + + fixture_file_timestamps.map do |t| + DataMigrate::RailsHelper.data_schema_migration.create_version(t) + end subject.dump(connection_db_config, stream) stream.rewind diff --git a/spec/data_migrate/tasks/data_migrate_tasks_spec.rb b/spec/data_migrate/tasks/data_migrate_tasks_spec.rb index 50792d95..0323df05 100644 --- a/spec/data_migrate/tasks/data_migrate_tasks_spec.rb +++ b/spec/data_migrate/tasks/data_migrate_tasks_spec.rb @@ -3,17 +3,17 @@ require "spec_helper" describe DataMigrate::Tasks::DataMigrateTasks do - let(:connection_db_config) do - if Gem::Dependency.new("railties", ">= 6.1").match?("railties", Gem.loaded_specs["railties"].version) - ActiveRecord::Base.connection_db_config - else - ActiveRecord::Base.configurations.configs_for.first - end + let(:db_config) do + { + adapter: "sqlite3", + database: "spec/db/test.db" + } end before do - ActiveRecord::SchemaMigration.create_table - DataMigrate::DataSchemaMigration.create_table + ActiveRecord::Base.establish_connection(db_config) + DataMigrate::RailsHelper.schema_migration.create_table + DataMigrate::RailsHelper.data_schema_migration.create_table end after do