apartment 0.1.3 → 0.5.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/.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
|