data_migrate 8.1.0 → 8.2.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.
- checksums.yaml +4 -4
- data/Changelog.md +8 -0
- data/README.md +21 -0
- data/lib/data_migrate/data_schema_migration.rb +7 -8
- data/lib/data_migrate/database_tasks.rb +1 -34
- data/lib/data_migrate/version.rb +1 -1
- data/tasks/databases.rake +85 -35
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba5ee2c5d78ddb60b5b23067b5103c4f1dba6d1249984dfe2489382cc9bc9f1a
|
4
|
+
data.tar.gz: d6ed21a477ffe26c2705f9582a4f370e1a20807297200ba62988ada34c0f42fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d31827b46b9def6d3be01606f027e040cc340e3c4aebea687980f2eefa4ca86acd92f9fb495c6b25578c69f8cfba78aa8ac6863b276945450e43323ff2458fec
|
7
|
+
data.tar.gz: eec842d6f96134abea3945d27e4d366f8f093ac0cfe14ff7f4931b61c2a872cd21fe4c19e7ccec54dedba470b224bf0b9b199f3c4941cad0d2b896de5211b8ac
|
data/Changelog.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 8.2.0
|
4
|
+
|
5
|
+
Delegate to anonymous subclass of AR::SchemaMigration [foxondo](https://github.com/foxondo)
|
6
|
+
|
7
|
+
## 8.1.1
|
8
|
+
|
9
|
+
Revert 8.1.0 changes
|
10
|
+
|
3
11
|
## 8.1.0
|
4
12
|
|
5
13
|
Avoid globally accessible functions for all rake tasks [berniechiu](https://github.com/berniechiu)
|
data/README.md
CHANGED
@@ -132,6 +132,27 @@ require 'capistrano/data_migrate'
|
|
132
132
|
|
133
133
|
From now on capistrano will run `rake db:migrate:with_data` in every deploy.
|
134
134
|
|
135
|
+
## Rails Engines support
|
136
|
+
|
137
|
+
This gem also has a initial support for adding data migrations inside Rails engines.
|
138
|
+
Inside the Engine's class initializer (the one that inherits from `Rails::Engine`, usually inside `engines/ENGINE_NAME/lib/engine.rb`) you need to add something like this:
|
139
|
+
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
module EngineName
|
143
|
+
class Engine < ::Rails::Engine
|
144
|
+
initializer :engine_name do |app|
|
145
|
+
::DataMigrate.configure do |data_migrate|
|
146
|
+
default_path = ::DataMigrate::Config.new.data_migrations_path
|
147
|
+
data_migrate.data_migrations_path = [default_path, root.join('db', 'data')]
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
```
|
153
|
+
|
154
|
+
Then, in the Engine's `db/data` folder, you can add data migrations and run them as usual.
|
155
|
+
|
135
156
|
### Contributing
|
136
157
|
|
137
158
|
## Testing
|
@@ -1,15 +1,14 @@
|
|
1
1
|
module DataMigrate
|
2
|
-
class DataSchemaMigration
|
3
|
-
|
2
|
+
class DataSchemaMigration
|
4
3
|
class << self
|
5
|
-
|
6
|
-
ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix
|
7
|
-
end
|
4
|
+
delegate :table_name, :primary_key, :create_table, :normalized_versions, :create, :create!, :table_exists?, :where, to: :instance
|
8
5
|
|
9
|
-
def
|
10
|
-
|
6
|
+
def instance
|
7
|
+
@instance ||= Class.new(::ActiveRecord::SchemaMigration) do
|
8
|
+
define_singleton_method(:table_name) { ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix }
|
9
|
+
define_singleton_method(:primary_key) { "version" }
|
10
|
+
end
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
@@ -47,40 +47,6 @@ module DataMigrate
|
|
47
47
|
Kernel.abort message
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
51
|
-
def pending_migrations
|
52
|
-
sort_migrations(
|
53
|
-
pending_schema_migrations,
|
54
|
-
pending_data_migrations
|
55
|
-
)
|
56
|
-
end
|
57
|
-
|
58
|
-
def sort_migrations set_1, set_2=nil
|
59
|
-
migrations = set_1 + (set_2 || [])
|
60
|
-
migrations.sort{|a,b| sort_string(a) <=> sort_string(b)}
|
61
|
-
end
|
62
|
-
|
63
|
-
def sort_string migration
|
64
|
-
"#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
|
65
|
-
end
|
66
|
-
|
67
|
-
def data_migrations_path
|
68
|
-
::DataMigrate.config.data_migrations_path
|
69
|
-
end
|
70
|
-
|
71
|
-
def run_migration(migration, direction)
|
72
|
-
if migration[:kind] == :data
|
73
|
-
::ActiveRecord::Migration.write("== %s %s" % ['Data', "=" * 71])
|
74
|
-
::DataMigrate::DataMigrator.run(direction, data_migrations_path, migration[:version])
|
75
|
-
else
|
76
|
-
::ActiveRecord::Migration.write("== %s %s" % ['Schema', "=" * 69])
|
77
|
-
::DataMigrate::SchemaMigration.run(
|
78
|
-
direction,
|
79
|
-
::Continuation::SchemaMigration.migrations_paths,
|
80
|
-
migration[:version]
|
81
|
-
)
|
82
|
-
end
|
83
|
-
end
|
84
50
|
end
|
85
51
|
|
86
52
|
# This overrides ActiveRecord::Tasks::DatabaseTasks
|
@@ -155,5 +121,6 @@ module DataMigrate
|
|
155
121
|
|
156
122
|
sort == "asc" ? sort_migrations(migrations) : sort_migrations(migrations).reverse
|
157
123
|
end
|
124
|
+
|
158
125
|
end
|
159
126
|
end
|
data/lib/data_migrate/version.rb
CHANGED
data/tasks/databases.rake
CHANGED
@@ -4,29 +4,29 @@ namespace :db do
|
|
4
4
|
namespace :migrate do
|
5
5
|
desc "Migrate the database data and schema (options: VERSION=x, VERBOSE=false)."
|
6
6
|
task :with_data => :environment do
|
7
|
-
|
7
|
+
assure_data_schema_table
|
8
8
|
|
9
9
|
ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
|
10
10
|
target_version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
11
11
|
migrations = []
|
12
12
|
|
13
13
|
if target_version.nil?
|
14
|
-
migrations =
|
14
|
+
migrations = pending_migrations.map{ |m| m.merge(:direction =>:up) }
|
15
15
|
else
|
16
16
|
current_schema_version = ActiveRecord::Migrator.current_version
|
17
17
|
schema_migrations = if target_version > current_schema_version
|
18
|
-
|
18
|
+
pending_schema_migrations.keep_if{ |m| m[:version] <= target_version }.map{ |m| m.merge(:direction =>:up) }
|
19
19
|
elsif target_version < current_schema_version
|
20
|
-
|
20
|
+
past_migrations.keep_if{ |m| m[:version] > target_version }.map{ |m| m.merge(:direction =>:down) }
|
21
21
|
else # ==
|
22
22
|
[]
|
23
23
|
end
|
24
24
|
|
25
|
-
current_data_version =
|
25
|
+
current_data_version = ActiveRecord::Migrator.current_version
|
26
26
|
data_migrations = if target_version > current_data_version
|
27
|
-
|
27
|
+
pending_data_migrations.keep_if{ |m| m[:version] <= target_version }.map{ |m| m.merge(:direction =>:up) }
|
28
28
|
elsif target_version < current_data_version
|
29
|
-
|
29
|
+
past_migrations.keep_if{ |m| m[:version] > target_version }.map{ |m| m.merge(:direction =>:down) }
|
30
30
|
else # ==
|
31
31
|
[]
|
32
32
|
end
|
@@ -35,9 +35,9 @@ namespace :db do
|
|
35
35
|
elsif data_migrations.empty?
|
36
36
|
schema_migrations
|
37
37
|
elsif target_version > current_data_version && target_version > current_schema_version
|
38
|
-
|
38
|
+
sort_migrations data_migrations, schema_migrations
|
39
39
|
elsif target_version < current_data_version && target_version < current_schema_version
|
40
|
-
|
40
|
+
sort_migrations(data_migrations, schema_migrations).reverse
|
41
41
|
elsif target_version > current_data_version && target_version < current_schema_version
|
42
42
|
schema_migrations + data_migrations
|
43
43
|
elsif target_version < current_data_version && target_version > current_schema_version
|
@@ -46,7 +46,7 @@ namespace :db do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
migrations.each do |migration|
|
49
|
-
|
49
|
+
run_migration(migration, migration[:direction])
|
50
50
|
end
|
51
51
|
|
52
52
|
Rake::Task["db:_dump"].invoke
|
@@ -56,7 +56,7 @@ namespace :db do
|
|
56
56
|
namespace :redo do
|
57
57
|
desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
|
58
58
|
task :with_data => :environment do
|
59
|
-
|
59
|
+
assure_data_schema_table
|
60
60
|
if ENV["VERSION"]
|
61
61
|
Rake::Task["db:migrate:down:with_data"].invoke
|
62
62
|
Rake::Task["db:migrate:up:with_data"].invoke
|
@@ -72,16 +72,16 @@ namespace :db do
|
|
72
72
|
task :with_data => :environment do
|
73
73
|
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
74
74
|
raise "VERSION is required" unless version
|
75
|
-
|
75
|
+
assure_data_schema_table
|
76
76
|
run_both = ENV["BOTH"] == "true"
|
77
|
-
migrations =
|
77
|
+
migrations = pending_migrations.keep_if{|m| m[:version] == version}
|
78
78
|
|
79
79
|
unless run_both || migrations.size < 2
|
80
80
|
migrations = migrations.slice(0,1)
|
81
81
|
end
|
82
82
|
|
83
83
|
migrations.each do |migration|
|
84
|
-
|
84
|
+
run_migration(migration, :up)
|
85
85
|
end
|
86
86
|
|
87
87
|
Rake::Task["db:_dump"].invoke
|
@@ -94,16 +94,16 @@ namespace :db do
|
|
94
94
|
task :with_data => :environment do
|
95
95
|
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
96
96
|
raise "VERSION is required" unless version
|
97
|
-
|
97
|
+
assure_data_schema_table
|
98
98
|
run_both = ENV["BOTH"] == "true"
|
99
|
-
migrations =
|
99
|
+
migrations = past_migrations.keep_if{|m| m[:version] == version}
|
100
100
|
|
101
101
|
unless run_both || migrations.size < 2
|
102
102
|
migrations = migrations.slice(0,1)
|
103
103
|
end
|
104
104
|
|
105
105
|
migrations.each do |migration|
|
106
|
-
|
106
|
+
run_migration(migration, :down)
|
107
107
|
end
|
108
108
|
|
109
109
|
Rake::Task["db:_dump"].invoke
|
@@ -123,9 +123,9 @@ namespace :db do
|
|
123
123
|
desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
|
124
124
|
task :with_data => :environment do
|
125
125
|
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
126
|
-
|
127
|
-
|
128
|
-
|
126
|
+
assure_data_schema_table
|
127
|
+
past_migrations[0..(step - 1)].each do | past_migration |
|
128
|
+
run_migration(past_migration, :down)
|
129
129
|
end
|
130
130
|
|
131
131
|
Rake::Task["db:_dump"].invoke
|
@@ -136,7 +136,7 @@ namespace :db do
|
|
136
136
|
namespace :forward do
|
137
137
|
desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
|
138
138
|
task :with_data => :environment do
|
139
|
-
|
139
|
+
assure_data_schema_table
|
140
140
|
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
141
141
|
DataMigrate::DatabaseTasks.forward(step)
|
142
142
|
Rake::Task["db:_dump"].invoke
|
@@ -147,7 +147,7 @@ namespace :db do
|
|
147
147
|
namespace :version do
|
148
148
|
desc "Retrieves the current schema version numbers for data and schema migrations"
|
149
149
|
task :with_data => :environment do
|
150
|
-
|
150
|
+
assure_data_schema_table
|
151
151
|
puts "Current Schema version: #{ActiveRecord::Migrator.current_version}"
|
152
152
|
puts "Current Data version: #{DataMigrate::DataMigrator.current_version}"
|
153
153
|
end
|
@@ -157,7 +157,7 @@ namespace :db do
|
|
157
157
|
desc "Raises an error if there are pending migrations or data migrations"
|
158
158
|
task with_data: :environment do
|
159
159
|
message = %{Run `rake db:migrate:with_data` to update your database then try again.}
|
160
|
-
DataMigrate::Tasks::DataMigrateTasks.abort_if_pending_migrations(
|
160
|
+
DataMigrate::Tasks::DataMigrateTasks.abort_if_pending_migrations(pending_migrations, message)
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
@@ -200,7 +200,7 @@ namespace :data do
|
|
200
200
|
namespace :migrate do
|
201
201
|
desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
|
202
202
|
task :redo => :environment do
|
203
|
-
|
203
|
+
assure_data_schema_table
|
204
204
|
if ENV["VERSION"]
|
205
205
|
Rake::Task["data:migrate:down"].invoke
|
206
206
|
Rake::Task["data:migrate:up"].invoke
|
@@ -212,10 +212,10 @@ namespace :data do
|
|
212
212
|
|
213
213
|
desc 'Runs the "up" for a given migration VERSION.'
|
214
214
|
task :up => :environment do
|
215
|
-
|
215
|
+
assure_data_schema_table
|
216
216
|
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
217
217
|
raise "VERSION is required" unless version
|
218
|
-
DataMigrate::DataMigrator.run(:up,
|
218
|
+
DataMigrate::DataMigrator.run(:up, data_migrations_path, version)
|
219
219
|
Rake::Task["data:dump"].invoke
|
220
220
|
end
|
221
221
|
|
@@ -223,8 +223,8 @@ namespace :data do
|
|
223
223
|
task :down => :environment do
|
224
224
|
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
225
225
|
raise "VERSION is required" unless version
|
226
|
-
|
227
|
-
DataMigrate::DataMigrator.run(:down,
|
226
|
+
assure_data_schema_table
|
227
|
+
DataMigrate::DataMigrator.run(:down, data_migrations_path, version)
|
228
228
|
Rake::Task["data:dump"].invoke
|
229
229
|
end
|
230
230
|
|
@@ -236,35 +236,35 @@ namespace :data do
|
|
236
236
|
|
237
237
|
desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
|
238
238
|
task :rollback => :environment do
|
239
|
-
|
239
|
+
assure_data_schema_table
|
240
240
|
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
241
|
-
DataMigrate::DataMigrator.rollback(
|
241
|
+
DataMigrate::DataMigrator.rollback(data_migrations_path, step)
|
242
242
|
Rake::Task["data:dump"].invoke
|
243
243
|
end
|
244
244
|
|
245
245
|
desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
|
246
246
|
task :forward => :environment do
|
247
|
-
|
247
|
+
assure_data_schema_table
|
248
248
|
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
249
249
|
# TODO: No worky for .forward
|
250
250
|
# DataMigrate::DataMigrator.forward('db/data/', step)
|
251
|
-
migrations =
|
251
|
+
migrations = pending_data_migrations.reverse.pop(step).reverse
|
252
252
|
migrations.each do | pending_migration |
|
253
|
-
DataMigrate::DataMigrator.run(:up,
|
253
|
+
DataMigrate::DataMigrator.run(:up, data_migrations_path, pending_migration[:version])
|
254
254
|
end
|
255
255
|
Rake::Task["data:dump"].invoke
|
256
256
|
end
|
257
257
|
|
258
258
|
desc "Retrieves the current schema version number for data migrations"
|
259
259
|
task :version => :environment do
|
260
|
-
|
260
|
+
assure_data_schema_table
|
261
261
|
puts "Current data version: #{DataMigrate::DataMigrator.current_version}"
|
262
262
|
end
|
263
263
|
|
264
264
|
desc "Raises an error if there are pending data migrations"
|
265
265
|
task abort_if_pending_migrations: :environment do
|
266
266
|
message = %{Run `rake data:migrate` to update your database then try again.}
|
267
|
-
DataMigrate::Tasks::DataMigrateTasks.abort_if_pending_migrations(
|
267
|
+
DataMigrate::Tasks::DataMigrateTasks.abort_if_pending_migrations(pending_data_migrations, message)
|
268
268
|
end
|
269
269
|
|
270
270
|
desc "Create a db/data_schema.rb file that stores the current data version"
|
@@ -287,3 +287,53 @@ namespace :data do
|
|
287
287
|
end
|
288
288
|
end
|
289
289
|
end
|
290
|
+
|
291
|
+
def pending_migrations
|
292
|
+
DataMigrate::DatabaseTasks.sort_migrations(
|
293
|
+
DataMigrate::DatabaseTasks.pending_schema_migrations,
|
294
|
+
DataMigrate::DatabaseTasks.pending_data_migrations
|
295
|
+
)
|
296
|
+
end
|
297
|
+
|
298
|
+
def pending_data_migrations
|
299
|
+
DataMigrate::DatabaseTasks.pending_data_migrations
|
300
|
+
end
|
301
|
+
|
302
|
+
def pending_schema_migrations
|
303
|
+
DataMigrate::DatabaseTasks.pending_schema_migrations
|
304
|
+
end
|
305
|
+
|
306
|
+
def sort_migrations set_1, set_2=nil
|
307
|
+
migrations = set_1 + (set_2 || [])
|
308
|
+
migrations.sort{|a,b| sort_string(a) <=> sort_string(b)}
|
309
|
+
end
|
310
|
+
|
311
|
+
def sort_string migration
|
312
|
+
"#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
|
313
|
+
end
|
314
|
+
|
315
|
+
def past_migrations(sort=nil)
|
316
|
+
DataMigrate::DatabaseTasks.past_migrations(sort)
|
317
|
+
end
|
318
|
+
|
319
|
+
def assure_data_schema_table
|
320
|
+
DataMigrate::DataMigrator.assure_data_schema_table
|
321
|
+
end
|
322
|
+
|
323
|
+
def data_migrations_path
|
324
|
+
DataMigrate.config.data_migrations_path
|
325
|
+
end
|
326
|
+
|
327
|
+
def run_migration(migration, direction)
|
328
|
+
if migration[:kind] == :data
|
329
|
+
ActiveRecord::Migration.write("== %s %s" % ['Data', "=" * 71])
|
330
|
+
DataMigrate::DataMigrator.run(direction, data_migrations_path, migration[:version])
|
331
|
+
else
|
332
|
+
ActiveRecord::Migration.write("== %s %s" % ['Schema', "=" * 69])
|
333
|
+
DataMigrate::SchemaMigration.run(
|
334
|
+
direction,
|
335
|
+
DataMigrate::SchemaMigration.migrations_paths,
|
336
|
+
migration[:version]
|
337
|
+
)
|
338
|
+
end
|
339
|
+
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: 8.
|
4
|
+
version: 8.2.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: 2022-
|
13
|
+
date: 2022-10-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|