data_migrate 9.4.2 → 10.0.0.rc1
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.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +3 -3
- data/.github/workflows/gempush.yml +8 -6
- data/.gitignore +2 -3
- data/.ruby-version +1 -0
- data/.travis.yml +14 -0
- data/Appraisals +5 -5
- data/Changelog.md +2 -46
- data/Gemfile +1 -0
- data/Gemfile.rails6.1 +11 -0
- data/README.md +5 -7
- data/data_migrate.gemspec +2 -2
- data/gemfiles/{rails_7.1.gemfile → rails_6.0.gemfile} +2 -1
- data/gemfiles/rails_6.1.gemfile +1 -0
- data/gemfiles/rails_7.0.gemfile +2 -1
- data/lib/data_migrate/data_migrator.rb +23 -15
- data/lib/data_migrate/data_schema.rb +2 -2
- data/lib/data_migrate/data_schema_migration.rb +7 -24
- data/lib/data_migrate/database_tasks.rb +48 -194
- data/lib/data_migrate/legacy_migrator.rb +22 -0
- data/lib/data_migrate/migration_context.rb +8 -11
- data/lib/data_migrate/schema_dumper.rb +1 -1
- data/lib/data_migrate/schema_migration.rb +4 -5
- data/lib/data_migrate/status_service.rb +4 -4
- data/lib/data_migrate/tasks/data_migrate_tasks.rb +15 -14
- data/lib/data_migrate/version.rb +1 -1
- data/lib/data_migrate.rb +1 -2
- data/spec/data_migrate/data_migrator_spec.rb +14 -17
- data/spec/data_migrate/data_schema_migration_spec.rb +8 -25
- data/spec/data_migrate/data_spec.rb +1 -1
- data/spec/data_migrate/database_tasks_spec.rb +19 -34
- data/spec/data_migrate/legacy_migrator_spec.rb +38 -0
- data/spec/data_migrate/migration_context_spec.rb +8 -15
- data/spec/data_migrate/schema_dumper_spec.rb +3 -6
- data/spec/data_migrate/schema_migration_spec.rb +6 -13
- data/spec/data_migrate/status_service_spec.rb +4 -7
- data/spec/data_migrate/tasks/data_migrate_tasks_spec.rb +14 -13
- data/spec/db/data/20091231235959_some_name.rb +1 -1
- data/spec/db/data/20171231235959_super_update.rb +1 -1
- data/spec/db/migrate/20131111111111_late_migration.rb +1 -1
- data/spec/db/migrate/20202020202011_db_migration.rb +1 -1
- data/tasks/databases.rake +83 -25
- metadata +19 -21
- data/Gemfile.lock +0 -184
- data/gemfiles/rails_6.1.gemfile.lock +0 -229
- data/gemfiles/rails_7.0.gemfile.lock +0 -230
- data/gemfiles/rails_7.1.gemfile.lock +0 -263
- data/lib/data_migrate/database_configurations_wrapper.rb +0 -11
- data/lib/data_migrate/rails_helper.rb +0 -79
- data/lib/data_migrate/test.rb +0 -14
@@ -5,143 +5,67 @@ require "data_migrate/config"
|
|
5
5
|
module DataMigrate
|
6
6
|
##
|
7
7
|
# This class extends DatabaseTasks to add a schema_file method.
|
8
|
-
|
8
|
+
class DatabaseTasks
|
9
9
|
extend ActiveRecord::Tasks::DatabaseTasks
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def with_temporary_connection_for_each(env: ActiveRecord::Tasks::DatabaseTasks.env, name: nil, &block) # :nodoc:
|
15
|
-
if name
|
16
|
-
db_config = ActiveRecord::Base.configurations.configs_for(env_name: env, name: name)
|
17
|
-
with_temporary_connection(db_config, &block)
|
18
|
-
else
|
19
|
-
ActiveRecord::Base.configurations.configs_for(env_name: env, name: name).each do |db_config|
|
20
|
-
with_temporary_connection(db_config, &block)
|
21
|
-
end
|
22
|
-
end
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def schema_file_type(_format = nil)
|
13
|
+
"data_schema.rb"
|
23
14
|
end
|
24
15
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
16
|
+
def dump_filename(spec_name, format = ActiveRecord::Base.schema_format)
|
17
|
+
filename = if spec_name == "primary"
|
18
|
+
schema_file_type(format)
|
19
|
+
else
|
20
|
+
"#{spec_name}_#{schema_file_type(format)}"
|
28
21
|
end
|
29
|
-
end
|
30
22
|
|
31
|
-
|
32
|
-
ActiveRecord::Base
|
23
|
+
ENV["DATA_SCHEMA"] || File.join(db_dir, filename)
|
33
24
|
end
|
34
25
|
|
35
|
-
def
|
36
|
-
|
26
|
+
def check_schema_file(filename)
|
27
|
+
unless File.exist?(filename)
|
28
|
+
message = +%{#{filename} doesn't exist yet. Run `rake data:migrate` to create it, then try again.}
|
29
|
+
Kernel.abort message
|
30
|
+
end
|
37
31
|
end
|
38
32
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
ensure
|
45
|
-
migration_class.connection_handler.establish_connection(original_db_config)
|
33
|
+
def pending_migrations
|
34
|
+
sort_migrations(
|
35
|
+
pending_schema_migrations,
|
36
|
+
pending_data_migrations
|
37
|
+
)
|
46
38
|
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def db_configs_with_versions
|
50
|
-
db_configs_with_versions = Hash.new { |h, k| h[k] = [] }
|
51
|
-
|
52
|
-
with_temporary_connection_for_each do |conn|
|
53
|
-
db_config = conn.pool.db_config
|
54
|
-
if db_config.primary?
|
55
|
-
versions_to_run = DataMigrate::DatabaseTasks.pending_data_migrations.map { |m| m[:version] }
|
56
|
-
target_version = ActiveRecord::Tasks::DatabaseTasks.target_version
|
57
39
|
|
58
|
-
|
59
|
-
|
60
|
-
db_configs_with_versions[version] << DatabaseConfigurationWrapper.new(db_config)
|
61
|
-
end
|
62
|
-
end
|
40
|
+
def sort_migrations(*migrations)
|
41
|
+
migrations.flatten.sort { |a, b| sort_string(a) <=> sort_string(b) }
|
63
42
|
end
|
64
43
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
def schema_file(_format = nil)
|
69
|
-
File.join(db_dir, "data_schema.rb")
|
70
|
-
end
|
71
|
-
|
72
|
-
def schema_file_type(_format = nil)
|
73
|
-
"data_schema.rb"
|
74
|
-
end
|
75
|
-
|
76
|
-
# This method is removed in Rails 7.0
|
77
|
-
def dump_filename(spec_name, format = ActiveRecord::Base.schema_format)
|
78
|
-
filename = if spec_name == "primary"
|
79
|
-
schema_file_type(format)
|
80
|
-
else
|
81
|
-
"#{spec_name}_#{schema_file_type(format)}"
|
44
|
+
def sort_string migration
|
45
|
+
"#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
|
82
46
|
end
|
83
47
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
def check_schema_file(filename)
|
88
|
-
unless File.exist?(filename)
|
89
|
-
message = +%{#{filename} doesn't exist yet. Run `rake data:migrate` to create it, then try again.}
|
90
|
-
Kernel.abort message
|
48
|
+
def data_migrations_path
|
49
|
+
::DataMigrate.config.data_migrations_path
|
91
50
|
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def pending_migrations
|
95
|
-
sort_migrations(
|
96
|
-
pending_schema_migrations,
|
97
|
-
pending_data_migrations
|
98
|
-
)
|
99
|
-
end
|
100
|
-
|
101
|
-
def sort_migrations(*migrations)
|
102
|
-
migrations.flatten.sort { |a, b| sort_string(a) <=> sort_string(b) }
|
103
|
-
end
|
104
|
-
|
105
|
-
def sort_string migration
|
106
|
-
"#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
|
107
|
-
end
|
108
51
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
::DataMigrate::SchemaMigration.migrations_paths,
|
122
|
-
migration[:version]
|
123
|
-
)
|
52
|
+
def run_migration(migration, direction)
|
53
|
+
if migration[:kind] == :data
|
54
|
+
::ActiveRecord::Migration.write("== %s %s" % ['Data', "=" * 71])
|
55
|
+
::DataMigrate::DataMigrator.run(direction, data_migrations_path, migration[:version])
|
56
|
+
else
|
57
|
+
::ActiveRecord::Migration.write("== %s %s" % ['Schema', "=" * 69])
|
58
|
+
::DataMigrate::SchemaMigration.run(
|
59
|
+
direction,
|
60
|
+
::DataMigrate::SchemaMigration.migrations_paths,
|
61
|
+
migration[:version]
|
62
|
+
)
|
63
|
+
end
|
124
64
|
end
|
125
65
|
end
|
126
66
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
# We only require a schema.rb file for the primary database
|
131
|
-
return unless db_config.primary?
|
132
|
-
|
133
|
-
File.join(File.dirname(ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(db_config, format)), schema_file_type)
|
134
|
-
end
|
135
|
-
|
136
|
-
# Override this method from `ActiveRecord::Tasks::DatabaseTasks`
|
137
|
-
# to ensure that the sha saved in ar_internal_metadata table
|
138
|
-
# is from the original schema.rb file
|
139
|
-
def schema_sha1(file)
|
140
|
-
ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, name: "primary"))
|
141
|
-
end
|
142
|
-
|
143
|
-
def forward(step = 1)
|
144
|
-
DataMigrate::DataMigrator.create_data_schema_table
|
67
|
+
def self.forward(step = 1)
|
68
|
+
DataMigrate::DataMigrator.assure_data_schema_table
|
145
69
|
migrations = pending_migrations.reverse.pop(step).reverse
|
146
70
|
migrations.each do | pending_migration |
|
147
71
|
if pending_migration[:kind] == :data
|
@@ -154,92 +78,22 @@ module DataMigrate
|
|
154
78
|
end
|
155
79
|
end
|
156
80
|
|
157
|
-
def pending_data_migrations
|
81
|
+
def self.pending_data_migrations
|
158
82
|
data_migrations = DataMigrate::DataMigrator.migrations(data_migrations_path)
|
159
|
-
|
160
|
-
|
161
|
-
data_migrator.pending_migrations.map { |m| { version: m.version, name: m.name, kind: :data } }
|
162
|
-
)
|
83
|
+
sort_migrations(DataMigrate::DataMigrator.new(:up, data_migrations ).
|
84
|
+
pending_migrations.map {|m| { version: m.version, name: m.name, kind: :data }})
|
163
85
|
end
|
164
86
|
|
165
|
-
def pending_schema_migrations
|
87
|
+
def self.pending_schema_migrations
|
166
88
|
::DataMigrate::SchemaMigration.pending_schema_migrations
|
167
89
|
end
|
168
90
|
|
169
|
-
def past_migrations(sort = nil)
|
170
|
-
data_versions = DataMigrate::
|
171
|
-
schema_versions =
|
91
|
+
def self.past_migrations(sort = nil)
|
92
|
+
data_versions = DataMigrate::DataSchemaMigration.table_exists? ? DataMigrate::DataSchemaMigration.normalized_versions : []
|
93
|
+
schema_versions = ActiveRecord::SchemaMigration.normalized_versions
|
172
94
|
migrations = data_versions.map { |v| { version: v.to_i, kind: :data } } + schema_versions.map { |v| { version: v.to_i, kind: :schema } }
|
173
95
|
|
174
96
|
sort&.downcase == "asc" ? sort_migrations(migrations) : sort_migrations(migrations).reverse
|
175
97
|
end
|
176
|
-
|
177
|
-
def self.migrate_with_data
|
178
|
-
DataMigrate::DataMigrator.create_data_schema_table
|
179
|
-
|
180
|
-
ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
|
181
|
-
|
182
|
-
db_configs = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env)
|
183
|
-
|
184
|
-
schema_mapped_versions = ActiveRecord::Tasks::DatabaseTasks.db_configs_with_versions(db_configs)
|
185
|
-
data_mapped_versions = DataMigrate::DatabaseTasks.db_configs_with_versions
|
186
|
-
|
187
|
-
mapped_versions = schema_mapped_versions.merge(data_mapped_versions) do |_key, schema_db_configs, data_db_configs|
|
188
|
-
schema_db_configs + data_db_configs
|
189
|
-
end
|
190
|
-
|
191
|
-
mapped_versions.sort.each do |version, db_configs|
|
192
|
-
db_configs.each do |db_config|
|
193
|
-
if is_data_migration = db_config.is_a?(DataMigrate::DatabaseConfigurationWrapper)
|
194
|
-
db_config = db_config.db_config
|
195
|
-
end
|
196
|
-
|
197
|
-
DataMigrate::DatabaseTasks.with_temporary_connection(db_config) do
|
198
|
-
if is_data_migration
|
199
|
-
DataMigrate::DataMigrator.run(:up, DataMigrate::DatabaseTasks.data_migrations_path, version)
|
200
|
-
else
|
201
|
-
ActiveRecord::Tasks::DatabaseTasks.migrate(version)
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def self.prepare_all_with_data
|
209
|
-
seed = false
|
210
|
-
|
211
|
-
each_current_configuration(env) do |db_config|
|
212
|
-
next unless db_config.primary?
|
213
|
-
|
214
|
-
with_temporary_pool(db_config) do
|
215
|
-
begin
|
216
|
-
database_initialized = migration_connection.schema_migration.table_exists?
|
217
|
-
rescue ActiveRecord::NoDatabaseError
|
218
|
-
create(db_config)
|
219
|
-
retry
|
220
|
-
end
|
221
|
-
|
222
|
-
unless database_initialized
|
223
|
-
if File.exist?(schema_dump_path(db_config))
|
224
|
-
load_schema(db_config, ActiveRecord.schema_format, nil)
|
225
|
-
load_schema_current(
|
226
|
-
:ruby,
|
227
|
-
ENV["DATA_SCHEMA"]
|
228
|
-
)
|
229
|
-
end
|
230
|
-
|
231
|
-
seed = true
|
232
|
-
end
|
233
|
-
|
234
|
-
migrate_with_data
|
235
|
-
if ActiveRecord.dump_schema_after_migration
|
236
|
-
dump_schema(db_config)
|
237
|
-
DataMigrate::Tasks::DataMigrateTasks.dump
|
238
|
-
end
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
load_seed if seed
|
243
|
-
end
|
244
98
|
end
|
245
99
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module DataMigrate
|
2
|
+
class LegacyMigrator
|
3
|
+
def initialize(migrations_paths = "db/data")
|
4
|
+
@migrations_paths = migrations_paths || "db/data"
|
5
|
+
end
|
6
|
+
|
7
|
+
def migrate
|
8
|
+
dates =
|
9
|
+
DataMigrate::DataMigrator.migrations(@migrations_paths).collect(&:version)
|
10
|
+
legacy = ActiveRecord::SchemaMigration.where(version: dates)
|
11
|
+
legacy.each do |v|
|
12
|
+
begin
|
13
|
+
version = v.version
|
14
|
+
puts "Creating #{version} in data schema"
|
15
|
+
DataMigrate::DataSchemaMigration.create(version: version)
|
16
|
+
rescue ActiveRecord::RecordNotUnique
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -11,8 +11,7 @@ module DataMigrate
|
|
11
11
|
migrations
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
data_migrator.migrate
|
14
|
+
DataMigrator.new(:up, selected_migrations, target_version).migrate
|
16
15
|
end
|
17
16
|
|
18
17
|
def down(target_version = nil)
|
@@ -23,13 +22,11 @@ module DataMigrate
|
|
23
22
|
migrations
|
24
23
|
end
|
25
24
|
|
26
|
-
|
27
|
-
data_migrator.migrate
|
25
|
+
DataMigrator.new(:down, selected_migrations, target_version).migrate
|
28
26
|
end
|
29
27
|
|
30
28
|
def run(direction, target_version)
|
31
|
-
|
32
|
-
data_migrator.run
|
29
|
+
DataMigrator.new(direction, migrations, target_version).run
|
33
30
|
end
|
34
31
|
|
35
32
|
def current_version
|
@@ -43,12 +40,12 @@ module DataMigrate
|
|
43
40
|
end
|
44
41
|
|
45
42
|
def migrations_status
|
46
|
-
db_list =
|
43
|
+
db_list = DataSchemaMigration.normalized_versions
|
47
44
|
|
48
45
|
file_list = migration_files.map do |file|
|
49
46
|
version, name, scope = parse_migration_filename(file)
|
50
47
|
raise ActiveRecord::IllegalMigrationNameError.new(file) unless version
|
51
|
-
version =
|
48
|
+
version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
|
52
49
|
status = db_list.delete(version) ? "up" : "down"
|
53
50
|
[status, version, (name + scope).humanize]
|
54
51
|
end.compact
|
@@ -63,15 +60,15 @@ module DataMigrate
|
|
63
60
|
private
|
64
61
|
|
65
62
|
def get_all_versions
|
66
|
-
if DataMigrate::
|
67
|
-
|
63
|
+
if DataMigrate::DataSchemaMigration.table_exists?
|
64
|
+
DataSchemaMigration.normalized_versions.map(&:to_i)
|
68
65
|
else
|
69
66
|
[]
|
70
67
|
end
|
71
68
|
end
|
72
69
|
|
73
70
|
def move(direction, steps)
|
74
|
-
migrator =
|
71
|
+
migrator = DataMigrator.new(direction, migrations)
|
75
72
|
|
76
73
|
if current_version != 0 && !migrator.current_migration
|
77
74
|
raise ActiveRecord::UnknownMigrationVersionError.new(current_version)
|
@@ -26,7 +26,7 @@ module DataMigrate
|
|
26
26
|
|
27
27
|
def initialize(connection)
|
28
28
|
@connection = connection
|
29
|
-
all_versions =
|
29
|
+
all_versions = DataSchemaMigration.normalized_versions
|
30
30
|
|
31
31
|
@version = begin
|
32
32
|
all_versions.max
|
@@ -7,14 +7,14 @@ module DataMigrate
|
|
7
7
|
def self.pending_schema_migrations
|
8
8
|
all_migrations = DataMigrate::MigrationContext.new(migrations_paths).migrations
|
9
9
|
sort_migrations(
|
10
|
-
ActiveRecord::Migrator.new(:up, all_migrations,
|
10
|
+
ActiveRecord::Migrator.new(:up, all_migrations, ActiveRecord::Base.connection.schema_migration).
|
11
11
|
pending_migrations.
|
12
12
|
map {|m| { version: m.version, kind: :schema }}
|
13
13
|
)
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.run(direction, migration_paths, version)
|
17
|
-
ActiveRecord::MigrationContext.new(migration_paths,
|
17
|
+
ActiveRecord::MigrationContext.new(migration_paths, ActiveRecord::Base.connection.schema_migration).run(direction, version)
|
18
18
|
end
|
19
19
|
|
20
20
|
def self.sort_migrations(set1, set2 = nil)
|
@@ -24,10 +24,9 @@ module DataMigrate
|
|
24
24
|
|
25
25
|
def self.migrations_paths
|
26
26
|
spec_name = DataMigrate.config.spec_name
|
27
|
-
|
28
|
-
if spec_name && Gem::Dependency.new("railties", ">= 7.0").match?("railties", Gem.loaded_specs["railties"].version, true)
|
27
|
+
if spec_name && Gem::Dependency.new("rails", "~> 7.0").match?("rails", Gem.loaded_specs["rails"].version)
|
29
28
|
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: spec_name).migrations_paths
|
30
|
-
elsif spec_name && Gem::Dependency.new("
|
29
|
+
elsif spec_name && Gem::Dependency.new("rails", "~> 6.0").match?("rails", Gem.loaded_specs["rails"].version)
|
31
30
|
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: spec_name).migrations_paths
|
32
31
|
else
|
33
32
|
Rails.application.config.paths["db/migrate"].to_a
|
@@ -24,11 +24,11 @@ module DataMigrate
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def table_name
|
27
|
-
DataMigrate::
|
27
|
+
DataMigrate::DataSchemaMigration.table_name
|
28
28
|
end
|
29
29
|
|
30
30
|
def output(stream)
|
31
|
-
unless DataMigrate::
|
31
|
+
unless DataMigrate::DataSchemaMigration.table_exists?
|
32
32
|
stream.puts "Data migrations table does not exist yet."
|
33
33
|
return
|
34
34
|
end
|
@@ -44,9 +44,9 @@ module DataMigrate
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def database_name
|
47
|
-
if Gem::Dependency.new("
|
47
|
+
if Gem::Dependency.new("rails", "~> 7.0").match?("rails", Gem.loaded_specs["rails"].version)
|
48
48
|
ActiveRecord::Base.connection_db_config.configuration_hash[:database]
|
49
|
-
elsif Gem::Dependency.new("
|
49
|
+
elsif Gem::Dependency.new("rails", "~> 6.0").match?("rails", Gem.loaded_specs["rails"].version)
|
50
50
|
ActiveRecord::Base.connection_config[:database]
|
51
51
|
end
|
52
52
|
end
|
@@ -9,9 +9,9 @@ module DataMigrate
|
|
9
9
|
@migrations_paths ||= DataMigrate.config.data_migrations_path
|
10
10
|
end
|
11
11
|
|
12
|
-
def dump
|
12
|
+
def dump(db_config)
|
13
13
|
if dump_schema_after_migration?
|
14
|
-
filename = DataMigrate::DatabaseTasks.
|
14
|
+
filename = DataMigrate::DatabaseTasks.dump_filename(spec_name(db_config), ActiveRecord::Base.schema_format)
|
15
15
|
ActiveRecord::Base.establish_connection(DataMigrate.config.db_configuration) if DataMigrate.config.db_configuration
|
16
16
|
File.open(filename, "w:utf-8") do |file|
|
17
17
|
DataMigrate::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
@@ -22,7 +22,7 @@ module DataMigrate
|
|
22
22
|
def migrate
|
23
23
|
target_version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
24
24
|
|
25
|
-
DataMigrate::DataMigrator.
|
25
|
+
DataMigrate::DataMigrator.assure_data_schema_table
|
26
26
|
DataMigrate::MigrationContext.new(migrations_paths).migrate(target_version)
|
27
27
|
end
|
28
28
|
|
@@ -44,15 +44,16 @@ module DataMigrate
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def status
|
48
|
-
|
47
|
+
def status(db_config)
|
48
|
+
puts "\ndatabase: #{spec_name(db_config)}\n\n"
|
49
|
+
DataMigrate::StatusService.dump(ActiveRecord::Base.connection)
|
49
50
|
end
|
50
51
|
|
51
|
-
def status_with_schema
|
52
|
+
def status_with_schema(db_config)
|
52
53
|
db_list_data = ActiveRecord::Base.connection.select_values(
|
53
|
-
"SELECT version FROM #{DataMigrate::
|
54
|
+
"SELECT version FROM #{DataMigrate::DataSchemaMigration.table_name}"
|
54
55
|
)
|
55
|
-
db_list_schema =
|
56
|
+
db_list_schema = ActiveRecord::SchemaMigration.all.pluck(:version)
|
56
57
|
file_list = []
|
57
58
|
|
58
59
|
Dir.foreach(File.join(Rails.root, migrations_paths)) do |file|
|
@@ -76,7 +77,7 @@ module DataMigrate
|
|
76
77
|
file_list.sort!{|a,b| "#{a[1]}_#{a[3] == 'data' ? 1 : 0}" <=> "#{b[1]}_#{b[3] == 'data' ? 1 : 0}" }
|
77
78
|
|
78
79
|
# output
|
79
|
-
puts "\ndatabase: #{
|
80
|
+
puts "\ndatabase: #{spec_name(db_config)}\n\n"
|
80
81
|
puts "#{"Status".center(8)} #{"Type".center(8)} #{"Migration ID".ljust(14)} Migration Name"
|
81
82
|
puts "-" * 60
|
82
83
|
file_list.each do |file|
|
@@ -93,11 +94,11 @@ module DataMigrate
|
|
93
94
|
|
94
95
|
private
|
95
96
|
|
96
|
-
def
|
97
|
-
if Gem::Dependency.new("
|
98
|
-
|
99
|
-
elsif Gem::Dependency.new("
|
100
|
-
|
97
|
+
def spec_name(db_config)
|
98
|
+
if Gem::Dependency.new("rails", "~> 7.0").match?("rails", Gem.loaded_specs["rails"].version)
|
99
|
+
db_config.name
|
100
|
+
elsif Gem::Dependency.new("rails", "~> 6.0").match?("rails", Gem.loaded_specs["rails"].version)
|
101
|
+
db_config.spec_name
|
101
102
|
end
|
102
103
|
end
|
103
104
|
end
|
data/lib/data_migrate/version.rb
CHANGED
data/lib/data_migrate.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require File.join(File.dirname(__FILE__), "data_migrate", "rails_helper")
|
4
3
|
require File.join(File.dirname(__FILE__), "data_migrate", "data_migrator")
|
5
4
|
require File.join(File.dirname(__FILE__), "data_migrate", "data_schema_migration")
|
6
5
|
require File.join(File.dirname(__FILE__), "data_migrate", "data_schema")
|
@@ -10,9 +9,9 @@ require File.join(File.dirname(__FILE__), "data_migrate", "status_service")
|
|
10
9
|
require File.join(File.dirname(__FILE__), "data_migrate", "migration_context")
|
11
10
|
require File.join(File.dirname(__FILE__), "data_migrate", "railtie")
|
12
11
|
require File.join(File.dirname(__FILE__), "data_migrate", "tasks/data_migrate_tasks")
|
12
|
+
require File.join(File.dirname(__FILE__), "data_migrate", "legacy_migrator")
|
13
13
|
require File.join(File.dirname(__FILE__), "data_migrate", "config")
|
14
14
|
require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration")
|
15
|
-
require File.join(File.dirname(__FILE__), "data_migrate", "database_configurations_wrapper")
|
16
15
|
|
17
16
|
module DataMigrate
|
18
17
|
def self.root
|
@@ -3,8 +3,7 @@
|
|
3
3
|
require "spec_helper"
|
4
4
|
|
5
5
|
describe DataMigrate::DataMigrator do
|
6
|
-
let(:
|
7
|
-
|
6
|
+
let(:subject) { DataMigrate::DataMigrator }
|
8
7
|
let(:db_config) do
|
9
8
|
{
|
10
9
|
adapter: "sqlite3",
|
@@ -14,8 +13,8 @@ describe DataMigrate::DataMigrator do
|
|
14
13
|
|
15
14
|
before do
|
16
15
|
ActiveRecord::Base.establish_connection(db_config)
|
17
|
-
|
18
|
-
DataMigrate::
|
16
|
+
::ActiveRecord::SchemaMigration.create_table
|
17
|
+
DataMigrate::DataSchemaMigration.create_table
|
19
18
|
end
|
20
19
|
|
21
20
|
after do
|
@@ -24,24 +23,22 @@ describe DataMigrate::DataMigrator do
|
|
24
23
|
end
|
25
24
|
|
26
25
|
describe ".load_migrated" do
|
27
|
-
let(:migrator) { DataMigrate::RailsHelper.data_migrator(:up, []) }
|
28
|
-
|
29
26
|
it "loads migrated versions" do
|
30
|
-
DataMigrate::
|
31
|
-
|
32
|
-
DataMigrate::
|
33
|
-
|
34
|
-
migrated =
|
27
|
+
DataMigrate::DataSchemaMigration.create(version: 20090000000000)
|
28
|
+
::ActiveRecord::SchemaMigration.create(version: 20100000000000)
|
29
|
+
DataMigrate::DataSchemaMigration.create(version: 20110000000000)
|
30
|
+
::ActiveRecord::SchemaMigration.create(version: 20120000000000)
|
31
|
+
migrated = subject.new(:up, []).load_migrated
|
35
32
|
expect(migrated.count).to eq 2
|
36
33
|
expect(migrated).to include 20090000000000
|
37
34
|
expect(migrated).to include 20110000000000
|
38
35
|
end
|
39
36
|
end
|
40
37
|
|
41
|
-
describe :
|
38
|
+
describe :assure_data_schema_table do
|
42
39
|
it "creates the data_migrations table" do
|
43
40
|
ActiveRecord::Migration.drop_table("data_migrations") rescue nil
|
44
|
-
|
41
|
+
subject.assure_data_schema_table
|
45
42
|
expect(
|
46
43
|
ActiveRecord::Base.connection.table_exists?("data_migrations")
|
47
44
|
).to eq true
|
@@ -50,7 +47,7 @@ describe DataMigrate::DataMigrator do
|
|
50
47
|
|
51
48
|
describe "#migrations_status" do
|
52
49
|
it "returns all migrations statuses" do
|
53
|
-
status =
|
50
|
+
status = subject.migrations_status
|
54
51
|
expect(status.length).to eq 2
|
55
52
|
expect(status.first).to eq ["down", "20091231235959", "Some name"]
|
56
53
|
expect(status.second).to eq ["down", "20171231235959", "Super update"]
|
@@ -60,19 +57,19 @@ describe DataMigrate::DataMigrator do
|
|
60
57
|
describe :match do
|
61
58
|
context "when the file does not match" do
|
62
59
|
it "returns nil" do
|
63
|
-
expect(
|
60
|
+
expect(subject.match("not_a_data_migration_file")).to be_nil
|
64
61
|
end
|
65
62
|
end
|
66
63
|
|
67
64
|
context "when the file doesn't end in .rb" do
|
68
65
|
it "returns nil" do
|
69
|
-
expect(
|
66
|
+
expect(subject.match("20091231235959_some_name.rb.un~")).to be_nil
|
70
67
|
end
|
71
68
|
end
|
72
69
|
|
73
70
|
context "when the file matches" do
|
74
71
|
it "returns a valid MatchData object" do
|
75
|
-
match_data =
|
72
|
+
match_data = subject.match("20091231235959_some_name.rb")
|
76
73
|
|
77
74
|
expect(match_data[0]).to eq "20091231235959_some_name.rb"
|
78
75
|
expect(match_data[1]).to eq "20091231235959"
|
@@ -1,33 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe DataMigrate::DataSchemaMigration do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
describe :table_name do
|
9
|
-
it "returns correct table name" do
|
10
|
-
expect(subject.table_name).to eq("data_migrations")
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe :index_name do
|
15
|
-
it "returns correct primary key name" do
|
16
|
-
expect(subject.primary_key).to eq("version")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
else
|
20
|
-
let(:subject) { DataMigrate::DataSchemaMigration }
|
21
|
-
describe :table_name do
|
22
|
-
it "returns correct table name" do
|
23
|
-
expect(subject.table_name).to eq("data_migrations")
|
24
|
-
end
|
4
|
+
let(:subject) { DataMigrate::DataSchemaMigration }
|
5
|
+
describe :table_name do
|
6
|
+
it "returns correct table name" do
|
7
|
+
expect(subject.table_name).to eq("data_migrations")
|
25
8
|
end
|
9
|
+
end
|
26
10
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
11
|
+
describe :index_name do
|
12
|
+
it "returns correct primary key name" do
|
13
|
+
expect(subject.primary_key).to eq("version")
|
31
14
|
end
|
32
15
|
end
|
33
16
|
end
|