use_db 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.rdoc +107 -0
- data/Rakefile +2 -0
- data/lib/migration.rb +21 -0
- data/lib/test_model.rb +10 -0
- data/lib/use_db/version.rb +3 -0
- data/lib/use_db.rb +63 -0
- data/lib/use_db_test_setup.rb +158 -0
- data/use_db.gemspec +21 -0
- metadata +66 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
= UseDb
|
2
|
+
|
3
|
+
A multi-database connection scheme for Rails 3, supporting testing and migrations
|
4
|
+
|
5
|
+
== Features
|
6
|
+
|
7
|
+
=== Easy to use
|
8
|
+
1. Bundle the gem
|
9
|
+
2. Define a second set of databases in your database.yml file. Use a prefix to differentiate from the core database.
|
10
|
+
3. Add "use_db :prefix => 'your_other_database_prefix_" to the Model
|
11
|
+
|
12
|
+
== Supported versions
|
13
|
+
|
14
|
+
* Ruby 1.9.2
|
15
|
+
|
16
|
+
* Rails 3.0.x
|
17
|
+
|
18
|
+
== Install
|
19
|
+
|
20
|
+
Put this line in your Gemfile:
|
21
|
+
gem 'use_db'
|
22
|
+
|
23
|
+
Then bundle:
|
24
|
+
% bundle
|
25
|
+
|
26
|
+
== Usage
|
27
|
+
|
28
|
+
=== ACTIVERECORD
|
29
|
+
|
30
|
+
Insert a reference to use_db in your model, with a :prefix and/or :suffix
|
31
|
+
|
32
|
+
class MyModel < ActiveRecord::Base
|
33
|
+
use_db :prefix => "your_other_database_prefix_", :suffix => "_is_legacy"
|
34
|
+
end
|
35
|
+
|
36
|
+
This maps to a database in database.yml named:
|
37
|
+
your_other_database_prefix_[::Rails.env]_is_legacy
|
38
|
+
|
39
|
+
So this is what your database.yml should look like:
|
40
|
+
|
41
|
+
your_other_database_prefix_test_is_legacy
|
42
|
+
adapter: mysql
|
43
|
+
database: other_test_db
|
44
|
+
...
|
45
|
+
your_other_database_prefix_development_is_legacy
|
46
|
+
adapter: mysql
|
47
|
+
database: other_dev_db
|
48
|
+
...
|
49
|
+
|
50
|
+
You may find it useful (and more DRY) to define an abstract model to inherit from to avoid littering use_db in multiple places:
|
51
|
+
|
52
|
+
class LegacyDataBase < ActiveRecord::Base
|
53
|
+
use_db :prefix => "your_other_database_prefix_", :suffix => "_is_legacy"
|
54
|
+
self.abstract_class = true
|
55
|
+
end
|
56
|
+
|
57
|
+
class MyModel < LegacyDataBase
|
58
|
+
end
|
59
|
+
|
60
|
+
=== MIGRATIONS
|
61
|
+
|
62
|
+
Each migration intended for a different database needs to be told which to use. Do this by adding a method "self.database_model" and returning the class name which defines the other database. If you don't, it defaults to the core database like normal.
|
63
|
+
|
64
|
+
class ChangeOtherDatabaseTable < ActiveRecord::Migration
|
65
|
+
|
66
|
+
# For clarity leave me at the top of the class.
|
67
|
+
def self.database_model
|
68
|
+
# Examples depending if you're using an abstract class or not:
|
69
|
+
# return "LegacyDataBase"
|
70
|
+
# return "MyModel"
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
=== TESTING
|
76
|
+
|
77
|
+
In order to test multiple databases, you must invoke a task which clones the development database
|
78
|
+
structure and copies it into the test database, clearing out the existing test data. There is a single
|
79
|
+
helper method which executes this task and you invoke it as follows:
|
80
|
+
|
81
|
+
UseDbTestSetup.prepare_test_db(:prefix => "your_other_database_prefix_", :suffix => "_is_legacy")
|
82
|
+
|
83
|
+
Even though it might not be the best place for it, I put this in my test_helper.
|
84
|
+
You don't want it to execute for every test, so put something like this around it:
|
85
|
+
|
86
|
+
unless defined?(CLONED_OTHER_DB_FOR_TESTING)
|
87
|
+
UseDbTestSetup.prepare_test_db(:prefix => "your_other_database_prefix_", :suffix => "_is_legacy")
|
88
|
+
CLONED_OTHER_DB_FOR_TESTING = true
|
89
|
+
end
|
90
|
+
|
91
|
+
=== DEBUGGING
|
92
|
+
|
93
|
+
Add this statement in your test_helper or whereever you like such things.
|
94
|
+
|
95
|
+
UseDb.debug_print = true
|
96
|
+
|
97
|
+
=== FIXTURES
|
98
|
+
|
99
|
+
Nope. I don't use them and you probably shouldn't either, so this gem doesn't support them. See factory_girl.
|
100
|
+
|
101
|
+
== Giving Back
|
102
|
+
|
103
|
+
Have a change or improvement? Fork it, fix it, then send a pull request.
|
104
|
+
|
105
|
+
== Credits
|
106
|
+
|
107
|
+
David Stevenson (ds@elctech.com) originally wrote the code for this as a plugin for Rails 2. I wanted it to be a gem for Rails 3, so that's what I did. I renamed a few things here and there, added some additional debugging statements, but it's largely what he wrote. Thanks David.
|
data/Rakefile
ADDED
data/lib/migration.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
class Migration
|
3
|
+
class << self
|
4
|
+
def method_missing(method, *arguments, &block)
|
5
|
+
say_with_time "#{method}(#{arguments.map { |a| a.inspect }.join(", ")})" do
|
6
|
+
arguments[0] = Migrator.proper_table_name(arguments.first) unless arguments.empty? || method == :execute
|
7
|
+
if (self.respond_to?(:database_model))
|
8
|
+
write "Using custom database model's connection (#{self.database_model}) for this migration"
|
9
|
+
eval("#{self.database_model}.connection.send(method, *arguments, &block)")
|
10
|
+
else
|
11
|
+
ActiveRecord::Base.connection.send(method, *arguments, &block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def uses_db?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/test_model.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
def create_test_model(model_name, prefix="", suffix="", rails_env=::Rails.env)
|
2
|
+
# puts "Creating test model '#{model_name}', :prefix => '#{prefix}', :suffix => '#{suffix}'"
|
3
|
+
str = <<-EOF
|
4
|
+
require "use_db"
|
5
|
+
class #{model_name} < ActiveRecord::Base
|
6
|
+
use_db :prefix => "#{prefix}", :suffix => "#{suffix}", :rails_env => "#{rails_env}"
|
7
|
+
end
|
8
|
+
EOF
|
9
|
+
eval(str)
|
10
|
+
end
|
data/lib/use_db.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
module UseDb
|
2
|
+
# Options (recommended to use one or both):
|
3
|
+
# :prefix - Specify the prefix to append to ::Rails.env when finding the adapter specification in database.yml
|
4
|
+
# :suffix - Just like :prefix, only concatentated to the end
|
5
|
+
# OR
|
6
|
+
# :adapter
|
7
|
+
# :host
|
8
|
+
# :username
|
9
|
+
# :password
|
10
|
+
# ... etc ... same as the options in establish_connection
|
11
|
+
|
12
|
+
@@use_dbs = [ActiveRecord::Base]
|
13
|
+
@@debug_print = false
|
14
|
+
|
15
|
+
def use_db(options)
|
16
|
+
options_dup = options.dup
|
17
|
+
conn_spec = get_use_db_conn_spec(options)
|
18
|
+
puts "Establishing connecting on behalf of #{self.to_s} to #{conn_spec.inspect}" if UseDb.debug_print
|
19
|
+
establish_connection(conn_spec)
|
20
|
+
extend ClassMixin
|
21
|
+
@@use_dbs << self unless @@use_dbs.include?(self) || self.to_s.starts_with?("TestModel")
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.all_use_dbs
|
25
|
+
return @@use_dbs
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.debug_print
|
29
|
+
return @@debug_print
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.debug_print=(newval)
|
33
|
+
@@debug_print = newval
|
34
|
+
end
|
35
|
+
|
36
|
+
module ClassMixin
|
37
|
+
def uses_db?
|
38
|
+
true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_use_db_conn_spec(options)
|
43
|
+
options.symbolize_keys
|
44
|
+
puts "get_use_db_conn_spec OPTIONS=#{options.inspect}" if UseDb.debug_print
|
45
|
+
suffix = options.delete(:suffix)
|
46
|
+
prefix = options.delete(:prefix)
|
47
|
+
rails_env = options.delete(:rails_env) || ::Rails.env
|
48
|
+
if (options[:adapter])
|
49
|
+
return options
|
50
|
+
else
|
51
|
+
str = "#{prefix}#{rails_env}#{suffix}"
|
52
|
+
puts "get_use_db_conn_spec STR=#{str.inspect}" if UseDb.debug_print
|
53
|
+
connections = YAML.load(ERB.new(IO.read("#{::Rails.root.to_s}/config/database.yml"), nil, nil, '_use_db_erbout').result)
|
54
|
+
puts "get_use_db_conn_spec CONNECTIONS read. need connections[str]! #{connections.inspect}" if UseDb.debug_print
|
55
|
+
raise "Cannot find database specification. Configuration '#{str}' expected in config/database.yml" if (connections[str].nil?)
|
56
|
+
return connections[str]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
ActiveRecord::Base.extend UseDb
|
62
|
+
|
63
|
+
require 'use_db_test_setup'
|
@@ -0,0 +1,158 @@
|
|
1
|
+
require "use_db.rb"
|
2
|
+
require "test_model.rb"
|
3
|
+
|
4
|
+
class UseDbTestSetup
|
5
|
+
|
6
|
+
extend UseDb
|
7
|
+
|
8
|
+
# Used in rake tasks, not normal testing
|
9
|
+
def self.other_databases
|
10
|
+
YAML.load(File.read("#{::Rails.root.to_s}/config/use_db.yml")).values.collect(&:symbolize_keys!)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.prepare_test_db(options)
|
14
|
+
dump_db_structure(options)
|
15
|
+
purge_db(options)
|
16
|
+
clone_db_structure(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.dump_db_structure(options)
|
20
|
+
options_dup = options.dup
|
21
|
+
options_dup[:rails_env] = "development"
|
22
|
+
conn_spec = get_use_db_conn_spec(options_dup)
|
23
|
+
#establish_connection(conn_spec)
|
24
|
+
|
25
|
+
test_class = setup_test_model(options[:prefix], options[:suffix], "ForDumpStructure")
|
26
|
+
|
27
|
+
puts "Dumping DB structure #{test_class.inspect}..." if UseDb.debug_print
|
28
|
+
|
29
|
+
case conn_spec["adapter"]
|
30
|
+
when "mysql", "oci", "oracle"
|
31
|
+
test_class.establish_connection(conn_spec)
|
32
|
+
File.open("#{::Rails.root.to_s}/db/#{::Rails.env}_structure.sql", "w+") { |f| f << test_class.connection.structure_dump }
|
33
|
+
=begin when "postgresql"
|
34
|
+
ENV['PGHOST'] = abcs[::Rails.env]["host"] if abcs[::Rails.env]["host"]
|
35
|
+
ENV['PGPORT'] = abcs[::Rails.env]["port"].to_s if abcs[::Rails.env]["port"]
|
36
|
+
ENV['PGPASSWORD'] = abcs[::Rails.env]["password"].to_s if abcs[::Rails.env]["password"]
|
37
|
+
search_path = abcs[::Rails.env]["schema_search_path"]
|
38
|
+
search_path = "--schema=#{search_path}" if search_path
|
39
|
+
`pg_dump -i -U "#{abcs[::Rails.env]["username"]}" -s -x -O -f db/#{::Rails.env}_structure.sql #{search_path} #{abcs[::Rails.env]["database"]}`
|
40
|
+
raise "Error dumping database" if $?.exitstatus == 1
|
41
|
+
when "sqlite", "sqlite3"
|
42
|
+
dbfile = abcs[::Rails.env]["database"] || abcs[::Rails.env]["dbfile"]
|
43
|
+
`#{abcs[::Rails.env]["adapter"]} #{dbfile} .schema > db/#{::Rails.env}_structure.sql`
|
44
|
+
when "sqlserver"
|
45
|
+
`scptxfr /s #{abcs[::Rails.env]["host"]} /d #{abcs[::Rails.env]["database"]} /I /f db\\#{::Rails.env}_structure.sql /q /A /r`
|
46
|
+
`scptxfr /s #{abcs[::Rails.env]["host"]} /d #{abcs[::Rails.env]["database"]} /I /F db\ /q /A /r`
|
47
|
+
when "firebird"
|
48
|
+
set_firebird_env(abcs[::Rails.env])
|
49
|
+
db_string = firebird_db_string(abcs[::Rails.env])
|
50
|
+
sh "isql -a #{db_string} > db/#{::Rails.env}_structure.sql"
|
51
|
+
=end
|
52
|
+
else
|
53
|
+
raise "Task not supported by '#{conn_spec["adapter"]}'"
|
54
|
+
end
|
55
|
+
|
56
|
+
#if test_class.connection.supports_migrations?
|
57
|
+
# File.open("db/#{::Rails.env}_structure.sql", "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
|
58
|
+
#end
|
59
|
+
|
60
|
+
test_class.connection.disconnect!
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.clone_db_structure(options)
|
64
|
+
options_dup = options.dup
|
65
|
+
conn_spec = get_use_db_conn_spec(options_dup)
|
66
|
+
#establish_connection(conn_spec)
|
67
|
+
|
68
|
+
test_class = setup_test_model(options[:prefix], options[:suffix], "ForClone")
|
69
|
+
|
70
|
+
puts "Cloning DB structure #{test_class.inspect}..." if UseDb.debug_print
|
71
|
+
|
72
|
+
case conn_spec["adapter"]
|
73
|
+
when "mysql"
|
74
|
+
test_class.connection.execute('SET foreign_key_checks = 0')
|
75
|
+
IO.readlines("#{::Rails.root.to_s}/db/#{::Rails.env}_structure.sql").join.split("\n\n").each do |table|
|
76
|
+
test_class.connection.execute(table)
|
77
|
+
end
|
78
|
+
when "oci", "oracle"
|
79
|
+
IO.readlines("#{::Rails.root.to_s}/db/#{::Rails.env}_structure.sql").join.split(";\n\n").each do |ddl|
|
80
|
+
test_class.connection.execute(ddl)
|
81
|
+
end
|
82
|
+
=begin when "postgresql"
|
83
|
+
ENV['PGHOST'] = abcs["test"]["host"] if abcs["test"]["host"]
|
84
|
+
ENV['PGPORT'] = abcs["test"]["port"].to_s if abcs["test"]["port"]
|
85
|
+
ENV['PGPASSWORD'] = abcs["test"]["password"].to_s if abcs["test"]["password"]
|
86
|
+
`psql -U "#{abcs["test"]["username"]}" -f db/#{::Rails.env}_structure.sql #{abcs["test"]["database"]}`
|
87
|
+
when "sqlite", "sqlite3"
|
88
|
+
dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
|
89
|
+
`#{abcs["test"]["adapter"]} #{dbfile} < db/#{::Rails.env}_structure.sql`
|
90
|
+
when "sqlserver"
|
91
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{::Rails.env}_structure.sql`
|
92
|
+
when "firebird"
|
93
|
+
set_firebird_env(abcs["test"])
|
94
|
+
db_string = firebird_db_string(abcs["test"])
|
95
|
+
sh "isql -i db/#{::Rails.env}_structure.sql #{db_string}"
|
96
|
+
=end
|
97
|
+
else
|
98
|
+
raise "Task not supported by '#{conn_spec["adapter"]}'"
|
99
|
+
end
|
100
|
+
|
101
|
+
test_class.connection.disconnect!
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.purge_db(options)
|
105
|
+
options_dup = options.dup
|
106
|
+
conn_spec = get_use_db_conn_spec(options_dup)
|
107
|
+
#establish_connection(conn_spec)
|
108
|
+
|
109
|
+
test_class = setup_test_model(options[:prefix], options[:suffix], "ForPurge")
|
110
|
+
|
111
|
+
case conn_spec["adapter"]
|
112
|
+
when "mysql"
|
113
|
+
test_class.connection.recreate_database(conn_spec["database"])
|
114
|
+
when "oci", "oracle"
|
115
|
+
test_class.connection.structure_drop.split(";\n\n").each do |ddl|
|
116
|
+
test_class.connection.execute(ddl)
|
117
|
+
end
|
118
|
+
when "firebird"
|
119
|
+
test_class.connection.recreate_database!
|
120
|
+
=begin
|
121
|
+
when "postgresql"
|
122
|
+
ENV['PGHOST'] = abcs["test"]["host"] if abcs["test"]["host"]
|
123
|
+
ENV['PGPORT'] = abcs["test"]["port"].to_s if abcs["test"]["port"]
|
124
|
+
ENV['PGPASSWORD'] = abcs["test"]["password"].to_s if abcs["test"]["password"]
|
125
|
+
enc_option = "-E #{abcs["test"]["encoding"]}" if abcs["test"]["encoding"]
|
126
|
+
|
127
|
+
ActiveRecord::Base.clear_active_connections!
|
128
|
+
`dropdb -U "#{abcs["test"]["username"]}" #{abcs["test"]["database"]}`
|
129
|
+
`createdb #{enc_option} -U "#{abcs["test"]["username"]}" #{abcs["test"]["database"]}`
|
130
|
+
when "sqlite","sqlite3"
|
131
|
+
dbfile = abcs["test"]["database"] || abcs["test"]["dbfile"]
|
132
|
+
File.delete(dbfile) if File.exist?(dbfile)
|
133
|
+
when "sqlserver"
|
134
|
+
dropfkscript = "#{abcs["test"]["host"]}.#{abcs["test"]["database"]}.DP1".gsub(/\\/,'-')
|
135
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{dropfkscript}`
|
136
|
+
`osql -E -S #{abcs["test"]["host"]} -d #{abcs["test"]["database"]} -i db\\#{::Rails.env}_structure.sql`
|
137
|
+
=end
|
138
|
+
else
|
139
|
+
raise "Task not supported by '#{conn_spec["adapter"]}'"
|
140
|
+
end
|
141
|
+
|
142
|
+
test_class.connection.disconnect!
|
143
|
+
end
|
144
|
+
|
145
|
+
def self.setup_test_model(prefix="", suffix="", model_suffix="", rails_env=::Rails.env)
|
146
|
+
puts "PREFIX= #{prefix}" if UseDb.debug_print
|
147
|
+
puts "SUFFIX= #{suffix}" if UseDb.debug_print
|
148
|
+
puts "MODEL SUFFIX= #{model_suffix}" if UseDb.debug_print
|
149
|
+
puts "rails_env= #{rails_env}" if UseDb.debug_print
|
150
|
+
prefix ||= ""
|
151
|
+
suffix ||= ""
|
152
|
+
model_name = "TestModel#{prefix.camelize}#{suffix.camelize}#{model_suffix}".gsub("_","").gsub("-","")
|
153
|
+
puts "model_name = #{model_name}" if UseDb.debug_print
|
154
|
+
return eval(model_name) if eval("defined?(#{model_name})")
|
155
|
+
create_test_model(model_name, prefix, suffix, rails_env)
|
156
|
+
return eval(model_name)
|
157
|
+
end
|
158
|
+
end
|
data/use_db.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "use_db/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "use_db"
|
7
|
+
s.version = UseDb::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Ron Guarisco"]
|
10
|
+
s.email = ["ron@guarisco.net"]
|
11
|
+
s.homepage = "https://github.com/guarisco/use_db"
|
12
|
+
s.summary = %q{Multi-database AR connections for Rails 3}
|
13
|
+
s.description = %q{Multi-database AR connections for Rails 3 models, tests, and migrations.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "use_db"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: use_db
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ron Guarisco
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-11 00:00:00 -05:00
|
14
|
+
default_executable:
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description: Multi-database AR connections for Rails 3 models, tests, and migrations.
|
18
|
+
email:
|
19
|
+
- ron@guarisco.net
|
20
|
+
executables: []
|
21
|
+
|
22
|
+
extensions: []
|
23
|
+
|
24
|
+
extra_rdoc_files: []
|
25
|
+
|
26
|
+
files:
|
27
|
+
- .gitignore
|
28
|
+
- Gemfile
|
29
|
+
- README.rdoc
|
30
|
+
- Rakefile
|
31
|
+
- lib/migration.rb
|
32
|
+
- lib/test_model.rb
|
33
|
+
- lib/use_db.rb
|
34
|
+
- lib/use_db/version.rb
|
35
|
+
- lib/use_db_test_setup.rb
|
36
|
+
- use_db.gemspec
|
37
|
+
has_rdoc: true
|
38
|
+
homepage: https://github.com/guarisco/use_db
|
39
|
+
licenses: []
|
40
|
+
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: "0"
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
requirements: []
|
59
|
+
|
60
|
+
rubyforge_project: use_db
|
61
|
+
rubygems_version: 1.6.2
|
62
|
+
signing_key:
|
63
|
+
specification_version: 3
|
64
|
+
summary: Multi-database AR connections for Rails 3
|
65
|
+
test_files: []
|
66
|
+
|