apartment 0.1.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/Gemfile +5 -12
- data/HISTORY.md +31 -0
- data/{README.markdown → README.md} +39 -21
- data/Rakefile +44 -47
- data/apartment.gemspec +19 -58
- data/lib/apartment.rb +57 -6
- data/lib/apartment/adapters/abstract_adapter.rb +106 -0
- data/lib/apartment/adapters/mysql_adapter.rb +11 -0
- data/lib/apartment/adapters/postgresql_adapter.rb +55 -0
- data/lib/apartment/database.rb +58 -74
- data/lib/apartment/elevators/subdomain.rb +27 -0
- data/lib/apartment/migrator.rb +23 -0
- data/lib/apartment/railtie.rb +1 -2
- data/lib/apartment/version.rb +3 -0
- data/lib/tasks/apartment.rake +36 -0
- data/spec/apartment_spec.rb +7 -0
- data/spec/config/database.yml +10 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +6 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/company.rb +3 -0
- data/spec/dummy/app/models/user.rb +3 -0
- data/spec/dummy/app/views/application/index.html.erb +1 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +47 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +8 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +26 -0
- data/spec/dummy/config/environments/production.rb +49 -0
- data/spec/dummy/config/environments/test.rb +35 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/db/migrate/20110613152810_create_dummy_models.rb +20 -0
- data/spec/dummy/db/schema.rb +26 -0
- data/spec/dummy/db/seeds.rb +8 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/{lib/apartment/associations/multi_tenant_association.rb → spec/dummy/public/favicon.ico} +0 -0
- data/spec/dummy/public/stylesheets/.gitkeep +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/integration/adapters/postgresql_integration_spec.rb +73 -0
- data/spec/integration/apartment_rake_integration_spec.rb +62 -0
- data/spec/integration/database_integration_spec.rb +107 -0
- data/spec/integration/middleware/subdomain_elevator_spec.rb +63 -0
- data/spec/integration/setup_spec.rb +8 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/apartment_helpers.rb +24 -0
- data/spec/support/capybara_sessions.rb +15 -0
- data/spec/support/config.rb +11 -0
- data/spec/support/migrate.rb +9 -0
- data/spec/tasks/apartment_rake_spec.rb +110 -0
- data/spec/unit/config_spec.rb +84 -0
- data/spec/unit/middleware/subdomain_elevator_spec.rb +20 -0
- data/spec/unit/migrator_spec.rb +87 -0
- metadata +112 -62
- data/.bundle/config +0 -2
- data/.project +0 -11
- data/Gemfile.lock +0 -22
- data/VERSION +0 -1
- data/lib/apartment/config.rb +0 -10
- data/lib/apartment/config/default_config.yml +0 -17
- data/lib/tasks/multi_tenant_migrate.rake +0 -14
- data/pkg/apartment-0.1.3.gem +0 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apartment::Elevators::Subdomain do
|
4
|
+
|
5
|
+
describe "#subdomain" do
|
6
|
+
it "should parse subdomain" do
|
7
|
+
request = ActionDispatch::Request.new('HTTP_HOST' => 'foo.bar.com')
|
8
|
+
elevator = Apartment::Elevators::Subdomain.new(nil)
|
9
|
+
elevator.subdomain(request).should == 'foo'
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return nil when no subdomain" do
|
13
|
+
request = ActionDispatch::Request.new('HTTP_HOST' => 'bar.com')
|
14
|
+
elevator = Apartment::Elevators::Subdomain.new(nil)
|
15
|
+
elevator.subdomain(request).should be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apartment::Migrator do
|
4
|
+
|
5
|
+
let(:config){ Apartment::Test.config['connections']['postgresql'].symbolize_keys }
|
6
|
+
let(:schema_name){ 'some_db_schema' }
|
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
|
+
|
9
|
+
before do
|
10
|
+
ActiveRecord::Base.establish_connection config
|
11
|
+
Apartment::Database.stub(:config).and_return config # Use postgresql config for this test
|
12
|
+
@original_schema = ActiveRecord::Base.connection.schema_search_path
|
13
|
+
|
14
|
+
Apartment.configure do |config|
|
15
|
+
config.use_postgres_schemas = true
|
16
|
+
config.excluded_models = []
|
17
|
+
config.database_names = [schema_name]
|
18
|
+
end
|
19
|
+
|
20
|
+
Apartment::Database.create schema_name # create the schema
|
21
|
+
migrations_path = Rails.root + ActiveRecord::Migrator.migrations_path # tell AR where the real migrations are
|
22
|
+
ActiveRecord::Migrator.stub(:migrations_path).and_return(migrations_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
after do
|
26
|
+
Apartment::Test.drop_schema(schema_name)
|
27
|
+
end
|
28
|
+
|
29
|
+
context "postgresql" do
|
30
|
+
|
31
|
+
context "using schemas" do
|
32
|
+
|
33
|
+
describe "#migrate" do
|
34
|
+
it "should connect to new db, then reset when done" do
|
35
|
+
ActiveRecord::Base.connection.should_receive(:schema_search_path=).with(schema_name).once
|
36
|
+
ActiveRecord::Base.connection.should_receive(:schema_search_path=).with(@original_schema).once
|
37
|
+
Apartment::Migrator.migrate(schema_name)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should migrate db" do
|
41
|
+
ActiveRecord::Migrator.should_receive(:migrate)
|
42
|
+
Apartment::Migrator.migrate(schema_name)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#run" do
|
47
|
+
context "up" do
|
48
|
+
|
49
|
+
it "should connect to new db, then reset when done" do
|
50
|
+
ActiveRecord::Base.connection.should_receive(:schema_search_path=).with(schema_name).once
|
51
|
+
ActiveRecord::Base.connection.should_receive(:schema_search_path=).with(@original_schema).once
|
52
|
+
Apartment::Migrator.run(:up, schema_name, version)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should migrate to a version" do
|
56
|
+
ActiveRecord::Migrator.should_receive(:run).with(:up, anything, version)
|
57
|
+
Apartment::Migrator.run(:up, schema_name, version)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "down" do
|
62
|
+
|
63
|
+
it "should connect to new db, then reset when done" do
|
64
|
+
ActiveRecord::Base.connection.should_receive(:schema_search_path=).with(schema_name).once
|
65
|
+
ActiveRecord::Base.connection.should_receive(:schema_search_path=).with(@original_schema).once
|
66
|
+
Apartment::Migrator.run(:down, schema_name, version)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should migrate to a version" do
|
70
|
+
ActiveRecord::Migrator.should_receive(:run).with(:down, anything, version)
|
71
|
+
Apartment::Migrator.run(:down, schema_name, version)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#rollback" do
|
77
|
+
let(:steps){ 3 }
|
78
|
+
|
79
|
+
it "should rollback the db" do
|
80
|
+
ActiveRecord::Migrator.should_receive(:rollback).with(anything, steps)
|
81
|
+
Apartment::Migrator.rollback(schema_name, steps)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apartment
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 3
|
9
|
-
version: 0.1.3
|
4
|
+
prerelease:
|
5
|
+
version: 0.5.0
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Ryan Brunner
|
9
|
+
- Brad Robertson
|
13
10
|
autorequire:
|
14
11
|
bindir: bin
|
15
12
|
cert_chain: []
|
@@ -18,104 +15,162 @@ date: 2011-04-18 00:00:00 -04:00
|
|
18
15
|
default_executable:
|
19
16
|
dependencies:
|
20
17
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
18
|
+
name: rails
|
19
|
+
prerelease: false
|
22
20
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
21
|
none: false
|
24
22
|
requirements:
|
25
|
-
- -
|
23
|
+
- - ~>
|
26
24
|
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
- 2
|
29
|
-
- 3
|
30
|
-
- 5
|
31
|
-
version: 2.3.5
|
25
|
+
version: 3.0.8
|
32
26
|
type: :runtime
|
33
|
-
prerelease: false
|
34
27
|
version_requirements: *id001
|
35
28
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
29
|
+
name: sqlite3
|
30
|
+
prerelease: false
|
37
31
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
32
|
none: false
|
39
33
|
requirements:
|
40
34
|
- - ">="
|
41
35
|
- !ruby/object:Gem::Version
|
42
|
-
segments:
|
43
|
-
- 0
|
44
36
|
version: "0"
|
45
37
|
type: :development
|
46
|
-
prerelease: false
|
47
38
|
version_requirements: *id002
|
48
39
|
- !ruby/object:Gem::Dependency
|
49
|
-
name:
|
40
|
+
name: rspec
|
41
|
+
prerelease: false
|
50
42
|
requirement: &id003 !ruby/object:Gem::Requirement
|
51
43
|
none: false
|
52
44
|
requirements:
|
53
45
|
- - ~>
|
54
46
|
- !ruby/object:Gem::Version
|
55
|
-
|
56
|
-
- 1
|
57
|
-
- 0
|
58
|
-
- 0
|
59
|
-
version: 1.0.0
|
47
|
+
version: 2.6.0
|
60
48
|
type: :development
|
61
|
-
prerelease: false
|
62
49
|
version_requirements: *id003
|
63
50
|
- !ruby/object:Gem::Dependency
|
64
|
-
name:
|
51
|
+
name: rspec-rails
|
52
|
+
prerelease: false
|
65
53
|
requirement: &id004 !ruby/object:Gem::Requirement
|
66
54
|
none: false
|
67
55
|
requirements:
|
68
56
|
- - ~>
|
69
57
|
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
- 1
|
72
|
-
- 5
|
73
|
-
- 1
|
74
|
-
version: 1.5.1
|
58
|
+
version: 2.6.1
|
75
59
|
type: :development
|
76
|
-
prerelease: false
|
77
60
|
version_requirements: *id004
|
78
61
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
62
|
+
name: capybara
|
63
|
+
prerelease: false
|
80
64
|
requirement: &id005 !ruby/object:Gem::Requirement
|
81
65
|
none: false
|
82
66
|
requirements:
|
83
|
-
- - "
|
67
|
+
- - "="
|
84
68
|
- !ruby/object:Gem::Version
|
85
|
-
|
86
|
-
- 0
|
87
|
-
version: "0"
|
69
|
+
version: 1.0.0
|
88
70
|
type: :development
|
89
|
-
prerelease: false
|
90
71
|
version_requirements: *id005
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: pg
|
74
|
+
prerelease: false
|
75
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ~>
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 0.11.0
|
81
|
+
type: :development
|
82
|
+
version_requirements: *id006
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: silent-postgres
|
85
|
+
prerelease: false
|
86
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ~>
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 0.0.8
|
92
|
+
type: :development
|
93
|
+
version_requirements: *id007
|
94
|
+
description: Apartment allows Rails applications to deal with database multitenancy
|
95
|
+
email:
|
96
|
+
- ryan@ryanbrunner.com
|
97
|
+
- bradleyrobertson@gmail.com
|
95
98
|
executables: []
|
96
99
|
|
97
100
|
extensions: []
|
98
101
|
|
99
|
-
extra_rdoc_files:
|
100
|
-
|
102
|
+
extra_rdoc_files: []
|
103
|
+
|
101
104
|
files:
|
102
|
-
- .
|
103
|
-
- .
|
105
|
+
- .gitignore
|
106
|
+
- .rspec
|
107
|
+
- .rvmrc
|
104
108
|
- Gemfile
|
105
|
-
-
|
106
|
-
- README.
|
109
|
+
- HISTORY.md
|
110
|
+
- README.md
|
107
111
|
- Rakefile
|
108
|
-
- VERSION
|
109
|
-
- apartment-0.1.3.gem
|
110
112
|
- apartment.gemspec
|
111
113
|
- lib/apartment.rb
|
112
|
-
- lib/apartment/
|
113
|
-
- lib/apartment/
|
114
|
-
- lib/apartment/
|
114
|
+
- lib/apartment/adapters/abstract_adapter.rb
|
115
|
+
- lib/apartment/adapters/mysql_adapter.rb
|
116
|
+
- lib/apartment/adapters/postgresql_adapter.rb
|
115
117
|
- lib/apartment/database.rb
|
118
|
+
- lib/apartment/elevators/subdomain.rb
|
119
|
+
- lib/apartment/migrator.rb
|
116
120
|
- lib/apartment/railtie.rb
|
117
|
-
- lib/
|
118
|
-
-
|
121
|
+
- lib/apartment/version.rb
|
122
|
+
- lib/tasks/apartment.rake
|
123
|
+
- spec/apartment_spec.rb
|
124
|
+
- spec/config/database.yml
|
125
|
+
- spec/dummy/Rakefile
|
126
|
+
- spec/dummy/app/controllers/application_controller.rb
|
127
|
+
- spec/dummy/app/helpers/application_helper.rb
|
128
|
+
- spec/dummy/app/models/company.rb
|
129
|
+
- spec/dummy/app/models/user.rb
|
130
|
+
- spec/dummy/app/views/application/index.html.erb
|
131
|
+
- spec/dummy/app/views/layouts/application.html.erb
|
132
|
+
- spec/dummy/config.ru
|
133
|
+
- spec/dummy/config/application.rb
|
134
|
+
- spec/dummy/config/boot.rb
|
135
|
+
- spec/dummy/config/database.yml
|
136
|
+
- spec/dummy/config/environment.rb
|
137
|
+
- spec/dummy/config/environments/development.rb
|
138
|
+
- spec/dummy/config/environments/production.rb
|
139
|
+
- spec/dummy/config/environments/test.rb
|
140
|
+
- spec/dummy/config/initializers/backtrace_silencers.rb
|
141
|
+
- spec/dummy/config/initializers/inflections.rb
|
142
|
+
- spec/dummy/config/initializers/mime_types.rb
|
143
|
+
- spec/dummy/config/initializers/secret_token.rb
|
144
|
+
- spec/dummy/config/initializers/session_store.rb
|
145
|
+
- spec/dummy/config/locales/en.yml
|
146
|
+
- spec/dummy/config/routes.rb
|
147
|
+
- spec/dummy/db/migrate/20110613152810_create_dummy_models.rb
|
148
|
+
- spec/dummy/db/schema.rb
|
149
|
+
- spec/dummy/db/seeds.rb
|
150
|
+
- spec/dummy/db/test.sqlite3
|
151
|
+
- spec/dummy/log/development.log
|
152
|
+
- spec/dummy/log/production.log
|
153
|
+
- spec/dummy/log/server.log
|
154
|
+
- spec/dummy/public/404.html
|
155
|
+
- spec/dummy/public/422.html
|
156
|
+
- spec/dummy/public/500.html
|
157
|
+
- spec/dummy/public/favicon.ico
|
158
|
+
- spec/dummy/public/stylesheets/.gitkeep
|
159
|
+
- spec/dummy/script/rails
|
160
|
+
- spec/integration/adapters/postgresql_integration_spec.rb
|
161
|
+
- spec/integration/apartment_rake_integration_spec.rb
|
162
|
+
- spec/integration/database_integration_spec.rb
|
163
|
+
- spec/integration/middleware/subdomain_elevator_spec.rb
|
164
|
+
- spec/integration/setup_spec.rb
|
165
|
+
- spec/spec_helper.rb
|
166
|
+
- spec/support/apartment_helpers.rb
|
167
|
+
- spec/support/capybara_sessions.rb
|
168
|
+
- spec/support/config.rb
|
169
|
+
- spec/support/migrate.rb
|
170
|
+
- spec/tasks/apartment_rake_spec.rb
|
171
|
+
- spec/unit/config_spec.rb
|
172
|
+
- spec/unit/middleware/subdomain_elevator_spec.rb
|
173
|
+
- spec/unit/migrator_spec.rb
|
119
174
|
has_rdoc: true
|
120
175
|
homepage: http://github.com/ryanbrunner/apartment
|
121
176
|
licenses:
|
@@ -130,24 +185,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
185
|
requirements:
|
131
186
|
- - ">="
|
132
187
|
- !ruby/object:Gem::Version
|
133
|
-
hash: -190181027694817836
|
134
|
-
segments:
|
135
|
-
- 0
|
136
188
|
version: "0"
|
137
189
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
190
|
none: false
|
139
191
|
requirements:
|
140
192
|
- - ">="
|
141
193
|
- !ruby/object:Gem::Version
|
142
|
-
segments:
|
143
|
-
- 0
|
144
194
|
version: "0"
|
145
195
|
requirements: []
|
146
196
|
|
147
197
|
rubyforge_project:
|
148
|
-
rubygems_version: 1.
|
198
|
+
rubygems_version: 1.6.2
|
149
199
|
signing_key:
|
150
200
|
specification_version: 3
|
151
|
-
summary: A Ruby gem for managing multitenancy in Rails applications
|
201
|
+
summary: A Ruby gem for managing database multitenancy in Rails applications
|
152
202
|
test_files: []
|
153
203
|
|
data/.bundle/config
DELETED
data/.project
DELETED
data/Gemfile.lock
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
activesupport (3.0.3)
|
5
|
-
git (1.2.5)
|
6
|
-
jeweler (1.5.1)
|
7
|
-
bundler (~> 1.0.0)
|
8
|
-
git (>= 1.2.5)
|
9
|
-
rake
|
10
|
-
rake (0.8.7)
|
11
|
-
rcov (0.9.9)
|
12
|
-
shoulda (2.11.3)
|
13
|
-
|
14
|
-
PLATFORMS
|
15
|
-
ruby
|
16
|
-
|
17
|
-
DEPENDENCIES
|
18
|
-
activesupport (>= 2.3.5)
|
19
|
-
bundler (~> 1.0.0)
|
20
|
-
jeweler (~> 1.5.1)
|
21
|
-
rcov
|
22
|
-
shoulda
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.1.3
|
data/lib/apartment/config.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# Apartment configuration
|
2
|
-
|
3
|
-
# Excluded models
|
4
|
-
# Indicate which models should be excluded from multi-tenancy. If you have information
|
5
|
-
# that does not vary between databases, or information that should be considered global,
|
6
|
-
# specify it here. Any classes involved in determining which database to access MUST be
|
7
|
-
# specified here
|
8
|
-
|
9
|
-
excluded_models: [User]
|
10
|
-
|
11
|
-
# Postgres integration mode
|
12
|
-
# By default, apartment switches databases in Postgres by changing the schema search path
|
13
|
-
# of the current environment database. If preferred, this can be turned off and Postgres will
|
14
|
-
# look in different databases for multi-tenanted models.
|
15
|
-
|
16
|
-
use_postgres_schemas: true
|
17
|
-
|
@@ -1,14 +0,0 @@
|
|
1
|
-
namespace :apartment do
|
2
|
-
desc "Apply database changes to all multi-tenant databases"
|
3
|
-
task :migrate => :environment do |t, args|
|
4
|
-
|
5
|
-
puts "[Migrating to default environment]"
|
6
|
-
ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db', 'migrate'))
|
7
|
-
|
8
|
-
Admin::Company.where("database is not null").select("distinct database").each do |u|
|
9
|
-
puts "[Migrating to #{u.database}]"
|
10
|
-
|
11
|
-
Apartment::Database.migrate u.database
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|