multi-database-9000 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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +59 -0
- data/Rakefile +2 -0
- data/features/creating_databases.feature +75 -0
- data/features/development_migrations.feature +94 -0
- data/features/production_migrations.feature +32 -0
- data/features/step_definitions/development_migrations_steps.rb +244 -0
- data/features/step_definitions/production_migration_steps.rb +28 -0
- data/features/step_definitions/sqlite_database_steps.rb +41 -0
- data/features/step_definitions/test_migration_steps.rb +84 -0
- data/features/support/env.rb +2 -0
- data/features/test_app.feature +6 -0
- data/features/test_migrations.feature +24 -0
- data/lib/multi-database-9000/multi-database-9000.rb +12 -0
- data/lib/multi-database-9000/tasks/multi-database-9000_tasks.rake +143 -0
- data/lib/multi-database-9000/version.rb +3 -0
- data/lib/multi-database-9000.rb +10 -0
- data/multi-database-9000.gemspec +29 -0
- data/multi-db-dummy/Gemfile +15 -0
- data/multi-db-dummy/Gemfile.lock +115 -0
- data/multi-db-dummy/README.rdoc +28 -0
- data/multi-db-dummy/Rakefile +6 -0
- data/multi-db-dummy/app/assets/images/.keep +0 -0
- data/multi-db-dummy/app/assets/stylesheets/application.css +15 -0
- data/multi-db-dummy/app/controllers/application_controller.rb +5 -0
- data/multi-db-dummy/app/controllers/concerns/.keep +0 -0
- data/multi-db-dummy/app/helpers/application_helper.rb +2 -0
- data/multi-db-dummy/app/mailers/.keep +0 -0
- data/multi-db-dummy/app/models/.keep +0 -0
- data/multi-db-dummy/app/models/concerns/.keep +0 -0
- data/multi-db-dummy/app/models/gadget.rb +3 -0
- data/multi-db-dummy/app/views/layouts/application.html.erb +13 -0
- data/multi-db-dummy/bin/bundle +3 -0
- data/multi-db-dummy/bin/rails +4 -0
- data/multi-db-dummy/bin/rake +4 -0
- data/multi-db-dummy/bin/setup +29 -0
- data/multi-db-dummy/config/application.rb +35 -0
- data/multi-db-dummy/config/boot.rb +3 -0
- data/multi-db-dummy/config/database.yml +49 -0
- data/multi-db-dummy/config/environment.rb +5 -0
- data/multi-db-dummy/config/environments/development.rb +28 -0
- data/multi-db-dummy/config/environments/production.rb +67 -0
- data/multi-db-dummy/config/environments/test.rb +42 -0
- data/multi-db-dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/multi-db-dummy/config/initializers/cookies_serializer.rb +3 -0
- data/multi-db-dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/multi-db-dummy/config/initializers/inflections.rb +16 -0
- data/multi-db-dummy/config/initializers/mime_types.rb +4 -0
- data/multi-db-dummy/config/initializers/session_store.rb +3 -0
- data/multi-db-dummy/config/initializers/wrap_parameters.rb +14 -0
- data/multi-db-dummy/config/locales/en.yml +23 -0
- data/multi-db-dummy/config/routes.rb +56 -0
- data/multi-db-dummy/config/secrets.yml +22 -0
- data/multi-db-dummy/config.ru +4 -0
- data/multi-db-dummy/lib/assets/.keep +0 -0
- data/multi-db-dummy/lib/tasks/.keep +0 -0
- data/multi-db-dummy/log/.keep +0 -0
- data/multi-db-dummy/public/404.html +67 -0
- data/multi-db-dummy/public/422.html +67 -0
- data/multi-db-dummy/public/500.html +66 -0
- data/multi-db-dummy/public/favicon.ico +0 -0
- data/multi-db-dummy/public/robots.txt +5 -0
- data/multi-db-dummy/test/controllers/.keep +0 -0
- data/multi-db-dummy/test/fixtures/.keep +0 -0
- data/multi-db-dummy/test/helpers/.keep +0 -0
- data/multi-db-dummy/test/integration/.keep +0 -0
- data/multi-db-dummy/test/mailers/.keep +0 -0
- data/multi-db-dummy/test/models/.keep +0 -0
- data/multi-db-dummy/test/models/gadget_test.rb +8 -0
- data/multi-db-dummy/test/test_helper.rb +12 -0
- data/multi-db-dummy/vendor/assets/stylesheets/.keep +0 -0
- data/single-db-dummy/Gemfile +16 -0
- data/single-db-dummy/Gemfile.lock +115 -0
- data/single-db-dummy/README.rdoc +28 -0
- data/single-db-dummy/Rakefile +6 -0
- data/single-db-dummy/app/assets/images/.keep +0 -0
- data/single-db-dummy/app/assets/stylesheets/application.css +15 -0
- data/single-db-dummy/app/controllers/application_controller.rb +5 -0
- data/single-db-dummy/app/controllers/concerns/.keep +0 -0
- data/single-db-dummy/app/helpers/application_helper.rb +2 -0
- data/single-db-dummy/app/mailers/.keep +0 -0
- data/single-db-dummy/app/models/.keep +0 -0
- data/single-db-dummy/app/models/concerns/.keep +0 -0
- data/single-db-dummy/app/models/user.rb +3 -0
- data/single-db-dummy/app/views/layouts/application.html.erb +13 -0
- data/single-db-dummy/bin/bundle +3 -0
- data/single-db-dummy/bin/rails +4 -0
- data/single-db-dummy/bin/rake +4 -0
- data/single-db-dummy/bin/setup +29 -0
- data/single-db-dummy/config/application.rb +35 -0
- data/single-db-dummy/config/boot.rb +3 -0
- data/single-db-dummy/config/database.yml +25 -0
- data/single-db-dummy/config/environment.rb +5 -0
- data/single-db-dummy/config/environments/development.rb +28 -0
- data/single-db-dummy/config/environments/production.rb +67 -0
- data/single-db-dummy/config/environments/test.rb +42 -0
- data/single-db-dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/single-db-dummy/config/initializers/cookies_serializer.rb +3 -0
- data/single-db-dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/single-db-dummy/config/initializers/inflections.rb +16 -0
- data/single-db-dummy/config/initializers/mime_types.rb +4 -0
- data/single-db-dummy/config/initializers/session_store.rb +3 -0
- data/single-db-dummy/config/initializers/wrap_parameters.rb +14 -0
- data/single-db-dummy/config/locales/en.yml +23 -0
- data/single-db-dummy/config/routes.rb +56 -0
- data/single-db-dummy/config/secrets.yml +22 -0
- data/single-db-dummy/config.ru +4 -0
- data/single-db-dummy/lib/assets/.keep +0 -0
- data/single-db-dummy/lib/tasks/.keep +0 -0
- data/single-db-dummy/log/.keep +0 -0
- data/single-db-dummy/public/404.html +67 -0
- data/single-db-dummy/public/422.html +67 -0
- data/single-db-dummy/public/500.html +66 -0
- data/single-db-dummy/public/favicon.ico +0 -0
- data/single-db-dummy/public/robots.txt +5 -0
- data/single-db-dummy/test/controllers/.keep +0 -0
- data/single-db-dummy/test/fixtures/.keep +0 -0
- data/single-db-dummy/test/helpers/.keep +0 -0
- data/single-db-dummy/test/integration/.keep +0 -0
- data/single-db-dummy/test/mailers/.keep +0 -0
- data/single-db-dummy/test/models/.keep +0 -0
- data/single-db-dummy/test/models/user_test.rb +8 -0
- data/single-db-dummy/test/test_helper.rb +10 -0
- data/single-db-dummy/vendor/assets/stylesheets/.keep +0 -0
- metadata +295 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 2b615a4d064746274e944f5bd1c41720eb88e416
|
|
4
|
+
data.tar.gz: 3d988a77248229b87e719feee2fd930abd3f4867
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 0bd12c0da8d04f705809843bcaf6db87380dab761ec3301964f7483755c0c0f8f5a4c5b3545995cc4001296d3aa180ffede8fd393f20e89f83df44f8ecafc3d0
|
|
7
|
+
data.tar.gz: 7a1b040ea4ff78b2e9a1e1c41c0269a81f3a72c7e83e201af8bd3ba464c74e84083e3f1a199d1a4c8688158f1ae0005e2108a3decdbd837e95c857b0154be904
|
data/.gitignore
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/.bundle/
|
|
2
|
+
/.yardoc
|
|
3
|
+
/Gemfile.lock
|
|
4
|
+
/_yardoc/
|
|
5
|
+
/coverage/
|
|
6
|
+
/doc/
|
|
7
|
+
/pkg/
|
|
8
|
+
/spec/reports/
|
|
9
|
+
/tmp/
|
|
10
|
+
/single-db-dummy/db
|
|
11
|
+
/single-db-dummy/log
|
|
12
|
+
/multi-db-dummy/db
|
|
13
|
+
/multi-db-dummy/log
|
|
14
|
+
*.bundle
|
|
15
|
+
*.so
|
|
16
|
+
*.o
|
|
17
|
+
*.a
|
|
18
|
+
mkmf.log
|
|
19
|
+
.idea
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2015 BCSG Ltd, Stefania Cardenas
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# MultiDatabase9000
|
|
2
|
+
|
|
3
|
+
A plugin designed to help a Rails app work transparently with multiple databases, inspired by the multi-database-migrations
|
|
4
|
+
gem (which was immensely helpful when we started down this road). But in the process of updating that gem to work with Rails 4,
|
|
5
|
+
we decided that we preferred an API that allowed us to transparently use the Rails and Rake commands we already knew
|
|
6
|
+
rather than create new versions within a separate namespace.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
Add this line to your application's Gemfile:
|
|
11
|
+
|
|
12
|
+
```ruby
|
|
13
|
+
gem 'multi-database-9000'
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
And then execute:
|
|
17
|
+
|
|
18
|
+
$ bundle
|
|
19
|
+
|
|
20
|
+
Or install it yourself as:
|
|
21
|
+
|
|
22
|
+
$ gem install multi-database-9000
|
|
23
|
+
|
|
24
|
+
## Concept
|
|
25
|
+
|
|
26
|
+
The gem assumes that your app has a "default" or "main" database that's configured in the standard test, development
|
|
27
|
+
and production connections defined in database.yml. Also that there are one or more extra databases configured with connection
|
|
28
|
+
names that start with a name for that database followed by the environment name (e.g. if you had a database called "widgets" you
|
|
29
|
+
would have connections defined for widgets_test, widgets_development and widgets_production). The name used in the connection
|
|
30
|
+
does not have to match the actual database name, but does need to be used consistently to refer to that database (e.g.
|
|
31
|
+
if I use the name "widgets" in database.yml I also need to use it when creating a directory for migrations).
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
Create a new set of connections for your database in database.yml, in the form of "<database_name>_test",
|
|
36
|
+
"<database_name>_production" etc.
|
|
37
|
+
|
|
38
|
+
Create a new directory under db/ called <database_name>_migrate to hold migrations for the database.
|
|
39
|
+
|
|
40
|
+
Create a new migration with rails g migration DATABASE=<database_name>. The DATABASE environment variable can be left
|
|
41
|
+
off if the target of the migration is your default database; alternatively multi-database-9000 also accepts DATABASE=default
|
|
42
|
+
|
|
43
|
+
rake db:create will attempt to create all databases for all connections. rake db:create DATABASE=widgets will only created
|
|
44
|
+
databases for connections with "widget" in their name.
|
|
45
|
+
|
|
46
|
+
Similarly, rake db:schema:load and rake:db:schema:dump will load or dump schemas for all connections to all databases.
|
|
47
|
+
rake db:schema:load DATABASE=widget will only load the schema for databases in connections with "widget" in their name.
|
|
48
|
+
|
|
49
|
+
In order for test database schemas to be kept updated, add the following line to your `test_helper` or `spec_helper` files:
|
|
50
|
+
|
|
51
|
+
MultiDatabase9000.maintain_all_test_schemas!
|
|
52
|
+
|
|
53
|
+
## Contributing
|
|
54
|
+
|
|
55
|
+
1. Fork it ( https://github.com/[my-github-username]/multi-database-9000/fork )
|
|
56
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
57
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
58
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
59
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
Feature: Running rake db:create
|
|
2
|
+
|
|
3
|
+
rake db:create should create all the databases in a multi-database app
|
|
4
|
+
rake db:create should still work in a single database app
|
|
5
|
+
rake db:create DATABASE=users should create the users database only
|
|
6
|
+
|
|
7
|
+
Background:
|
|
8
|
+
Given no databases have been created
|
|
9
|
+
|
|
10
|
+
Scenario: creating the database in a single database app
|
|
11
|
+
When I run `bundle exec rake db:create` in a single database app
|
|
12
|
+
Then the file "../../single-db-dummy/db/development.sqlite3" should exist
|
|
13
|
+
And the file "../../single-db-dummy/db/test.sqlite3" should exist
|
|
14
|
+
|
|
15
|
+
Scenario: creating the database in a multi database app
|
|
16
|
+
When I run `bundle exec rake db:create` in a multi database app
|
|
17
|
+
Then the following files should exist:
|
|
18
|
+
|../../multi-db-dummy/db/development.sqlite3 |
|
|
19
|
+
|../../multi-db-dummy/db/users_development.sqlite3 |
|
|
20
|
+
|../../multi-db-dummy/db/widgets_development.sqlite3|
|
|
21
|
+
|../../multi-db-dummy/db/test.sqlite3 |
|
|
22
|
+
|../../multi-db-dummy/db/users_test.sqlite3 |
|
|
23
|
+
|../../multi-db-dummy/db/widgets_test.sqlite3 |
|
|
24
|
+
And the following files should not exist:
|
|
25
|
+
|../../multi-db-dummy/db/production.sqlite3 |
|
|
26
|
+
|../../multi-db-dummy/db/users_production.sqlite3 |
|
|
27
|
+
|../../multi-db-dummy/db/widgets_production.sqlite3 |
|
|
28
|
+
|
|
29
|
+
Scenario: specifying the database to create using the DATABASE environment variable
|
|
30
|
+
When I run `bundle exec rake db:create DATABASE=users` in a multi database app
|
|
31
|
+
Then the following files should exist:
|
|
32
|
+
|../../multi-db-dummy/db/users_development.sqlite3 |
|
|
33
|
+
|../../multi-db-dummy/db/users_test.sqlite3 |
|
|
34
|
+
And the following files should not exist:
|
|
35
|
+
|../../multi-db-dummy/db/development.sqlite3 |
|
|
36
|
+
|../../multi-db-dummy/db/widgets_development.sqlite3|
|
|
37
|
+
|../../multi-db-dummy/db/test.sqlite3 |
|
|
38
|
+
|../../multi-db-dummy/db/widgets_test.sqlite3 |
|
|
39
|
+
|../../multi-db-dummy/db/production.sqlite3 |
|
|
40
|
+
|../../multi-db-dummy/db/users_production.sqlite3 |
|
|
41
|
+
|../../multi-db-dummy/db/widgets_production.sqlite3 |
|
|
42
|
+
|
|
43
|
+
Scenario: specifying the Rails environment
|
|
44
|
+
Given I set the environment variables to:
|
|
45
|
+
| variable | value |
|
|
46
|
+
| RAILS_ENV | test |
|
|
47
|
+
When I run `bundle exec rake db:create` in a multi database app
|
|
48
|
+
Then the following files should exist:
|
|
49
|
+
|../../multi-db-dummy/db/users_test.sqlite3 |
|
|
50
|
+
|../../multi-db-dummy/db/test.sqlite3 |
|
|
51
|
+
|../../multi-db-dummy/db/widgets_test.sqlite3 |
|
|
52
|
+
And the following files should not exist:
|
|
53
|
+
|../../multi-db-dummy/db/users_development.sqlite3 |
|
|
54
|
+
|../../multi-db-dummy/db/development.sqlite3 |
|
|
55
|
+
|../../multi-db-dummy/db/widgets_development.sqlite3|
|
|
56
|
+
|../../multi-db-dummy/db/production.sqlite3 |
|
|
57
|
+
|../../multi-db-dummy/db/users_production.sqlite3 |
|
|
58
|
+
|../../multi-db-dummy/db/widgets_production.sqlite3 |
|
|
59
|
+
|
|
60
|
+
Scenario: specifying the database and the Rails environment
|
|
61
|
+
Given I set the environment variables to:
|
|
62
|
+
| variable | value |
|
|
63
|
+
| RAILS_ENV | production |
|
|
64
|
+
When I run `bundle exec rake db:create DATABASE=widgets` in a multi database app
|
|
65
|
+
Then the following files should exist:
|
|
66
|
+
|../../multi-db-dummy/db/widgets_production.sqlite3 |
|
|
67
|
+
And the following files should not exist:
|
|
68
|
+
|../../multi-db-dummy/db/users_test.sqlite3 |
|
|
69
|
+
|../../multi-db-dummy/db/test.sqlite3 |
|
|
70
|
+
|../../multi-db-dummy/db/widgets_test.sqlite3 |
|
|
71
|
+
|../../multi-db-dummy/db/users_development.sqlite3 |
|
|
72
|
+
|../../multi-db-dummy/db/development.sqlite3 |
|
|
73
|
+
|../../multi-db-dummy/db/widgets_development.sqlite3|
|
|
74
|
+
|../../multi-db-dummy/db/production.sqlite3 |
|
|
75
|
+
|../../multi-db-dummy/db/users_production.sqlite3 |
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
Feature: Migrations run for all databases in the app
|
|
2
|
+
|
|
3
|
+
rake db:migrate should still work in a single database app
|
|
4
|
+
rake db:migrate should migrate all the databases in a multi-database app
|
|
5
|
+
rake db:migrate DATABASE=users should migrate the users database only
|
|
6
|
+
rake db:migrate:status should list all migrations for all databases, ordered by timestamp.
|
|
7
|
+
The migrations list should include an extra column listing the database each migration is for.
|
|
8
|
+
|
|
9
|
+
Status Migration ID Database Migration Name
|
|
10
|
+
--------------------------------------------------
|
|
11
|
+
up 20151010141234 users Create accounts table
|
|
12
|
+
up 20151010142141 default Create posts table
|
|
13
|
+
up 20151010145432 widgets Create widgets table
|
|
14
|
+
|
|
15
|
+
Background:
|
|
16
|
+
Given empty databases have been created for the app
|
|
17
|
+
|
|
18
|
+
Scenario: User runs a migration in a single database app
|
|
19
|
+
When I create a database migration in a single database app
|
|
20
|
+
And It creates a users table with columns called 'name' and 'age' and 'email'
|
|
21
|
+
And I run `bundle exec rake db:migrate` in a single database app
|
|
22
|
+
Then I should see the created users table
|
|
23
|
+
And I should see the correct columns in the users table
|
|
24
|
+
|
|
25
|
+
Scenario: The schema is updated when migrations are run in a single database app
|
|
26
|
+
When I run a migration with the timestamp "20151010142141" in a single database app
|
|
27
|
+
Then the file "../../single-db-dummy/db/schema.rb" should exist
|
|
28
|
+
And the version in the schema file should be updated
|
|
29
|
+
|
|
30
|
+
Scenario: User runs a migration in a multi database app
|
|
31
|
+
When I create a database migration on the default database in a multi database app
|
|
32
|
+
And It creates a posts table with columns called 'title' and 'text' and 'author'
|
|
33
|
+
And I create another database migration on the users database in a multi database app
|
|
34
|
+
And It creates an accounts table with columns called 'expense' and 'user_id' and 'total'
|
|
35
|
+
And I create another database migration on the widgets database in a multi database app
|
|
36
|
+
And It creates a gadgets table with columns called 'doobry' and 'wotsit' and 'thingy'
|
|
37
|
+
And I run `bundle exec rake db:migrate` in a multi database app
|
|
38
|
+
Then I should see the created 'posts' table in the 'default' database
|
|
39
|
+
And I should see the created 'accounts' table in the 'users' database
|
|
40
|
+
And I should see the created 'gadgets' table in the 'widgets' database
|
|
41
|
+
And I should see the "title", "text" and "author" columns in the "posts" table in the "default" database
|
|
42
|
+
And I should see the "expense", "user_id" and "total" columns in the "accounts" table in the "users" database
|
|
43
|
+
And I should see the "doobry", "wotsit" and "thingy" columns in the "gadgets" table in the "widgets" database
|
|
44
|
+
|
|
45
|
+
Scenario: The schema is updated when migrations are run in a multi database app
|
|
46
|
+
When I run migrations with the following timestamps "20151010142141", "20151010141234" and "20151010145432" in a multi-database app
|
|
47
|
+
Then the file "../../multi-db-dummy/db/schema.rb" should exist
|
|
48
|
+
Then the file "../../multi-db-dummy/db/users_schema.rb" should exist
|
|
49
|
+
Then the file "../../multi-db-dummy/db/widgets_schema.rb" should exist
|
|
50
|
+
And the versions in the schema files should be updated
|
|
51
|
+
|
|
52
|
+
Scenario: Specifying the database to migrate using the DATABASE environment variable
|
|
53
|
+
Given There is a migration with the timestamp "20151010141234" for the users database
|
|
54
|
+
When I run `bundle exec rake db:migrate DATABASE=users` in a multi database app
|
|
55
|
+
Then the file "../../multi-db-dummy/db/users_schema.rb" should exist
|
|
56
|
+
And the file "../../multi-db-dummy/db/widgets_schema.rb" should not exist
|
|
57
|
+
And the file "../../multi-db-dummy/db/schema.rb" should not exist
|
|
58
|
+
And the version in the users schema file should be updated
|
|
59
|
+
|
|
60
|
+
Scenario: Specifying the database and the environment variables to migrate to
|
|
61
|
+
Given I set the environment variables to:
|
|
62
|
+
| variable | value |
|
|
63
|
+
| RAILS_ENV | production |
|
|
64
|
+
And there is a migration for the widgets database in a multi database app
|
|
65
|
+
When I run `bundle exec rake db:migrate DATABASE=widgets` in a multi database app
|
|
66
|
+
Then the file "../../multi-db-dummy/db/widgets_production.sqlite3" should exist
|
|
67
|
+
And the file "../../multi-db-dummy/db/production.sqlite3" should not exist
|
|
68
|
+
And the file "../../multi-db-dummy/db/users_production.sqlite3" should not exist
|
|
69
|
+
|
|
70
|
+
Scenario: User runs rake db:migrate:status in a single database app
|
|
71
|
+
Given I have created and run a migration with the name "20151010142141_create_users_table.rb", in a single database app
|
|
72
|
+
And I have created but not run a migration with the name "20151010151000_add_nickname_to_users.rb", in a single database app
|
|
73
|
+
When I run `bundle exec rake db:migrate:status` in a single database app
|
|
74
|
+
Then the output should match /up\s+20151010142141\s+default\s+Create users table/
|
|
75
|
+
And the output should match /down\s+20151010151000\s+default\s+Add nickname to users/
|
|
76
|
+
|
|
77
|
+
Scenario: User runs rake db:migrate:status in a multi database app
|
|
78
|
+
Given I have created and run the following migrations in a multi database app:
|
|
79
|
+
| Migration | database|
|
|
80
|
+
| 20151010142141_create_posts_table.rb | default |
|
|
81
|
+
| 20151010141234_create_accounts_table.rb | users |
|
|
82
|
+
| 20151010145432_create_gadgets_table.rb | widgets |
|
|
83
|
+
And I have created and not run the following migrations:
|
|
84
|
+
| Migration | database|
|
|
85
|
+
| 20151010153000_add_address_to_accounts.rb | users |
|
|
86
|
+
| 20151010153500_add_serial_to_gadgets.rb | widgets |
|
|
87
|
+
When I run `bundle exec rake db:migrate:status` in a multi database app
|
|
88
|
+
Then the output should match /up\s+20151010142141\s+default\s+Create posts table/
|
|
89
|
+
Then the output should match /up\s+20151010141234\s+users\s+Create accounts table/
|
|
90
|
+
Then the output should match /up\s+20151010145432\s+widgets\s+Create gadgets table/
|
|
91
|
+
Then the output should match /down\s+20151010153000\s+users\s+Add address to accounts/
|
|
92
|
+
Then the output should match /down\s+20151010153500\s+widgets\s+Add serial to gadgets/
|
|
93
|
+
|
|
94
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Feature: Migrations run for all databases in the app in the production environment
|
|
2
|
+
|
|
3
|
+
rake db:migrate should still work in a single database app
|
|
4
|
+
rake db:migrate should migrate all the databases in a multi-database app
|
|
5
|
+
|
|
6
|
+
Background:
|
|
7
|
+
Given I set the environment variables to:
|
|
8
|
+
| variable | value |
|
|
9
|
+
| RAILS_ENV | production |
|
|
10
|
+
And empty databases have been created for the app
|
|
11
|
+
|
|
12
|
+
Scenario: User runs a migration in a single database app in the production environment
|
|
13
|
+
When I create a database migration in a single database app
|
|
14
|
+
And It creates a users table with columns called 'name' and 'age' and 'email'
|
|
15
|
+
And I run `bundle exec rake db:migrate` in a single database app
|
|
16
|
+
Then I should see the created users table in the production environment
|
|
17
|
+
And I should see the correct columns in the users table in the production environment
|
|
18
|
+
|
|
19
|
+
Scenario: User runs a migration in a multi database app in the production environment
|
|
20
|
+
When I create a database migration on the default database in a multi database app
|
|
21
|
+
And It creates a posts table with columns called 'title' and 'text' and 'author'
|
|
22
|
+
And I create another database migration on the users database in a multi database app
|
|
23
|
+
And It creates an accounts table with columns called 'expense' and 'user_id' and 'total'
|
|
24
|
+
And I create another database migration on the widgets database in a multi database app
|
|
25
|
+
And It creates a gadgets table with columns called 'doobry' and 'wotsit' and 'thingy'
|
|
26
|
+
And I run `bundle exec rake db:migrate` in a multi database app
|
|
27
|
+
Then I should see the created "posts" table in the "default" database in the production environment
|
|
28
|
+
And I should see the created "accounts" table in the "users" database in the production environment
|
|
29
|
+
And I should see the created "gadgets" table in the "widgets" database in the production environment
|
|
30
|
+
And I should see the "title", "text" and "author" columns in the "posts" table in the "default" database in the production environment
|
|
31
|
+
And I should see the "expense", "user_id" and "total" columns in the "accounts" table in the "users" database in the production environment
|
|
32
|
+
And I should see the "doobry", "wotsit" and "thingy" columns in the "gadgets" table in the "widgets" database in the production environment
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
require 'sqlite3'
|
|
2
|
+
require 'pry'
|
|
3
|
+
|
|
4
|
+
Given(/^empty databases have been created for the app$/) do
|
|
5
|
+
clear_db_dir
|
|
6
|
+
|
|
7
|
+
cd "../../single-db-dummy" do
|
|
8
|
+
run_rake_db_create
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
cd "../../multi-db-dummy" do
|
|
12
|
+
run_rake_db_create
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
When(/^I create a database migration in a single database app$/) do
|
|
18
|
+
write_single_db_migration
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
When(/^It creates a users table with columns called 'name' and 'age' and 'email'$/) do
|
|
22
|
+
# This line is just describing what was created in the migration.
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
Then(/^I should see the created users table$/) do
|
|
26
|
+
table_exists? :app => "single-db-dummy", :database => "development.sqlite3", :table => "users"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
Then(/^I should see the correct columns in the users table$/) do
|
|
30
|
+
columns_exist? :app => "single-db-dummy", :database => "development.sqlite3", :table => "users", :columns => ["name", "email", "age"]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
When(/^I create a database migration on the default database in a multi database app$/) do
|
|
34
|
+
write_migration_for_default_db
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
When(/^It creates a posts table with columns called 'title' and 'text' and 'author'$/) do
|
|
38
|
+
# This line describes what was created in the migration
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
When(/^I create another database migration on the users database in a multi database app$/) do
|
|
42
|
+
write_migration_for_users_db
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
When(/^It creates an accounts table with columns called 'expense' and 'user_id' and 'total'$/) do
|
|
46
|
+
# This line shows which columns are created on the users database accounts table.
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
When(/^I create another database migration on the widgets database in a multi database app$/) do
|
|
50
|
+
write_migration_for_widgets_db
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
When(/^It creates a gadgets table with columns called 'doobry' and 'wotsit' and 'thingy'$/) do
|
|
54
|
+
# This line shows which columns are created on the widgets database gadgets table.
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
Then(/^I should see the created posts table in the default database$/) do
|
|
58
|
+
table_exists? :database => "development.sqlite3", :table => "posts"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
Then(/^I should see the created '([^']*)' table in the '([^']*)' database$/) do |table, database|
|
|
62
|
+
if database == "default"
|
|
63
|
+
database_file_name = "development"
|
|
64
|
+
else
|
|
65
|
+
database_file_name = "#{database}_development"
|
|
66
|
+
end
|
|
67
|
+
table_exists? :app => "multi-db-dummy", :database => "#{database_file_name}.sqlite3", :table => table
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
Then(/^I should see the "([^"]*)", "([^"]*)" and "([^"]*)" columns in the "([^"]*)" table in the "([^"]*)" database$/) do |column1, column2, column3, table, database|
|
|
71
|
+
if database == "default"
|
|
72
|
+
database_file_name = "development"
|
|
73
|
+
else
|
|
74
|
+
database_file_name = "#{database}_development"
|
|
75
|
+
end
|
|
76
|
+
columns_exist? :app => "multi-db-dummy", :database => "#{database_file_name}.sqlite3", :table => table, :columns => [column1, column2, column3]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
When(/^I run a migration with the timestamp "([^"]*)" in a single database app$/) do |timestamp|
|
|
80
|
+
@timestamp = timestamp
|
|
81
|
+
write_single_db_migration
|
|
82
|
+
run_task_in_single_db_app "bundle exec rake db:migrate"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
Then(/^the version in the schema file should be updated$/) do
|
|
86
|
+
version = "version: #{@timestamp}"
|
|
87
|
+
expect(File.read "single-db-dummy/db/schema.rb").to match Regexp.new(version)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
When(/^I run migrations with the following timestamps "([^"]*)", "([^"]*)" and "([^"]*)" in a multi\-database app$/) do |timestamp1, timestamp2, timestamp3|
|
|
91
|
+
@timestamps = [timestamp1, timestamp2, timestamp3]
|
|
92
|
+
write_migration_for_default_db
|
|
93
|
+
write_migration_for_users_db
|
|
94
|
+
write_migration_for_widgets_db
|
|
95
|
+
run_task_in_multi_db_app "bundle exec rake db:migrate"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
Then(/^the versions in the schema files should be updated$/) do
|
|
100
|
+
version = "version: #{@timestamps[0]}"
|
|
101
|
+
expect(File.read "multi-db-dummy/db/schema.rb").to match Regexp.new(version)
|
|
102
|
+
version = "version: #{@timestamps[1]}"
|
|
103
|
+
expect(File.read "multi-db-dummy/db/users_schema.rb").to match Regexp.new(version)
|
|
104
|
+
version = "version: #{@timestamps[2]}"
|
|
105
|
+
expect(File.read "multi-db-dummy/db/widgets_schema.rb").to match Regexp.new(version)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
Given(/^I have created and run a migration with the name "([^"]*)", in a single database app$/) do |up_migration|
|
|
109
|
+
@up_migration = up_migration
|
|
110
|
+
write_single_db_migration
|
|
111
|
+
run_task_in_single_db_app "bundle exec rake db:migrate"
|
|
112
|
+
end
|
|
113
|
+
Given(/^There is a migration with the timestamp "([^"]*)" for the users database$/) do |timestamp|
|
|
114
|
+
@timestamp = [timestamp]
|
|
115
|
+
write_migration_for_users_db
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
Given(/^I have created but not run a migration with the name "([^"]*)", in a single database app$/) do |down_migration|
|
|
119
|
+
@down_migration = down_migration
|
|
120
|
+
write_another_single_db_migration
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
Given(/^I have created and run the following migrations in a multi database app:$/) do |table|
|
|
124
|
+
write_migration_for_default_db
|
|
125
|
+
write_migration_for_users_db
|
|
126
|
+
write_migration_for_widgets_db
|
|
127
|
+
run_task_in_multi_db_app "bundle exec rake db:migrate"
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
Given(/^I have created and not run the following migrations:$/) do |table|
|
|
131
|
+
table.hashes.each do |row|
|
|
132
|
+
write_multi_db_migration_for row["database"], row["Migration"]
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
Then(/^the version in the users schema file should be updated$/) do
|
|
138
|
+
version = "version: #{@timestamp[0]}"
|
|
139
|
+
expect(File.read "multi-db-dummy/db/users_schema.rb").to match Regexp.new(version)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
And(/^there is a migration for the widgets database in a multi database app$/) do
|
|
143
|
+
write_migration_for_widgets_db
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Helpers
|
|
147
|
+
|
|
148
|
+
def write_multi_db_migration_for(database, migration_name)
|
|
149
|
+
migration_database = database == "default" ? "migrate" : "#{database}_migrate"
|
|
150
|
+
migration_class = migration_name.match(/\d+_(\w+).rb/).captures.first.split('_').map(&:capitalize).join
|
|
151
|
+
|
|
152
|
+
migration = <<-MIGRATION_END
|
|
153
|
+
class #{migration_class} < ActiveRecord::Migration
|
|
154
|
+
def change
|
|
155
|
+
say "changed!"
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
MIGRATION_END
|
|
159
|
+
|
|
160
|
+
write_file "../../multi-db-dummy/db/#{migration_database}/#{migration_name}", migration
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def run_rake_db_create
|
|
164
|
+
cmd = unescape_text("rake db:create")
|
|
165
|
+
cmd = extract_text(cmd) if !aruba.config.keep_ansi || aruba.config.remove_ansi_escape_sequences
|
|
166
|
+
|
|
167
|
+
run_simple(cmd, false)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def write_single_db_migration
|
|
171
|
+
migration = <<-MIGRATION_END
|
|
172
|
+
class CreateUsersTable < ActiveRecord::Migration
|
|
173
|
+
def change
|
|
174
|
+
create_table :users do |column|
|
|
175
|
+
column.string :name
|
|
176
|
+
column.integer :age
|
|
177
|
+
column.string :email
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
MIGRATION_END
|
|
182
|
+
|
|
183
|
+
write_file "../../single-db-dummy/db/migrate/20151010142141_" + "create_users_table.rb", migration
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def write_another_single_db_migration
|
|
187
|
+
migration = <<-MIGRATION_END
|
|
188
|
+
class AddNicknameToUsers < ActiveRecord::Migration
|
|
189
|
+
def change
|
|
190
|
+
add_column :users, :nickname, :string
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
MIGRATION_END
|
|
194
|
+
|
|
195
|
+
write_file "../../single-db-dummy/db/migrate/20151010151000_" + "add_nickname_to_users.rb", migration
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def write_migration_for_default_db
|
|
199
|
+
migration = <<-MIGRATION_END
|
|
200
|
+
class CreatePostsTable < ActiveRecord::Migration
|
|
201
|
+
def change
|
|
202
|
+
create_table :posts do |column|
|
|
203
|
+
column.string :title
|
|
204
|
+
column.integer :text
|
|
205
|
+
column.string :author
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
MIGRATION_END
|
|
210
|
+
|
|
211
|
+
write_file "../../multi-db-dummy/db/migrate/20151010142141_" + "create_posts_table.rb", migration
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def write_migration_for_users_db
|
|
215
|
+
migration = <<-MIGRATION_END
|
|
216
|
+
class CreateAccountsTable < ActiveRecord::Migration
|
|
217
|
+
def change
|
|
218
|
+
create_table :accounts do |column|
|
|
219
|
+
column.string :expense
|
|
220
|
+
column.integer :user_id
|
|
221
|
+
column.string :total
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
MIGRATION_END
|
|
226
|
+
|
|
227
|
+
write_file "../../multi-db-dummy/db/users_migrate/20151010141234_" + "create_accounts_table.rb", migration
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def write_migration_for_widgets_db
|
|
231
|
+
migration = <<-MIGRATION_END
|
|
232
|
+
class CreateGadgetsTable < ActiveRecord::Migration
|
|
233
|
+
def change
|
|
234
|
+
create_table :gadgets do |column|
|
|
235
|
+
column.string :doobry
|
|
236
|
+
column.integer :wotsit
|
|
237
|
+
column.string :thingy
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
MIGRATION_END
|
|
242
|
+
|
|
243
|
+
write_file "../../multi-db-dummy/db/widgets_migrate/20151010145432_" + "create_gadgets_table.rb", migration
|
|
244
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'sqlite3'
|
|
2
|
+
require 'pry'
|
|
3
|
+
|
|
4
|
+
Then(/^I should see the created users table in the production environment$/) do
|
|
5
|
+
table_exists? :app => "single-db-dummy", :database => "production.sqlite3", :table => "users"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
Then(/^I should see the correct columns in the users table in the production environment$/) do
|
|
9
|
+
columns_exist? :app => "single-db-dummy", :database => "production.sqlite3", :table => "users", :columns => ["name", "email", "age"]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
Then(/^I should see the created "([^"]*)" table in the "([^"]*)" database in the production environment$/) do |table, database|
|
|
13
|
+
if database == "default"
|
|
14
|
+
database_file_name = "production"
|
|
15
|
+
else
|
|
16
|
+
database_file_name = "#{database}_production"
|
|
17
|
+
end
|
|
18
|
+
table_exists? :app => "multi-db-dummy", :database => "#{database_file_name}.sqlite3", :table => table
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
Then(/^I should see the "([^"]*)", "([^"]*)" and "([^"]*)" columns in the "([^"]*)" table in the "([^"]*)" database in the production environment$/) do |column1, column2, column3, table , database|
|
|
22
|
+
if database == "default"
|
|
23
|
+
database_file_name = "production"
|
|
24
|
+
else
|
|
25
|
+
database_file_name = "#{database}_production"
|
|
26
|
+
end
|
|
27
|
+
columns_exist? :app => "multi-db-dummy", :database => "#{database_file_name}.sqlite3", :table => table, :columns => [column1, column2, column3]
|
|
28
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
|
|
2
|
+
Given(/^no databases have been created$/) do
|
|
3
|
+
clear_db_dir
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
Given(/^I run `([^`]*)` in a single database app$/) do |command|
|
|
7
|
+
run_task_in_single_db_app(command)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Given(/^I run `([^`]*)` in a multi database app$/) do |command|
|
|
12
|
+
run_task_in_multi_db_app(command)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
#helper
|
|
17
|
+
|
|
18
|
+
def run_task_in_single_db_app(command)
|
|
19
|
+
cmd = unescape_text(command)
|
|
20
|
+
cmd = extract_text(cmd) if !aruba.config.keep_ansi || aruba.config.remove_ansi_escape_sequences
|
|
21
|
+
|
|
22
|
+
cd "../../single-db-dummy" do
|
|
23
|
+
run_simple(cmd, false)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def run_task_in_multi_db_app(command)
|
|
28
|
+
cmd = unescape_text(command)
|
|
29
|
+
cmd = extract_text(cmd) if !aruba.config.keep_ansi || aruba.config.remove_ansi_escape_sequences
|
|
30
|
+
|
|
31
|
+
cd "../../multi-db-dummy" do
|
|
32
|
+
run_simple(cmd, false)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def clear_db_dir
|
|
37
|
+
remove("../../single-db-dummy/db", :force => true)
|
|
38
|
+
remove("../../multi-db-dummy/db", :force => true)
|
|
39
|
+
create_directory "../../single-db-dummy/db"
|
|
40
|
+
create_directory "../../multi-db-dummy/db"
|
|
41
|
+
end
|