From 9dda06181ebbc63d1fe78069080ce8d9db9d71b6 Mon Sep 17 00:00:00 2001 From: Christoph Sassenberg Date: Mon, 5 Sep 2022 16:15:03 +0200 Subject: [PATCH 01/19] Delegate to anonymous subclass of AR::SchemaMigration --- lib/data_migrate/data_schema_migration.rb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/data_migrate/data_schema_migration.rb b/lib/data_migrate/data_schema_migration.rb index 74b111fe..70fdf463 100644 --- a/lib/data_migrate/data_schema_migration.rb +++ b/lib/data_migrate/data_schema_migration.rb @@ -1,15 +1,14 @@ module DataMigrate - class DataSchemaMigration < ::ActiveRecord::SchemaMigration - + class DataSchemaMigration class << self - def table_name - ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix - end + delegate :table_name, :primary_key, :create_table, :normalized_versions, :create, :create!, :table_exists?, :where, to: :instance - def primary_key - "version" + def instance + @instance ||= Class.new(::ActiveRecord::SchemaMigration) do + define_singleton_method(:table_name) { ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix } + define_singleton_method(:primary_key) { "version" } + end end end end end - From 60fc88db789d9b1895fd3a5de9e98670438dd14b Mon Sep 17 00:00:00 2001 From: Ilya Katz Date: Mon, 24 Oct 2022 12:46:08 -0700 Subject: [PATCH 02/19] Bump version --- Changelog.md | 4 ++++ lib/data_migrate/version.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 8d10e97d..4d21d5f7 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,9 @@ # Changelog +## 8.2.0 + +Delegate to anonymous subclass of AR::SchemaMigration [foxondo](https://github.com/foxondo) + ## 8.1.1 Revert 8.1.0 changes diff --git a/lib/data_migrate/version.rb b/lib/data_migrate/version.rb index bad20f4c..1962fc48 100644 --- a/lib/data_migrate/version.rb +++ b/lib/data_migrate/version.rb @@ -1,3 +1,3 @@ module DataMigrate - VERSION = "8.1.1".freeze + VERSION = "8.2.0".freeze end From 0a27cb0640f3929184b487a01360c7382bfd0455 Mon Sep 17 00:00:00 2001 From: Christoph Sassenberg Date: Mon, 14 Nov 2022 14:02:21 +0100 Subject: [PATCH 03/19] Add delegation to exists? for use by third parties --- lib/data_migrate/data_schema_migration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/data_migrate/data_schema_migration.rb b/lib/data_migrate/data_schema_migration.rb index 70fdf463..68316664 100644 --- a/lib/data_migrate/data_schema_migration.rb +++ b/lib/data_migrate/data_schema_migration.rb @@ -1,7 +1,7 @@ module DataMigrate class DataSchemaMigration class << self - delegate :table_name, :primary_key, :create_table, :normalized_versions, :create, :create!, :table_exists?, :where, to: :instance + delegate :table_name, :primary_key, :create_table, :normalized_versions, :create, :create!, :table_exists?, :exists?, :where, to: :instance def instance @instance ||= Class.new(::ActiveRecord::SchemaMigration) do From 04d304282aeedeae44c9bd16db3e7067b80c41b5 Mon Sep 17 00:00:00 2001 From: Ilya Katz Date: Wed, 7 Dec 2022 11:41:03 -0800 Subject: [PATCH 04/19] Update docs for 8.3.0 --- Changelog.md | 4 ++++ lib/data_migrate/version.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 4d21d5f7..dc4d10d1 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,9 @@ # Changelog +## 8.3.0 + +Add delegation to exists? for use by third parties [foxondo](https://github.com/foxondo) + ## 8.2.0 Delegate to anonymous subclass of AR::SchemaMigration [foxondo](https://github.com/foxondo) diff --git a/lib/data_migrate/version.rb b/lib/data_migrate/version.rb index 1962fc48..26b43b09 100644 --- a/lib/data_migrate/version.rb +++ b/lib/data_migrate/version.rb @@ -1,3 +1,3 @@ module DataMigrate - VERSION = "8.2.0".freeze + VERSION = "8.3.0".freeze end From 6358268e77a5742e06bea9e9c73770c9d0dce8b5 Mon Sep 17 00:00:00 2001 From: Bernie Chiu Date: Sun, 27 Feb 2022 15:42:38 +0800 Subject: [PATCH 05/19] Avoid globally accessible functions for all rake tasks to prevent collision --- lib/data_migrate/database_tasks.rb | 35 ++++++++- tasks/databases.rake | 118 +++++++++-------------------- 2 files changed, 68 insertions(+), 85 deletions(-) diff --git a/lib/data_migrate/database_tasks.rb b/lib/data_migrate/database_tasks.rb index 6a31caef..da8de54a 100644 --- a/lib/data_migrate/database_tasks.rb +++ b/lib/data_migrate/database_tasks.rb @@ -47,6 +47,40 @@ def check_schema_file(filename) Kernel.abort message end end + + def pending_migrations + sort_migrations( + pending_schema_migrations, + pending_data_migrations + ) + end + + def sort_migrations set_1, set_2=nil + migrations = set_1 + (set_2 || []) + migrations.sort{|a,b| sort_string(a) <=> sort_string(b)} + end + + def sort_string migration + "#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}" + end + + def data_migrations_path + ::DataMigrate.config.data_migrations_path + end + + def run_migration(migration, direction) + if migration[:kind] == :data + ::ActiveRecord::Migration.write("== %s %s" % ['Data', "=" * 71]) + ::DataMigrate::DataMigrator.run(direction, data_migrations_path, migration[:version]) + else + ::ActiveRecord::Migration.write("== %s %s" % ['Schema', "=" * 69]) + ::DataMigrate::SchemaMigration.run( + direction, + ::Continuation::SchemaMigration.migrations_paths, + migration[:version] + ) + end + end end # This overrides ActiveRecord::Tasks::DatabaseTasks @@ -121,6 +155,5 @@ def self.past_migrations(sort = nil) sort == "asc" ? sort_migrations(migrations) : sort_migrations(migrations).reverse end - end end diff --git a/tasks/databases.rake b/tasks/databases.rake index c3630b38..4e8c308a 100644 --- a/tasks/databases.rake +++ b/tasks/databases.rake @@ -4,29 +4,29 @@ namespace :db do namespace :migrate do desc "Migrate the database data and schema (options: VERSION=x, VERBOSE=false)." task :with_data => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true target_version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil migrations = [] if target_version.nil? - migrations = pending_migrations.map{ |m| m.merge(:direction =>:up) } + migrations = DataMigrate::DatabaseTasks.pending_migrations.map{ |m| m.merge(:direction =>:up) } else current_schema_version = ActiveRecord::Migrator.current_version schema_migrations = if target_version > current_schema_version - pending_schema_migrations.keep_if{ |m| m[:version] <= target_version }.map{ |m| m.merge(:direction =>:up) } + DataMigrate::DatabaseTasks.pending_schema_migrations.keep_if{ |m| m[:version] <= target_version }.map{ |m| m.merge(:direction =>:up) } elsif target_version < current_schema_version - past_migrations.keep_if{ |m| m[:version] > target_version }.map{ |m| m.merge(:direction =>:down) } + DataMigrate::DatabaseTasks.past_migrations.keep_if{ |m| m[:version] > target_version }.map{ |m| m.merge(:direction =>:down) } else # == [] end current_data_version = ActiveRecord::Migrator.current_version data_migrations = if target_version > current_data_version - pending_data_migrations.keep_if{ |m| m[:version] <= target_version }.map{ |m| m.merge(:direction =>:up) } + DataMigrate::DatabaseTasks.pending_data_migrations.keep_if{ |m| m[:version] <= target_version }.map{ |m| m.merge(:direction =>:up) } elsif target_version < current_data_version - past_migrations.keep_if{ |m| m[:version] > target_version }.map{ |m| m.merge(:direction =>:down) } + DataMigrate::DatabaseTasks.past_migrations.keep_if{ |m| m[:version] > target_version }.map{ |m| m.merge(:direction =>:down) } else # == [] end @@ -35,9 +35,9 @@ namespace :db do elsif data_migrations.empty? schema_migrations elsif target_version > current_data_version && target_version > current_schema_version - sort_migrations data_migrations, schema_migrations + DataMigrate::DatabaseTasks.sort_migrations data_migrations, schema_migrations elsif target_version < current_data_version && target_version < current_schema_version - sort_migrations(data_migrations, schema_migrations).reverse + DataMigrate::DatabaseTasks.sort_migrations(data_migrations, schema_migrations).reverse elsif target_version > current_data_version && target_version < current_schema_version schema_migrations + data_migrations elsif target_version < current_data_version && target_version > current_schema_version @@ -46,7 +46,7 @@ namespace :db do end migrations.each do |migration| - run_migration(migration, migration[:direction]) + DataMigrate::DatabaseTasks.run_migration(migration, migration[:direction]) end Rake::Task["db:_dump"].invoke @@ -56,7 +56,7 @@ namespace :db do namespace :redo do desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).' task :with_data => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table if ENV["VERSION"] Rake::Task["db:migrate:down:with_data"].invoke Rake::Task["db:migrate:up:with_data"].invoke @@ -72,16 +72,16 @@ namespace :db do task :with_data => :environment do version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil raise "VERSION is required" unless version - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table run_both = ENV["BOTH"] == "true" - migrations = pending_migrations.keep_if{|m| m[:version] == version} + migrations = DataMigrate::DatabaseTasks.pending_migrations.keep_if{|m| m[:version] == version} unless run_both || migrations.size < 2 migrations = migrations.slice(0,1) end migrations.each do |migration| - run_migration(migration, :up) + DataMigrate::DatabaseTasks.run_migration(migration, :up) end Rake::Task["db:_dump"].invoke @@ -94,16 +94,16 @@ namespace :db do task :with_data => :environment do version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil raise "VERSION is required" unless version - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table run_both = ENV["BOTH"] == "true" - migrations = past_migrations.keep_if{|m| m[:version] == version} + migrations = DataMigrate::DatabaseTasks.past_migrations.keep_if{|m| m[:version] == version} unless run_both || migrations.size < 2 migrations = migrations.slice(0,1) end migrations.each do |migration| - run_migration(migration, :down) + DataMigrate::DatabaseTasks.run_migration(migration, :down) end Rake::Task["db:_dump"].invoke @@ -123,9 +123,9 @@ namespace :db do desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).' task :with_data => :environment do step = ENV['STEP'] ? ENV['STEP'].to_i : 1 - assure_data_schema_table - past_migrations[0..(step - 1)].each do | past_migration | - run_migration(past_migration, :down) + DataMigrate::DataMigrator.assure_data_schema_table + DataMigrate::DatabaseTasks.past_migrations[0..(step - 1)].each do | past_migration | + DataMigrate::DatabaseTasks.run_migration(past_migration, :down) end Rake::Task["db:_dump"].invoke @@ -136,7 +136,7 @@ namespace :db do namespace :forward do desc 'Pushes the schema to the next version (specify steps w/ STEP=n).' task :with_data => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table step = ENV['STEP'] ? ENV['STEP'].to_i : 1 DataMigrate::DatabaseTasks.forward(step) Rake::Task["db:_dump"].invoke @@ -147,7 +147,7 @@ namespace :db do namespace :version do desc "Retrieves the current schema version numbers for data and schema migrations" task :with_data => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table puts "Current Schema version: #{ActiveRecord::Migrator.current_version}" puts "Current Data version: #{DataMigrate::DataMigrator.current_version}" end @@ -157,7 +157,7 @@ namespace :db do desc "Raises an error if there are pending migrations or data migrations" task with_data: :environment do message = %{Run `rake db:migrate:with_data` to update your database then try again.} - DataMigrate::Tasks::DataMigrateTasks.abort_if_pending_migrations(pending_migrations, message) + DataMigrate::Tasks::DataMigrateTasks.abort_if_pending_migrations(DataMigrate::DatabaseTasks.pending_migrations, message) end end @@ -200,7 +200,7 @@ namespace :data do namespace :migrate do desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).' task :redo => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table if ENV["VERSION"] Rake::Task["data:migrate:down"].invoke Rake::Task["data:migrate:up"].invoke @@ -212,10 +212,10 @@ namespace :data do desc 'Runs the "up" for a given migration VERSION.' task :up => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil raise "VERSION is required" unless version - DataMigrate::DataMigrator.run(:up, data_migrations_path, version) + DataMigrate::DataMigrator.run(:up, DataMigrate::DatabaseTasks.data_migrations_path, version) Rake::Task["data:dump"].invoke end @@ -223,8 +223,8 @@ namespace :data do task :down => :environment do version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil raise "VERSION is required" unless version - assure_data_schema_table - DataMigrate::DataMigrator.run(:down, data_migrations_path, version) + DataMigrate::DataMigrator.assure_data_schema_table + DataMigrate::DataMigrator.run(:down, DataMigrate::DatabaseTasks.data_migrations_path, version) Rake::Task["data:dump"].invoke end @@ -236,35 +236,35 @@ namespace :data do desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).' task :rollback => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table step = ENV['STEP'] ? ENV['STEP'].to_i : 1 - DataMigrate::DataMigrator.rollback(data_migrations_path, step) + DataMigrate::DataMigrator.rollback(DataMigrate::DatabaseTasks.data_migrations_path, step) Rake::Task["data:dump"].invoke end desc 'Pushes the schema to the next version (specify steps w/ STEP=n).' task :forward => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table step = ENV['STEP'] ? ENV['STEP'].to_i : 1 # TODO: No worky for .forward # DataMigrate::DataMigrator.forward('db/data/', step) - migrations = pending_data_migrations.reverse.pop(step).reverse + migrations = DataMigrate::DatabaseTasks.pending_data_migrations.reverse.pop(step).reverse migrations.each do | pending_migration | - DataMigrate::DataMigrator.run(:up, data_migrations_path, pending_migration[:version]) + DataMigrate::DataMigrator.run(:up, DataMigrate::DatabaseTasks.data_migrations_path, pending_migration[:version]) end Rake::Task["data:dump"].invoke end desc "Retrieves the current schema version number for data migrations" task :version => :environment do - assure_data_schema_table + DataMigrate::DataMigrator.assure_data_schema_table puts "Current data version: #{DataMigrate::DataMigrator.current_version}" end desc "Raises an error if there are pending data migrations" task abort_if_pending_migrations: :environment do message = %{Run `rake data:migrate` to update your database then try again.} - DataMigrate::Tasks::DataMigrateTasks.abort_if_pending_migrations(pending_data_migrations, message) + DataMigrate::Tasks::DataMigrateTasks.abort_if_pending_migrations(DataMigrate::DatabaseTasks.pending_data_migrations, message) end desc "Create a db/data_schema.rb file that stores the current data version" @@ -287,53 +287,3 @@ namespace :data do end end end - -def pending_migrations - DataMigrate::DatabaseTasks.sort_migrations( - DataMigrate::DatabaseTasks.pending_schema_migrations, - DataMigrate::DatabaseTasks.pending_data_migrations - ) -end - -def pending_data_migrations - DataMigrate::DatabaseTasks.pending_data_migrations -end - -def pending_schema_migrations - DataMigrate::DatabaseTasks.pending_schema_migrations -end - -def sort_migrations set_1, set_2=nil - migrations = set_1 + (set_2 || []) - migrations.sort{|a,b| sort_string(a) <=> sort_string(b)} -end - -def sort_string migration - "#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}" -end - -def past_migrations(sort=nil) - DataMigrate::DatabaseTasks.past_migrations(sort) -end - -def assure_data_schema_table - DataMigrate::DataMigrator.assure_data_schema_table -end - -def data_migrations_path - DataMigrate.config.data_migrations_path -end - -def run_migration(migration, direction) - if migration[:kind] == :data - ActiveRecord::Migration.write("== %s %s" % ['Data', "=" * 71]) - DataMigrate::DataMigrator.run(direction, data_migrations_path, migration[:version]) - else - ActiveRecord::Migration.write("== %s %s" % ['Schema', "=" * 69]) - DataMigrate::SchemaMigration.run( - direction, - DataMigrate::SchemaMigration.migrations_paths, - migration[:version] - ) - end -end From 88d4737e904b99299dff48d085189cadd1f1e2a2 Mon Sep 17 00:00:00 2001 From: Ilya Katz Date: Sat, 10 Dec 2022 14:58:30 -0800 Subject: [PATCH 06/19] Bump version and description --- Changelog.md | 4 ++++ lib/data_migrate/version.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index dc4d10d1..37fbb9b7 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,9 @@ # Changelog +## 8.4.0 + +Avoid Globally Accessible Functions for All Rake Tasks [berniechiu](https://github.com/berniechiu) + ## 8.3.0 Add delegation to exists? for use by third parties [foxondo](https://github.com/foxondo) diff --git a/lib/data_migrate/version.rb b/lib/data_migrate/version.rb index 26b43b09..f218b08d 100644 --- a/lib/data_migrate/version.rb +++ b/lib/data_migrate/version.rb @@ -1,3 +1,3 @@ module DataMigrate - VERSION = "8.3.0".freeze + VERSION = "8.4.0".freeze end From a0b638a824c0b78db66e894e5dd5cb56dc44a141 Mon Sep 17 00:00:00 2001 From: Bernie Chiu Date: Mon, 12 Dec 2022 14:22:45 +0800 Subject: [PATCH 07/19] Fix wrong module class was called --- lib/data_migrate/database_tasks.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/data_migrate/database_tasks.rb b/lib/data_migrate/database_tasks.rb index da8de54a..94f6c15f 100644 --- a/lib/data_migrate/database_tasks.rb +++ b/lib/data_migrate/database_tasks.rb @@ -76,7 +76,7 @@ def run_migration(migration, direction) ::ActiveRecord::Migration.write("== %s %s" % ['Schema', "=" * 69]) ::DataMigrate::SchemaMigration.run( direction, - ::Continuation::SchemaMigration.migrations_paths, + ::DataMigrate::SchemaMigration.migrations_paths, migration[:version] ) end From 0285b509f56ea580114f91853a775bfce24bbf25 Mon Sep 17 00:00:00 2001 From: Ilya Katz Date: Mon, 12 Dec 2022 11:08:48 -0800 Subject: [PATCH 08/19] Bump version --- lib/data_migrate/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/data_migrate/version.rb b/lib/data_migrate/version.rb index f218b08d..ad9aa165 100644 --- a/lib/data_migrate/version.rb +++ b/lib/data_migrate/version.rb @@ -1,3 +1,3 @@ module DataMigrate - VERSION = "8.4.0".freeze + VERSION = "8.4.1".freeze end From e13667b66f0f37124f8e8302e4ea94d71bd50230 Mon Sep 17 00:00:00 2001 From: Reid Beels Date: Tue, 13 Dec 2022 10:36:36 -0800 Subject: [PATCH 09/19] Fix current data version lookup in db:migrate:with_data This is a re-creation of #202, which fixes a bug where the AR migration schema version is incorrectly referenced instead of the data migration version. This causes data migrations be to be incorrectly re-run on an otherwise migrated database whenever the most recent schema version is lower than the most recent data version. --- tasks/databases.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/databases.rake b/tasks/databases.rake index 4e8c308a..cd61dc87 100644 --- a/tasks/databases.rake +++ b/tasks/databases.rake @@ -22,7 +22,7 @@ namespace :db do [] end - current_data_version = ActiveRecord::Migrator.current_version + current_data_version = DataMigrate::DataMigrator.current_version data_migrations = if target_version > current_data_version DataMigrate::DatabaseTasks.pending_data_migrations.keep_if{ |m| m[:version] <= target_version }.map{ |m| m.merge(:direction =>:up) } elsif target_version < current_data_version From e767299a3af9b5be310abefbe2a30e482a11bf9f Mon Sep 17 00:00:00 2001 From: Ilya Katz Date: Wed, 14 Dec 2022 12:20:58 -0800 Subject: [PATCH 10/19] Bump version --- lib/data_migrate/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/data_migrate/version.rb b/lib/data_migrate/version.rb index ad9aa165..530cb690 100644 --- a/lib/data_migrate/version.rb +++ b/lib/data_migrate/version.rb @@ -1,3 +1,3 @@ module DataMigrate - VERSION = "8.4.1".freeze + VERSION = "8.4.2".freeze end From 03510458451be338553286b211ea12ea64c6312d Mon Sep 17 00:00:00 2001 From: Baron Bloomer Date: Mon, 21 Nov 2022 12:30:29 +0000 Subject: [PATCH 11/19] [#224] Support custom data migration template --- README.md | 1 + lib/data_migrate/config.rb | 5 +- lib/generators/data_migrate.rb | 17 ++++++- .../data_migration_generator.rb | 6 ++- spec/data_migrate/config_spec.rb | 33 ++++++++++-- .../data_migration_generator_spec.rb | 51 ++++++++++++++++--- 6 files changed, 100 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 629538bc..f550b048 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ You can override this setting in `config/initializers/data_migrate.rb` ```ruby DataMigrate.configure do |config| config.data_migrations_path = 'db/awesomepath/' + config.data_template_path = Rails.root.join("lib", "awesomepath", "custom_data_migration.rb") config.db_configuration = { 'host' => '127.0.0.1', 'database' => 'awesome_database', diff --git a/lib/data_migrate/config.rb b/lib/data_migrate/config.rb index 78ec34d2..426ec409 100644 --- a/lib/data_migrate/config.rb +++ b/lib/data_migrate/config.rb @@ -12,10 +12,13 @@ def config end class Config - attr_accessor :data_migrations_path, :db_configuration, :spec_name + attr_accessor :data_migrations_path, :data_template_path, :db_configuration, :spec_name + + DEFAULT_DATA_TEMPLATE_PATH = "data_migration.rb" def initialize @data_migrations_path = "db/data/" + @data_template_path = DEFAULT_DATA_TEMPLATE_PATH @db_configuration = nil @spec_name = nil end diff --git a/lib/generators/data_migrate.rb b/lib/generators/data_migrate.rb index 2aad73f6..30b9de9c 100644 --- a/lib/generators/data_migrate.rb +++ b/lib/generators/data_migrate.rb @@ -1,9 +1,22 @@ require 'rails/generators/named_base' + module DataMigrate module Generators class DataMigrationGenerator < Rails::Generators::NamedBase #:nodoc: - def self.source_root - @_data_migrate_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), generator_name, 'templates')) + class << self + def source_root + build_data_migrate_source_root + end + + private + + def build_data_migrate_source_root + if DataMigrate.config.data_template_path == DataMigrate::Config::DEFAULT_DATA_TEMPLATE_PATH + File.expand_path(File.join(File.dirname(__FILE__), generator_name, 'templates')) + else + File.expand_path(File.dirname(DataMigrate.config.data_template_path)) + end + end end end end diff --git a/lib/generators/data_migration/data_migration_generator.rb b/lib/generators/data_migration/data_migration_generator.rb index f8279545..b488ec83 100644 --- a/lib/generators/data_migration/data_migration_generator.rb +++ b/lib/generators/data_migration/data_migration_generator.rb @@ -14,7 +14,7 @@ class DataMigrationGenerator < Rails::Generators::NamedBase def create_data_migration set_local_assigns! - migration_template "data_migration.rb", data_migrations_file_path + migration_template template_path, data_migrations_file_path end protected @@ -26,6 +26,10 @@ def set_local_assigns! end end + def template_path + DataMigrate.config.data_template_path + end + def migration_base_class_name "ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]" end diff --git a/spec/data_migrate/config_spec.rb b/spec/data_migrate/config_spec.rb index 58e5caec..6f264bfc 100644 --- a/spec/data_migrate/config_spec.rb +++ b/spec/data_migrate/config_spec.rb @@ -1,12 +1,16 @@ require "spec_helper" describe DataMigrate::Config do - it "sets default data_migrations_path path", :no_override do expect(DataMigrate.config.data_migrations_path).to eq "db/data/" end + it "sets default data_template_path path", :no_override do + expect(DataMigrate.config.data_template_path).to eq DataMigrate::Config::DEFAULT_DATA_TEMPLATE_PATH + end + describe "data migration path configured" do + subject { DataMigrate.config.data_migrations_path } before do @before = DataMigrate.config.data_migrations_path DataMigrate.configure do |config| @@ -20,8 +24,31 @@ end end - it do - expect(DataMigrate.config.data_migrations_path).to eq "db/awesome/" + it "equals the custom data migration path" do + is_expected.to eq "db/awesome/" + end + end + + describe "data template path configured" do + subject { DataMigrate.config.data_template_path } + + before do + @before = DataMigrate.config.data_template_path + DataMigrate.configure do |config| + config.data_template_path = data_template_path + end + end + + let(:data_template_path) { "lib/awesome/templates/data_migration.rb" } + + after do + DataMigrate.configure do |config| + config.data_template_path = @before + end + end + + it "equals the custom data template path" do + is_expected.to eq data_template_path end end end diff --git a/spec/generators/data_migration/data_migration_generator_spec.rb b/spec/generators/data_migration/data_migration_generator_spec.rb index aa870651..3f373056 100644 --- a/spec/generators/data_migration/data_migration_generator_spec.rb +++ b/spec/generators/data_migration/data_migration_generator_spec.rb @@ -4,7 +4,8 @@ require 'generators/data_migration/data_migration_generator' describe DataMigrate::Generators::DataMigrationGenerator do - let(:subject) { DataMigrate::Generators::DataMigrationGenerator } + subject { DataMigrate::Generators::DataMigrationGenerator } + describe :next_migration_number do it "next migration" do Timecop.freeze("2016-12-03 22:15:26 -0800") do @@ -19,14 +20,18 @@ end describe :migration_base_class_name do - let(:subject) { DataMigrate::Generators::DataMigrationGenerator.new(['my_migration']) } + subject { generator.send(:migration_base_class_name) } + + let(:generator) { DataMigrate::Generators::DataMigrationGenerator.new(['my_migration']) } + it "returns the correct base class name" do - expect(subject.send(:migration_base_class_name)).to eq("ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]") + is_expected.to eq("ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]") end end describe :create_data_migration do - let(:subject) { DataMigrate::Generators::DataMigrationGenerator.new(['my_migration']) } + subject { DataMigrate::Generators::DataMigrationGenerator.new(['my_migration']) } + let(:data_migrations_file_path) { 'abc/my_migration.rb' } context 'when custom data migrations path has a trailing slash' do @@ -35,7 +40,7 @@ end it 'returns correct file path' do - expect(subject).to receive(:migration_template).with( + is_expected.to receive(:migration_template).with( 'data_migration.rb', data_migrations_file_path ) @@ -49,7 +54,7 @@ end it 'returns correct file path' do - expect(subject).to receive(:migration_template).with( + is_expected.to receive(:migration_template).with( 'data_migration.rb', data_migrations_file_path ) @@ -57,4 +62,38 @@ end end end + + describe ".source_root" do + subject { described_class.source_root } + + let(:default_source_root) do + File.expand_path( + File.dirname(Bundler.root.join("lib", "generators", "data_migration", "templates", "data_migration.rb")) + ) + end + + it { is_expected.to eq default_source_root } + + context "when DateMigrate.config.data_template_path is set" do + before do + @before = DataMigrate.config.data_template_path + DataMigrate.configure do |config| + config.data_template_path = data_template_path + end + end + + let(:data_template_path) { "lib/awesome/templates/data_migration.rb" } + let(:expected_source_root) { File.expand_path(File.dirname(Bundler.root.join(data_template_path))) } + + after do + DataMigrate.configure do |config| + config.data_template_path = @before + end + end + + it "reads directory from config data template path" do + is_expected.to eq expected_source_root + end + end + end end From eb6da047c2bde41ddce32f7aa940f2c1c949e31f Mon Sep 17 00:00:00 2001 From: Baron Bloomer Date: Mon, 21 Nov 2022 15:56:19 +0000 Subject: [PATCH 12/19] Add DataMigrate.root --- lib/data_migrate.rb | 3 +++ .../data_migration/data_migration_generator_spec.rb | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/data_migrate.rb b/lib/data_migrate.rb index 47096479..5820e5c9 100644 --- a/lib/data_migrate.rb +++ b/lib/data_migrate.rb @@ -19,4 +19,7 @@ end module DataMigrate + def self.root + File.dirname(__dir__) + end end diff --git a/spec/generators/data_migration/data_migration_generator_spec.rb b/spec/generators/data_migration/data_migration_generator_spec.rb index 3f373056..26a92a3d 100644 --- a/spec/generators/data_migration/data_migration_generator_spec.rb +++ b/spec/generators/data_migration/data_migration_generator_spec.rb @@ -68,7 +68,7 @@ let(:default_source_root) do File.expand_path( - File.dirname(Bundler.root.join("lib", "generators", "data_migration", "templates", "data_migration.rb")) + File.dirname(File.join(DataMigrate.root, "lib", "generators", "data_migration", "templates", "data_migration.rb")) ) end @@ -83,7 +83,7 @@ end let(:data_template_path) { "lib/awesome/templates/data_migration.rb" } - let(:expected_source_root) { File.expand_path(File.dirname(Bundler.root.join(data_template_path))) } + let(:expected_source_root) { File.expand_path(File.dirname(File.join(DataMigrate.root, data_template_path))) } after do DataMigrate.configure do |config| From 759a1f8103e9557ee5f20ee35f6101ec941b7b5c Mon Sep 17 00:00:00 2001 From: Baron Bloomer Date: Tue, 22 Nov 2022 11:18:00 +0000 Subject: [PATCH 13/19] Raise error if provided file path cannot be found This will help developers debug issues related to an incorrect file path as early as possible. --- lib/data_migrate.rb | 2 +- lib/data_migrate/config.rb | 6 ++++++ spec/data_migrate/config_spec.rb | 14 +++++++++++++- .../data_migration_generator_spec.rb | 8 +++++--- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/data_migrate.rb b/lib/data_migrate.rb index 5820e5c9..39ce3a88 100644 --- a/lib/data_migrate.rb +++ b/lib/data_migrate.rb @@ -20,6 +20,6 @@ module DataMigrate def self.root - File.dirname(__dir__) + File.dirname(__FILE__) end end diff --git a/lib/data_migrate/config.rb b/lib/data_migrate/config.rb index 426ec409..a7aff17a 100644 --- a/lib/data_migrate/config.rb +++ b/lib/data_migrate/config.rb @@ -22,5 +22,11 @@ def initialize @db_configuration = nil @spec_name = nil end + + def data_template_path=(value) + @data_template_path = value.tap do |path| + raise ArgumentError, "File not found: '#{path}'" unless path == DEFAULT_DATA_TEMPLATE_PATH || File.exists?(path) + end + end end end diff --git a/spec/data_migrate/config_spec.rb b/spec/data_migrate/config_spec.rb index 6f264bfc..60cd0db9 100644 --- a/spec/data_migrate/config_spec.rb +++ b/spec/data_migrate/config_spec.rb @@ -39,7 +39,9 @@ end end - let(:data_template_path) { "lib/awesome/templates/data_migration.rb" } + let(:data_template_path) do + File.join(DataMigrate.root, "generators", "data_migration", "templates", "data_migration.rb") + end after do DataMigrate.configure do |config| @@ -50,5 +52,15 @@ it "equals the custom data template path" do is_expected.to eq data_template_path end + + context "when path does not exist" do + subject { DataMigrate.config.data_template_path = invalid_path } + + let(:invalid_path) { "lib/awesome/templates/data_migration.rb" } + + it "checks that file exists on setting config var" do + expect { subject }.to raise_error { ArgumentError.new("File not found: '#{data_template_path}'") } + end + end end end diff --git a/spec/generators/data_migration/data_migration_generator_spec.rb b/spec/generators/data_migration/data_migration_generator_spec.rb index 26a92a3d..47547154 100644 --- a/spec/generators/data_migration/data_migration_generator_spec.rb +++ b/spec/generators/data_migration/data_migration_generator_spec.rb @@ -68,7 +68,7 @@ let(:default_source_root) do File.expand_path( - File.dirname(File.join(DataMigrate.root, "lib", "generators", "data_migration", "templates", "data_migration.rb")) + File.dirname(File.join(DataMigrate.root, "generators", "data_migration", "templates", "data_migration.rb")) ) end @@ -82,8 +82,10 @@ end end - let(:data_template_path) { "lib/awesome/templates/data_migration.rb" } - let(:expected_source_root) { File.expand_path(File.dirname(File.join(DataMigrate.root, data_template_path))) } + let(:data_template_path) do + File.join(DataMigrate.root, "generators", "data_migration", "templates", "data_migration.rb") + end + let(:expected_source_root) { File.dirname(data_template_path) } after do DataMigrate.configure do |config| From 92891bb008ad130cfd4db7f6216cbc818ec6c366 Mon Sep 17 00:00:00 2001 From: Ilya Katz Date: Sun, 1 Jan 2023 19:04:25 -0800 Subject: [PATCH 14/19] Bump version --- Changelog.md | 4 ++++ lib/data_migrate/version.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 37fbb9b7..d1f40fb1 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,9 @@ # Changelog +## 8.5.0 + +Allow custom templates [bazay](https://github.com/bazay) + ## 8.4.0 Avoid Globally Accessible Functions for All Rake Tasks [berniechiu](https://github.com/berniechiu) diff --git a/lib/data_migrate/version.rb b/lib/data_migrate/version.rb index 530cb690..af9d0758 100644 --- a/lib/data_migrate/version.rb +++ b/lib/data_migrate/version.rb @@ -1,3 +1,3 @@ module DataMigrate - VERSION = "8.4.2".freeze + VERSION = "8.5.0".freeze end From 8aa2efdead6ffa34260fe996223dd14d84216420 Mon Sep 17 00:00:00 2001 From: Ilya Katz Date: Sun, 1 Jan 2023 19:24:41 -0800 Subject: [PATCH 15/19] Pusg to rubygems from main --- .github/workflows/gempush.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gempush.yml b/.github/workflows/gempush.yml index 2fa3bfa0..4ba95cb6 100644 --- a/.github/workflows/gempush.yml +++ b/.github/workflows/gempush.yml @@ -3,7 +3,7 @@ name: Ruby Gem on: push: branches: - - master + - main jobs: build: From b15900131b4406c64c359992d93df00dc4f1e180 Mon Sep 17 00:00:00 2001 From: Peter Nagy Date: Wed, 4 Jan 2023 11:12:26 +0100 Subject: [PATCH 16/19] Fix #220 Obsolete post install message removed --- data_migrate.gemspec | 9 --------- 1 file changed, 9 deletions(-) diff --git a/data_migrate.gemspec b/data_migrate.gemspec index 1c0762ff..6759751d 100644 --- a/data_migrate.gemspec +++ b/data_migrate.gemspec @@ -38,13 +38,4 @@ Gem::Specification.new do |s| s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } s.require_paths = ["lib"] - - s.post_install_message = <<-POST_INSTALL_MESSAGE -#{"*" * 80} -data-migrate: IMPORTANT: Breaking change introduced for migrations from v2. - -Failure to run the migration can have serious consequences. -See Readme for more info. -#{"*" * 80} -POST_INSTALL_MESSAGE end From 9aefda5375bcdaf50d8382610a7f29571ddb0aa6 Mon Sep 17 00:00:00 2001 From: Gustavo Diel Date: Fri, 23 Sep 2022 13:49:40 -0300 Subject: [PATCH 17/19] feat: fix generation when engines define data migrations path --- lib/generators/data_migration/data_migration_generator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/generators/data_migration/data_migration_generator.rb b/lib/generators/data_migration/data_migration_generator.rb index b488ec83..f2cb5ac6 100644 --- a/lib/generators/data_migration/data_migration_generator.rb +++ b/lib/generators/data_migration/data_migration_generator.rb @@ -39,7 +39,7 @@ def data_migrations_file_path end def data_migrations_path - DataMigrate.config.data_migrations_path + DataMigrate.config.data_migrations_gen_path || DataMigrate.config.data_migrations_path end end end From 9d81103289f3f12f9d684d68061a0705155da340 Mon Sep 17 00:00:00 2001 From: Gustavo Diel Date: Fri, 23 Sep 2022 14:25:52 -0300 Subject: [PATCH 18/19] feat: support engines --- lib/data_migrate/data_migrator_five.rb | 2 +- .../data_migration/data_migration_generator_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/data_migrate/data_migrator_five.rb b/lib/data_migrate/data_migrator_five.rb index 67c3bbab..1ec6a4cd 100644 --- a/lib/data_migrate/data_migrator_five.rb +++ b/lib/data_migrate/data_migrator_five.rb @@ -6,7 +6,7 @@ module DataMigrate class DataMigrator < ActiveRecord::Migrator def self.migrations_paths - [DataMigrate.config.data_migrations_path] + Array.wrap(DataMigrate.config.data_migrations_path) end def self.assure_data_schema_table diff --git a/spec/generators/data_migration/data_migration_generator_spec.rb b/spec/generators/data_migration/data_migration_generator_spec.rb index 47547154..44de8d3e 100644 --- a/spec/generators/data_migration/data_migration_generator_spec.rb +++ b/spec/generators/data_migration/data_migration_generator_spec.rb @@ -36,7 +36,7 @@ context 'when custom data migrations path has a trailing slash' do before do - DataMigrate.config.data_migrations_path = 'abc/' + DataMigrate.config.data_migrations_gen_path = 'abc/' end it 'returns correct file path' do @@ -50,7 +50,7 @@ context 'when custom data migrations path does not have a trailing slash' do before do - DataMigrate.config.data_migrations_path = 'abc' + DataMigrate.config.data_migrations_gen_path = 'abc' end it 'returns correct file path' do From 3807de412e2f91d79861716488389913387c35be Mon Sep 17 00:00:00 2001 From: Chris Blatchley Date: Tue, 31 Jan 2023 11:11:40 -0800 Subject: [PATCH 19/19] fix: iterate through migration dirs --- lib/data_migrate/data_schema.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/data_migrate/data_schema.rb b/lib/data_migrate/data_schema.rb index 605fbfbc..4de8aca1 100644 --- a/lib/data_migrate/data_schema.rb +++ b/lib/data_migrate/data_schema.rb @@ -30,10 +30,12 @@ def migrated def versions @versions ||= begin - versions = [] - Dir.foreach(DataMigrate::DataMigrator.full_migrations_path) do |file| - match_data = DataMigrate::DataMigrator.match(file) - versions << match_data[1].to_i if match_data + versions = Set.new + DataMigrate::DataMigrator.migrations_paths.each do |path| + Dir.foreach(path) do |file| + match_data = DataMigrate::DataMigrator.match(file) + versions << match_data[1].to_i if match_data + end end versions end