migrer 0.0.2 → 0.1.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.
- data/README.md +5 -1
- data/{lib/data_migration.rb → app/models/migrer/data_migration_version.rb} +7 -5
- data/lib/generators/data_migration/USAGE +1 -1
- data/lib/generators/data_migration/data_migration_generator.rb +2 -2
- data/lib/generators/data_migration/templates/data_migration.rb +6 -8
- data/lib/migrer/ansi_colors.rb +13 -0
- data/lib/migrer/version.rb +1 -1
- data/lib/migrer.rb +3 -0
- data/lib/tasks/migrer.rake +56 -48
- metadata +4 -3
data/README.md
CHANGED
|
@@ -51,7 +51,7 @@ Create a data migration:
|
|
|
51
51
|
|
|
52
52
|
$ bundle exec rails generate data_migration MyFirstDataMigration "optional description"
|
|
53
53
|
|
|
54
|
-
This will create the file:
|
|
54
|
+
This will create the file: db/data_migrate/<timestamp>_my_first_data_migration.rb
|
|
55
55
|
|
|
56
56
|
Open this file and replace "TODO" with your data migration code!
|
|
57
57
|
|
|
@@ -89,6 +89,10 @@ ActiveRecord migrations):**
|
|
|
89
89
|
|
|
90
90
|
bundle exec rake data:unmark VERSION=<version>
|
|
91
91
|
|
|
92
|
+
**View all unprocessed data migrations by filename:**
|
|
93
|
+
|
|
94
|
+
bundle exec rake data:pending
|
|
95
|
+
|
|
92
96
|
## Contributing
|
|
93
97
|
|
|
94
98
|
1. Fork it
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
class
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
class Migrer::DataMigrationVersion < ActiveRecord::Base
|
|
2
|
+
|
|
3
|
+
attr_accessible :version
|
|
4
|
+
|
|
5
|
+
def self.all_from_files
|
|
6
|
+
filenames = Dir.entries("#{Rails.root}/db/data_migrate").select { |f| /^\d+.*\.rb$/ === f }
|
|
4
7
|
data_migrations = {}
|
|
5
8
|
|
|
6
9
|
filenames.each do |f|
|
|
7
10
|
match_data = /^(?<version>\d+)_(?<name>.+)\.rb$/.match(f)
|
|
8
11
|
|
|
9
|
-
record =
|
|
10
|
-
"SELECT * FROM data_migration_versions WHERE version = '#{match_data[:version]}'").first
|
|
12
|
+
record = Migrer::DataMigrationVersion.find_by_version(match_data[:version])
|
|
11
13
|
|
|
12
14
|
data_migrations.merge!(
|
|
13
15
|
match_data[:version] => {
|
|
@@ -6,11 +6,11 @@ class DataMigrationGenerator < Rails::Generators::NamedBase
|
|
|
6
6
|
|
|
7
7
|
def generate_data_migration
|
|
8
8
|
template "data_migration.rb",
|
|
9
|
-
"
|
|
9
|
+
"db/data_migrate/#{file_name}"
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
private
|
|
13
13
|
def file_name
|
|
14
|
-
"#{ActiveRecord::Generators::Base.next_migration_number('
|
|
14
|
+
"#{ActiveRecord::Generators::Base.next_migration_number('db/data_migrate')}_#{name.underscore}.rb"
|
|
15
15
|
end
|
|
16
16
|
end
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
class <%= name %>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
end
|
|
8
|
-
end
|
|
1
|
+
class <%= name %>
|
|
2
|
+
<%= "\n # #{description}\n" if description.present? %>
|
|
3
|
+
def self.run
|
|
4
|
+
#TODO: data_migration code
|
|
5
|
+
end
|
|
6
|
+
end
|
data/lib/migrer/version.rb
CHANGED
data/lib/migrer.rb
CHANGED
data/lib/tasks/migrer.rake
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'migrer/ansi_colors'
|
|
2
2
|
|
|
3
3
|
namespace :data do
|
|
4
|
-
desc "Data migration tasks"
|
|
5
4
|
|
|
5
|
+
desc 'Run all unprocessed data migrations or a single data migration if VERSION is specified.'
|
|
6
6
|
task migrate: :environment do
|
|
7
|
-
data_migrations =
|
|
7
|
+
data_migrations = Migrer::DataMigrationVersion.all_from_files
|
|
8
8
|
|
|
9
9
|
if (version = ENV['VERSION'])
|
|
10
10
|
data_migration = data_migrations[version]
|
|
11
11
|
|
|
12
12
|
if data_migration.present?
|
|
13
13
|
if data_migration[:processed]
|
|
14
|
-
puts "Data migration already processed. Do you want to run it anyway? (responses other than 'yes' will exit)"
|
|
14
|
+
puts "Data migration already processed. Do you want to run it anyway? (responses other than 'yes' will exit)".migrer_yellow
|
|
15
15
|
else
|
|
16
|
-
puts "Starting data migration #{data_migration[:class_name]}. Do you wish to continue? (responses other than 'yes' will exit)"
|
|
16
|
+
puts "Starting data migration #{data_migration[:class_name]}. Do you wish to continue? (responses other than 'yes' will exit)".migrer_yellow
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
prompt = $stdin.gets.chomp
|
|
@@ -22,134 +22,142 @@ namespace :data do
|
|
|
22
22
|
puts "#{data_migration[:class_name]}: migrating"
|
|
23
23
|
t_start = Time.now
|
|
24
24
|
|
|
25
|
-
require "#{Rails.root}/
|
|
25
|
+
require "#{Rails.root}/db/data_migrate/#{data_migration[:basefilename]}"
|
|
26
26
|
eval(data_migration[:class_name]).run
|
|
27
27
|
|
|
28
28
|
t_end = Time.now
|
|
29
29
|
|
|
30
30
|
unless data_migration[:processed]
|
|
31
|
-
|
|
32
|
-
"INSERT INTO data_migration_versions
|
|
33
|
-
VALUES (NULL, '#{version}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)" )
|
|
31
|
+
Migrer::DataMigrationVersion.create(version: version)
|
|
34
32
|
end
|
|
35
33
|
|
|
36
|
-
puts "#{data_migration[:class_name]}: migrated (#{t_end - t_start}s)"
|
|
34
|
+
puts "#{data_migration[:class_name]}:" + " migrated (#{t_end - t_start}s)".migrer_green
|
|
37
35
|
end
|
|
38
36
|
else
|
|
39
|
-
puts "No data migration found matching version: #{version}"
|
|
37
|
+
puts "No data migration found matching version: #{version}".migrer_red
|
|
40
38
|
end
|
|
41
39
|
else
|
|
42
40
|
data_migrations.each do |k, v|
|
|
43
41
|
unless v[:processed]
|
|
44
|
-
puts "Starting data migration #{v[:class_name]}. Do you wish to continue? (responses other than 'yes' will exit)"
|
|
42
|
+
puts "Starting data migration #{v[:class_name]}. Do you wish to continue? (responses other than 'yes' will exit)".migrer_yellow
|
|
45
43
|
prompt = $stdin.gets.chomp
|
|
46
44
|
if prompt == "yes"
|
|
47
45
|
puts "#{v[:class_name]}: migrating"
|
|
48
46
|
t_start = Time.now
|
|
49
47
|
|
|
50
|
-
require "#{Rails.root}/
|
|
48
|
+
require "#{Rails.root}/db/data_migrate/#{v[:basefilename]}"
|
|
51
49
|
eval(v[:class_name]).run
|
|
52
50
|
|
|
53
51
|
t_end = Time.now
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
"INSERT INTO data_migration_versions
|
|
57
|
-
VALUES (NULL, '#{k}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)" )
|
|
53
|
+
Migrer::DataMigrationVersion.create(version: k)
|
|
58
54
|
|
|
59
|
-
puts "#{v[:class_name]}: migrated (#{t_end - t_start}s)"
|
|
55
|
+
puts "#{v[:class_name]}:" + " migrated (#{t_end - t_start}s)".migrer_green
|
|
60
56
|
end
|
|
61
57
|
end
|
|
62
58
|
end
|
|
63
59
|
end
|
|
64
60
|
end
|
|
65
61
|
|
|
62
|
+
desc 'Mark a single migration as already processed (requires VERSION).'
|
|
66
63
|
task mark: :environment do
|
|
67
|
-
data_migrations =
|
|
64
|
+
data_migrations = Migrer::DataMigrationVersion.all_from_files
|
|
68
65
|
|
|
69
66
|
if (version = ENV['VERSION'])
|
|
70
67
|
data_migration = data_migrations[version]
|
|
71
68
|
|
|
72
69
|
if data_migration.present?
|
|
73
70
|
if data_migration[:processed]
|
|
74
|
-
puts "Data migration already processed."
|
|
71
|
+
puts "Data migration already processed.".migrer_yellow
|
|
75
72
|
else
|
|
76
|
-
puts "Data migration #{data_migration[:class_name]} will be marked as processed. Continue? (responses other than 'yes' will exit)"
|
|
73
|
+
puts "Data migration #{data_migration[:class_name]} will be marked as processed. Continue? (responses other than 'yes' will exit)".migrer_yellow
|
|
77
74
|
|
|
78
75
|
prompt = $stdin.gets.chomp
|
|
79
76
|
|
|
80
77
|
if prompt == "yes"
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
VALUES (NULL, '#{version}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)" )
|
|
84
|
-
|
|
85
|
-
puts "#{data_migration[:class_name]}: marked as migrated"
|
|
78
|
+
Migrer::DataMigrationVersion.create(version: version)
|
|
79
|
+
puts "#{data_migration[:class_name]}:" + " marked as migrated".migrer_green
|
|
86
80
|
end
|
|
87
81
|
end
|
|
88
82
|
else
|
|
89
|
-
puts "No data migration found matching version: #{version}"
|
|
83
|
+
puts "No data migration found matching version: #{version}".migrer_red
|
|
90
84
|
end
|
|
91
85
|
else
|
|
92
|
-
puts "VERSION must be supplied."
|
|
86
|
+
puts "VERSION must be supplied.".migrer_red
|
|
93
87
|
end
|
|
94
88
|
end
|
|
95
89
|
|
|
90
|
+
desc 'Mark all data migrations as already processed.'
|
|
96
91
|
task mark_all: :environment do
|
|
97
|
-
unprocessed_data_migrations =
|
|
92
|
+
unprocessed_data_migrations = Migrer::DataMigrationVersion.all_from_files.select { |k, v| !v[:processed] }
|
|
98
93
|
|
|
99
|
-
puts "This will mark all data migrations as already processed. Continue? (responses other than 'yes' will exit)"
|
|
94
|
+
puts "This will mark all data migrations as already processed. Continue? (responses other than 'yes' will exit)".migrer_yellow
|
|
100
95
|
|
|
101
96
|
prompt = $stdin.gets.chomp
|
|
102
97
|
if prompt == "yes"
|
|
103
98
|
unprocessed_data_migrations.each do |k, v|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
VALUES (NULL, '#{k}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)" )
|
|
107
|
-
|
|
108
|
-
puts "#{v[:class_name]}: marked as migrated"
|
|
99
|
+
Migrer::DataMigrationVersion.create(version: k)
|
|
100
|
+
puts "#{v[:class_name]}:" + " marked as migrated".migrer_green
|
|
109
101
|
end
|
|
110
102
|
end
|
|
111
103
|
end
|
|
112
104
|
|
|
105
|
+
desc 'Revert a data migration to an unprocessed state (requires VERSION).'
|
|
113
106
|
task unmark: :environment do
|
|
114
|
-
data_migrations =
|
|
107
|
+
data_migrations = Migrer::DataMigrationVersion.all_from_files
|
|
115
108
|
|
|
116
109
|
if (version = ENV['VERSION'])
|
|
117
110
|
data_migration = data_migrations[version]
|
|
118
111
|
|
|
119
112
|
if data_migration.present?
|
|
120
113
|
if !data_migration[:processed]
|
|
121
|
-
puts "Data migration not yet processed."
|
|
114
|
+
puts "Data migration not yet processed.".migrer_yellow
|
|
122
115
|
else
|
|
123
|
-
puts "Data migration #{data_migration[:class_name]} will be unmarked as processed. Continue? (responses other than 'yes' will exit)"
|
|
116
|
+
puts "Data migration #{data_migration[:class_name]} will be unmarked as processed. Continue? (responses other than 'yes' will exit)".migrer_yellow
|
|
124
117
|
|
|
125
118
|
prompt = $stdin.gets.chomp
|
|
126
119
|
|
|
127
120
|
if prompt == "yes"
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
WHERE version = '#{version}'" )
|
|
131
|
-
|
|
132
|
-
puts "#{data_migration[:class_name]}: unmarked as migrated"
|
|
121
|
+
Migrer::DataMigrationVersion.find_by_version(version).destroy
|
|
122
|
+
puts "#{data_migration[:class_name]}:" + " unmarked as migrated".migrer_green
|
|
133
123
|
end
|
|
134
124
|
end
|
|
135
125
|
else
|
|
136
|
-
puts "No data migration found matching version: #{version}"
|
|
126
|
+
puts "No data migration found matching version: #{version}".migrer_red
|
|
137
127
|
end
|
|
138
128
|
else
|
|
139
|
-
puts "VERSION must be supplied."
|
|
129
|
+
puts "VERSION must be supplied.".migrer_red
|
|
140
130
|
end
|
|
141
131
|
end
|
|
142
132
|
|
|
133
|
+
desc 'Revert all data migrations to an unprocessed state.'
|
|
143
134
|
task unmark_all: :environment do
|
|
144
|
-
puts "All data migrations will be unmarked as processed. Continue? (responses other than 'yes' will exit)"
|
|
135
|
+
puts "All data migrations will be unmarked as processed. Continue? (responses other than 'yes' will exit)".migrer_yellow
|
|
145
136
|
|
|
146
137
|
prompt = $stdin.gets.chomp
|
|
147
138
|
|
|
148
139
|
if prompt == "yes"
|
|
149
|
-
|
|
150
|
-
|
|
140
|
+
Migrer::DataMigrationVersion.destroy_all
|
|
141
|
+
puts "Data migration records cleared".migrer_green
|
|
142
|
+
end
|
|
143
|
+
end
|
|
151
144
|
|
|
152
|
-
|
|
145
|
+
desc 'View all unprocessed data migrations by filename.'
|
|
146
|
+
task pending: :environment do
|
|
147
|
+
data_migrations = Migrer::DataMigrationVersion.all_from_files
|
|
148
|
+
pending = data_migrations.reject {|k, v| v[:processed]}
|
|
149
|
+
|
|
150
|
+
if data_migrations.present?
|
|
151
|
+
if pending.present?
|
|
152
|
+
puts "The following migrations have not yet been processed:".migrer_yellow
|
|
153
|
+
pending.each do |k, v|
|
|
154
|
+
puts v[:filename]
|
|
155
|
+
end
|
|
156
|
+
else
|
|
157
|
+
puts "All existing data migrations have been processed.".migrer_yellow
|
|
158
|
+
end
|
|
159
|
+
else
|
|
160
|
+
puts "No data migrations found.".migrer_yellow
|
|
153
161
|
end
|
|
154
162
|
end
|
|
155
163
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: migrer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2013-01-
|
|
13
|
+
date: 2013-01-31 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: activerecord
|
|
@@ -40,12 +40,13 @@ files:
|
|
|
40
40
|
- LICENSE.txt
|
|
41
41
|
- README.md
|
|
42
42
|
- Rakefile
|
|
43
|
+
- app/models/migrer/data_migration_version.rb
|
|
43
44
|
- db/migrate/20121229002105_create_migrer_table.rb
|
|
44
|
-
- lib/data_migration.rb
|
|
45
45
|
- lib/generators/data_migration/USAGE
|
|
46
46
|
- lib/generators/data_migration/data_migration_generator.rb
|
|
47
47
|
- lib/generators/data_migration/templates/data_migration.rb
|
|
48
48
|
- lib/migrer.rb
|
|
49
|
+
- lib/migrer/ansi_colors.rb
|
|
49
50
|
- lib/migrer/engine.rb
|
|
50
51
|
- lib/migrer/version.rb
|
|
51
52
|
- lib/tasks/migrer.rake
|