imigrate 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +21 -0
  7. data/README.md +104 -0
  8. data/Rakefile +2 -0
  9. data/imigrate.gemspec +25 -0
  10. data/lib/generators/imigrate.rb +30 -0
  11. data/lib/generators/templates/data_migration.rb +8 -0
  12. data/lib/imigrate.rb +9 -0
  13. data/lib/imigrate/activerecord_ext.rb +19 -0
  14. data/lib/imigrate/railtie.rb +10 -0
  15. data/lib/imigrate/version.rb +3 -0
  16. data/lib/tasks/capistrano.rake +17 -0
  17. data/lib/tasks/databases.rake +60 -0
  18. data/spec/dummy/README.rdoc +28 -0
  19. data/spec/dummy/Rakefile +6 -0
  20. data/spec/dummy/app/assets/images/.keep +0 -0
  21. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  22. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  23. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  24. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  25. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy/app/mailers/.keep +0 -0
  27. data/spec/dummy/app/models/.keep +0 -0
  28. data/spec/dummy/app/models/concerns/.keep +0 -0
  29. data/spec/dummy/app/models/user.rb +2 -0
  30. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  31. data/spec/dummy/bin/bundle +3 -0
  32. data/spec/dummy/bin/rails +4 -0
  33. data/spec/dummy/bin/rake +4 -0
  34. data/spec/dummy/config.ru +4 -0
  35. data/spec/dummy/config/application.rb +23 -0
  36. data/spec/dummy/config/boot.rb +5 -0
  37. data/spec/dummy/config/database.yml +25 -0
  38. data/spec/dummy/config/environment.rb +5 -0
  39. data/spec/dummy/config/environments/development.rb +39 -0
  40. data/spec/dummy/config/environments/production.rb +78 -0
  41. data/spec/dummy/config/environments/test.rb +39 -0
  42. data/spec/dummy/config/initializers/assets.rb +8 -0
  43. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  44. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  45. data/spec/dummy/config/initializers/data_migrator.rb +1 -0
  46. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  47. data/spec/dummy/config/initializers/inflections.rb +16 -0
  48. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  49. data/spec/dummy/config/initializers/session_store.rb +3 -0
  50. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  51. data/spec/dummy/config/locales/en.yml +23 -0
  52. data/spec/dummy/config/routes.rb +56 -0
  53. data/spec/dummy/config/secrets.yml +22 -0
  54. data/spec/dummy/db/data/20150202182709_populate_user.rb +9 -0
  55. data/spec/dummy/db/data/20150202183455_populate_user2.rb +9 -0
  56. data/spec/dummy/db/development.sqlite3 +0 -0
  57. data/spec/dummy/db/migrate/20150202164939_create_user.rb +8 -0
  58. data/spec/dummy/db/migrate_test/20150202174939_modify_user.rb +5 -0
  59. data/spec/dummy/db/schema.rb +27 -0
  60. data/spec/dummy/db/test.sqlite3 +0 -0
  61. data/spec/dummy/lib/assets/.keep +0 -0
  62. data/spec/dummy/log/.keep +0 -0
  63. data/spec/dummy/public/404.html +67 -0
  64. data/spec/dummy/public/422.html +67 -0
  65. data/spec/dummy/public/500.html +66 -0
  66. data/spec/dummy/public/favicon.ico +0 -0
  67. data/spec/lib/generators/generator_spec.rb +17 -0
  68. data/spec/rake_tasks_spec.rb +147 -0
  69. data/spec/spec_helper.rb +18 -0
  70. metadata +181 -0
@@ -0,0 +1,9 @@
1
+ class PopulateUser < ActiveRecord::Migration
2
+ def self.up
3
+ User.create!(first_name: 'toto', last_name: 'tata')
4
+ end
5
+
6
+ def self.down
7
+ raise ActiveRecord::IrreversibleMigration
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class PopulateUser2 < ActiveRecord::Migration
2
+ def self.up
3
+ User.create!(first_name: 'toto2', last_name: 'tata2')
4
+ end
5
+
6
+ def self.down
7
+ raise ActiveRecord::IrreversibleMigration
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ class CreateUser < ActiveRecord::Migration
2
+ def change
3
+ create_table :users do |t|
4
+ t.string :first_name
5
+ t.string :last_name
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class ModifyUser < ActiveRecord::Migration
2
+ def change
3
+ add_column :users, :email, :string
4
+ end
5
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended that you check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(version: 20150202164939) do
15
+
16
+ create_table "data_migrations", id: false, force: true do |t|
17
+ t.string "version", null: false
18
+ end
19
+
20
+ add_index "data_migrations", ["version"], name: "unique_data_migrations", unique: true
21
+
22
+ create_table "users", force: true do |t|
23
+ t.string "first_name"
24
+ t.string "last_name"
25
+ end
26
+
27
+ end
File without changes
File without changes
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/404.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The page you were looking for doesn't exist.</h1>
62
+ <p>You may have mistyped the address or the page may have moved.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/422.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The change you wanted was rejected.</h1>
62
+ <p>Maybe you tried to change something you didn't have access to.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ require "generator_spec"
4
+
5
+ describe Imigrate::Generators::DataMigrationGenerator, type: :generator do
6
+ destination File.expand_path("../../../tmp", __FILE__)
7
+
8
+ before(:all) do
9
+ prepare_destination
10
+ end
11
+
12
+ it "create the templated file" do
13
+ run_generator %w{toto}
14
+ assert_migration "db/data/toto.rb"
15
+ end
16
+
17
+ end
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+ require 'fileutils'
3
+
4
+ describe 'rake tasks' do
5
+
6
+ ### Helpers ###
7
+ def rails_app_root
8
+ "#{MIGRATOR_ROOT}/spec/dummy"
9
+ end
10
+ def debug(mes)
11
+ if ENV['DEBUG'] == 'true'
12
+ puts mes
13
+ end
14
+ end
15
+
16
+ def insert_migration_test
17
+ FileUtils.copy_file("#{rails_app_root}/db/migrate_test/20150202174939_modify_user.rb", "#{rails_app_root}/db/migrate/20150202174939_modify_user.rb")
18
+ end
19
+
20
+ def reset_migration_and_db
21
+ FileUtils.remove_file("#{rails_app_root}/db/migrate/20150202174939_modify_user.rb")
22
+ exec_cmd('rake db:drop')
23
+ exec_cmd('git checkout db/schema.rb')
24
+ exec_cmd('rake db:setup')
25
+ end
26
+
27
+ def get_data_versions
28
+ ActiveRecord::Base.establish_connection
29
+ res = ActiveRecord::Base.connection.execute('SELECT * from data_migrations').to_a.map{|r| r['version']}
30
+ debug "Result get_data_versions: #{res}"
31
+ res
32
+ end
33
+
34
+ def get_versions
35
+ ActiveRecord::Base.establish_connection
36
+ res = ActiveRecord::Base.connection.execute('SELECT * from schema_migrations').to_a.map{|r| r['version']}
37
+ debug "Result get_versions: #{res}"
38
+ res
39
+ end
40
+
41
+ def exec_cmd(cmd)
42
+ cmd_final = "cd #{rails_app_root} && RAILS_ENV=test #{cmd}"
43
+
44
+ debug "Executing: #{cmd_final}"
45
+ res = `#{cmd_final}`
46
+ debug "Result: #{res}"
47
+ res
48
+ end
49
+
50
+ def rake(task)
51
+ exec_cmd("rake #{task}")
52
+ end
53
+ #### End Helpers ####
54
+
55
+ describe 'db:data:migrate' do
56
+ before do
57
+ DatabaseCleaner.clean
58
+ end
59
+
60
+ it "add an user" do
61
+ expect{rake('db:data:migrate')}.to change{User.count}.by (2)
62
+ end
63
+
64
+ it "add version to data_migration" do
65
+ rake('db:data:migrate')
66
+ expect(get_data_versions.any?).to eq(true)
67
+ end
68
+
69
+ it "does not change schema migration" do
70
+ expect{rake('db:data:migrate')}.to_not change{get_versions}
71
+ end
72
+ end
73
+
74
+ describe 'db:migrate' do
75
+ before do
76
+ ActiveRecord::Base.establish_connection
77
+ DatabaseCleaner.clean
78
+ insert_migration_test
79
+ end
80
+ after do
81
+ reset_migration_and_db
82
+ end
83
+
84
+ it 'does not add an user' do
85
+ expect{rake('db:migrate')}.to_not change{User.count}
86
+ end
87
+
88
+ it "does not add version to data_migration" do
89
+ rake('db:migrate')
90
+ expect(get_data_versions.any?).to eq(false)
91
+ end
92
+
93
+ it "does add version to schema" do
94
+ rake('db:migrate')
95
+ expect(get_versions).to include('20150202174939')
96
+ end
97
+ end
98
+
99
+ describe 'db:migrate:all' do
100
+ before do
101
+ ActiveRecord::Base.establish_connection
102
+ DatabaseCleaner.clean
103
+ insert_migration_test
104
+ end
105
+ after do
106
+ reset_migration_and_db
107
+ end
108
+
109
+ it 'does add an user and change the schema' do
110
+ rake('db:migrate:all')
111
+ expect(User.count).to eq(2)
112
+ expect(get_versions).to include('20150202174939')
113
+ expect(get_data_versions).to include('20150202183455')
114
+ end
115
+ end
116
+
117
+ context 'setting an env_prefix' do
118
+ before do
119
+ ActiveRecord::Base.establish_connection
120
+ DatabaseCleaner.clean
121
+ insert_migration_test
122
+ end
123
+ after do
124
+ reset_migration_and_db
125
+ end
126
+
127
+ it 'does add an user and change the schema' do
128
+ rake('DATA_MIGRATOR_ENV_PREFIX=staging db:migrate:all')
129
+ expect(User.count).to eq(2)
130
+ expect(get_versions).to include('20150202174939')
131
+ expect(get_data_versions).to include('staging_20150202183455')
132
+ end
133
+
134
+ describe 'when changing env_prefix' do
135
+ it 'contains version for both env' do
136
+ rake('DATA_MIGRATOR_ENV_PREFIX=staging db:data:migrate')
137
+ expect(get_data_versions).to include('staging_20150202183455')
138
+ expect(get_data_versions).to_not include('production_20150202183455')
139
+ expect(User.count).to eq(2)
140
+ rake('DATA_MIGRATOR_ENV_PREFIX=production db:data:migrate')
141
+ expect(get_data_versions).to include('staging_20150202183455')
142
+ expect(get_data_versions).to include('production_20150202183455')
143
+ expect(User.count).to eq(4)
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,18 @@
1
+ ENV["RAILS_ENV"] ||= 'test'
2
+
3
+ require File.expand_path("../dummy/config/environment", __FILE__)
4
+
5
+ require 'rails/test_help'
6
+ require 'rspec/rails'
7
+ require 'imigrate'
8
+ require 'database_cleaner'
9
+
10
+ MIGRATOR_ROOT = File.expand_path('../..', __FILE__)
11
+
12
+ DatabaseCleaner.strategy = :truncation
13
+
14
+ RSpec.configure do |config|
15
+
16
+ config.mock_with :rspec
17
+
18
+ end