data_migrate 5.1.0 → 6.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rbenv-gemsets +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -4
- data/Appraisals +7 -9
- data/Changelog.md +44 -3
- data/Gemfile +2 -0
- data/Gemfile.rails5.1 +1 -1
- data/README.md +30 -18
- data/data_migrate.gemspec +2 -2
- data/gemfiles/rails_4.2.gemfile +2 -1
- data/gemfiles/rails_5.0.gemfile +1 -1
- data/gemfiles/rails_5.1.gemfile +1 -1
- data/gemfiles/rails_5.2.gemfile +1 -1
- data/gemfiles/rails_6.0.gemfile +8 -0
- data/lib/capistrano/data_migrate/migrate.rb +3 -4
- data/lib/data_migrate.rb +14 -10
- data/lib/data_migrate/config.rb +21 -0
- data/lib/data_migrate/data_migrator.rb +20 -14
- data/lib/data_migrate/data_migrator_five.rb +10 -3
- data/lib/data_migrate/database_tasks.rb +3 -1
- data/lib/data_migrate/schema_migration_five.rb +1 -1
- data/lib/data_migrate/schema_migration_six.rb +31 -0
- data/lib/data_migrate/status_service.rb +1 -1
- data/lib/data_migrate/tasks/data_migrate_tasks.rb +4 -8
- data/lib/data_migrate/version.rb +1 -1
- data/lib/generators/data_migration/data_migration_generator.rb +10 -1
- data/spec/data_migrate/config_spec.rb +27 -0
- data/spec/data_migrate/data_migrator_spec.rb +21 -0
- data/spec/data_migrate/database_tasks_spec.rb +4 -10
- data/spec/data_migrate/migration_context_spec.rb +13 -4
- data/spec/data_migrate/schema_migration_spec.rb +3 -1
- data/spec/data_migrate/status_service_spec.rb +10 -1
- data/spec/data_migrate/tasks/data_migrate_tasks_spec.rb +2 -17
- data/spec/db/{4.2 → 6.0}/20091231235959_some_name.rb +1 -1
- data/spec/db/{4.2 → 6.0}/20171231235959_super_update.rb +1 -1
- data/spec/db/data-6.0/20091231235959_some_name.rb +9 -0
- data/spec/db/data-6.0/20171231235959_super_update.rb +9 -0
- data/spec/db/data-6.0/20181128000207_excluded_file.rb.other_ext +1 -0
- data/spec/db/data/20181128000207_excluded_file.rb.other_ext +1 -0
- data/spec/db/migrate/6.0/20131111111111_late_migration.rb +9 -0
- data/spec/db/migrate/6.0/20202020202011_db_migration.rb +9 -0
- data/spec/generators/data_migration/data_migration_generator_spec.rb +33 -0
- data/spec/spec_helper.rb +26 -4
- data/tasks/databases.rake +14 -10
- metadata +32 -14
@@ -1,10 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_record"
|
4
|
+
require "data_migrate/config"
|
4
5
|
|
5
6
|
module DataMigrate
|
6
7
|
class DataMigrator < ActiveRecord::Migrator
|
7
|
-
self.migrations_paths
|
8
|
+
def self.migrations_paths
|
9
|
+
[DataMigrate.config.data_migrations_path]
|
10
|
+
end
|
8
11
|
|
9
12
|
def self.assure_data_schema_table
|
10
13
|
ActiveRecord::Base.establish_connection(db_config)
|
@@ -42,6 +45,9 @@ module DataMigrate
|
|
42
45
|
/(\d{14})_(.+)\.rb/.match(filename)
|
43
46
|
end
|
44
47
|
|
48
|
+
def needs_migration?
|
49
|
+
DataMigrate::DatabaseTasks.pending_migrations.count.positive?
|
50
|
+
end
|
45
51
|
##
|
46
52
|
# Provides the full migrations_path filepath
|
47
53
|
# @return (String)
|
@@ -53,9 +59,10 @@ module DataMigrate
|
|
53
59
|
DataMigrate::MigrationContext.new(migrations_paths).migrations_status
|
54
60
|
end
|
55
61
|
|
56
|
-
#TODO: this was added to be backward compatible, need to re-evaluate
|
62
|
+
# TODO: this was added to be backward compatible, need to re-evaluate
|
57
63
|
def migrations(_migrations_paths)
|
58
|
-
DataMigrate::MigrationContext.new(migrations_paths).migrations
|
64
|
+
#DataMigrate::MigrationContext.new(migrations_paths).migrations
|
65
|
+
DataMigrate::MigrationContext.new(_migrations_paths).migrations
|
59
66
|
end
|
60
67
|
|
61
68
|
#TODO: this was added to be backward compatible, need to re-evaluate
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "data_migrate/config"
|
4
|
+
|
3
5
|
module DataMigrate
|
4
6
|
##
|
5
7
|
# This class extends DatabaseTasks to add a schema_file method.
|
@@ -26,7 +28,7 @@ module DataMigrate
|
|
26
28
|
end
|
27
29
|
|
28
30
|
def self.data_migrations_path
|
29
|
-
|
31
|
+
DataMigrate.config.data_migrations_path
|
30
32
|
end
|
31
33
|
|
32
34
|
def self.schema_migrations_path
|
@@ -3,7 +3,7 @@ module DataMigrate
|
|
3
3
|
# to allow data/schema combiation tasks
|
4
4
|
class SchemaMigration
|
5
5
|
def self.pending_schema_migrations
|
6
|
-
all_migrations =
|
6
|
+
all_migrations = DataMigrate::MigrationContext.new(migrations_paths).migrations
|
7
7
|
sort_migrations(
|
8
8
|
ActiveRecord::Migrator.new(:up, all_migrations).
|
9
9
|
pending_migrations.
|
@@ -0,0 +1,31 @@
|
|
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::MigrationContext.new(migrations_paths).migrations
|
7
|
+
sort_migrations(
|
8
|
+
ActiveRecord::Migrator.new(:up, all_migrations, ActiveRecord::Base.connection.schema_migration).
|
9
|
+
pending_migrations.
|
10
|
+
map {|m| { version: m.version, kind: :schema }}
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.run(direction, migration_paths, version)
|
15
|
+
ActiveRecord::MigrationContext.new(migration_paths, ActiveRecord::Base.connection.schema_migration).run(direction, 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
|
@@ -52,7 +52,7 @@ module DataMigrate
|
|
52
52
|
|
53
53
|
def migration_files(db_list)
|
54
54
|
file_list = []
|
55
|
-
Dir.foreach(File.join(root_folder,
|
55
|
+
Dir.foreach(File.join(root_folder, DataMigrate.config.data_migrations_path)) do |file|
|
56
56
|
# only files matching "20091231235959_some_name.rb" pattern
|
57
57
|
if match_data = DataMigrate::DataMigrator.match(file)
|
58
58
|
status = db_list.delete(match_data[1]) ? "up" : "down"
|
@@ -3,21 +3,17 @@ module DataMigrate
|
|
3
3
|
module DataMigrateTasks
|
4
4
|
extend self
|
5
5
|
def migrations_paths
|
6
|
-
@migrations_paths ||=
|
7
|
-
if Rails.application && Rails.application.paths["data/migrate"]
|
8
|
-
Rails.application.paths["data/migrate"].to_a
|
9
|
-
end
|
10
|
-
end
|
6
|
+
@migrations_paths ||= DataMigrate.config.data_migrations_path
|
11
7
|
end
|
12
8
|
|
13
9
|
def migrate
|
14
10
|
DataMigrate::DataMigrator.assure_data_schema_table
|
15
11
|
target_version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
16
|
-
if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2
|
12
|
+
if (Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2) ||
|
13
|
+
Rails::VERSION::MAJOR == 6
|
17
14
|
DataMigrate::MigrationContext.new(migrations_paths).migrate(target_version)
|
18
15
|
else
|
19
|
-
|
20
|
-
DataMigrate::DataMigrator.migrate(paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
|
16
|
+
DataMigrate::DataMigrator.migrate(migrations_paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
|
21
17
|
end
|
22
18
|
end
|
23
19
|
end
|
data/lib/data_migrate/version.rb
CHANGED
@@ -2,6 +2,7 @@ require "generators/data_migrate"
|
|
2
2
|
require "rails/generators"
|
3
3
|
require "rails/generators/active_record/migration"
|
4
4
|
require "rails/generators/migration"
|
5
|
+
require "data_migrate/config"
|
5
6
|
|
6
7
|
module DataMigrate
|
7
8
|
module Generators
|
@@ -13,7 +14,7 @@ module DataMigrate
|
|
13
14
|
|
14
15
|
def create_data_migration
|
15
16
|
set_local_assigns!
|
16
|
-
migration_template "data_migration.rb",
|
17
|
+
migration_template "data_migration.rb", data_migrations_file_path
|
17
18
|
end
|
18
19
|
|
19
20
|
protected
|
@@ -34,6 +35,14 @@ module DataMigrate
|
|
34
35
|
"ActiveRecord::Migration"
|
35
36
|
end
|
36
37
|
end
|
38
|
+
|
39
|
+
def data_migrations_file_path
|
40
|
+
File.join(data_migrations_path, "#{file_name}.rb")
|
41
|
+
end
|
42
|
+
|
43
|
+
def data_migrations_path
|
44
|
+
DataMigrate.config.data_migrations_path
|
45
|
+
end
|
37
46
|
end
|
38
47
|
end
|
39
48
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe DataMigrate::Config do
|
4
|
+
|
5
|
+
it "sets default data_migrations_path path", :no_override do
|
6
|
+
expect(DataMigrate.config.data_migrations_path).to eq "db/data/"
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "data migration path configured" do
|
10
|
+
before do
|
11
|
+
@before = DataMigrate.config.data_migrations_path
|
12
|
+
DataMigrate.configure do |config|
|
13
|
+
config.data_migrations_path = "db/awesome/"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
after do
|
18
|
+
DataMigrate.configure do |config|
|
19
|
+
config.data_migrations_path = @before
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it do
|
24
|
+
expect(DataMigrate.config.data_migrations_path).to eq "db/awesome/"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -9,6 +9,11 @@ describe DataMigrate::DataMigrator do
|
|
9
9
|
}
|
10
10
|
end
|
11
11
|
|
12
|
+
before do
|
13
|
+
allow(DataMigrate::DataMigrator).to receive(:db_config) { db_config }
|
14
|
+
ActiveRecord::Base.establish_connection(db_config)
|
15
|
+
end
|
16
|
+
|
12
17
|
describe :load_migrated do
|
13
18
|
before do
|
14
19
|
allow(subject).to receive(:db_config) { db_config }.at_least(:once)
|
@@ -56,6 +61,22 @@ describe DataMigrate::DataMigrator do
|
|
56
61
|
end
|
57
62
|
end
|
58
63
|
|
64
|
+
describe "#migrations_status" do
|
65
|
+
before do
|
66
|
+
allow(subject).to receive(:db_config) { db_config }.at_least(:once)
|
67
|
+
ActiveRecord::Base.establish_connection(db_config)
|
68
|
+
::ActiveRecord::SchemaMigration.create_table
|
69
|
+
DataMigrate::DataSchemaMigration.create_table
|
70
|
+
end
|
71
|
+
|
72
|
+
it "returns all migrations statuses" do
|
73
|
+
status = subject.migrations_status
|
74
|
+
expect(status.length).to eq 2
|
75
|
+
expect(status.first).to eq ["down", "20091231235959", "Some name"]
|
76
|
+
expect(status.second).to eq ["down", "20171231235959", "Super update"]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
59
80
|
describe :match do
|
60
81
|
context "when the file does not match" do
|
61
82
|
it "returns nil" do
|
@@ -5,7 +5,9 @@ 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 ==
|
8
|
+
if Rails::VERSION::MAJOR == 6
|
9
|
+
"spec/db/migrate/6.0"
|
10
|
+
elsif Rails::VERSION::MAJOR == 5
|
9
11
|
if Rails::VERSION::MINOR == 2
|
10
12
|
"spec/db/migrate/5.2"
|
11
13
|
else
|
@@ -16,15 +18,7 @@ describe DataMigrate::DatabaseTasks do
|
|
16
18
|
end
|
17
19
|
}
|
18
20
|
let(:data_migrations_path) {
|
19
|
-
|
20
|
-
if Rails::VERSION::MINOR == 2
|
21
|
-
"spec/db/data"
|
22
|
-
else
|
23
|
-
"spec/db/5.0"
|
24
|
-
end
|
25
|
-
else
|
26
|
-
"spec/db/4.2"
|
27
|
-
end
|
21
|
+
DataMigrate.config.data_migrations_path
|
28
22
|
}
|
29
23
|
let(:db_config) do
|
30
24
|
{
|
@@ -2,15 +2,24 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe DataMigrate::DataMigrator do
|
4
4
|
let(:context) {
|
5
|
-
|
5
|
+
if (Rails::VERSION::MAJOR == 6)
|
6
|
+
DataMigrate::MigrationContext.new("spec/db/data-6.0")
|
7
|
+
else
|
8
|
+
DataMigrate::MigrationContext.new("spec/db/data")
|
9
|
+
end
|
6
10
|
}
|
7
11
|
let(:schema_context) {
|
8
|
-
|
12
|
+
if (Rails::VERSION::MAJOR == 6)
|
13
|
+
ActiveRecord::MigrationContext.new("spec/db/migrate/6.0", ActiveRecord::Base.connection.schema_migration)
|
14
|
+
else
|
15
|
+
ActiveRecord::MigrationContext.new("spec/db/migrate/5.2")
|
16
|
+
end
|
9
17
|
}
|
10
18
|
|
11
19
|
before do
|
12
|
-
unless Rails::VERSION::MAJOR == 5 and
|
13
|
-
Rails::VERSION::MINOR == 2
|
20
|
+
unless (Rails::VERSION::MAJOR == 5 and
|
21
|
+
Rails::VERSION::MINOR == 2) ||
|
22
|
+
Rails::VERSION::MAJOR == 6
|
14
23
|
skip("Tests are only applicable for Rails 5.2")
|
15
24
|
end
|
16
25
|
end
|
@@ -4,7 +4,9 @@ require "spec_helper"
|
|
4
4
|
|
5
5
|
describe DataMigrate::SchemaMigration do
|
6
6
|
let(:migration_path) {
|
7
|
-
if Rails::VERSION::MAJOR ==
|
7
|
+
if Rails::VERSION::MAJOR == 6
|
8
|
+
"spec/db/migrate/6.0"
|
9
|
+
elsif Rails::VERSION::MAJOR == 5
|
8
10
|
if Rails::VERSION::MINOR == 2
|
9
11
|
"spec/db/migrate/5.2"
|
10
12
|
else
|
@@ -46,7 +46,7 @@ describe DataMigrate::StatusService do
|
|
46
46
|
VALUES #{fixture_file_timestamps.map { |t| "(#{t})" }.join(', ')}
|
47
47
|
SQL
|
48
48
|
|
49
|
-
allow_any_instance_of(service).to receive(:root_folder) { "
|
49
|
+
allow_any_instance_of(service).to receive(:root_folder) { "./" }
|
50
50
|
end
|
51
51
|
|
52
52
|
after do
|
@@ -62,6 +62,15 @@ describe DataMigrate::StatusService do
|
|
62
62
|
expect(stream.read).to include expected
|
63
63
|
end
|
64
64
|
|
65
|
+
it "excludes files without .rb extension" do
|
66
|
+
stream = StringIO.new
|
67
|
+
service.dump(ActiveRecord::Base.connection, stream)
|
68
|
+
stream.rewind
|
69
|
+
|
70
|
+
expected = "20181128000207 Excluded file"
|
71
|
+
expect(stream.read).to_not include expected
|
72
|
+
end
|
73
|
+
|
65
74
|
it "shows missing file migration" do
|
66
75
|
stream = StringIO.new
|
67
76
|
service.dump(ActiveRecord::Base.connection, stream)
|
@@ -11,21 +11,6 @@ describe DataMigrate::Tasks::DataMigrateTasks do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
before do
|
14
|
-
if Rails::VERSION::MAJOR == 5
|
15
|
-
if Rails::VERSION::MINOR == 2
|
16
|
-
allow(DataMigrate::Tasks::DataMigrateTasks).to receive(:migrations_paths) {
|
17
|
-
"spec/db/data"
|
18
|
-
}
|
19
|
-
else
|
20
|
-
allow(DataMigrate::Tasks::DataMigrateTasks).to receive(:migrations_paths) {
|
21
|
-
"spec/db/5.0"
|
22
|
-
}
|
23
|
-
end
|
24
|
-
else
|
25
|
-
allow(DataMigrate::Tasks::DataMigrateTasks).to receive(:migrations_paths) {
|
26
|
-
"spec/db/4.2"
|
27
|
-
}
|
28
|
-
end
|
29
14
|
allow(DataMigrate::DataMigrator).to receive(:db_config) { db_config }
|
30
15
|
ActiveRecord::Base.establish_connection(db_config)
|
31
16
|
end
|
@@ -36,9 +21,9 @@ describe DataMigrate::Tasks::DataMigrateTasks do
|
|
36
21
|
|
37
22
|
describe :migrate do
|
38
23
|
it do
|
39
|
-
|
24
|
+
expect {
|
40
25
|
DataMigrate::Tasks::DataMigrateTasks.migrate
|
41
|
-
|
26
|
+
}.to output(/20091231235959 SomeName: migrating/).to_stdout
|
42
27
|
end
|
43
28
|
|
44
29
|
it do
|
@@ -0,0 +1 @@
|
|
1
|
+
# This file should be excluded
|
@@ -0,0 +1 @@
|
|
1
|
+
# This file should be excluded
|
@@ -24,4 +24,37 @@ describe DataMigrate::Generators::DataMigrationGenerator do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
describe :create_data_migration do
|
29
|
+
let(:subject) { DataMigrate::Generators::DataMigrationGenerator.new(['my_migration']) }
|
30
|
+
let(:data_migrations_file_path) { 'abc/my_migration.rb' }
|
31
|
+
|
32
|
+
context 'when custom data migrations path has a trailing slash' do
|
33
|
+
before do
|
34
|
+
DataMigrate.config.data_migrations_path = 'abc/'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns correct file path' do
|
38
|
+
expect(subject).to receive(:migration_template).with(
|
39
|
+
'data_migration.rb', data_migrations_file_path
|
40
|
+
)
|
41
|
+
|
42
|
+
subject.create_data_migration
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when custom data migrations path does not have a trailing slash' do
|
47
|
+
before do
|
48
|
+
DataMigrate.config.data_migrations_path = 'abc'
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns correct file path' do
|
52
|
+
expect(subject).to receive(:migration_template).with(
|
53
|
+
'data_migration.rb', data_migrations_file_path
|
54
|
+
)
|
55
|
+
|
56
|
+
subject.create_data_migration
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
27
60
|
end
|