multi-database-9000 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 33e7b9669dcf781d0f6b56a0d2f51726024e66fd
4
- data.tar.gz: d7c68fc744690834858eb9c9147fc8d9fcfdcd19
3
+ metadata.gz: 4aff0b568745cf031959322115ac1463cfb2be74
4
+ data.tar.gz: d887a6c2f4b7b980590b34768431561659fedf5c
5
5
  SHA512:
6
- metadata.gz: b71aba44cf23dcc5eb977df8ed37e3b39707e1b588194c22a80c51107a0544f0429dcf80743ca69d58dc5ef919896ed5571b8220102deeb0bfa9dca3dcc0a8cb
7
- data.tar.gz: f94f1891d8add9af32e25aab7857ea8df2b7ff0fc7631cc5d6802cee6ee6280d0f88ac3ad4aec0a25c0118e0781afb4cdecb7c4397edd52f990224965bd483ac
6
+ metadata.gz: 92dab60e53e359f0e57a8bc76defa34871324d563eaf7702100129cdb19048e3fa491d2563cca323783ce6c921d769ca1dd449a6c187446937ae3efd910c8782
7
+ data.tar.gz: 58b04be81ed4f4c5e19386f99cc333c574174f3e986d140c720fe05af6dc11453afef3bfca9b92458624c88edb0962dc9586ffa2ba64bee3b0bfba7a67ef342b
data/.gitignore CHANGED
@@ -18,3 +18,4 @@
18
18
  mkmf.log
19
19
  .idea
20
20
  *.gem
21
+ .rbx
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.2.3"
4
+ # uncomment this line if your project needs to run something other than `rake`:
5
+ script: bundle exec cucumber
@@ -2,6 +2,7 @@ Feature: rake schema tasks should work for all databases in the app
2
2
 
3
3
  rake db:schema:load will load all the database schemas for the current environment
4
4
  rake db:schema:load DATABASE=widgets will load the schema for the widgets database
5
+ the schema_migrations table for each database should be correctly updated with migrations run on that database only
5
6
 
6
7
  Background:
7
8
  Given empty databases have been created for the app
@@ -108,3 +109,40 @@ Feature: rake schema tasks should work for all databases in the app
108
109
  And I should see the created 'accounts' table in the 'users' 'production' database
109
110
  And I should see the "title", "text" and "author" columns in the "posts" table in the "default" "production" database
110
111
  And I should see the "expense", "user_id" and "total" columns in the "accounts" table in the "users" "production" database
112
+
113
+ Scenario: checking the schema_migrations table after running rake db:schema:load
114
+ Given a multi database app and a schema file with:
115
+ """
116
+ ActiveRecord::Schema.define(version: 20151010142141) do
117
+
118
+ create_table "posts", force: :cascade do |t|
119
+ t.string "title"
120
+ t.integer "text"
121
+ t.string "author"
122
+ end
123
+
124
+ end
125
+ """
126
+ And a users_schema file with:
127
+ """
128
+ ActiveRecord::Schema.define(version: 20151010141234) do
129
+
130
+ create_table "accounts", force: :cascade do |t|
131
+ t.string "expense"
132
+ t.integer "user_id"
133
+ t.string "total"
134
+ end
135
+
136
+ end
137
+ """
138
+ And the following migrations have already been run:
139
+ | Migration | database|
140
+ | 20151008140000_create_posts_table.rb | default |
141
+ | 20151009140000_update_posts_table.rb | default |
142
+ | 20151010142141_change_posts_table.rb | default |
143
+ | 20151008220000_create_accounts_table.rb | users |
144
+ | 20151009220000_update_accounts_table.rb | users |
145
+ | 20151010141234_change_gadgets_table.rb | users |
146
+ When I run `bundle exec rake db:schema:load` in the multi database app
147
+ Then the schema_migrations table for the "default" database should only contain version numbers from default database migrations
148
+ And the schema_migrations table for the "users" database should only contain version numbers from users database migrations
@@ -1,3 +1,5 @@
1
+ require 'pry'
2
+
1
3
  Given(/^a single database app and a schema file with:$/) do |schema_content|
2
4
  write_file "../../single-db-dummy/db/schema.rb", schema_content
3
5
  end
@@ -8,4 +10,26 @@ end
8
10
 
9
11
  Given(/^a (\w+) file with:$/) do |schema_name, schema_content|
10
12
  write_file "../../multi-db-dummy/db/#{schema_name}.rb", schema_content
13
+ end
14
+
15
+ Given(/^the following migrations have already been run:$/) do |table|
16
+ @version_numbers = Hash.new {|hash, missing_key| hash[missing_key] = []}
17
+ table.hashes.each{|migration| @version_numbers[migration["database"]] << migration["Migration"].match(/\d{14}/).to_s}
18
+ table.hashes.each do |migration|
19
+ write_multi_db_migration_for migration["database"], migration["Migration"]
20
+ end
21
+ end
22
+
23
+ Then(/^the schema_migrations table for the "([^"]*)" database should only contain version numbers from (?:\w+) database migrations$/) do |database|
24
+ if database == "default"
25
+ database_file = "development.sqlite3"
26
+ else
27
+ database_file = "#{database}_development.sqlite3"
28
+ end
29
+ SQLite3::Database.new("multi-db-dummy/db/#{database_file}") do |db|
30
+ versions_query = db.execute("SELECT version FROM schema_migrations ORDER BY version ASC")
31
+ puts versions_query
32
+ expect(versions_query.count).to eql @version_numbers[database].count
33
+ expect(versions_query.flatten).to match_array @version_numbers[database]
34
+ end
11
35
  end
@@ -0,0 +1,19 @@
1
+ module MultiDatabase9000
2
+ module ActiveRecordExtensions
3
+ module Schema
4
+ def define(info, &block) # :nodoc:
5
+ instance_eval(&block)
6
+
7
+ unless info[:version].blank?
8
+ initialize_schema_migrations_table
9
+ database_match = caller[1].match(/\/(\w+)_schema/)
10
+ if database_match.present?
11
+ connection.assume_migrated_upto_version(info[:version], MultiDatabase9000.migration_path_for(database_match.captures.first))
12
+ else
13
+ connection.assume_migrated_upto_version(info[:version], migrations_paths)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,6 @@
1
1
  require "multi-database-9000/version"
2
2
  require "multi-database-9000/multi-database-9000"
3
+ require "active_record_extensions/schema"
3
4
 
4
5
  module MultiDatabase9000
5
6
  class Railtie < Rails::Railtie
@@ -7,5 +8,6 @@ module MultiDatabase9000
7
8
  load "multi-database-9000/tasks/multi-database-9000_tasks.rake"
8
9
  end
9
10
  end
10
-
11
11
  end
12
+
13
+ ActiveRecord::Schema.prepend MultiDatabase9000::ActiveRecordExtensions::Schema
@@ -1,5 +1,5 @@
1
1
  module MultiDatabase9000
2
- def self.maintain_all_test_schemas! # :nodoc:
2
+ def self.maintain_all_test_schemas!
3
3
  # Roundrip to Rake to allow plugins to hook into database initialization.
4
4
  FileUtils.cd Rails.root do
5
5
  current_config = ActiveRecord::Base.connection_config
@@ -9,4 +9,47 @@ module MultiDatabase9000
9
9
  ActiveRecord::Base.establish_connection(current_config)
10
10
  end
11
11
  end
12
+
13
+ def self.migration_path_for(database)
14
+ return nil unless database.present?
15
+ return ["db/#{database}_migrate"]
16
+ end
17
+
18
+ def database_connections(database: nil, rails_envs: nil)
19
+ connections = connections_for_environment(rails_envs)
20
+ if database.present?
21
+ connections.keep_if {|key, _| key.match Regexp.new(database)}
22
+ end
23
+ return connections
24
+ end
25
+
26
+ def connections_for_environment(rails_envs)
27
+ rails_envs = Array(rails_envs)
28
+ matcher = ->(key, value){rails_envs.any?{|env| key.match Regexp.new(env)}}
29
+ return ActiveRecord::Base.configurations.keep_if &matcher
30
+ end
31
+
32
+ def database_name(connection_key)
33
+ if connection_key.match /\w+_\w+/
34
+ return connection_key.split('_').first
35
+ else
36
+ return "default"
37
+ end
38
+ end
39
+
40
+ def migration_directory(connection_key)
41
+ if ['test','development','staging','cucumber','production'].include? connection_key
42
+ return "db/migrate/"
43
+ else
44
+ return "db/#{database_name(connection_key)}_migrate/"
45
+ end
46
+ end
47
+
48
+ def schema_file_name(connection_key)
49
+ if ['test','development','staging','cucumber','production'].include? connection_key
50
+ return "schema.rb"
51
+ else
52
+ return "#{database_name(connection_key)}_schema.rb"
53
+ end
54
+ end
12
55
  end
@@ -1,3 +1,3 @@
1
1
  module MultiDatabase9000
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- multi-database-9000 (0.2.1)
4
+ multi-database-9000 (0.3.0)
5
5
  rails (>= 4.0)
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- multi-database-9000 (0.1.0)
4
+ multi-database-9000 (0.3.0)
5
5
  rails (>= 4.0)
6
6
 
7
7
  GEM
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi-database-9000
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Weston
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-11-05 00:00:00.000000000 Z
13
+ date: 2015-11-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -132,6 +132,7 @@ extensions: []
132
132
  extra_rdoc_files: []
133
133
  files:
134
134
  - ".gitignore"
135
+ - ".travis.yml"
135
136
  - Gemfile
136
137
  - LICENSE.txt
137
138
  - README.md
@@ -150,6 +151,7 @@ files:
150
151
  - features/support/env.rb
151
152
  - features/test_app.feature
152
153
  - features/test_migrations.feature
154
+ - lib/active_record_extensions/schema.rb
153
155
  - lib/generators/multi_migration_generator.rb
154
156
  - lib/generators/templates/migration.rb
155
157
  - lib/multi-database-9000.rb