apartment 0.14.4 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
@@ -4,21 +4,20 @@ describe Apartment::Elevators::Subdomain do
|
|
4
4
|
|
5
5
|
let(:company){ mock_model(Company, :subdomain => 'foo').as_null_object }
|
6
6
|
let(:domain){ "http://#{company.subdomain}.domain.com" }
|
7
|
+
let(:api){ Apartment::Database }
|
7
8
|
|
8
9
|
before do
|
9
10
|
Apartment.seed_after_create = false
|
10
11
|
Apartment.use_postgres_schemas = true
|
11
12
|
|
12
|
-
|
13
|
+
api.create(company.subdomain)
|
13
14
|
end
|
14
15
|
|
15
|
-
after
|
16
|
-
Apartment::Test.drop_schema(company.subdomain)
|
17
|
-
end
|
16
|
+
after{ api.drop(company.subdomain) }
|
18
17
|
|
19
18
|
context "single request" do
|
20
19
|
it "should switch the db" do
|
21
|
-
ActiveRecord::Base.connection.schema_search_path.should_not ==
|
20
|
+
ActiveRecord::Base.connection.schema_search_path.should_not == company.subdomain
|
22
21
|
|
23
22
|
visit(domain)
|
24
23
|
ActiveRecord::Base.connection.schema_search_path.should == company.subdomain
|
@@ -29,32 +28,22 @@ describe Apartment::Elevators::Subdomain do
|
|
29
28
|
let(:company2){ mock_model(Company, :subdomain => 'bar').as_null_object }
|
30
29
|
let(:domain2){ "http://#{company2.subdomain}.domain.com" }
|
31
30
|
|
32
|
-
before
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
Apartment::Database.process(company2.subdomain) do
|
40
|
-
@c2_user_count = (@c1_user_count + 2).times{ User.create }
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
after do
|
45
|
-
Apartment::Test.drop_schema(company2.subdomain)
|
46
|
-
end
|
31
|
+
before{ api.create(company2.subdomain) }
|
32
|
+
after{ api.drop(company2.subdomain) }
|
33
|
+
|
34
|
+
let!(:c1_user_count){ api.process(company.subdomain){ (2 + rand(2)).times{ User.create } } }
|
35
|
+
let!(:c2_user_count){ api.process(company2.subdomain){ (c1_user_count + 2).times{ User.create } } }
|
47
36
|
|
48
37
|
it "should fetch the correct user count for each session based on subdomain" do
|
49
38
|
visit(domain)
|
50
39
|
|
51
40
|
in_new_session do |session|
|
52
41
|
session.visit(domain2)
|
53
|
-
User.count.should ==
|
42
|
+
User.count.should == c2_user_count
|
54
43
|
end
|
55
44
|
|
56
45
|
visit(domain)
|
57
|
-
User.count.should ==
|
46
|
+
User.count.should == c1_user_count
|
58
47
|
end
|
59
48
|
|
60
49
|
|
data/spec/spec_helper.rb
CHANGED
@@ -27,5 +27,12 @@ RSpec.configure do |config|
|
|
27
27
|
# Necessary as some tests will leak things like current_schema into the next test
|
28
28
|
ActiveRecord::Base.clear_all_connections!
|
29
29
|
end
|
30
|
+
|
31
|
+
config.after(:each) do
|
32
|
+
Apartment::Test.reset
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
30
36
|
|
31
|
-
|
37
|
+
# Load shared examples, must happen after configure for RSpec 3
|
38
|
+
Dir["#{File.dirname(__FILE__)}/examples/**/*.rb"].each { |f| require f }
|
@@ -6,6 +6,12 @@ module Apartment
|
|
6
6
|
def reset
|
7
7
|
Apartment.excluded_models = nil
|
8
8
|
Apartment.use_postgres_schemas = nil
|
9
|
+
Apartment.seed_after_create = nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def next_db
|
13
|
+
@x ||= 0
|
14
|
+
"db_#{@x += 1}"
|
9
15
|
end
|
10
16
|
|
11
17
|
def drop_schema(schema)
|
@@ -17,7 +23,7 @@ module Apartment
|
|
17
23
|
end
|
18
24
|
|
19
25
|
def load_schema
|
20
|
-
silence_stream(STDOUT){ load(
|
26
|
+
silence_stream(STDOUT){ load(Rails.root.join('db', 'schema.rb')) }
|
21
27
|
end
|
22
28
|
|
23
29
|
def migrate
|
data/spec/support/config.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Apartment
|
2
|
+
module Spec
|
3
|
+
|
4
|
+
#
|
5
|
+
# Define the interface methods required to
|
6
|
+
# use an adapter shared example
|
7
|
+
#
|
8
|
+
#
|
9
|
+
module AdapterRequirements
|
10
|
+
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
let(:db1){ Apartment::Test.next_db }
|
15
|
+
let(:db2){ Apartment::Test.next_db }
|
16
|
+
let(:connection){ ActiveRecord::Base.connection }
|
17
|
+
|
18
|
+
before do
|
19
|
+
ActiveRecord::Base.establish_connection config
|
20
|
+
subject.create(db1)
|
21
|
+
subject.create(db2)
|
22
|
+
end
|
23
|
+
|
24
|
+
after do
|
25
|
+
# Reset before dropping (can't drop a db you're connected to)
|
26
|
+
subject.reset
|
27
|
+
|
28
|
+
# sometimes we manually drop these schemas in testing, don't care if we can't drop, hence rescue
|
29
|
+
subject.drop(db1) rescue true
|
30
|
+
subject.drop(db2) rescue true
|
31
|
+
|
32
|
+
ActiveRecord::Base.clear_all_connections!
|
33
|
+
Apartment::Database.reload!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
%w{subject config database_names default_database}.each do |method|
|
38
|
+
define_method method do
|
39
|
+
raise "You must define a `#{method}` method in your host group"
|
40
|
+
end unless defined?(method)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -25,7 +25,7 @@ describe "apartment rake tasks" do
|
|
25
25
|
|
26
26
|
context 'database migration' do
|
27
27
|
|
28
|
-
let(:database_names){
|
28
|
+
let(:database_names){ 3.times.map{ Apartment::Test.next_db } }
|
29
29
|
let(:db_count){ database_names.length }
|
30
30
|
|
31
31
|
before do
|
data/spec/unit/migrator_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Apartment::Migrator do
|
4
4
|
|
5
5
|
let(:config){ Apartment::Test.config['connections']['postgresql'].symbolize_keys }
|
6
|
-
let(:schema_name){
|
6
|
+
let(:schema_name){ Apartment::Test.next_db }
|
7
7
|
let(:version){ 20110613152810 } # note this is brittle! I've literally just taken the version of the one migration I made... don't change this version
|
8
8
|
|
9
9
|
before do
|
metadata
CHANGED
@@ -1,146 +1,162 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: apartment
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.14.4
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.15.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Ryan Brunner
|
9
9
|
- Brad Robertson
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
|
14
|
+
date: 2012-03-18 00:00:00 -04:00
|
15
|
+
default_executable:
|
16
|
+
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: activerecord
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
20
|
none: false
|
19
|
-
requirements:
|
20
|
-
- -
|
21
|
-
- !ruby/object:Gem::Version
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
22
24
|
version: 3.1.2
|
23
25
|
type: :runtime
|
24
26
|
prerelease: false
|
25
|
-
version_requirements: *
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
+
version_requirements: *id001
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rack
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 1.4.0
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: *id002
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: rails
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 3.1.2
|
47
|
+
type: :development
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: *id003
|
50
|
+
- !ruby/object:Gem::Dependency
|
27
51
|
name: rake
|
28
|
-
requirement: &
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
29
53
|
none: false
|
30
|
-
requirements:
|
54
|
+
requirements:
|
31
55
|
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
56
|
+
- !ruby/object:Gem::Version
|
33
57
|
version: 0.9.2
|
34
58
|
type: :development
|
35
59
|
prerelease: false
|
36
|
-
version_requirements: *
|
37
|
-
- !ruby/object:Gem::Dependency
|
60
|
+
version_requirements: *id004
|
61
|
+
- !ruby/object:Gem::Dependency
|
38
62
|
name: sqlite3
|
39
|
-
requirement: &
|
63
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
40
64
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version:
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0"
|
45
69
|
type: :development
|
46
70
|
prerelease: false
|
47
|
-
version_requirements: *
|
48
|
-
- !ruby/object:Gem::Dependency
|
71
|
+
version_requirements: *id005
|
72
|
+
- !ruby/object:Gem::Dependency
|
49
73
|
name: rspec
|
50
|
-
requirement: &
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
51
75
|
none: false
|
52
|
-
requirements:
|
76
|
+
requirements:
|
53
77
|
- - ~>
|
54
|
-
- !ruby/object:Gem::Version
|
78
|
+
- !ruby/object:Gem::Version
|
55
79
|
version: 2.8.0
|
56
80
|
type: :development
|
57
81
|
prerelease: false
|
58
|
-
version_requirements: *
|
59
|
-
- !ruby/object:Gem::Dependency
|
82
|
+
version_requirements: *id006
|
83
|
+
- !ruby/object:Gem::Dependency
|
60
84
|
name: rspec-rails
|
61
|
-
requirement: &
|
85
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
62
86
|
none: false
|
63
|
-
requirements:
|
87
|
+
requirements:
|
64
88
|
- - ~>
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 2.8.
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 2.8.1
|
67
91
|
type: :development
|
68
92
|
prerelease: false
|
69
|
-
version_requirements: *
|
70
|
-
- !ruby/object:Gem::Dependency
|
93
|
+
version_requirements: *id007
|
94
|
+
- !ruby/object:Gem::Dependency
|
71
95
|
name: capybara
|
72
|
-
requirement: &
|
96
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
73
97
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
77
101
|
version: 1.0.0
|
78
102
|
type: :development
|
79
103
|
prerelease: false
|
80
|
-
version_requirements: *
|
81
|
-
- !ruby/object:Gem::Dependency
|
104
|
+
version_requirements: *id008
|
105
|
+
- !ruby/object:Gem::Dependency
|
82
106
|
name: pg
|
83
|
-
requirement: &
|
107
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
84
108
|
none: false
|
85
|
-
requirements:
|
86
|
-
- -
|
87
|
-
- !ruby/object:Gem::Version
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
88
112
|
version: 0.11.0
|
89
113
|
type: :development
|
90
114
|
prerelease: false
|
91
|
-
version_requirements: *
|
92
|
-
- !ruby/object:Gem::Dependency
|
115
|
+
version_requirements: *id009
|
116
|
+
- !ruby/object:Gem::Dependency
|
93
117
|
name: mysql2
|
94
|
-
requirement: &
|
95
|
-
none: false
|
96
|
-
requirements:
|
97
|
-
- - ~>
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
version: 0.3.7
|
100
|
-
type: :development
|
101
|
-
prerelease: false
|
102
|
-
version_requirements: *2156176740
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: silent-postgres
|
105
|
-
requirement: &2156175840 !ruby/object:Gem::Requirement
|
118
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
106
119
|
none: false
|
107
|
-
requirements:
|
120
|
+
requirements:
|
108
121
|
- - ~>
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 0.3.10
|
111
124
|
type: :development
|
112
125
|
prerelease: false
|
113
|
-
version_requirements: *
|
114
|
-
- !ruby/object:Gem::Dependency
|
126
|
+
version_requirements: *id010
|
127
|
+
- !ruby/object:Gem::Dependency
|
115
128
|
name: delayed_job
|
116
|
-
requirement: &
|
129
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
117
130
|
none: false
|
118
|
-
requirements:
|
131
|
+
requirements:
|
119
132
|
- - ~>
|
120
|
-
- !ruby/object:Gem::Version
|
121
|
-
version: 3.0
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: "3.0"
|
122
135
|
type: :development
|
123
136
|
prerelease: false
|
124
|
-
version_requirements: *
|
125
|
-
- !ruby/object:Gem::Dependency
|
137
|
+
version_requirements: *id011
|
138
|
+
- !ruby/object:Gem::Dependency
|
126
139
|
name: delayed_job_active_record
|
127
|
-
requirement: &
|
140
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
128
141
|
none: false
|
129
|
-
requirements:
|
130
|
-
- -
|
131
|
-
- !ruby/object:Gem::Version
|
132
|
-
version:
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: "0"
|
133
146
|
type: :development
|
134
147
|
prerelease: false
|
135
|
-
version_requirements: *
|
148
|
+
version_requirements: *id012
|
136
149
|
description: Apartment allows Rails applications to deal with database multitenancy
|
137
|
-
email:
|
150
|
+
email:
|
138
151
|
- ryan@ryanbrunner.com
|
139
152
|
- bradleyrobertson@gmail.com
|
140
153
|
executables: []
|
154
|
+
|
141
155
|
extensions: []
|
156
|
+
|
142
157
|
extra_rdoc_files: []
|
143
|
-
|
158
|
+
|
159
|
+
files:
|
144
160
|
- .gitignore
|
145
161
|
- .rspec
|
146
162
|
- .rvmrc
|
@@ -169,6 +185,7 @@ files:
|
|
169
185
|
- spec/adapters/postgresql_adapter_spec.rb
|
170
186
|
- spec/apartment_spec.rb
|
171
187
|
- spec/config/database.yml
|
188
|
+
- spec/database_spec.rb
|
172
189
|
- spec/dummy/Rakefile
|
173
190
|
- spec/dummy/app/controllers/application_controller.rb
|
174
191
|
- spec/dummy/app/helpers/application_helper.rb
|
@@ -204,48 +221,55 @@ files:
|
|
204
221
|
- spec/dummy/public/favicon.ico
|
205
222
|
- spec/dummy/public/stylesheets/.gitkeep
|
206
223
|
- spec/dummy/script/rails
|
224
|
+
- spec/examples/db_adapter_examples.rb
|
225
|
+
- spec/examples/generic_adapter_examples.rb
|
226
|
+
- spec/examples/schema_adapter_examples.rb
|
207
227
|
- spec/integration/apartment_rake_integration_spec.rb
|
208
|
-
- spec/integration/database_integration_spec.rb
|
209
228
|
- spec/integration/delayed_job_integration_spec.rb
|
210
229
|
- spec/integration/middleware/subdomain_elevator_spec.rb
|
211
230
|
- spec/spec_helper.rb
|
212
231
|
- spec/support/apartment_helpers.rb
|
213
232
|
- spec/support/capybara_sessions.rb
|
214
233
|
- spec/support/config.rb
|
234
|
+
- spec/support/requirements.rb
|
215
235
|
- spec/tasks/apartment_rake_spec.rb
|
216
236
|
- spec/unit/config_spec.rb
|
217
237
|
- spec/unit/middleware/subdomain_elevator_spec.rb
|
218
238
|
- spec/unit/migrator_spec.rb
|
219
239
|
- spec/unit/reloader_spec.rb
|
240
|
+
has_rdoc: true
|
220
241
|
homepage: http://github.com/bradrobertson/apartment
|
221
|
-
licenses:
|
242
|
+
licenses:
|
222
243
|
- MIT
|
223
244
|
post_install_message:
|
224
245
|
rdoc_options: []
|
225
|
-
|
246
|
+
|
247
|
+
require_paths:
|
226
248
|
- lib
|
227
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
249
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
228
250
|
none: false
|
229
|
-
requirements:
|
230
|
-
- -
|
231
|
-
- !ruby/object:Gem::Version
|
232
|
-
|
233
|
-
segments:
|
251
|
+
requirements:
|
252
|
+
- - ">="
|
253
|
+
- !ruby/object:Gem::Version
|
254
|
+
hash: -617584559
|
255
|
+
segments:
|
234
256
|
- 0
|
235
|
-
|
236
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
257
|
+
version: "0"
|
258
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
259
|
none: false
|
238
|
-
requirements:
|
239
|
-
- -
|
240
|
-
- !ruby/object:Gem::Version
|
241
|
-
|
242
|
-
segments:
|
260
|
+
requirements:
|
261
|
+
- - ">="
|
262
|
+
- !ruby/object:Gem::Version
|
263
|
+
hash: -617584559
|
264
|
+
segments:
|
243
265
|
- 0
|
244
|
-
|
266
|
+
version: "0"
|
245
267
|
requirements: []
|
268
|
+
|
246
269
|
rubyforge_project:
|
247
|
-
rubygems_version: 1.
|
270
|
+
rubygems_version: 1.6.2
|
248
271
|
signing_key:
|
249
272
|
specification_version: 3
|
250
273
|
summary: A Ruby gem for managing database multitenancy in Rails applications
|
251
274
|
test_files: []
|
275
|
+
|