apartment 0.14.4 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.md +5 -0
- data/README.md +2 -7
- data/apartment.gemspec +10 -8
- data/lib/apartment.rb +1 -1
- data/lib/apartment/adapters/abstract_adapter.rb +51 -58
- data/lib/apartment/adapters/mysql_adapter.rb +14 -3
- data/lib/apartment/adapters/postgresql_adapter.rb +2 -4
- data/lib/apartment/railtie.rb +1 -1
- data/lib/apartment/version.rb +1 -1
- data/spec/adapters/mysql_adapter_spec.rb +8 -27
- data/spec/adapters/postgresql_adapter_spec.rb +22 -121
- data/spec/config/database.yml +2 -2
- data/spec/database_spec.rb +110 -0
- data/spec/dummy/db/schema.rb +7 -1
- data/spec/examples/db_adapter_examples.rb +36 -0
- data/spec/examples/generic_adapter_examples.rb +97 -0
- data/spec/examples/schema_adapter_examples.rb +130 -0
- data/spec/integration/apartment_rake_integration_spec.rb +4 -3
- data/spec/integration/delayed_job_integration_spec.rb +2 -3
- data/spec/integration/middleware/subdomain_elevator_spec.rb +11 -22
- data/spec/spec_helper.rb +8 -1
- data/spec/support/apartment_helpers.rb +7 -1
- data/spec/support/config.rb +4 -4
- data/spec/support/requirements.rb +45 -0
- data/spec/tasks/apartment_rake_spec.rb +1 -1
- data/spec/unit/migrator_spec.rb +1 -1
- metadata +122 -98
- data/spec/integration/database_integration_spec.rb +0 -200
data/HISTORY.md
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Apartment
|
2
|
-
*Multitenancy for Rails 3*
|
2
|
+
*Multitenancy for Rails 3 and ActiveRecord*
|
3
3
|
|
4
4
|
Apartment provides tools to help you deal with multiple databases in your Rails
|
5
5
|
application. If you need to have certain data sequestered based on account or company,
|
@@ -19,7 +19,6 @@ on a per-user basis, look under "Usage - Switching databases per request", below
|
|
19
19
|
|
20
20
|
> NOTE: If using [postgresl schemas](http://www.postgresql.org/docs/9.0/static/ddl-schemas.html) you must use:
|
21
21
|
>
|
22
|
-
> * for Rails 3.0.x: _Rails ~> 3.0.10_, it contains a [patch](https://github.com/rails/rails/pull/1607) that has better postgresql schema support
|
23
22
|
> * for Rails 3.1.x: _Rails ~> 3.1.2_, it contains a [patch](https://github.com/rails/rails/pull/3232) that makes prepared statements work with multiple schemas
|
24
23
|
|
25
24
|
## Usage
|
@@ -157,8 +156,4 @@ In order to make ActiveRecord models play nice with DJ and Apartment, include `A
|
|
157
156
|
* The Local setup for development assumes that a root user with no password exists for both mysql and postgresl
|
158
157
|
* Rake tasks (see the Rakefile) will help you setup your dbs necessary to run tests
|
159
158
|
* Please issue pull requests to the `development` branch. All development happens here, master is used for releases
|
160
|
-
* Ensure that your code is accompanied with tests. No code will be merged without tests
|
161
|
-
|
162
|
-
## TODO
|
163
|
-
|
164
|
-
* Shared examples for testing to ensure consistency across all adapters
|
159
|
+
* Ensure that your code is accompanied with tests. No code will be merged without tests
|
data/apartment.gemspec
CHANGED
@@ -17,16 +17,18 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.licenses = ["MIT"]
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
s.rubygems_version = %q{1.3.7}
|
20
|
-
|
21
|
-
s.add_dependency '
|
20
|
+
|
21
|
+
s.add_dependency 'activerecord', '>= 3.1.2' # must be >= 3.1.2 due to bug in prepared_statements
|
22
|
+
s.add_dependency 'rack', '~> 1.4.0'
|
23
|
+
|
24
|
+
s.add_development_dependency 'rails', '>= 3.1.2'
|
22
25
|
s.add_development_dependency 'rake', '~> 0.9.2'
|
23
26
|
s.add_development_dependency 'sqlite3'
|
24
27
|
s.add_development_dependency 'rspec', '~> 2.8.0'
|
25
|
-
s.add_development_dependency 'rspec-rails', '~> 2.8.
|
26
|
-
s.add_development_dependency 'capybara', '1.0.0'
|
27
|
-
s.add_development_dependency 'pg', '
|
28
|
-
s.add_development_dependency 'mysql2', '~> 0.3.
|
29
|
-
s.add_development_dependency
|
30
|
-
s.add_development_dependency 'delayed_job', '~> 3.0.1'
|
28
|
+
s.add_development_dependency 'rspec-rails', '~> 2.8.1'
|
29
|
+
s.add_development_dependency 'capybara', '~> 1.0.0'
|
30
|
+
s.add_development_dependency 'pg', '>= 0.11.0'
|
31
|
+
s.add_development_dependency 'mysql2', '~> 0.3.10'
|
32
|
+
s.add_development_dependency 'delayed_job', '~> 3.0'
|
31
33
|
s.add_development_dependency 'delayed_job_active_record'
|
32
34
|
end
|
data/lib/apartment.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
require 'active_record'
|
2
2
|
|
3
3
|
module Apartment
|
4
|
-
|
4
|
+
|
5
5
|
module Adapters
|
6
|
-
|
6
|
+
|
7
7
|
class AbstractAdapter
|
8
|
-
|
8
|
+
|
9
9
|
# @constructor
|
10
10
|
# @param {Hash} config Database config
|
11
11
|
# @param {Hash} defaults Some default options
|
12
|
-
#
|
12
|
+
#
|
13
13
|
def initialize(config, defaults = {})
|
14
14
|
@config = config
|
15
15
|
@defaults = defaults
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
# Create a new database, import schema, seed if appropriate
|
19
|
-
#
|
19
|
+
#
|
20
20
|
# @param {String} database Database name
|
21
|
-
#
|
21
|
+
#
|
22
22
|
def create(database)
|
23
23
|
create_database(database)
|
24
24
|
|
@@ -27,44 +27,35 @@ module Apartment
|
|
27
27
|
|
28
28
|
# Seed data if appropriate
|
29
29
|
seed_data if Apartment.seed_after_create
|
30
|
-
|
30
|
+
|
31
31
|
yield if block_given?
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
# Get the current database name
|
36
|
-
#
|
36
|
+
#
|
37
37
|
# @return {String} current database name
|
38
|
-
#
|
38
|
+
#
|
39
39
|
def current_database
|
40
40
|
ActiveRecord::Base.connection.current_database
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
# Drop the database
|
44
|
-
#
|
44
|
+
#
|
45
45
|
# @param {String} database Database name
|
46
|
-
#
|
46
|
+
#
|
47
47
|
def drop(database)
|
48
48
|
# ActiveRecord::Base.connection.drop_database note that drop_database will not throw an exception, so manually execute
|
49
49
|
ActiveRecord::Base.connection.execute("DROP DATABASE #{environmentify(database)}" )
|
50
|
-
|
51
|
-
rescue ActiveRecord::StatementInvalid
|
50
|
+
|
51
|
+
rescue ActiveRecord::StatementInvalid
|
52
52
|
raise DatabaseNotFound, "The database #{environmentify(database)} cannot be found"
|
53
53
|
end
|
54
|
-
|
55
|
-
# Prepend the environment if configured and the environment isn't already there
|
56
|
-
#
|
57
|
-
# @param {String} database Database name
|
58
|
-
# @return {String} database name with Rails environment *optionally* prepended
|
59
|
-
#
|
60
|
-
def environmentify(database)
|
61
|
-
Apartment.prepend_environment && !database.include?(Rails.env) ? "#{Rails.env}_#{database}" : database
|
62
|
-
end
|
63
54
|
|
64
55
|
# Connect to db, do your biz, switch back to previous db
|
65
|
-
#
|
56
|
+
#
|
66
57
|
# @param {String?} database Database or schema to connect to
|
67
|
-
#
|
58
|
+
#
|
68
59
|
def process(database = nil)
|
69
60
|
current_db = current_database
|
70
61
|
switch(database)
|
@@ -75,7 +66,7 @@ module Apartment
|
|
75
66
|
end
|
76
67
|
|
77
68
|
# Establish a new connection for each specific excluded model
|
78
|
-
#
|
69
|
+
#
|
79
70
|
def process_excluded_models
|
80
71
|
# All other models will shared a connection (at ActiveRecord::Base) and we can modify at will
|
81
72
|
Apartment.excluded_models.each do |excluded_model|
|
@@ -85,21 +76,21 @@ module Apartment
|
|
85
76
|
warn "[Deprecation Warning] Passing class references to excluded models is now deprecated, please use a string instead"
|
86
77
|
excluded_model = excluded_model.name
|
87
78
|
end
|
88
|
-
|
79
|
+
|
89
80
|
excluded_model.constantize.establish_connection @config
|
90
81
|
end
|
91
82
|
end
|
92
|
-
|
83
|
+
|
93
84
|
# Reset the database connection to the default
|
94
|
-
#
|
85
|
+
#
|
95
86
|
def reset
|
96
87
|
ActiveRecord::Base.establish_connection @config
|
97
88
|
end
|
98
|
-
|
89
|
+
|
99
90
|
# Switch to new connection (or schema if appopriate)
|
100
|
-
#
|
91
|
+
#
|
101
92
|
# @param {String} database Database name
|
102
|
-
#
|
93
|
+
#
|
103
94
|
def switch(database = nil)
|
104
95
|
# Just connect to default db and return
|
105
96
|
return reset if database.nil?
|
@@ -108,54 +99,63 @@ module Apartment
|
|
108
99
|
end
|
109
100
|
|
110
101
|
# Load the rails seed file into the db
|
111
|
-
#
|
102
|
+
#
|
112
103
|
def seed_data
|
113
104
|
silence_stream(STDOUT){ load_or_abort("#{Rails.root}/db/seeds.rb") } # Don't log the output of seeding the db
|
114
105
|
end
|
115
106
|
alias_method :seed, :seed_data
|
116
|
-
|
107
|
+
|
117
108
|
protected
|
118
|
-
|
109
|
+
|
119
110
|
# Create the database
|
120
|
-
#
|
111
|
+
#
|
121
112
|
# @param {String} database Database name
|
122
|
-
#
|
113
|
+
#
|
123
114
|
def create_database(database)
|
124
115
|
ActiveRecord::Base.connection.create_database( environmentify(database) )
|
125
116
|
|
126
|
-
rescue ActiveRecord::StatementInvalid
|
117
|
+
rescue ActiveRecord::StatementInvalid
|
127
118
|
raise DatabaseExists, "The database #{environmentify(database)} already exists."
|
128
119
|
end
|
129
|
-
|
120
|
+
|
130
121
|
# Connect to new database
|
131
|
-
#
|
122
|
+
#
|
132
123
|
# @param {String} database Database name
|
133
|
-
#
|
124
|
+
#
|
134
125
|
def connect_to_new(database)
|
135
126
|
ActiveRecord::Base.establish_connection multi_tenantify(database)
|
136
127
|
ActiveRecord::Base.connection.active? # call active? to manually check if this connection is valid
|
137
128
|
|
138
|
-
rescue ActiveRecord::StatementInvalid
|
129
|
+
rescue ActiveRecord::StatementInvalid
|
139
130
|
raise DatabaseNotFound, "The database #{environmentify(database)} cannot be found."
|
140
131
|
end
|
141
|
-
|
132
|
+
|
133
|
+
# Prepend the environment if configured and the environment isn't already there
|
134
|
+
#
|
135
|
+
# @param {String} database Database name
|
136
|
+
# @return {String} database name with Rails environment *optionally* prepended
|
137
|
+
#
|
138
|
+
def environmentify(database)
|
139
|
+
Apartment.prepend_environment && !database.include?(Rails.env) ? "#{Rails.env}_#{database}" : database
|
140
|
+
end
|
141
|
+
|
142
142
|
# Import the database schema
|
143
|
-
#
|
143
|
+
#
|
144
144
|
def import_database_schema
|
145
145
|
ActiveRecord::Schema.verbose = false # do not log schema load output.
|
146
146
|
load_or_abort("#{Rails.root}/db/schema.rb")
|
147
147
|
end
|
148
|
-
|
148
|
+
|
149
149
|
# Return a new config that is multi-tenanted
|
150
|
-
#
|
150
|
+
#
|
151
151
|
def multi_tenantify(database)
|
152
152
|
@config.clone.tap do |config|
|
153
153
|
config[:database] = environmentify(database)
|
154
154
|
end
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
# Load a file or abort if it doesn't exists
|
158
|
-
#
|
158
|
+
#
|
159
159
|
def load_or_abort(file)
|
160
160
|
if File.exists?(file)
|
161
161
|
load(file)
|
@@ -163,14 +163,7 @@ module Apartment
|
|
163
163
|
abort %{#{file} doesn't exist yet}
|
164
164
|
end
|
165
165
|
end
|
166
|
-
|
167
|
-
# Remove all non-alphanumeric characters
|
168
|
-
#
|
169
|
-
def sanitize(database)
|
170
|
-
warn "[Deprecation Warning] Sanitize is no longer used, client should ensure proper database names"
|
171
|
-
database.gsub(/[\W]/,'')
|
172
|
-
end
|
173
|
-
|
166
|
+
|
174
167
|
end
|
175
168
|
end
|
176
169
|
end
|
@@ -2,7 +2,7 @@ module Apartment
|
|
2
2
|
|
3
3
|
module Database
|
4
4
|
|
5
|
-
def self.
|
5
|
+
def self.mysql2_adapter(config)
|
6
6
|
Adapters::MysqlAdapter.new config
|
7
7
|
end
|
8
8
|
end
|
@@ -11,8 +11,19 @@ module Apartment
|
|
11
11
|
|
12
12
|
class MysqlAdapter < AbstractAdapter
|
13
13
|
|
14
|
+
protected
|
15
|
+
|
16
|
+
# Connect to new database
|
17
|
+
# Abstract adapter will catch generic ActiveRecord error
|
18
|
+
# Catch specific adapter errors here
|
19
|
+
#
|
20
|
+
# @param {String} database Database name
|
21
|
+
#
|
22
|
+
def connect_to_new(database)
|
23
|
+
super
|
24
|
+
rescue Mysql2::Error
|
25
|
+
raise DatabaseNotFound, "Cannot find database #{environmentify(database)}"
|
26
|
+
end
|
14
27
|
end
|
15
|
-
|
16
28
|
end
|
17
|
-
|
18
29
|
end
|
@@ -7,7 +7,6 @@ module Apartment
|
|
7
7
|
Adapters::PostgresqlSchemaAdapter.new(config, :schema_search_path => ActiveRecord::Base.connection.schema_search_path) :
|
8
8
|
Adapters::PostgresqlAdapter.new(config)
|
9
9
|
end
|
10
|
-
|
11
10
|
end
|
12
11
|
|
13
12
|
module Adapters
|
@@ -47,7 +46,7 @@ module Apartment
|
|
47
46
|
# @param {String} database Database (schema) to drop
|
48
47
|
#
|
49
48
|
def drop(database)
|
50
|
-
ActiveRecord::Base.connection.execute("DROP SCHEMA #{database} CASCADE")
|
49
|
+
ActiveRecord::Base.connection.execute("DROP SCHEMA \"#{database}\" CASCADE")
|
51
50
|
|
52
51
|
rescue ActiveRecord::StatementInvalid
|
53
52
|
raise SchemaNotFound, "The schema #{database.inspect} cannot be found."
|
@@ -102,13 +101,12 @@ module Apartment
|
|
102
101
|
# Create the new schema
|
103
102
|
#
|
104
103
|
def create_database(database)
|
105
|
-
ActiveRecord::Base.connection.execute("CREATE SCHEMA #{database}")
|
104
|
+
ActiveRecord::Base.connection.execute("CREATE SCHEMA \"#{database}\"")
|
106
105
|
|
107
106
|
rescue ActiveRecord::StatementInvalid
|
108
107
|
raise SchemaExists, "The schema #{database} already exists."
|
109
108
|
end
|
110
109
|
|
111
110
|
end
|
112
|
-
|
113
111
|
end
|
114
112
|
end
|
data/lib/apartment/railtie.rb
CHANGED
data/lib/apartment/version.rb
CHANGED
@@ -1,36 +1,17 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'apartment/adapters/mysql_adapter'
|
2
|
+
require 'apartment/adapters/mysql_adapter'
|
3
3
|
|
4
4
|
describe Apartment::Adapters::MysqlAdapter do
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
@mysql = Apartment::Database.mysql_adapter Apartment::Test.config['connections']['mysql'].symbolize_keys
|
9
|
-
end
|
10
|
-
|
11
|
-
after do
|
12
|
-
ActiveRecord::Base.clear_all_connections!
|
13
|
-
end
|
6
|
+
let(:config){ Apartment::Test.config['connections']['mysql'] }
|
7
|
+
subject{ Apartment::Database.mysql2_adapter config.symbolize_keys }
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
let(:database1){ 'first_database' }
|
18
|
-
|
19
|
-
before do
|
20
|
-
@mysql.create(database1)
|
21
|
-
end
|
22
|
-
|
23
|
-
after do
|
24
|
-
ActiveRecord::Base.connection.drop_database(@mysql.environmentify(database1))
|
25
|
-
end
|
26
|
-
|
27
|
-
describe "#create" do
|
28
|
-
it "should create the new database" do
|
29
|
-
ActiveRecord::Base.connection.execute("SELECT schema_name FROM information_schema.schemata").collect{|row| row[0]}.should include(@mysql.environmentify(database1))
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
9
|
+
def database_names
|
10
|
+
ActiveRecord::Base.connection.execute("SELECT schema_name FROM information_schema.schemata").collect{|row| row[0]}
|
33
11
|
end
|
34
12
|
|
13
|
+
let(:default_database){ subject.process{ ActiveRecord::Base.connection.current_database } }
|
35
14
|
|
15
|
+
it_should_behave_like "a generic apartment adapter"
|
16
|
+
it_should_behave_like "a db based apartment adapter"
|
36
17
|
end
|
@@ -1,137 +1,38 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'apartment/adapters/postgresql_adapter'
|
2
|
+
require 'apartment/adapters/postgresql_adapter'
|
3
3
|
|
4
4
|
describe Apartment::Adapters::PostgresqlAdapter do
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
@schema_search_path = ActiveRecord::Base.connection.schema_search_path
|
9
|
-
end
|
10
|
-
|
11
|
-
after do
|
12
|
-
ActiveRecord::Base.clear_all_connections!
|
13
|
-
end
|
6
|
+
let(:config){ Apartment::Test.config['connections']['postgresql'] }
|
7
|
+
subject{ Apartment::Database.postgresql_adapter config.symbolize_keys }
|
14
8
|
|
15
9
|
context "using schemas" do
|
16
10
|
|
17
|
-
|
18
|
-
let(:schema2){ 'another_db_schema' }
|
19
|
-
let(:database_names){ ActiveRecord::Base.connection.execute("SELECT nspname FROM pg_namespace;").collect{|row| row['nspname']} }
|
20
|
-
|
21
|
-
subject{ Apartment::Database.postgresql_adapter Apartment::Test.config['connections']['postgresql'].symbolize_keys }
|
22
|
-
|
23
|
-
before do
|
24
|
-
Apartment.use_postgres_schemas = true
|
25
|
-
subject.create(schema)
|
26
|
-
subject.create(schema2)
|
27
|
-
end
|
28
|
-
|
29
|
-
after do
|
30
|
-
# sometimes we manually drop these schemas in testing, dont' care if we can't drop hence rescue
|
31
|
-
subject.drop(schema) rescue true
|
32
|
-
subject.drop(schema2) rescue true
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "#create" do
|
36
|
-
|
37
|
-
it "should create the new schema" do
|
38
|
-
database_names.should include(schema)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should load schema.rb to new schema" do
|
42
|
-
ActiveRecord::Base.connection.schema_search_path = schema
|
43
|
-
ActiveRecord::Base.connection.tables.should include('companies')
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should reset connection when finished" do
|
47
|
-
ActiveRecord::Base.connection.schema_search_path.should_not == schema
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should yield to block if passed" do
|
51
|
-
subject.drop(schema2) # so we don't get errors on creation
|
52
|
-
|
53
|
-
@count = 0 # set our variable so its visible in and outside of blocks
|
54
|
-
|
55
|
-
subject.create(schema2) do
|
56
|
-
@count = User.count
|
57
|
-
ActiveRecord::Base.connection.schema_search_path.should == schema2
|
58
|
-
User.create
|
59
|
-
end
|
60
|
-
|
61
|
-
subject.process(schema2){ User.count.should == @count + 1 }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe "#drop" do
|
66
|
-
|
67
|
-
it "should delete the database" do
|
68
|
-
subject.switch schema # can't drop db we're currently connected to, ensure these are different
|
69
|
-
subject.drop schema2
|
70
|
-
|
71
|
-
database_names.should_not include(schema2)
|
72
|
-
end
|
73
|
-
|
74
|
-
it "should raise an error for unkown database" do
|
75
|
-
expect {
|
76
|
-
subject.drop "unknown_database"
|
77
|
-
}.to raise_error(Apartment::SchemaNotFound)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
|
82
|
-
describe "#process" do
|
83
|
-
it "should connect" do
|
84
|
-
subject.process(schema) do
|
85
|
-
ActiveRecord::Base.connection.schema_search_path.should == schema
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should reset" do
|
90
|
-
subject.process(schema)
|
91
|
-
ActiveRecord::Base.connection.schema_search_path.should == @schema_search_path
|
92
|
-
end
|
93
|
-
|
94
|
-
# We're often finding when using Apartment in tests, the `current_database` (ie the previously attached to schema)
|
95
|
-
# gets dropped, but process will try to return to that schema in a test. We should just reset if it doesnt exist
|
96
|
-
it "should not throw exception if current_database (schema) is no longer accessible" do
|
97
|
-
subject.switch(schema2)
|
11
|
+
before{ Apartment.use_postgres_schemas = true }
|
98
12
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
end
|
13
|
+
# Not sure why, but somehow using let(:database_names) memoizes for the whole example group, not just each test
|
14
|
+
def database_names
|
15
|
+
ActiveRecord::Base.connection.execute("SELECT nspname FROM pg_namespace;").collect{|row| row['nspname']}
|
103
16
|
end
|
17
|
+
|
18
|
+
let(:default_database){ subject.process{ ActiveRecord::Base.connection.schema_search_path } }
|
104
19
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
describe "#switch" do
|
114
|
-
it "should connect to new schema" do
|
115
|
-
subject.switch(schema)
|
116
|
-
ActiveRecord::Base.connection.schema_search_path.should == schema
|
117
|
-
end
|
20
|
+
it_should_behave_like "a generic apartment adapter"
|
21
|
+
it_should_behave_like "a schema based apartment adapter"
|
22
|
+
end
|
23
|
+
|
24
|
+
context "using databases" do
|
118
25
|
|
119
|
-
|
120
|
-
subject.switch
|
121
|
-
ActiveRecord::Base.connection.schema_search_path.should == @schema_search_path
|
122
|
-
end
|
123
|
-
end
|
26
|
+
before{ Apartment.use_postgres_schemas = false }
|
124
27
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
subject.current_database.should == schema
|
129
|
-
end
|
28
|
+
# Not sure why, but somehow using let(:database_names) memoizes for the whole example group, not just each test
|
29
|
+
def database_names
|
30
|
+
connection.execute("select datname from pg_database;").collect{|row| row['datname']}
|
130
31
|
end
|
32
|
+
|
33
|
+
let(:default_database){ subject.process{ ActiveRecord::Base.connection.current_database } }
|
131
34
|
|
132
|
-
|
133
|
-
|
134
|
-
context "using databases" do
|
135
|
-
# TODO
|
35
|
+
it_should_behave_like "a generic apartment adapter"
|
36
|
+
it_should_behave_like "a db based apartment adapter"
|
136
37
|
end
|
137
38
|
end
|