data_migrate 7.0.2 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +5 -7
  4. data/Appraisals +4 -8
  5. data/Changelog.md +8 -0
  6. data/Gemfile +0 -7
  7. data/README.md +1 -1
  8. data/gemfiles/{rails_5.1.gemfile → rails_7.0.gemfile} +1 -1
  9. data/lib/data_migrate/database_tasks.rb +14 -0
  10. data/lib/data_migrate/schema_dumper.rb +1 -1
  11. data/lib/data_migrate/status_service_five.rb +6 -2
  12. data/lib/data_migrate/tasks/data_migrate_tasks.rb +93 -8
  13. data/lib/data_migrate/version.rb +1 -1
  14. data/lib/data_migrate.rb +10 -32
  15. data/lib/generators/data_migration/data_migration_generator.rb +1 -7
  16. data/spec/data_migrate/database_tasks_spec.rb +4 -9
  17. data/spec/data_migrate/migration_context_spec.rb +6 -14
  18. data/spec/data_migrate/schema_migration_spec.rb +21 -22
  19. data/spec/data_migrate/tasks/data_migrate_tasks_spec.rb +46 -0
  20. data/spec/generators/data_migration/data_migration_generator_spec.rb +7 -7
  21. data/spec/spec_helper.rb +3 -13
  22. data/tasks/databases.rake +2 -63
  23. metadata +4 -20
  24. data/Gemfile.rails5 +0 -10
  25. data/Gemfile.rails5.1 +0 -10
  26. data/gemfiles/rails_4.1.gemfile +0 -7
  27. data/gemfiles/rails_4.2.gemfile +0 -9
  28. data/gemfiles/rails_5.0.gemfile +0 -8
  29. data/lib/data_migrate/data_migrator.rb +0 -101
  30. data/lib/data_migrate/migration.rb +0 -26
  31. data/lib/data_migrate/migration_five.rb +0 -26
  32. data/lib/data_migrate/schema_migration.rb +0 -31
  33. data/lib/data_migrate/status_service.rb +0 -65
  34. data/spec/db/5.0/20091231235959_some_name.rb +0 -9
  35. data/spec/db/5.0/20171231235959_super_update.rb +0 -9
  36. data/spec/db/migrate/4.2/20131111111111_late_migration.rb +0 -9
  37. data/spec/db/migrate/4.2/20202020202011_db_migration.rb +0 -9
  38. data/spec/db/migrate/5.0/20131111111111_late_migration.rb +0 -9
  39. data/spec/db/migrate/5.0/20202020202011_db_migration.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d029ae70dba905ed85200561697e4e44b62b654ab216d6b20b809737e35f3fc1
4
- data.tar.gz: 39f53a2d2f289d8d55730f9657bbaef454abff395593e354fa31ef11b1a38dd3
3
+ metadata.gz: 86bd9c5c658d19081e2f3832e2637197c53ba841fb779a0424dae6b6d87c6685
4
+ data.tar.gz: 8698b30801c19530248088d6521de33c1688f548e7ce8b218ccd75ca4058bffb
5
5
  SHA512:
6
- metadata.gz: b0e7f347d47d48acab66cb3e700f72321805ee29fbed1bbb7689bfaafb0f7cff6a0add4a62ec847cb0d49dd18b46f9408b3b8d3a2bf56c0fa1c2a75dcabb3277
7
- data.tar.gz: 63a062d5266920ecddd9d18a781f9105390f9188cc9ed6cc4930a99821ab2ed972dae7cb2687de9202c0a26fcf29040eb77aae78215e43401d234685116a7981
6
+ metadata.gz: 4303810721d723a76494aee931ca4026b20590f762d9600f056cafd2e8af3e955067f56c0ecdea271f53aa0c1f82eb1f803078e20dd3483ec2a311a3cb5a2d55
7
+ data.tar.gz: ebee6c3e420f9d272daf4f428cdd71a24f9453fb1b845aee783b1348a45ce18a6539a6d60ce40885f39c8180035c940c71be7a685988fba1780445a8df1bc287
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.1
1
+ 2.7.5
data/.travis.yml CHANGED
@@ -1,16 +1,14 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.6
4
3
  - 2.7
4
+ - 3.0
5
5
  script: bundle exec rspec
6
6
  gemfile:
7
- - gemfiles/rails_5.1.gemfile
8
7
  - gemfiles/rails_5.2.gemfile
9
8
  - gemfiles/rails_6.0.gemfile
10
9
  - gemfiles/rails_6.1.gemfile
11
- matrix:
10
+ - gemfiles/rails_7.0.gemfile
11
+ jobs:
12
12
  exclude:
13
- - rvm: 2.4.4
14
- gemfile: gemfiles/rails_6.0.gemfile
15
- - rvm: 2.4.4
16
- gemfile: gemfiles/rails_6.1.gemfile
13
+ - rvm: 3.0
14
+ gemfile: gemfiles/rails_5.2.gemfile
data/Appraisals CHANGED
@@ -1,11 +1,3 @@
1
- appraise 'rails-5.0' do
2
- gem 'rails', '5.0.7.2'
3
- end
4
-
5
- appraise 'rails-5.1' do
6
- gem 'rails', '5.1.7'
7
- end
8
-
9
1
  appraise 'rails-5.2' do
10
2
  gem 'rails', '~> 5.2.3'
11
3
  end
@@ -17,3 +9,7 @@ end
17
9
  appraise 'rails-6.1' do
18
10
  gem 'rails', '~> 6.1.0'
19
11
  end
12
+
13
+ appraise 'rails-7.0' do
14
+ gem 'rails', '~> 7.0'
15
+ end
data/Changelog.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 8.0.0.rc2
4
+
5
+ Bug fixes [gdott9](https://github.com/gdott9)
6
+
7
+ ## 8.0.0.rc1
8
+ Add support for Rails 7
9
+ Removed support for Rails versions below 5.2. Now are supported only versions Rails 5.2 and up
10
+
3
11
  ## 7.0.2
4
12
 
5
13
  Remove magic comment in migration files [y-yagi](https://github.com/y-yagi)
data/Gemfile CHANGED
@@ -1,11 +1,4 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- # Specify your gem's dependencies in data_migrate.gemspec
4
- %w[
5
- activerecord
6
- railties
7
- ].each do |rails_gem|
8
- gem rails_gem, '~> 6.0.0'
9
- end
10
3
  gem 'sqlite3', "~> 1.4"
11
4
  gemspec
data/README.md CHANGED
@@ -36,7 +36,7 @@ table to track all migrations.
36
36
 
37
37
  ## Rails Support
38
38
 
39
- Support Rails 5.0 through 6.0
39
+ Support Rails 5.2 through 7.0
40
40
 
41
41
  ### Important notes for older versions
42
42
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "http://rubygems.org"
4
4
 
5
- gem "rails", "5.1.7"
6
5
  gem "sqlite3", "~> 1.4"
6
+ gem "rails", "~> 7.0"
7
7
 
8
8
  gemspec path: "../"
@@ -23,6 +23,20 @@ module DataMigrate
23
23
  ENV["DATA_SCHEMA"] || File.join(schema_location, filename)
24
24
  end
25
25
 
26
+ def schema_dump_path(db_config, format = ActiveRecord.schema_format)
27
+ return ENV["DATA_SCHEMA"] if ENV["DATA_SCHEMA"]
28
+
29
+ filename = if db_config.primary?
30
+ schema_file_type(format)
31
+ else
32
+ [db_config.name, schema_file_type(format)].join("_")
33
+ end
34
+
35
+ return unless filename
36
+
37
+ File.dirname(filename) == schema_location ? filename : File.join(schema_location, filename)
38
+ end
39
+
26
40
  def schema_location
27
41
  db_dir
28
42
  end
@@ -8,7 +8,7 @@ module DataMigrate
8
8
  private_class_method :new
9
9
 
10
10
  class << self
11
- def dump(connection = ActiveRecord::Base.connection, stream = STDOUT)
11
+ def dump(connection = ActiveRecord::Base.connection, stream = $stdout)
12
12
  new(connection).dump(stream)
13
13
  stream
14
14
  end
@@ -1,7 +1,7 @@
1
1
  module DataMigrate
2
2
  class StatusService
3
3
  class << self
4
- def dump(connection = ActiveRecord::Base.connection, stream = STDOUT)
4
+ def dump(connection = ActiveRecord::Base.connection, stream = $stdout)
5
5
  new(connection).dump(stream)
6
6
  stream
7
7
  end
@@ -32,7 +32,11 @@ module DataMigrate
32
32
  end
33
33
 
34
34
  # output
35
- stream.puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
35
+ if ActiveRecord.version >= Gem::Version.new('7.0')
36
+ stream.puts "\ndatabase: #{ActiveRecord::Base.connection_db_config.configuration_hash[:database]}\n\n"
37
+ else
38
+ stream.puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
39
+ end
36
40
  stream.puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
37
41
  stream.puts "-" * 50
38
42
  db_list.each do |status, version, name|
@@ -2,12 +2,17 @@ module DataMigrate
2
2
  module Tasks
3
3
  module DataMigrateTasks
4
4
  extend self
5
+
6
+ def schema_migrations_path
7
+ File.join('db', 'migrate')
8
+ end
9
+
5
10
  def migrations_paths
6
11
  @migrations_paths ||= DataMigrate.config.data_migrations_path
7
12
  end
8
13
 
9
14
  def dump
10
- if ActiveRecord::Base.dump_schema_after_migration
15
+ if dump_schema_after_migration?
11
16
  filename = DataMigrate::DatabaseTasks.schema_file
12
17
  ActiveRecord::Base.establish_connection(DataMigrate.config.db_configuration) if DataMigrate.config.db_configuration
13
18
  File.open(filename, "w:utf-8") do |file|
@@ -17,14 +22,10 @@ module DataMigrate
17
22
  end
18
23
 
19
24
  def migrate
20
- DataMigrate::DataMigrator.assure_data_schema_table
21
25
  target_version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
22
- if (Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2) ||
23
- Rails::VERSION::MAJOR == 6
24
- DataMigrate::MigrationContext.new(migrations_paths).migrate(target_version)
25
- else
26
- DataMigrate::DataMigrator.migrate(migrations_paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
27
- end
26
+
27
+ DataMigrate::DataMigrator.assure_data_schema_table
28
+ DataMigrate::MigrationContext.new(migrations_paths).migrate(target_version)
28
29
  end
29
30
 
30
31
  def abort_if_pending_migrations(migrations, message)
@@ -36,6 +37,90 @@ module DataMigrate
36
37
  abort message
37
38
  end
38
39
  end
40
+
41
+ def dump_schema_after_migration?
42
+ if ActiveRecord.respond_to?(:dump_schema_after_migration)
43
+ ActiveRecord.dump_schema_after_migration
44
+ else
45
+ ActiveRecord::Base.dump_schema_after_migration
46
+ end
47
+ end
48
+
49
+ def status
50
+ config = connect_to_database
51
+ return unless config
52
+
53
+ connection = ActiveRecord::Base.connection
54
+ puts "\ndatabase: #{config['database']}\n\n"
55
+ DataMigrate::StatusService.dump(connection)
56
+ end
57
+
58
+ def status_with_schema
59
+ config = connect_to_database
60
+ return unless config
61
+
62
+ db_list_data = ActiveRecord::Base.connection.select_values(
63
+ "SELECT version FROM #{DataMigrate::DataSchemaMigration.table_name}"
64
+ )
65
+ db_list_schema = ActiveRecord::Base.connection.select_values(
66
+ "SELECT version FROM #{ActiveRecord::SchemaMigration.schema_migrations_table_name}"
67
+ )
68
+ file_list = []
69
+
70
+ Dir.foreach(File.join(Rails.root, migrations_paths)) do |file|
71
+ # only files matching "20091231235959_some_name.rb" pattern
72
+ if match_data = /(\d{14})_(.+)\.rb/.match(file)
73
+ status = db_list_data.delete(match_data[1]) ? 'up' : 'down'
74
+ file_list << [status, match_data[1], match_data[2], 'data']
75
+ end
76
+ end
77
+
78
+ Dir.foreach(File.join(Rails.root, schema_migrations_path)) do |file|
79
+ # only files matching "20091231235959_some_name.rb" pattern
80
+ if match_data = /(\d{14})_(.+)\.rb/.match(file)
81
+ status = db_list_schema.delete(match_data[1]) ? 'up' : 'down'
82
+ file_list << [status, match_data[1], match_data[2], 'schema']
83
+ end
84
+ end
85
+
86
+ file_list.sort!{|a,b| "#{a[1]}_#{a[3] == 'data' ? 1 : 0}" <=> "#{b[1]}_#{b[3] == 'data' ? 1 : 0}" }
87
+
88
+ # output
89
+ puts "\ndatabase: #{config['database']}\n\n"
90
+ puts "#{"Status".center(8)} #{"Type".center(8)} #{"Migration ID".ljust(14)} Migration Name"
91
+ puts "-" * 60
92
+ file_list.each do |file|
93
+ puts "#{file[0].center(8)} #{file[3].center(8)} #{file[1].ljust(14)} #{file[2].humanize}"
94
+ end
95
+ db_list_schema.each do |version|
96
+ puts "#{'up'.center(8)} #{version.ljust(14)} *** NO SCHEMA FILE ***"
97
+ end
98
+ db_list_data.each do |version|
99
+ puts "#{'up'.center(8)} #{version.ljust(14)} *** NO DATA FILE ***"
100
+ end
101
+ puts
102
+ end
103
+
104
+ private
105
+
106
+ def connect_to_database
107
+ config = if ActiveRecord.version < Gem::Version.new('6.1')
108
+ ActiveRecord::Base.configurations[Rails.env || 'development']
109
+ else
110
+ ActiveRecord::Base.configurations.find_db_config(Rails.env || 'development').configuration_hash
111
+ end
112
+ ActiveRecord::Base.establish_connection(config)
113
+
114
+ unless DataMigrate::DataSchemaMigration.table_exists?
115
+ puts 'Data migrations table does not exist yet.'
116
+ config = nil
117
+ end
118
+ unless ActiveRecord::SchemaMigration.table_exists?
119
+ puts 'Schema migrations table does not exist yet.'
120
+ config = nil
121
+ end
122
+ config
123
+ end
39
124
  end
40
125
  end
41
126
  end
@@ -1,3 +1,3 @@
1
1
  module DataMigrate
2
- VERSION = "7.0.2".freeze
2
+ VERSION = "8.0.0".freeze
3
3
  end
data/lib/data_migrate.rb CHANGED
@@ -1,44 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if Rails::VERSION::MAJOR == 6
4
- require File.join(File.dirname(__FILE__), "data_migrate", "data_migrator_five")
5
- elsif Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2
6
- require File.join(File.dirname(__FILE__), "data_migrate", "data_migrator_five")
7
- else
8
- require File.join(File.dirname(__FILE__), "data_migrate", "data_migrator")
9
- end
10
- require File.join(File.dirname(__FILE__), "data_migrate",
11
- "data_schema_migration")
3
+ require File.join(File.dirname(__FILE__), "data_migrate", "data_migrator_five")
4
+ require File.join(File.dirname(__FILE__), "data_migrate", "data_schema_migration")
12
5
  require File.join(File.dirname(__FILE__), "data_migrate", "data_schema")
13
6
  require File.join(File.dirname(__FILE__), "data_migrate", "database_tasks")
14
7
  require File.join(File.dirname(__FILE__), "data_migrate", "schema_dumper")
15
- if Rails::VERSION::MAJOR == 6
16
- require File.join(File.dirname(__FILE__), "data_migrate", "status_service_five")
17
- require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration_six")
18
- elsif Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2
19
- require File.join(File.dirname(__FILE__), "data_migrate", "status_service_five")
20
- require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration_five")
21
- else
22
- require File.join(File.dirname(__FILE__), "data_migrate", "status_service")
23
- require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration")
24
- end
25
-
26
- if Rails::VERSION::MAJOR == 6
27
- require File.join(File.dirname(__FILE__), "data_migrate", "migration_context")
28
- # require File.join(File.dirname(__FILE__), "data_migrate", "migration_five")
29
- elsif Rails::VERSION::MAJOR == 5
30
- if Rails::VERSION::MINOR == 2
31
- require File.join(File.dirname(__FILE__), "data_migrate", "migration_context")
32
- else
33
- require File.join(File.dirname(__FILE__), "data_migrate", "migration_five")
34
- end
35
- else
36
- require File.join(File.dirname(__FILE__), "data_migrate", "migration")
37
- end
8
+ require File.join(File.dirname(__FILE__), "data_migrate", "status_service_five")
9
+ require File.join(File.dirname(__FILE__), "data_migrate", "migration_context")
38
10
  require File.join(File.dirname(__FILE__), "data_migrate", "railtie")
39
11
  require File.join(File.dirname(__FILE__), "data_migrate", "tasks/data_migrate_tasks")
40
12
  require File.join(File.dirname(__FILE__), "data_migrate", "legacy_migrator")
41
13
  require File.join(File.dirname(__FILE__), "data_migrate", "config")
42
14
 
15
+ if Rails::VERSION::MAJOR == 5
16
+ require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration_five")
17
+ else
18
+ require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration_six")
19
+ end
20
+
43
21
  module DataMigrate
44
22
  end
@@ -27,13 +27,7 @@ module DataMigrate
27
27
  end
28
28
 
29
29
  def migration_base_class_name
30
- if ActiveRecord.version >= Gem::Version.new("5.0")
31
- "ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]"
32
- elsif ActiveRecord.version >= Gem::Version.new("5.2")
33
- "DataMigrate::MigrationContext"
34
- else
35
- "ActiveRecord::Migration"
36
- end
30
+ "ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]"
37
31
  end
38
32
 
39
33
  def data_migrations_file_path
@@ -5,16 +5,10 @@ require "spec_helper"
5
5
  describe DataMigrate::DatabaseTasks do
6
6
  let(:subject) { DataMigrate::DatabaseTasks }
7
7
  let(:migration_path) {
8
- if Rails::VERSION::MAJOR == 6
9
- "spec/db/migrate/6.0"
10
- elsif Rails::VERSION::MAJOR == 5
11
- if Rails::VERSION::MINOR == 2
12
- "spec/db/migrate/5.2"
13
- else
14
- "spec/db/migrate/5.0"
15
- end
8
+ if Rails::VERSION::MAJOR == 5
9
+ "spec/db/migrate/5.2"
16
10
  else
17
- "spec/db/migrate/4.2"
11
+ "spec/db/migrate/6.0"
18
12
  end
19
13
  }
20
14
  let(:data_migrations_path) {
@@ -32,6 +26,7 @@ describe DataMigrate::DatabaseTasks do
32
26
  # Rails.application.config.paths["db"].first
33
27
  # @see https://github.com/rails/rails/blob/a7d49ef78c36df2d1ca876451f30915ada1079a5/activerecord/lib/active_record/tasks/database_tasks.rb#L54
34
28
  allow(subject).to receive(:db_dir).and_return("db")
29
+ allow(ActiveRecord::Tasks::DatabaseTasks).to receive(:db_dir).and_return("db")
35
30
  end
36
31
 
37
32
  before do
@@ -2,28 +2,20 @@ require "spec_helper"
2
2
 
3
3
  describe DataMigrate::DataMigrator do
4
4
  let(:context) {
5
- if (Rails::VERSION::MAJOR == 6)
6
- DataMigrate::MigrationContext.new("spec/db/data-6.0")
7
- else
5
+ if (Rails::VERSION::MAJOR == 5)
8
6
  DataMigrate::MigrationContext.new("spec/db/data")
7
+ else
8
+ DataMigrate::MigrationContext.new("spec/db/data-6.0")
9
9
  end
10
10
  }
11
11
  let(:schema_context) {
12
- if (Rails::VERSION::MAJOR == 6)
13
- ActiveRecord::MigrationContext.new("spec/db/migrate/6.0", ActiveRecord::Base.connection.schema_migration)
14
- else
12
+ if (Rails::VERSION::MAJOR == 5)
15
13
  ActiveRecord::MigrationContext.new("spec/db/migrate/5.2")
14
+ else
15
+ ActiveRecord::MigrationContext.new("spec/db/migrate/6.0", ActiveRecord::Base.connection.schema_migration)
16
16
  end
17
17
  }
18
18
 
19
- before do
20
- unless (Rails::VERSION::MAJOR == 5 and
21
- Rails::VERSION::MINOR == 2) ||
22
- Rails::VERSION::MAJOR == 6
23
- skip("Tests are only applicable for Rails 5.2")
24
- end
25
- end
26
-
27
19
  after do
28
20
  begin
29
21
  ActiveRecord::Migration.drop_table("data_migrations")
@@ -4,16 +4,10 @@ require "spec_helper"
4
4
 
5
5
  describe DataMigrate::SchemaMigration do
6
6
  let(:migration_path) {
7
- if Rails::VERSION::MAJOR == 6
8
- "spec/db/migrate/6.0"
9
- elsif Rails::VERSION::MAJOR == 5
10
- if Rails::VERSION::MINOR == 2
11
- "spec/db/migrate/5.2"
12
- else
13
- "spec/db/migrate/5.0"
14
- end
7
+ if Rails::VERSION::MAJOR == 5
8
+ "spec/db/migrate/5.2"
15
9
  else
16
- "spec/db/migrate/4.2"
10
+ "spec/db/migrate/6.0"
17
11
  end
18
12
  }
19
13
 
@@ -72,22 +66,27 @@ describe DataMigrate::SchemaMigration do
72
66
  if Rails.version > '6'
73
67
  describe :migrations_paths do
74
68
  context 'when a db_name is configured' do
69
+ let(:config) { double(:config) }
75
70
  let(:paths) { ['spec/db/migrate/6.0', 'spec/db/components/migrate/6.0'] }
76
-
77
- if Rails.version > '6.1'
78
- before do
79
- allow(ActiveRecord::Base.configurations.configs_for(env_name: 'test', name: 'primary')).to receive(:migrations_paths).and_return(paths)
80
- DataMigrate.configure do |config|
81
- config.spec_name = 'primary'
82
- end
71
+ let(:config_options) do
72
+ if Rails.version > '6.1'
73
+ { env_name: 'test', name: 'primary' }
74
+ else
75
+ { env_name: 'test', spec_name: 'primary' }
83
76
  end
84
- else
85
- before do
86
- allow(ActiveRecord::Base.configurations.configs_for(env_name: 'test', spec_name: 'primary')).to receive(:migrations_paths).and_return(paths)
87
- DataMigrate.configure do |config|
88
- config.spec_name = 'primary'
89
- end
77
+ end
78
+
79
+ before do
80
+ DataMigrate.configure do |config|
81
+ config.spec_name = 'primary'
90
82
  end
83
+
84
+ allow(ActiveRecord::Base.configurations)
85
+ .to receive(:configs_for)
86
+ .with(config_options)
87
+ .and_return(config)
88
+
89
+ allow(config).to receive(:migrations_paths).and_return(paths)
91
90
  end
92
91
 
93
92
  it 'lists schema migration paths' do
@@ -115,4 +115,50 @@ describe DataMigrate::Tasks::DataMigrateTasks do
115
115
  end
116
116
  end
117
117
  end
118
+
119
+ describe :status do
120
+ let(:db_config) do
121
+ {
122
+ adapter: "sqlite3",
123
+ database: "spec/db/test.db"
124
+ }
125
+ end
126
+
127
+ before do
128
+ if Rails::VERSION::MAJOR == 5
129
+ ActiveRecord::Base.configurations['test'] = db_config
130
+ else
131
+ hash_config = ActiveRecord::DatabaseConfigurations::HashConfig.new('test', 'test', db_config)
132
+ config_obj = ActiveRecord::DatabaseConfigurations.new([hash_config])
133
+ allow(ActiveRecord::Base).to receive(:configurations).and_return(config_obj)
134
+ end
135
+
136
+ allow(Rails).to receive(:root) { '.' }
137
+
138
+ if Rails::VERSION::MAJOR == 5
139
+ allow(DataMigrate::Tasks::DataMigrateTasks).to receive(:schema_migrations_path) { 'spec/db/migrate/5.2' }
140
+ else
141
+ allow(DataMigrate::Tasks::DataMigrateTasks).to receive(:schema_migrations_path) { 'spec/db/migrate/6.0' }
142
+ end
143
+
144
+ DataMigrate::Tasks::DataMigrateTasks.migrate
145
+ end
146
+
147
+ after do
148
+ ActiveRecord::Migration.drop_table("data_migrations")
149
+ end
150
+
151
+ it "should display data migration status" do
152
+ expect {
153
+ DataMigrate::Tasks::DataMigrateTasks.status
154
+ }.to output(/up 20091231235959 Some name/).to_stdout
155
+ end
156
+
157
+ it "should display schema and data migration status" do
158
+ expect {
159
+ DataMigrate::Tasks::DataMigrateTasks.status_with_schema
160
+ }.to output(match(/up data 20091231235959 Some name/)
161
+ .and match(/down schema 20131111111111 Late migration/)).to_stdout
162
+ end
163
+ end
118
164
  end
@@ -8,8 +8,12 @@ describe DataMigrate::Generators::DataMigrationGenerator do
8
8
  describe :next_migration_number do
9
9
  it "next migration" do
10
10
  Timecop.freeze("2016-12-03 22:15:26 -0800") do
11
- expect(ActiveRecord::Base).to receive(:timestamped_migrations) { true }
12
- expect(subject.next_migration_number(1)).to eq("20161204061526")
11
+ if ActiveRecord.version >= Gem::Version.new('7.0')
12
+ expect(ActiveRecord).to receive(:timestamped_migrations) { true }
13
+ else
14
+ expect(ActiveRecord::Base).to receive(:timestamped_migrations) { true }
15
+ end
16
+ expect(subject.next_migration_number(1).to_s).to eq("20161204061526")
13
17
  end
14
18
  end
15
19
  end
@@ -17,11 +21,7 @@ describe DataMigrate::Generators::DataMigrationGenerator do
17
21
  describe :migration_base_class_name do
18
22
  let(:subject) { DataMigrate::Generators::DataMigrationGenerator.new(['my_migration']) }
19
23
  it "returns the correct base class name" do
20
- if ActiveRecord.version >= Gem::Version.new('5.0')
21
- expect(subject.send(:migration_base_class_name)).to eq("ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]")
22
- else
23
- expect(subject.send(:migration_base_class_name)).to eq('ActiveRecord::Migration')
24
- end
24
+ expect(subject.send(:migration_base_class_name)).to eq("ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]")
25
25
  end
26
26
  end
27
27
 
data/spec/spec_helper.rb CHANGED
@@ -20,23 +20,13 @@ RSpec.configure do |config|
20
20
  if example.metadata[:no_override]
21
21
  else
22
22
  @prev_data_migrations_path = DataMigrate.config.data_migrations_path
23
- if Rails::VERSION::MAJOR == 6
23
+ if Rails::VERSION::MAJOR == 5
24
24
  DataMigrate.configure do |config|
25
- config.data_migrations_path = "spec/db/6.0"
26
- end
27
- elsif Rails::VERSION::MAJOR == 5
28
- if Rails::VERSION::MINOR == 2
29
- DataMigrate.configure do |config|
30
- config.data_migrations_path = "spec/db/data"
31
- end
32
- else
33
- DataMigrate.configure do |config|
34
- config.data_migrations_path = "spec/db/5.0"
35
- end
25
+ config.data_migrations_path = "spec/db/data"
36
26
  end
37
27
  else
38
28
  DataMigrate.configure do |config|
39
- config.data_migrations_path = "spec/db/5.0"
29
+ config.data_migrations_path = "spec/db/6.0"
40
30
  end
41
31
  end
42
32
  end
data/tasks/databases.rake CHANGED
@@ -114,49 +114,7 @@ namespace :db do
114
114
  namespace :status do
115
115
  desc "Display status of data and schema migrations"
116
116
  task :with_data => :environment do
117
- config = connect_to_database
118
- next unless config
119
-
120
- db_list_data = ActiveRecord::Base.connection.select_values(
121
- "SELECT version FROM #{DataMigrate::DataSchemaMigration.table_name}"
122
- )
123
- db_list_schema = ActiveRecord::Base.connection.select_values(
124
- "SELECT version FROM #{ActiveRecord::SchemaMigration.schema_migrations_table_name}"
125
- )
126
- file_list = []
127
-
128
- Dir.foreach(File.join(Rails.root, data_migrations_path)) do |file|
129
- # only files matching "20091231235959_some_name.rb" pattern
130
- if match_data = /(\d{14})_(.+)\.rb/.match(file)
131
- status = db_list_data.delete(match_data[1]) ? 'up' : 'down'
132
- file_list << [status, match_data[1], match_data[2], 'data']
133
- end
134
- end
135
-
136
- Dir.foreach(File.join(Rails.root, 'db', 'migrate')) do |file|
137
- # only files matching "20091231235959_some_name.rb" pattern
138
- if match_data = /(\d{14})_(.+)\.rb/.match(file)
139
- status = db_list_schema.delete(match_data[1]) ? 'up' : 'down'
140
- file_list << [status, match_data[1], match_data[2], 'schema']
141
- end
142
- end
143
-
144
- file_list.sort!{|a,b| "#{a[1]}_#{a[3] == 'data' ? 1 : 0}" <=> "#{b[1]}_#{b[3] == 'data' ? 1 : 0}" }
145
-
146
- # output
147
- puts "\ndatabase: #{config['database']}\n\n"
148
- puts "#{"Status".center(8)} #{"Type".center(8)} #{"Migration ID".ljust(14)} Migration Name"
149
- puts "-" * 60
150
- file_list.each do |file|
151
- puts "#{file[0].center(8)} #{file[3].center(8)} #{file[1].ljust(14)} #{file[2].humanize}"
152
- end
153
- db_list_schema.each do |version|
154
- puts "#{'up'.center(8)} #{version.ljust(14)} *** NO SCHEMA FILE ***"
155
- end
156
- db_list_data.each do |version|
157
- puts "#{'up'.center(8)} #{version.ljust(14)} *** NO DATA FILE ***"
158
- end
159
- puts
117
+ DataMigrate::Tasks::DataMigrateTasks.status_with_schema
160
118
  end
161
119
  end
162
120
  end # END OF MIGRATE NAME SPACE
@@ -272,11 +230,7 @@ namespace :data do
272
230
 
273
231
  desc "Display status of data migrations"
274
232
  task :status => :environment do
275
- config = ActiveRecord::Base.configurations[Rails.env || 'development']
276
- ActiveRecord::Base.establish_connection(config)
277
- connection = ActiveRecord::Base.connection
278
- puts "\ndatabase: #{config['database']}\n\n"
279
- DataMigrate::StatusService.dump(connection)
233
+ DataMigrate::Tasks::DataMigrateTasks.status
280
234
  end
281
235
  end
282
236
 
@@ -358,21 +312,6 @@ def sort_string migration
358
312
  "#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
359
313
  end
360
314
 
361
- def connect_to_database
362
- config = ActiveRecord::Base.configurations[Rails.env || 'development']
363
- ActiveRecord::Base.establish_connection(config)
364
-
365
- unless DataMigrate::DataSchemaMigration.table_exists?
366
- puts 'Data migrations table does not exist yet.'
367
- config = nil
368
- end
369
- unless ActiveRecord::SchemaMigration.table_exists?
370
- puts 'Schema migrations table does not exist yet.'
371
- config = nil
372
- end
373
- config
374
- end
375
-
376
315
  def past_migrations(sort=nil)
377
316
  DataMigrate::DatabaseTasks.past_migrations(sort)
378
317
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_migrate
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.2
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew J Vargo
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-07-12 00:00:00.000000000 Z
13
+ date: 2022-03-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -202,40 +202,30 @@ files:
202
202
  - Appraisals
203
203
  - Changelog.md
204
204
  - Gemfile
205
- - Gemfile.rails5
206
- - Gemfile.rails5.1
207
205
  - Gemfile.rails5.2
208
206
  - Gemfile.rails6.1
209
207
  - LICENSE
210
208
  - README.md
211
209
  - Rakefile
212
210
  - data_migrate.gemspec
213
- - gemfiles/rails_4.1.gemfile
214
- - gemfiles/rails_4.2.gemfile
215
- - gemfiles/rails_5.0.gemfile
216
- - gemfiles/rails_5.1.gemfile
217
211
  - gemfiles/rails_5.2.gemfile
218
212
  - gemfiles/rails_6.0.gemfile
219
213
  - gemfiles/rails_6.1.gemfile
214
+ - gemfiles/rails_7.0.gemfile
220
215
  - lib/capistrano/data_migrate.rb
221
216
  - lib/capistrano/data_migrate/migrate.rb
222
217
  - lib/data_migrate.rb
223
218
  - lib/data_migrate/config.rb
224
- - lib/data_migrate/data_migrator.rb
225
219
  - lib/data_migrate/data_migrator_five.rb
226
220
  - lib/data_migrate/data_schema.rb
227
221
  - lib/data_migrate/data_schema_migration.rb
228
222
  - lib/data_migrate/database_tasks.rb
229
223
  - lib/data_migrate/legacy_migrator.rb
230
- - lib/data_migrate/migration.rb
231
224
  - lib/data_migrate/migration_context.rb
232
- - lib/data_migrate/migration_five.rb
233
225
  - lib/data_migrate/railtie.rb
234
226
  - lib/data_migrate/schema_dumper.rb
235
- - lib/data_migrate/schema_migration.rb
236
227
  - lib/data_migrate/schema_migration_five.rb
237
228
  - lib/data_migrate/schema_migration_six.rb
238
- - lib/data_migrate/status_service.rb
239
229
  - lib/data_migrate/status_service_five.rb
240
230
  - lib/data_migrate/tasks/data_migrate_tasks.rb
241
231
  - lib/data_migrate/version.rb
@@ -256,8 +246,6 @@ files:
256
246
  - spec/data_migrate/schema_migration_spec.rb
257
247
  - spec/data_migrate/status_service_spec.rb
258
248
  - spec/data_migrate/tasks/data_migrate_tasks_spec.rb
259
- - spec/db/5.0/20091231235959_some_name.rb
260
- - spec/db/5.0/20171231235959_super_update.rb
261
249
  - spec/db/6.0/20091231235959_some_name.rb
262
250
  - spec/db/6.0/20171231235959_super_update.rb
263
251
  - spec/db/data-6.0/20091231235959_some_name.rb
@@ -270,10 +258,6 @@ files:
270
258
  - spec/db/data/partial_schema/test_data_schema.rb
271
259
  - spec/db/data/schema/data_schema.rb
272
260
  - spec/db/data/schema/test_data_schema.rb
273
- - spec/db/migrate/4.2/20131111111111_late_migration.rb
274
- - spec/db/migrate/4.2/20202020202011_db_migration.rb
275
- - spec/db/migrate/5.0/20131111111111_late_migration.rb
276
- - spec/db/migrate/5.0/20202020202011_db_migration.rb
277
261
  - spec/db/migrate/5.2/20131111111111_late_migration.rb
278
262
  - spec/db/migrate/5.2/20202020202011_db_migration.rb
279
263
  - spec/db/migrate/6.0/20131111111111_late_migration.rb
@@ -307,7 +291,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
307
291
  - !ruby/object:Gem::Version
308
292
  version: '0'
309
293
  requirements: []
310
- rubygems_version: 3.2.15
294
+ rubygems_version: 3.2.32
311
295
  signing_key:
312
296
  specification_version: 4
313
297
  summary: Rake tasks to migrate data alongside schema changes.
data/Gemfile.rails5 DELETED
@@ -1,10 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in data_migrate.gemspec
4
- gemspec
5
- %w[
6
- activerecord
7
- railties
8
- ].each do |rails_gem|
9
- gem rails_gem, '~> 5.0.0'
10
- end
data/Gemfile.rails5.1 DELETED
@@ -1,10 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in data_migrate.gemspec
4
- gemspec
5
- %w[
6
- activerecord
7
- railties
8
- ].each do |rails_gem|
9
- gem rails_gem, '~> 5.1.7'
10
- end
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "http://rubygems.org"
4
-
5
- gem "rails", "4.1.16"
6
-
7
- gemspec path: "../"
@@ -1,9 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "http://rubygems.org"
4
-
5
- gem "rails", "4.2.11.1"
6
- gem "nokogiri", "1.6.8.1"
7
- gem "bundler" , "< 2.0"
8
-
9
- gemspec path: "../"
@@ -1,8 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "http://rubygems.org"
4
-
5
- gem "rails", "5.0.7.2"
6
- gem "sqlite3", "~> 1.4"
7
-
8
- gemspec path: "../"
@@ -1,101 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_record"
4
-
5
- module DataMigrate
6
- class DataMigrator < ActiveRecord::Migrator
7
-
8
- def record_version_state_after_migrating(version)
9
- if down?
10
- migrated.delete(version)
11
- DataMigrate::DataSchemaMigration.where(version: version.to_s).delete_all
12
- else
13
- migrated << version
14
- DataMigrate::DataSchemaMigration.create!(version: version.to_s)
15
- end
16
- end
17
-
18
- def load_migrated(connection = ActiveRecord::Base.connection)
19
- self.class.get_all_versions(connection)
20
- end
21
-
22
- class << self
23
- alias_method :migrations_status_orig, :migrations_status
24
-
25
- def migrations_status
26
- migrations_status_orig([DataMigrate.config.data_migrations_path])
27
- end
28
-
29
- def current_version(connection = ActiveRecord::Base.connection)
30
- get_all_versions(connection).max || 0
31
- end
32
-
33
- def get_all_versions(connection = ActiveRecord::Base.connection)
34
- if table_exists?(connection, schema_migrations_table_name)
35
- DataMigrate::DataSchemaMigration.all.map { |x| x.version.to_i }.sort
36
- else
37
- []
38
- end
39
- end
40
-
41
- def schema_migrations_table_name
42
- ActiveRecord::Base.table_name_prefix + "data_migrations" +
43
- ActiveRecord::Base.table_name_suffix
44
- end
45
-
46
- def migrations_path
47
- DataMigrate.config.data_migrations_path
48
- end
49
-
50
- ##
51
- # Provides the full migrations_path filepath
52
- # @return (String)
53
- def full_migrations_path
54
- File.join(Rails.root, *migrations_path.split(File::SEPARATOR))
55
- end
56
-
57
- def assure_data_schema_table
58
- ActiveRecord::Base.establish_connection(db_config)
59
- sm_table = DataMigrate::DataMigrator.schema_migrations_table_name
60
-
61
- unless table_exists?(ActiveRecord::Base.connection, sm_table)
62
- create_table(sm_table)
63
- end
64
- end
65
-
66
- ##
67
- # Compares the given filename with what we expect data migration
68
- # filenames to be, eg the "20091231235959_some_name.rb" pattern
69
- # @param (String) filename
70
- # @return (MatchData)
71
- def match(filename)
72
- /(\d{14})_(.+)\.rb$/.match(filename)
73
- end
74
-
75
- private
76
-
77
- def create_table(sm_table)
78
- ActiveRecord::Base.connection.create_table(sm_table, id: false) do |schema_migrations_table|
79
- schema_migrations_table.string :version, primary_key: true
80
- end
81
- end
82
-
83
- def table_exists?(connection, table_name)
84
- # Avoid the warning that table_exists? prints in Rails 5.0 due a
85
- # change in behavior between Rails 5.0 and Rails 5.1 of this method
86
- # with respect to database views.
87
- if ActiveRecord.version >= Gem::Version.new("5.0") &&
88
- ActiveRecord.version < Gem::Version.new("5.1")
89
- connection.data_source_exists?(table_name)
90
- else
91
- connection.table_exists?(schema_migrations_table_name)
92
- end
93
- end
94
-
95
- def db_config
96
- ActiveRecord::Base.configurations[Rails.env || "development"] ||
97
- ENV["DATABASE_URL"]
98
- end
99
- end
100
- end
101
- end
@@ -1,26 +0,0 @@
1
- module DataMigrate
2
- class Migration < ::ActiveRecord::Migration
3
-
4
- class << self
5
- def check_pending!(connection = ::ActiveRecord::Base.connection)
6
- raise ActiveRecord::PendingMigrationError if DataMigrator::Migrator.needs_migration?(connection)
7
- end
8
-
9
- def migrate(direction)
10
- new.migrate direction
11
- end
12
-
13
- def table_name
14
- ActiveRecord::Base.table_name_prefix + "data_migrations" + ActiveRecord::Base.table_name_suffix
15
- end
16
-
17
- def primary_key
18
- "version"
19
- end
20
- end
21
-
22
- def initialize(name = self.class.name, version = nil)
23
- super(name, version)
24
- end
25
- end
26
- end
@@ -1,26 +0,0 @@
1
- module DataMigrate
2
- class MigrationFive < ::ActiveRecord::Migration[5.0]
3
-
4
- class << self
5
- def check_pending!(connection = ::ActiveRecord::Base.connection)
6
- raise ActiveRecord::PendingMigrationError if DataMigrator::Migrator.needs_migration?(connection)
7
- end
8
-
9
- def migrate(direction)
10
- new.migrate direction
11
- end
12
-
13
- def table_name
14
- ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix
15
- end
16
-
17
- def primary_key
18
- "version"
19
- end
20
- end
21
-
22
- def initialize(name = self.class.name, version = nil)
23
- super(name, version)
24
- end
25
- end
26
- end
@@ -1,31 +0,0 @@
1
- module DataMigrate
2
- # Helper class to getting access to db schema
3
- # to allow data/schema combiation tasks
4
- class SchemaMigration
5
- def self.pending_schema_migrations
6
- all_migrations = DataMigrate::DataMigrator.migrations(migrations_paths)
7
- sort_migrations(
8
- ActiveRecord::Migrator.new(:up, all_migrations).
9
- pending_migrations.
10
- map {|m| { version: m.version, name: m.name, kind: :schema }}
11
- )
12
- end
13
-
14
- def self.run(direction, migration_paths, version)
15
- ActiveRecord::Migrator.run(direction, migration_paths, version)
16
- end
17
-
18
- def self.sort_migrations(set1, set2 = nil)
19
- migrations = set1 + (set2 || [])
20
- migrations.sort {|a, b| sort_string(a) <=> sort_string(b)}
21
- end
22
-
23
- def self.migrations_paths
24
- Rails.application.config.paths["db/migrate"].to_a
25
- end
26
-
27
- def self.sort_string(migration)
28
- "#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
29
- end
30
- end
31
- end
@@ -1,65 +0,0 @@
1
- module DataMigrate
2
- class StatusService
3
- class << self
4
- def dump(connection = ActiveRecord::Base.connection, stream = STDOUT)
5
- new(connection).dump(stream)
6
- stream
7
- end
8
- end
9
-
10
- def initialize(connection)
11
- @connection = connection
12
- end
13
-
14
- def root_folder
15
- Rails.root
16
- end
17
-
18
- def dump(stream)
19
- unless @connection.table_exists?(table_name)
20
- stream.puts "Data migrations table does not exist yet."
21
- return
22
- end
23
- sql = "SELECT version FROM #{DataMigrate::DataMigrator.schema_migrations_table_name}"
24
- db_list = ActiveRecord::Base.connection.select_values(sql)
25
- output(stream, db_list)
26
- end
27
-
28
- private
29
-
30
- def table_name
31
- DataMigrate::DataMigrator.schema_migrations_table_name
32
- end
33
-
34
- def output(stream, db_list)
35
- stream.puts "#{"Status".center(8)} #{"Migration ID".ljust(14)} Migration Name"
36
- stream.puts "-" * 50
37
- list = migration_files(db_list) + migration_list(db_list)
38
- list.sort! {|line1, line2| line1[1] <=> line2[1]}
39
- list.each do |file|
40
- stream.puts "#{file[0].center(8)} #{file[1].ljust(14)} #{file[2]}"
41
- end
42
- stream.puts
43
- end
44
-
45
- def migration_list(db_list)
46
- list = []
47
- db_list.each do |version|
48
- list << ["up", version, "********** NO FILE *************"]
49
- end
50
- list
51
- end
52
-
53
- def migration_files(db_list)
54
- file_list = []
55
- Dir.foreach(File.join(root_folder, DataMigrate.config.data_migrations_path)) do |file|
56
- # only files matching "20091231235959_some_name.rb" pattern
57
- if match_data = DataMigrate::DataMigrator.match(file)
58
- status = db_list.delete(match_data[1]) ? "up" : "down"
59
- file_list << [status, match_data[1], match_data[2].humanize]
60
- end
61
- end
62
- file_list
63
- end
64
- end
65
- end
@@ -1,9 +0,0 @@
1
- class SomeName < ActiveRecord::Migration[5.0]
2
- def up
3
- puts "Doing data migration"
4
- end
5
-
6
- def down
7
- raise ActiveRecord::IrreversibleMigration
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class SuperUpdate < ActiveRecord::Migration[5.0]
2
- def up
3
- puts "Doing data migration"
4
- end
5
-
6
- def down
7
- raise ActiveRecord::IrreversibleMigration
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class LateMigration < ActiveRecord::Migration
2
- def up
3
- puts "Doing schema LateMigration"
4
- end
5
-
6
- def down
7
- puts "Undoing LateMigration"
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class DbMigration < ActiveRecord::Migration
2
- def up
3
- puts "Doing schema migration"
4
- end
5
-
6
- def down
7
- puts "Undoing DbMigration"
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class LateMigration < ActiveRecord::Migration[5.0]
2
- def up
3
- puts "Doing schema LateMigration"
4
- end
5
-
6
- def down
7
- puts "Undoing LateMigration"
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class DbMigration < ActiveRecord::Migration[5.0]
2
- def up
3
- puts "Doing schema migration"
4
- end
5
-
6
- def down
7
- puts "Undoing DbMigration"
8
- end
9
- end