multiple_dbs 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: af9c0af78926a4506ef7eeb69316619bc61c35f0
4
+ data.tar.gz: de2bfdfa8fdc35f92efdaa58f69ff0a3b8eeb256
5
+ SHA512:
6
+ metadata.gz: d036f11d65f5637c5d4c6a01cec12573d6fa23875309e43be5a606b6593c0d3269bd3a9fd54bfe7e529985d5b4c3579ae0741d8b038f21a39355295af257dfed
7
+ data.tar.gz: 93a80a61c13648cf9ec5d13c690649cf1318fca6f8714b5e2d1b1f7ebd29850bc4626596997862759bf4196ed1cc4913a6b1646df48ebdeb53be25871ea1ac3a
@@ -0,0 +1,20 @@
1
+ Copyright 2017 Yonga
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,341 @@
1
+ # MultipleDbs
2
+ So, your rails application needs to handle n databases. Well my friend,
3
+ this is your solution. This gem allows you to handle all your databases
4
+ connections, either for different databases that share the same entity
5
+ relationship model or for different databases with different entity
6
+ relationship models.
7
+
8
+ ## Usage
9
+
10
+ multiple_dbs creates a subclass for the models you want to handle in multiple
11
+ databases and one subclass for each connection. By doing this, each connection is
12
+ handled by it's own subclass, preventing switching between connections, which add a high computational cost.
13
+
14
+ #### IMPORTANT.
15
+ The following examples assume that you define 3 databases: db1, db2 and db3.
16
+
17
+ Before you start, follow the installation instructions [here](https://github.com/yonga9121/multiple_dbs#installation) and please read all this
18
+ document, especially if your project is already running or
19
+ already has a database with migrations and stuff.
20
+
21
+ ### Generate models.
22
+
23
+ If you want to generate a model for all the databases, run
24
+ ```bash
25
+ $ rails g multiple_dbs_model user email:string
26
+ ```
27
+
28
+ If you want to generate a model for a specific databases, run
29
+ ```bash
30
+ $ rails g multiple_dbs_model user email:string --only=db1 db3
31
+ ```
32
+
33
+ If you want to generate a model skipping a specific databases, run
34
+ ```bash
35
+ $ rails g multiple_dbs_model user email:string --skip=db1 db3
36
+ ```
37
+
38
+ You will find all migrations in the folder db/your_database/migrate.
39
+ The schema and seed files can be found in the folder db/your_database.
40
+
41
+ #### NOTE:
42
+ If you already have models, migrations and a schema file, and want to manage that
43
+ initial database with the multiple_dbs gem (recommended), you should create the database using the multiple_dbs_initializer generator and pass said database name as an argument. Check the ["How to start if already have a database ?"](https://github.com/yonga9121/multiple_dbs#how-to-start-if-already-have-a-database-) section for more information.
44
+
45
+ If you DO NOT want to override the default database.yml file, add as an option
46
+ --not_override=true
47
+
48
+
49
+ ### Generate Migrations
50
+
51
+ If you want to generate a migration for all the databases, run
52
+ ```bash
53
+ $ rails g multiple_dbs_migration add_column_password_to_users password:string
54
+ ```
55
+
56
+ If you want to a generate migration for a specific database, run
57
+ ```bash
58
+ $ rails g multiple_dbs_migration add_column_password_to_users password:string --only=db1 db3
59
+ ```
60
+
61
+ If you want to generate a migration skipping a specific database, run
62
+ ```bash
63
+ $ rails g multiple_dbs_migration add_column_password_to_users password:string --skip=db1 db2
64
+ ```
65
+
66
+ #### NOTE:
67
+ If you already have models, migrations and a schema file, and want to manage that
68
+ initial database with the multiple_dbs gem (recommended), you should create the database using the multiple_dbs_initializer generator and pass said database name as an argument. Check the ["How to start if already have a database ?"](https://github.com/yonga9121/multiple_dbs#how-to-start-if-already-have-a-database-) section for more information.
69
+
70
+ If you DO NOT want to override the default database.yml file, add as an option
71
+ --not_override=true
72
+
73
+ ### Setting up your application_controller
74
+
75
+ Add this tou your controller. Be sure to specify the database_name in the method mdb_name.
76
+
77
+ This will turn on the connection to the specified database.
78
+
79
+ ```ruby
80
+ def mdb_name
81
+ Thread.current[:mdb_name] ||= nil # ...change this for somthing that gives you the database name, like: 'db1' or 'client1_database'. You can use the request headers or the params or an object in the database or the request domain...
82
+ end
83
+
84
+ before_filter do
85
+ MultipleDbs.validate_connection(mdb_name)
86
+ end
87
+ ```
88
+
89
+ ### Setting up your models
90
+
91
+ Assuming that you create a User model and it has many Posts.
92
+
93
+ The User and Post models should look like this:
94
+ ```ruby
95
+ # app/models/user.rb
96
+ class User < ApplicationRecord
97
+ make_connectable_class do |db|
98
+ has_many :posts, class_name: "Post#{db}"
99
+ end
100
+ end
101
+
102
+ # app/models/post.rb
103
+ class Post < ApplicationRecord
104
+ make_connectable_class do |db|
105
+ belongs_to :user, foreign_key: "user_id", class_name: "User#{db}"
106
+ end
107
+ end
108
+ ```
109
+ Here, you associate the models between databases, by using classes PostDb1, PostDb2 and PostDb3 associated with classes UserDb1, UserDb2 and UserDb3 respectively.
110
+
111
+ In case you don't need the association through all the databases, for example, the
112
+ database db1, your models should look like this.
113
+
114
+ ```ruby
115
+ # app/models/user.rb
116
+ class User < ApplicationRecord
117
+ make_connectable_class do |db|
118
+ has_many :posts, class_name: "PostDb1"
119
+ end
120
+ end
121
+
122
+ # app/models/post.rb
123
+ class Post < ApplicationRecord
124
+ make_connectable_class do |db|
125
+ belongs_to :user, foreign_key: "user_id", class_name: "UserDb1"
126
+ end
127
+ end
128
+ ```
129
+ Here, you associate the models between databases, by using class PostDb1 associated with classes UserDb1, UserDb2 and UserDb3.
130
+
131
+ In case you don't need to define a class for all your databases, your models should look like this.
132
+ ```ruby
133
+ # app/models/user.rb
134
+ class User < ApplicationRecord
135
+ make_connectable_class(only: [:db1,:db3]) do |db|
136
+ has_many :posts, class_name: "Post#{db}"
137
+ end
138
+ end
139
+
140
+ # app/models/post.rb
141
+ class Post < ApplicationRecord
142
+ make_connectable_class(only: [:db1,:db3]) do |db|
143
+ belongs_to :user, foreign_key: "user_id", class_name: "User#{db}"
144
+ end
145
+ end
146
+ ```
147
+
148
+ Here, you associate the models between databases, by using classes PostDb1, PostDb2 and PostDb3 associated with classes UserDb1 and UserDb3.
149
+
150
+ ### Using the subclasses
151
+
152
+ You have two options for using a subclass that handles a connection.
153
+
154
+ - 1. Get the class from the base model
155
+
156
+ Use the model User to get the desired class.
157
+
158
+ ```ruby
159
+ user_class = User.multiple_class(:db1) # or User.mdb(:db1)
160
+ user_class.create(email: "someone@email.com")
161
+ ```
162
+ This is useful if your client sends you the database for data storage or transaction runs.
163
+
164
+ - 2. Using the raw constant
165
+
166
+ Before you can use the raw constant you must be sure that the connection to the database is on.
167
+ You can do this using MultipleDbs.validate_connection(dat_name) passing the database name as a parameter.
168
+
169
+ Use the UserDb1 class as usual
170
+ ```ruby
171
+ UserDb1.create(email: "someone@email.com")
172
+ ```
173
+
174
+ - 3. Using classes from different connections
175
+
176
+ In order to use different connections you must be sure that the connection from each database is on.
177
+ ```ruby
178
+ # somewhere in your code before you use the classes
179
+
180
+ MultipleDbs.validate_connection(:db1)
181
+ MultipleDbs.validate_connection(:db2)
182
+
183
+
184
+ # using the raw classes
185
+
186
+ puts UserDb1.first.inspect
187
+ puts UserDb2.first.inspect
188
+
189
+ # using the model to get the desired class
190
+
191
+ puts User.mdb(:db1).first.inspect
192
+ puts User.mdb(:db2).first.inspect
193
+ ```
194
+
195
+ ## Installation
196
+
197
+ Add this line to your application's Gemfile:
198
+ ```ruby
199
+ gem 'multiple_dbs'
200
+ ```
201
+
202
+ And then execute:
203
+ ```bash
204
+ $ bundle
205
+ ```
206
+
207
+ Or install it yourself as:
208
+ ```bash
209
+ $ gem install multiple_dbs
210
+ ```
211
+
212
+ Let's setup our connections. We are going to create all our configuration files
213
+ and all the stuff needed. Call the multiple_dbs_initializer generator and pass
214
+ as an argument the databases names. You can also pass as options the specific
215
+ database configuration.
216
+
217
+ Run in your terminal
218
+ ```bash
219
+ $ rails g multiple_dbs_initializer my_database1 my_database2
220
+ ```
221
+
222
+ If you need to configure the database connections (adapter, username,
223
+ etc), pass the options you want. Allowed options are: adapter,encoding,pool,username,password
224
+
225
+ Run in your terminal
226
+ ```bash
227
+ $ rails g multiple_dbs_initializer my_database1 my_database2
228
+ --development=username:goku password:ukog adapter:mysql2
229
+ --test=username:gohan password:nahog adapter:postgresql pool:2
230
+ --production=username:seriusname password:enviromentvariablepls pool:20
231
+ ```
232
+
233
+ Run the help command for more information
234
+ ```bash
235
+ $ rails g multiple_dbs_initializer --help
236
+ ```
237
+
238
+ We just need one more thing... Read the section according to your rails version
239
+
240
+ ### Rails >= 5.x.x
241
+
242
+ Add this line to your application_record.rb file so you ApplicationRecord class
243
+ looks like this.
244
+ ```ruby
245
+ # app/models/application_record.rb
246
+ class ApplicationRecord < ActiveRecord::Base
247
+ include MultipleDbs::MultiConnectable # this line
248
+ self.abstract_class = true
249
+ end
250
+
251
+ ```
252
+
253
+ ### How to start if already have a database ?.
254
+
255
+ If you already have a database and want to replicate the entity relationship model in your new databases you can do the following:
256
+
257
+ - Install the gem.
258
+ - Run the multiple_dbs_initializer and configure your database connections.
259
+ - If you want to copy the migrations from the default folder db/migrate into all your new databases, run in your terminal
260
+ ```bash
261
+ $ rails "mdbs:replicate_default_database"
262
+ ```
263
+
264
+ This command will copy your db/migrate folder into each of your databases folders, like db/your_database.
265
+
266
+ - If you want to copy the migrations from the default folder db/migrate into an specific database, run in your terminal:
267
+ ```bash
268
+ $ rails "mdbs:replicate_default_database_into[your_database]"
269
+ ```
270
+
271
+ This command will copy your db/migrate folder into db/your_database
272
+
273
+ - If you want to copy a specific migration from the default folder db/migrate into all your databases, run in your terminal:
274
+ ```bash
275
+ $ rails "mdbs:copy_migration_from_default[file_name.rb]"
276
+ ```
277
+
278
+ - If you want to copy a specific migration from the default folder db/migrate into an specific database, run in your terminal:
279
+ ```bash
280
+ $ rails "mdbs:copy_migration_from_default_into[file_name.rb, database_name]"
281
+ ```
282
+
283
+ - after you copy the migrations you want into the databases you want, migrate your databases, run in your terminal:
284
+ ```bash
285
+ $ rails mdbs:migrate
286
+ ```
287
+
288
+
289
+ ### Manage the databases
290
+ multiple_dbs comes with a list of useful tasks that you can find in your project
291
+ after the gem was installed.
292
+
293
+ Run in your terminal
294
+ ```bash
295
+ $ rake --tasks
296
+ ```
297
+
298
+ You will find all the tasks under the namespace "mdbs"
299
+
300
+ To create all the databases.
301
+ ```bash
302
+ $ rails mdbs:create
303
+ ```
304
+
305
+ To create a specific database
306
+ ```bash
307
+ $ rails mdbs:your_database_name:create
308
+ ```
309
+
310
+ To setup all the databases.
311
+ ```bash
312
+ $ rails mdbs:setup
313
+ ```
314
+
315
+ To setup a specific database.
316
+ ```bash
317
+ $ rails mdbs:your_database_name:setup
318
+ ```
319
+
320
+ To migrate all the databases.
321
+ ```bash
322
+ $ rails mdbs:migrate
323
+ ```
324
+
325
+ To migrate a specific database.
326
+ ```bash
327
+ $ rails mdbs:your_database_name:migrate
328
+ ```
329
+
330
+ You can pass the standard rails options as arguments to the tasks.
331
+
332
+ Please. Please! check the tasks under the namespace "mdbs"
333
+ Run in your terminal
334
+ ```bash
335
+ $ rake --tasks
336
+ ```
337
+
338
+
339
+
340
+ ## License
341
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,34 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'MultipleDbs'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+
21
+
22
+ require 'bundler/gem_tasks'
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+
34
+ task default: :test
@@ -0,0 +1,23 @@
1
+ Description:
2
+ You must use this generator to start using the multiple_dbs gem .
3
+ It creates the files needed to work with your databases.
4
+ Those files are:
5
+ - An initializer that define a constant with the databases names that you
6
+ give as an argument and the constants that store the databases configuration.
7
+ - the DBNAME_database.yml configuration files for each one of the databases.
8
+ - the database.yml. This file is needed by rails as default.
9
+ You can pass as options the configuration for each environment
10
+ (development, production, test).
11
+
12
+ Example:
13
+ rails generate multiple_dbs_initializer your_database your_database2 your_database3
14
+
15
+ This will create and override if exist the following files:
16
+ config/initializers/multiple_dbs_initializer.rb
17
+ config/multiple_dbs/your_database_database.yml
18
+ config/multiple_dbs/your_database2_database.yml
19
+ config/multiple_dbs/your_database3_database.yml
20
+ config/database.yml
21
+
22
+ Example with Options:
23
+ rails generate multiple_dbs_initializer your_database your_database2 your_database3 --development=username:super password:cool --test=adapter:mysql2 pool:2 --production=username:imsecure
@@ -0,0 +1,131 @@
1
+ class MultipleDbsInitializerGenerator < Rails::Generators::Base
2
+ source_root File.expand_path("../templates", __FILE__)
3
+
4
+ ## @@default_db_config
5
+ # default database configuration
6
+ @@default_db_config = {
7
+ "adapter"=> "postgresql",
8
+ "encoding"=> "unicode",
9
+ "pool"=> 5,
10
+ "username"=> "root",
11
+ "password"=> "toor",
12
+ }
13
+
14
+ ## databases = [:db1, :db2]
15
+ # an array that stores the databases names.
16
+ argument :databases, type: :array, default: [:db1, :db2]
17
+
18
+ ## development = @@default_db_config
19
+ # a hash that allows the user to change the default database configuration
20
+ # for the development environment through the options
21
+ class_option :development, type: :hash, default: @@default_db_config
22
+ ## production = @@default_db_config
23
+ # a hash that allows the user to change the default database configuration
24
+ # for the production environment through the options
25
+ class_option :production, type: :hash, default: @@default_db_config
26
+ ## test = @@default_db_config
27
+ # a hash that allows the user to change the default database configuration
28
+ # for the test environment through the options
29
+ class_option :test, type: :hash, default: @@default_db_config
30
+
31
+ ## not_override
32
+ # If false override the config/database.yml otherwise not override it
33
+ class_option :not_override, type: :boolean, default: true
34
+
35
+ ## define_multiple_dbs_constant
36
+ # Create the multiple_dbs_initializer.rb file.
37
+ # This file define the MultipleDbs::DBS constant
38
+ # and the MultipleDbs::DbConnection per database.
39
+ # Also delete the config/multiple_dbs folder and
40
+ # create the ymls files that store the database
41
+ # configuration
42
+ def define_multiple_dbs_constant
43
+ copy_file "initializer.rb", "config/initializers/multiple_dbs_initializer.rb"
44
+ insert_into_file "config/initializers/multiple_dbs_initializer.rb",
45
+ %Q{\tDBS=#{databases.map{|db| db.to_s.underscore.to_sym}}
46
+ run_setup\n}, after: "# Your databases.\n", verbose: false
47
+ remove_file "config/multiple_dbs", verbose: false
48
+ inject_into_class "app/controllers/application_controller.rb", ApplicationController,
49
+ %Q{\t\t# def mdb_name
50
+ # Thread.current[:mdb_name] ||= ... somthing that gives you the database name, like: 'db1' or 'client1_database'
51
+ # end
52
+ # before_filter do
53
+ # MultipleDbs.validate_connection(mdb_name)
54
+ # end\n}
55
+ databases.each do |db|
56
+ create_database_config_file db
57
+ end
58
+ create_database_config_file if !options.not_override
59
+ end
60
+
61
+ private
62
+
63
+
64
+ ## create_database_config_file
65
+ # create the configuration yml file for the given database name
66
+ # if the database name is null then the default rails configuration file is
67
+ # Overwritten
68
+ def create_database_config_file(db = nil)
69
+ fpath = db ? "/multiple_dbs/#{db}_database.yml" : "/database.yml"
70
+ db ||= databases.first
71
+ copy_file "config_db.yml", "config#{fpath}"
72
+
73
+ insert_into_file "config#{fpath}",
74
+ %Q{#{options.development["adapter"] ? options.development["adapter"] : @@default_db_config["adapter"] } },
75
+ before: "#development_adapter", verbose: false, force: true
76
+ insert_into_file "config#{fpath}",
77
+ %Q{#{options.development["encoding"] ? options.development["encoding"] : @@default_db_config["encoding"] } },
78
+ before: "#development_encoding", verbose: false, force: true
79
+ insert_into_file "config#{fpath}",
80
+ %Q{#{options.development["pool"] ? options.development["pool"] : @@default_db_config["pool"] } },
81
+ before: "#development_pool", verbose: false, force: true
82
+ insert_into_file "config#{fpath}",
83
+ %Q{#{db}_development },
84
+ before: "#development_database", verbose: false, force: true
85
+ insert_into_file "config#{fpath}",
86
+ %Q{#{options.development["username"] ? options.development["username"] : @@default_db_config["username"] } },
87
+ before: "#development_username", verbose: false, force: true
88
+ insert_into_file "config#{fpath}",
89
+ %Q{#{options.development["password"] ? options.development["password"] : @@default_db_config["password"] } },
90
+ before: "#development_psw", verbose: false, force: true
91
+
92
+ insert_into_file "config#{fpath}",
93
+ %Q{#{options.production["adapter"] ? options.production["adapter"] : @@default_db_config["adapter"] } },
94
+ before: "#production_adapter", verbose: false, force: true
95
+ insert_into_file "config#{fpath}",
96
+ %Q{#{options.production["encoding"] ? options.production["encoding"] : @@default_db_config["encoding"] } },
97
+ before: "#production_encoding", verbose: false, force: true
98
+ insert_into_file "config#{fpath}",
99
+ %Q{#{options.production["pool"] ? options.production["pool"] : @@default_db_config["pool"] } },
100
+ before: "#production_pool", verbose: false, force: true
101
+ insert_into_file "config#{fpath}",
102
+ %Q{#{db}_production },
103
+ before: "#production_database", verbose: false, force: true
104
+ insert_into_file "config#{fpath}",
105
+ %Q{#{options.production["username"] ? options.production["username"] : @@default_db_config["username"] } },
106
+ before: "#production_username", verbose: false, force: true
107
+ insert_into_file "config#{fpath}",
108
+ %Q{#{options.production["password"] ? options.production["password"] : @@default_db_config["password"] } },
109
+ before: "#production_psw", verbose: false, force: true
110
+
111
+ insert_into_file "config#{fpath}",
112
+ %Q{#{options.test["adapter"] ? options.test["adapter"] : @@default_db_config["adapter"] } },
113
+ before: "#test_adapter", verbose: false, force: true
114
+ insert_into_file "config#{fpath}",
115
+ %Q{#{options.test["encoding"] ? options.test["encoding"] : @@default_db_config["encoding"] } },
116
+ before: "#test_encoding", verbose: false, force: true
117
+ insert_into_file "config#{fpath}",
118
+ %Q{#{options.test["pool"] ? options.test["pool"] : @@default_db_config["pool"] } },
119
+ before: "#test_pool", verbose: false, force: true
120
+ insert_into_file "config#{fpath}",
121
+ %Q{#{db}_test },
122
+ before: "#test_database", verbose: false, force: true
123
+ insert_into_file "config#{fpath}",
124
+ %Q{#{options.test["username"] ? options.test["username"] : @@default_db_config["username"] } },
125
+ before: "#test_username", verbose: false, force: true
126
+ insert_into_file "config#{fpath}",
127
+ %Q{#{options.test["password"] ? options.test["password"] : @@default_db_config["password"] } },
128
+ before: "#test_psw", verbose: false, force: true
129
+ end
130
+
131
+ end
@@ -0,0 +1,24 @@
1
+
2
+ development:
3
+ adapter: #development_adapter
4
+ encoding: #development_encoding
5
+ pool: #development_pool
6
+ database: #development_database
7
+ password: #development_psw
8
+ username: #development_username
9
+
10
+ production:
11
+ adapter: #production_adapter
12
+ encoding: #production_encoding
13
+ pool: #production_pool
14
+ database: #production_database
15
+ username: #production_username
16
+ password: #production_psw
17
+
18
+ test:
19
+ adapter: #test_adapter
20
+ encoding: #test_encoding
21
+ pool: #test_pool
22
+ database: #test_database
23
+ username: #test_username
24
+ password: #test_psw
@@ -0,0 +1,8 @@
1
+ module MultipleDbs
2
+ # Your databases.
3
+
4
+ module DbConnection
5
+ # DbConnection Constants.
6
+ end
7
+
8
+ end
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Generate the migrations like the migration generator from rails but
3
+ create the files in the multiple_dbs databases.
4
+
5
+ You can use it as you usually use the rails migration generator
6
+
7
+ You can use the options:
8
+ --only and pass the name of the databases space separated. This only create
9
+ the migration in the specified databases
10
+ --skip and pass the name of the databases space separated. This not create
11
+ the migration in the specified databases
12
+
13
+ Example:
14
+ rails g multiple_dbs_migration add_password_to_users password:string --only=db1 db3 --skip=db3
@@ -0,0 +1,25 @@
1
+ require 'rails/generators/active_record/migration/migration_generator'
2
+
3
+ class MultipleDbsMigrationGenerator < ActiveRecord::Generators::MigrationGenerator
4
+ source_root File.join(File.dirname(ActiveRecord::Generators::MigrationGenerator.instance_method(:create_migration_file).source_location.first), "templates")
5
+
6
+ class_option :only, type: :array, default: []
7
+ class_option :skip, type: :array, default: []
8
+
9
+ def create_migration_file
10
+ if MultipleDbs and MultipleDbs::DBS
11
+ set_local_assigns!
12
+ validate_file_name!
13
+ only_arr = options[:only].map{|o| o.to_sym }.delete_if{ |o| !MultipleDbs::DBS.include?(o)} if options[:only] and options[:only].any?
14
+ skip_arr = options[:skip].map{|s| s.to_sym }.delete_if{ |s| !MultipleDbs::DBS.include?(s)} if options[:skip] and options[:skip].any?
15
+ databases_list = (MultipleDbs::DBS & only_arr) if only_arr and only_arr.any?
16
+ databases_list = databases_list - skip_arr if skip_arr and skip_arr.any?
17
+ databases_list ||= MultipleDbs::DBS
18
+ databases_list.each do |branch|
19
+ migration_template @migration_template, "db/#{branch}/migrate/#{file_name}.rb"
20
+ end if databases_list.any?
21
+ else
22
+ puts "The multiple_dbs constant is not defined. The multiple_dbs generator must be runned first. Type in your console: rails g multiple_dbs --help"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Generate the models like the model generator from rails but
3
+ create the files in the multiple_dbs databases.
4
+
5
+ You can use it as you usually use the rails model generator
6
+
7
+ You can use the options:
8
+ --only and pass the name of the databases space separated. This only create
9
+ the model in the specified databases
10
+ --skip and pass the name of the databases space separated. This not create
11
+ the model in the specified databases
12
+
13
+ Example:
14
+ rails g multiple_dbs_model User email:string --only=db1 db3 --skip=db3
@@ -0,0 +1,26 @@
1
+ require 'rails/generators/active_record/model/model_generator'
2
+
3
+ class MultipleDbsModelGenerator < ActiveRecord::Generators::ModelGenerator
4
+ source_root File.join(File.dirname(ActiveRecord::Generators::ModelGenerator.instance_method(:create_migration_file).source_location.first), "templates")
5
+
6
+ class_option :only, type: :array, default: []
7
+ class_option :skip, type: :array, default: []
8
+
9
+ def create_migration_file
10
+ if MultipleDbs and MultipleDbs::DBS
11
+ return unless options[:migration] && options[:parent].nil?
12
+ attributes.each { |a| a.attr_options.delete(:index) if a.reference? && !a.has_index? } if options[:indexes] == false
13
+ only_arr = options[:only].map{|o| o.to_sym }.delete_if{ |o| !MultipleDbs::DBS.include?(o)} if options[:only] and options[:only].any?
14
+ skip_arr = options[:skip].map{|s| s.to_sym }.delete_if{ |s| !MultipleDbs::DBS.include?(s)} if options[:skip] and options[:skip].any?
15
+ databases_list = (MultipleDbs::DBS & only_arr) if only_arr and only_arr.any?
16
+ databases_list = databases_list - skip_arr if skip_arr and skip_arr.any?
17
+ databases_list ||= MultipleDbs::DBS
18
+ databases_list.each do |branch|
19
+ migration_template "../../migration/templates/create_table_migration.rb", "db/#{branch}/migrate/#{table_name}.rb"
20
+ end if databases_list.any?
21
+ else
22
+ puts "The multiple_dbs constant is not defined. The multiple_dbs generator must be runned first. Type in your console: rails g multiple_dbs --help"
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,7 @@
1
+ require "multiple_dbs/railtie"
2
+ require "multiple_dbs/multi_connectable"
3
+
4
+ ## MultipleDbs
5
+ # The MultipleDbs module.
6
+ module MultipleDbs
7
+ end
@@ -0,0 +1,207 @@
1
+ module MultipleDbs
2
+
3
+ def validate_connection(db)
4
+ conn_klass = const_get("Conn#{db.to_s.camelize}")
5
+ if conn_klass
6
+ ActiveRecord::Base.connection_handler.connection_pools.each do |pool|
7
+ Rails.logger.info "CONN FOUND" and return true if pool.spec.name == conn_klass.to_s
8
+ end
9
+ Rails.logger.info " CONN NOT FOUND. CONNECTION TO #{conn_klass}"
10
+ conn_klass.connection and return true
11
+ else
12
+ raise Exception.new("Undefined constant #{conn_klass}")
13
+ end
14
+ end
15
+ module_function :validate_connection
16
+
17
+ # This module should be included in your application ApplicationRecord.
18
+ # It define two class methods for your models. With this two
19
+ # methods you can setup and handle all the models from all the
20
+ # databases you defined.
21
+ module MultiConnectable
22
+ extend ActiveSupport::Concern
23
+
24
+ included do
25
+ end
26
+
27
+ module ClassMethods
28
+
29
+ # This method lookup for the subclass related to the database that you pass
30
+ # as an argument and the model in wich you are calling the method.
31
+ # It use Object.const_get to lookup for the constant and also call
32
+ # the method multiple_relations so the relations match the classes
33
+ # that must be matched.
34
+ def multiple_class(connectable_type)
35
+ klass = Object.const_get("#{self.name}#{connectable_type.capitalize}")
36
+ klass.muliple_relations
37
+ klass
38
+ end
39
+ alias :mdb :multiple_class
40
+
41
+ # This method define one subclass for each database you define. Why?
42
+ # becouse each subclass handle the connection with the specifyed database
43
+ # and becouse of that we does not have to turn off and on the connections
44
+ # between databases. It's simple, if you have a User model and 3 databases
45
+ # defined db1, db2, db3 this method set the constants UserDb1, UserDb2
46
+ # and UserDb3. UserDb1 handle the connection with the database db1 and so on.
47
+ #
48
+ # EXAMPLE:
49
+ # class User < ApplicationRecord
50
+ # make_connectable_class do |db|
51
+ # has_many :post, class_name: "Post#{db}"
52
+ # end
53
+ # end
54
+ #
55
+ def make_connectable_class(options = {},&block)
56
+ only = options[:only]
57
+ only = only.delete_if{ |o| !MultipleDbs::DBS.include?(o) } if only and only.any?
58
+ database_list = (MultipleDbs::DBS & only) if only and only.any?
59
+ database_list ||= MultipleDbs::DBS
60
+ database_list.each do |db|
61
+ class_eval do
62
+ Object.const_set("#{self.name}#{db.capitalize}", Class.new(self) do
63
+ class_eval do
64
+ # This constant store the name of the database that this subclass
65
+ # is handling
66
+ const_set("CONNECTABLE_TYPE",db.capitalize)
67
+
68
+ # This variable will store the connection_pool that is going to
69
+ # handle the connections for the database. Just initializing the constant
70
+ Thread.current[const_get("CONNECTABLE_TYPE").to_s.underscore + "_connection"] = nil
71
+
72
+ # This filter calls the method multiple_relations
73
+ # setting the relations to the database they should be set
74
+ before_validation :muliple_relations
75
+ # This filter calls the method multiple_relations
76
+ # setting the relations to the database they should be set
77
+ after_find :muliple_relations
78
+
79
+
80
+ # This variable store the block given by the user...
81
+ # It is thought to have the definition of the model relations
82
+ # and is used my the method multiple_relations to set them adequately
83
+ @connectable_relations = block_given? ? block : nil
84
+
85
+ # This method call the block given by the user. If that block contains
86
+ # the definition of the relations parametrized like this:
87
+ #
88
+ # class User < ApplicationRecord
89
+ # make_connectable_class do |db|
90
+ # has_many :post, class_name: "Post#{db}"
91
+ # end
92
+ # end
93
+ #
94
+ # it will set the :post relation to the database handle by this
95
+ # subclass
96
+ def self.muliple_relations
97
+ @connectable_relations.call( const_get("CONNECTABLE_TYPE") ) if @connectable_relations
98
+ end
99
+
100
+ # return the database name of the database that this subclass
101
+ # is related to
102
+ def self.connectable_type
103
+ const_get("CONNECTABLE_TYPE")
104
+ end
105
+
106
+
107
+ # Override the connection method. Search the connection_pool that
108
+ # is handle the database connection, assign it to the
109
+ # Thread.current[const_get("CONNECTABLE_TYPE").to_s.underscore + "_connection"]
110
+ # vairable
111
+ def self.connection
112
+ self.connection_handler.connection_pools.each do |pool|
113
+ if pool.spec.config[:database] == eval('DBConnection' + const_get("CONNECTABLE_TYPE").to_s).connection["database"]
114
+ return Thread.current[const_get("CONNECTABLE_TYPE").to_s.underscore + "_connection"] = pool.connection
115
+ end
116
+ end
117
+ end
118
+
119
+ private
120
+
121
+ # return the database name of the database that this subclass
122
+ # is related to
123
+ def connectable_type
124
+ const_get("CONNECTABLE_TYPE")
125
+ end
126
+
127
+ # Call the class method multiple_relations.
128
+ # This method call the block given by the user. If that block contains
129
+ # the definition of the relations parametrized like this:
130
+ #
131
+ # class User < ApplicationRecord
132
+ # make_connectable_class do |db|
133
+ # has_many :post, class_name: "Post#{db}"
134
+ # end
135
+ # end
136
+ #
137
+ # it will set the :post relation to the database handle by this
138
+ # subclass
139
+ def muliple_relations
140
+ self.class.muliple_relations
141
+ end
142
+ end
143
+ end)
144
+ # Set the relations for the current database
145
+ Object.const_get("#{self.name}#{db.capitalize}").muliple_relations
146
+ end
147
+ end if database_list.any?
148
+ end
149
+ end
150
+ end
151
+
152
+
153
+ private
154
+
155
+ def run_setup
156
+ Object.class_eval do
157
+ def self.const_missing(c)
158
+ matches = []
159
+ db_matches = []
160
+ MultipleDbs::DBS.each do |db|
161
+ matches << c.to_s.scan(
162
+ Regexp.new('(([A-Z]){1}([a-zA-Z]|[0-9])*)+' + db.to_s.camelize + '$')
163
+ )
164
+ db_matches << db
165
+ break if matches.flatten.any?
166
+ end
167
+ const_temp = Object.const_get(matches.first).mdb(db_matches.last) if matches.flatten!.any?
168
+ MultipleDbs.validate_connection(db_matches.last) if matches.any? and const_temp.to_s.eql?(c.to_s)
169
+ return const_temp if matches.any? and const_temp.to_s.eql?(c.to_s)
170
+ super
171
+ end
172
+ end if Rails.env.development? and defined? MultipleDbs and defined? MultipleDbs::DBS
173
+
174
+ DBS.each do |db|
175
+ Object.const_set("DBConnection" + db.to_s.camelize , Class.new do
176
+ attr_accessor :connection
177
+ @connection = YAML::load(ERB.new(File.read(Rails.root.join("config/multiple_dbs", db.to_s.downcase + "_database.yml"))).result)[Rails.env]
178
+ def self.connection
179
+ @connection
180
+ end
181
+ end)
182
+ end
183
+
184
+ DBS.each do |db|
185
+ conn_config = const_get("DBConnection" + db.to_s.camelize).connection
186
+ if conn_config["database"] != ActiveRecord::Base.connection_config[:database]
187
+ conn_klass = Object.const_set("Conn" + db.to_s.camelize, Class.new(ApplicationRecord))
188
+ conn_klass.establish_connection conn_config
189
+ conn_klass.connection
190
+ else
191
+ Object.const_set("Conn" + db.to_s.camelize, ActiveRecord::Base)
192
+ end
193
+ end
194
+
195
+ ActiveRecord::Base.clear_all_connections!
196
+ end
197
+ module_function :run_setup
198
+
199
+ end
200
+
201
+ # If running in development mode, rails use Kernel#load to load our code.
202
+ # Is good, it allows us to make changes in files and see the changes in our
203
+ # server/console instantly but the subclasses that we create for each one of
204
+ # your models will not be available until you call the model...
205
+ # So this piece of code override const_missing if you are running rails in
206
+ # development and find the constants that you are looking for
207
+ # (the multiple_dbs constants) behind the scenes
@@ -0,0 +1,9 @@
1
+ module MultipleDbs
2
+ class Railtie < Rails::Railtie
3
+
4
+ rake_tasks do
5
+ load 'tasks/multiple_dbs_tasks.rake'
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module MultipleDbs
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,227 @@
1
+
2
+ # Regexp used to find the databases list.
3
+ REGEX_MATCH_FILES_BY_NAME = /config\/multiple_dbs\/([a-zA-Z]+[0-9]*|[0-9]+[a-zA-Z]*)_database.yml/
4
+
5
+ # @dbs Store all the databases names
6
+ @dbs = []
7
+
8
+ # Search in the config/multiple_dbs directory and scan each filename looking for each database name
9
+ Dir["config/multiple_dbs/*"].each do |file|
10
+ @dbs << file.scan(REGEX_MATCH_FILES_BY_NAME)
11
+ end
12
+ @dbs.flatten!
13
+
14
+
15
+ # MultipleDbs namespace
16
+ namespace :mdbs do
17
+ # Looping all the databases
18
+ @dbs.each do |db|
19
+ desc "databases managment #{db} tasks"
20
+ # A namespace per database
21
+ namespace db.to_sym do |database|
22
+ desc "#{db} drop"
23
+ task :drop do
24
+ Rake::Task["db:drop"].invoke
25
+ end
26
+ desc "#{db} create"
27
+ task :create do
28
+ Rake::Task["db:create"].invoke
29
+ end
30
+ desc "#{db} setup"
31
+ task :setup do
32
+ Rake::Task["db:setup"].invoke
33
+ end
34
+ desc "#{db} migrate"
35
+ task :migrate do
36
+ Rake::Task["db:migrate"].invoke
37
+ end
38
+ desc "#{db} rollback"
39
+ task :rollback do
40
+ Rake::Task["db:rollback"].invoke
41
+ end
42
+ desc "#{db} seed"
43
+ task :seed do
44
+ Rake::Task["db:seed"].invoke
45
+ end
46
+ desc "#{db} version"
47
+ task :version do
48
+ Rake::Task["db:version"].invoke
49
+ end
50
+
51
+ namespace :schema do
52
+ desc "#{db} schema load"
53
+ task :load do
54
+ Rake::Task["db:schema:load"].invoke
55
+ end
56
+ desc "#{db} schema dump"
57
+ task :dump do
58
+ Rake::Task["db:schema:dump"].invoke
59
+ end
60
+ end
61
+
62
+ database.tasks.each do |task|
63
+ task.enhance ["mdbs:#{db}:set_custom_config"] do
64
+ Rake::Task["mdbs:#{db}:revert_to_original_config"].invoke
65
+ end
66
+ end
67
+
68
+ desc "#{db} set custom config"
69
+ task "set_custom_config".to_sym do
70
+ # save current vars
71
+ @original_config = {
72
+ env_schema: ENV['SCHEMA'],
73
+ config: Rails.application.config.dup
74
+ }
75
+ # set config variables for custom database
76
+ ENV['SCHEMA'] = "db/#{db}/schema.rb"
77
+ Rails.application.config.paths['db'] = ["db/#{db}"]
78
+ Rails.application.config.paths['db/migrate'] = ["db/#{db}/migrate"]
79
+ Rails.application.config.paths['db/seeds.rb'] = ["db/#{db}/seeds.rb"]
80
+ Rails.application.config.paths['config/database'] = ["config/multiple_dbs/#{db}_database.yml"]
81
+ end
82
+ desc "#{db} revert custom config"
83
+ task "revert_to_original_config".to_sym do
84
+ # reset config variables to original values
85
+ ENV['SCHEMA'] = @original_config[:env_schema]
86
+ Rails.application.config = @original_config[:config]
87
+ end
88
+ end #db tasks
89
+
90
+ end # looping dbes
91
+
92
+ desc "drop all dbs and delete their schema file"
93
+ task :hard_drop do
94
+ @dbs.each do |db|
95
+ puts "hard dropping #{db}"
96
+ puts system(" rake mdbs:#{db}:drop") ? "#{db} dropped" : "Error while dropping #{db}"
97
+ puts system(" rm -rf db/#{db}/schema.rb ") ? "schema from #{db} removed" : "Error while erasing the schema from #{db}"
98
+ end
99
+ end
100
+
101
+ desc "drop, delete the schema files, create, migrate and seed for all dbs"
102
+ task :hard_reset do
103
+ @dbs.each do |db|
104
+ puts "hard reset #{db}"
105
+ puts system(" rake mdbs:#{db}:drop") ? "#{db} dropped" : "Error while dropping #{db}"
106
+ puts system(" rm -rf db/#{db}/schema.rb ") ? "schema from #{db} removed" : "Error while erasing the schema from #{db}"
107
+ puts system(" rake mdbs:#{db}:create") ? "#{db} created" : "Error while creating #{db}"
108
+ puts system(" rake mdbs:#{db}:migrate") ? "#{db} migrated" : "Error while migrating #{db}"
109
+ puts system(" rake mdbs:#{db}:seed") ? "#{db} seeded" : "Error while seeding #{db}"
110
+ end
111
+ end
112
+
113
+ desc "copy the seeds from the db/seed.rb file to each dbs seed file."
114
+ task :copy_seeds do
115
+ @dbs.each do |db|
116
+ puts "Copy seed to #{db}. #{system('cp db/seeds.rb db/#{db}/seeds.rb')}"
117
+ end
118
+ end
119
+
120
+ desc "copy the specified migration to each dbs migrations folder. Parameters: full_path.rb, database_name"
121
+ task :copy_migration, [:file_name, :db_name] do |t, args|
122
+ @dbs.each do |db|
123
+ puts "Copy migration from db/#{args[:db_name].downcase}/migrate/#{args[:file_name]} to db/#{db}/migrate/#{args[:file_name]}."
124
+ puts system("cp db/#{args[:db_name].downcase}/migrate/#{args[:file_name]} db/#{db}/migrate/#{args[:file_name]} ")
125
+ end
126
+ end
127
+
128
+ desc "copy the specified migration to the specified db migrations folder. Parameters: full_path.rb, from_database_name, to_database_name"
129
+ task :copy_migration_into, [:file_name, :from_database_name, :to_database_name] do |t, args|
130
+ puts "Copy migration from db/#{args[:from_database_name].downcase}/migrate/#{args[:file_name]} to db/#{args[:to_database_name]}/migrate/#{args[:file_name]}."
131
+ puts system("cp db/#{args[:from_database_name].downcase}/migrate/#{args[:file_name]} db/#{args[:to_database_name]}/migrate/#{args[:file_name]} ")
132
+ end
133
+
134
+ desc "copy the specified migration from the default migrations folder db/migrate to each dbs migrations folder. Parameters: full_path.rb"
135
+ task :copy_migration_from_default, [:file_name] do |t, args|
136
+ @dbs.each do |db|
137
+ puts "Copy migration from db/migrate/#{args[:file_name]} to db/#{db}/migrate/#{args[:file_name]}."
138
+ system(" mkdir db/#{db}")
139
+ system(" mkdir db/#{db}/migrate")
140
+ puts system("cp db/migrate/#{args[:file_name]} db/#{db}/migrate/#{args[:file_name]} ")
141
+ end
142
+ end
143
+
144
+ desc "copy the db/migration folder into each of your databases"
145
+ task :replicate_default_database do
146
+ @dbs.each do |db|
147
+ puts "Copy folder db/migrate to db/#{db}"
148
+ system(" mkdir db/#{db}")
149
+ puts system("cp -r db/migrate db/#{db}")
150
+ end
151
+ end
152
+
153
+ desc "copy the db/migration folder into the specified database"
154
+ task :replicate_default_database_into,[:db_name] do |t, args|
155
+ puts "Copy folder db/migrate to db/#{args[:db_name]}/migrate"
156
+ system(" mkdir db/#{args[:db_name]}")
157
+ puts system("cp -r db/migrate db/#{args[:db_name]}/migrate")
158
+ end
159
+
160
+ desc "copy the specified migration from the default migrations folder db/migrate, to the specified db migrations folder. Parameters: full_path.rb, to_database_name"
161
+ task :copy_migration_from_default_into, [:file_name, :to_database_name] do |t, args|
162
+ puts "Copy migration from db/migrate/#{args[:file_name]} to db/#{args[:to_database_name]}/migrate/#{args[:file_name]}."
163
+ system(" mkdir db/#{args[:to_database_name]}")
164
+ system(" mkdir db/#{args[:to_database_name]}/migrate")
165
+ puts system("cp db/migrate/#{args[:file_name]} db/#{args[:to_database_name]}/migrate/#{args[:file_name]} ")
166
+ end
167
+
168
+ desc "drop all dbs"
169
+ task :drop do
170
+ puts "Droping #{@dbs.join(',')}."
171
+ @dbs.each do |db|
172
+ Rake::Task["mdbs:#{db}:drop"].invoke
173
+ Rake::Task["db:drop"].reenable
174
+ Rake::Task["db:load_config"].reenable
175
+ Rake::Task["db:drop:_unsafe"].reenable
176
+ puts "#{db} dropped"
177
+ end
178
+ end
179
+ desc "create all dbs"
180
+ task :create do
181
+ @dbs.each do |db|
182
+ puts system(" rake mdbs:#{db}:create") ? "#{db} created" : "Error while creating #{db}"
183
+ end
184
+ end
185
+ desc "setup all dbs"
186
+ task :setup do
187
+ @dbs.each do |db|
188
+ puts system(" rake mdbs:#{db}:setup") ? "#{db} setup completed" : "Error while setting up #{db}"
189
+ end
190
+ end
191
+ desc "migrate all dbs"
192
+ task :migrate do
193
+ @dbs.each do |db|
194
+ puts system( "rake mdbs:#{db}:migrate" ) ? "#{db} migrated" : "Error while migrating #{db}"
195
+ end
196
+ end
197
+ desc "rollback all dbs"
198
+ task :rollback do
199
+ @dbs.each do |db|
200
+ puts system( "rake mdbs:#{db}:migrate" ) ? "#{db} rollback completed" : "Error while executing rollback on #{db}"
201
+ end
202
+ end
203
+ desc "seed all dbs"
204
+ task :seed do
205
+ @dbs.each do |db|
206
+ puts system( "rake mdbs:#{db}:seed" ) ? "#{db} seeded" : "Error while seeding #{db}"
207
+ end
208
+ end
209
+ desc "version all dbs"
210
+ task :version do
211
+ puts "Please use specific task for each database. Ex mdbs:my_db:version"
212
+ end
213
+ namespace :schema do
214
+ desc "schema load all dbs"
215
+ task :load do
216
+ @dbs.each do |db|
217
+ puts system(" rake mdbs:#{db}:schema:load ") ? "#{db} schema loaded" : "Error while loading schema for #{db}"
218
+ end
219
+ end
220
+ desc "schema dump all dbs"
221
+ task :dump do
222
+ @dbs.each do |db|
223
+ puts system(" rake mdbs:#{db}:schema:dump ") ? "#{db} schema dumped" : "Error while dumping schema for #{db}"
224
+ end
225
+ end
226
+ end
227
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: multiple_dbs
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yonga9121
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-09-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: pg
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Management of multiple databases.
42
+ email:
43
+ - jorgeggayon@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - MIT-LICENSE
49
+ - README.md
50
+ - Rakefile
51
+ - lib/generators/multiple_dbs_initializer/USAGE
52
+ - lib/generators/multiple_dbs_initializer/multiple_dbs_initializer_generator.rb
53
+ - lib/generators/multiple_dbs_initializer/templates/config_db.yml
54
+ - lib/generators/multiple_dbs_initializer/templates/initializer.rb
55
+ - lib/generators/multiple_dbs_migration/USAGE
56
+ - lib/generators/multiple_dbs_migration/multiple_dbs_migration_generator.rb
57
+ - lib/generators/multiple_dbs_model/USAGE
58
+ - lib/generators/multiple_dbs_model/multiple_dbs_model_generator.rb
59
+ - lib/multiple_dbs.rb
60
+ - lib/multiple_dbs/multi_connectable.rb
61
+ - lib/multiple_dbs/railtie.rb
62
+ - lib/multiple_dbs/version.rb
63
+ - lib/tasks/multiple_dbs_tasks.rake
64
+ homepage: https://yonga9121.github.io/multiple_dbs/
65
+ licenses:
66
+ - MIT
67
+ metadata: {}
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 2.5.1
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: Management of multiple databases.
88
+ test_files: []