activerecord-multi-tenant 0.2.1 → 0.3.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Appraisals +12 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +151 -0
- data/README.md +88 -0
- data/Rakefile +7 -0
- data/activerecord-multi-tenant.gemspec +25 -0
- data/docker-compose.yml +18 -0
- data/gemfiles/rails_3.2.gemfile +7 -0
- data/gemfiles/rails_3.2.gemfile.lock +97 -0
- data/gemfiles/rails_4.2.gemfile +6 -0
- data/gemfiles/rails_4.2.gemfile.lock +110 -0
- data/gemfiles/rails_5.0.gemfile +6 -0
- data/gemfiles/rails_5.0.gemfile.lock +115 -0
- data/lib/activerecord-multi-tenant.rb +2 -0
- data/lib/activerecord-multi-tenant/controller_extensions.rb +22 -0
- data/lib/activerecord-multi-tenant/default_scope.rb +1 -1
- data/lib/activerecord-multi-tenant/migrations.rb +1 -1
- data/lib/activerecord-multi-tenant/model_extensions.rb +120 -0
- data/lib/activerecord-multi-tenant/multi_tenant.rb +33 -44
- data/lib/activerecord-multi-tenant/version.rb +1 -1
- data/spec/activerecord-multi-tenant/controller_extensions_spec.rb +30 -0
- data/spec/activerecord-multi-tenant/model_extensions_spec.rb +153 -0
- data/spec/activerecord-multi-tenant/record_callback_spec.rb +22 -0
- data/spec/activerecord-multi-tenant/record_finding_spec.rb +11 -0
- data/spec/activerecord-multi-tenant/record_modifications_spec.rb +20 -0
- data/spec/database.yml +9 -0
- data/spec/schema.rb +104 -0
- data/spec/spec_helper.rb +43 -0
- metadata +44 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c5c0ba14d59d29394780c14bc3af728e9f9e8c4
|
4
|
+
data.tar.gz: 76633446183eeca8bf24f5763db3dab4582d83fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83055c97bedeab4a83b32a4a772c2ed62511f464529e392283832fb42fe39d0e04e0c33e710e1950c49e0cf14ac9a3d95da7a73375e813898fdd07f79a664597
|
7
|
+
data.tar.gz: a89de927f75b3e5824d07cfb731fe21c506e5104d10e42e9406609d10b9d70b08ab1152919e7ea9f9191d7b57a04ba60c0fcde1b4795d9dac12f6890580ecaa0
|
data/.gitignore
ADDED
data/Appraisals
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 0.3.0 2016-12-30
|
4
|
+
|
5
|
+
* Remove dependency on acts_as_tenant - instead copy the code thats necessary
|
6
|
+
* Fix issue with callbacks having TenantIdWrapper instead of the actual object
|
7
|
+
|
8
|
+
|
9
|
+
## 0.2.1 2016-12-29
|
10
|
+
|
11
|
+
* Fix bug in CopyFromClient helper
|
12
|
+
|
13
|
+
|
14
|
+
## 0.2.0 2016-12-27
|
15
|
+
|
16
|
+
* Initial release
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
activerecord-multi-tenant (0.3.0)
|
5
|
+
rails (>= 3.1)
|
6
|
+
request_store (>= 1.0.5)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
actioncable (5.0.1)
|
12
|
+
actionpack (= 5.0.1)
|
13
|
+
nio4r (~> 1.2)
|
14
|
+
websocket-driver (~> 0.6.1)
|
15
|
+
actionmailer (5.0.1)
|
16
|
+
actionpack (= 5.0.1)
|
17
|
+
actionview (= 5.0.1)
|
18
|
+
activejob (= 5.0.1)
|
19
|
+
mail (~> 2.5, >= 2.5.4)
|
20
|
+
rails-dom-testing (~> 2.0)
|
21
|
+
actionpack (5.0.1)
|
22
|
+
actionview (= 5.0.1)
|
23
|
+
activesupport (= 5.0.1)
|
24
|
+
rack (~> 2.0)
|
25
|
+
rack-test (~> 0.6.3)
|
26
|
+
rails-dom-testing (~> 2.0)
|
27
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
28
|
+
actionview (5.0.1)
|
29
|
+
activesupport (= 5.0.1)
|
30
|
+
builder (~> 3.1)
|
31
|
+
erubis (~> 2.7.0)
|
32
|
+
rails-dom-testing (~> 2.0)
|
33
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
34
|
+
activejob (5.0.1)
|
35
|
+
activesupport (= 5.0.1)
|
36
|
+
globalid (>= 0.3.6)
|
37
|
+
activemodel (5.0.1)
|
38
|
+
activesupport (= 5.0.1)
|
39
|
+
activerecord (5.0.1)
|
40
|
+
activemodel (= 5.0.1)
|
41
|
+
activesupport (= 5.0.1)
|
42
|
+
arel (~> 7.0)
|
43
|
+
activesupport (5.0.1)
|
44
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
45
|
+
i18n (~> 0.7)
|
46
|
+
minitest (~> 5.1)
|
47
|
+
tzinfo (~> 1.1)
|
48
|
+
appraisal (2.1.0)
|
49
|
+
bundler
|
50
|
+
rake
|
51
|
+
thor (>= 0.14.0)
|
52
|
+
arel (7.1.4)
|
53
|
+
builder (3.2.2)
|
54
|
+
concurrent-ruby (1.0.4)
|
55
|
+
database_cleaner (1.3.0)
|
56
|
+
diff-lcs (1.2.5)
|
57
|
+
erubis (2.7.0)
|
58
|
+
globalid (0.3.7)
|
59
|
+
activesupport (>= 4.1.0)
|
60
|
+
i18n (0.7.0)
|
61
|
+
loofah (2.0.3)
|
62
|
+
nokogiri (>= 1.5.9)
|
63
|
+
mail (2.6.4)
|
64
|
+
mime-types (>= 1.16, < 4)
|
65
|
+
method_source (0.8.2)
|
66
|
+
mime-types (3.1)
|
67
|
+
mime-types-data (~> 3.2015)
|
68
|
+
mime-types-data (3.2016.0521)
|
69
|
+
mini_portile2 (2.1.0)
|
70
|
+
minitest (5.10.1)
|
71
|
+
nio4r (1.2.1)
|
72
|
+
nokogiri (1.7.0)
|
73
|
+
mini_portile2 (~> 2.1.0)
|
74
|
+
pg (0.19.0)
|
75
|
+
rack (2.0.1)
|
76
|
+
rack-test (0.6.3)
|
77
|
+
rack (>= 1.0)
|
78
|
+
rails (5.0.1)
|
79
|
+
actioncable (= 5.0.1)
|
80
|
+
actionmailer (= 5.0.1)
|
81
|
+
actionpack (= 5.0.1)
|
82
|
+
actionview (= 5.0.1)
|
83
|
+
activejob (= 5.0.1)
|
84
|
+
activemodel (= 5.0.1)
|
85
|
+
activerecord (= 5.0.1)
|
86
|
+
activesupport (= 5.0.1)
|
87
|
+
bundler (>= 1.3.0, < 2.0)
|
88
|
+
railties (= 5.0.1)
|
89
|
+
sprockets-rails (>= 2.0.0)
|
90
|
+
rails-dom-testing (2.0.2)
|
91
|
+
activesupport (>= 4.2.0, < 6.0)
|
92
|
+
nokogiri (~> 1.6)
|
93
|
+
rails-html-sanitizer (1.0.3)
|
94
|
+
loofah (~> 2.0)
|
95
|
+
railties (5.0.1)
|
96
|
+
actionpack (= 5.0.1)
|
97
|
+
activesupport (= 5.0.1)
|
98
|
+
method_source
|
99
|
+
rake (>= 0.8.7)
|
100
|
+
thor (>= 0.18.1, < 2.0)
|
101
|
+
rake (12.0.0)
|
102
|
+
request_store (1.3.1)
|
103
|
+
rspec (3.5.0)
|
104
|
+
rspec-core (~> 3.5.0)
|
105
|
+
rspec-expectations (~> 3.5.0)
|
106
|
+
rspec-mocks (~> 3.5.0)
|
107
|
+
rspec-core (3.5.4)
|
108
|
+
rspec-support (~> 3.5.0)
|
109
|
+
rspec-expectations (3.5.0)
|
110
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
111
|
+
rspec-support (~> 3.5.0)
|
112
|
+
rspec-mocks (3.5.0)
|
113
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
114
|
+
rspec-support (~> 3.5.0)
|
115
|
+
rspec-rails (3.5.2)
|
116
|
+
actionpack (>= 3.0)
|
117
|
+
activesupport (>= 3.0)
|
118
|
+
railties (>= 3.0)
|
119
|
+
rspec-core (~> 3.5.0)
|
120
|
+
rspec-expectations (~> 3.5.0)
|
121
|
+
rspec-mocks (~> 3.5.0)
|
122
|
+
rspec-support (~> 3.5.0)
|
123
|
+
rspec-support (3.5.0)
|
124
|
+
sprockets (3.7.1)
|
125
|
+
concurrent-ruby (~> 1.0)
|
126
|
+
rack (> 1, < 3)
|
127
|
+
sprockets-rails (3.2.0)
|
128
|
+
actionpack (>= 4.0)
|
129
|
+
activesupport (>= 4.0)
|
130
|
+
sprockets (>= 3.0.0)
|
131
|
+
thor (0.19.4)
|
132
|
+
thread_safe (0.3.5)
|
133
|
+
tzinfo (1.2.2)
|
134
|
+
thread_safe (~> 0.1)
|
135
|
+
websocket-driver (0.6.4)
|
136
|
+
websocket-extensions (>= 0.1.0)
|
137
|
+
websocket-extensions (0.1.2)
|
138
|
+
|
139
|
+
PLATFORMS
|
140
|
+
ruby
|
141
|
+
|
142
|
+
DEPENDENCIES
|
143
|
+
activerecord-multi-tenant!
|
144
|
+
appraisal
|
145
|
+
database_cleaner (~> 1.3.0)
|
146
|
+
pg
|
147
|
+
rspec (>= 3.0)
|
148
|
+
rspec-rails
|
149
|
+
|
150
|
+
BUNDLED WITH
|
151
|
+
1.11.2
|
data/README.md
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# activerecord-multi-tenant [ ](https://rubygems.org/gems/activerecord-multi-tenant) [ ](https://rubygems.org/gems/activerecord-multi-tenant)
|
2
|
+
|
3
|
+
ActiveRecord/Rails integration for multi-tenant databases, in particular the Citus extension for PostgreSQL.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add the following to your Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'activerecord-multi-tenant'
|
11
|
+
```
|
12
|
+
|
13
|
+
## Supported Rails versions
|
14
|
+
|
15
|
+
All Ruby on Rails versions starting with 3.2 or newer are supported.
|
16
|
+
|
17
|
+
This gem only supports ActiveRecord (the Rails default ORM), and not alternative ORMs like Sequel.
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
It is required that you add `multi_tenant` definitions to your model in order to have full support for Citus, in particular when updating records.
|
22
|
+
|
23
|
+
In the example of an analytics application, sharding on `customer_id`, annotate your models like this:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
class PageView < ActiveRecord::Base
|
27
|
+
multi_tenant :customer
|
28
|
+
belongs_to :site
|
29
|
+
|
30
|
+
# ...
|
31
|
+
end
|
32
|
+
|
33
|
+
class Site < ActiveRecord::Base
|
34
|
+
multi_tenant :customer
|
35
|
+
has_many :page_views
|
36
|
+
belongs_to :customer
|
37
|
+
|
38
|
+
# ...
|
39
|
+
end
|
40
|
+
```
|
41
|
+
|
42
|
+
and then wrap all code that runs queries/modifications in blocks like this:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
customer = Customer.find(session[:current_customer_id])
|
46
|
+
# ...
|
47
|
+
MultiTenant.with(customer) do
|
48
|
+
site = Site.find(params[:site_id])
|
49
|
+
site.update! last_accessed_at: Time.now
|
50
|
+
site.page_views.count
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
Inside controllers you can use a before_action together with set_current_tenant, to set the tenant for the current request:
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
class ApplicationController < ActionController::Base
|
58
|
+
set_current_tenant_through_filter # Required to opt into this behavior
|
59
|
+
before_action :set_customer_as_tenant
|
60
|
+
|
61
|
+
def set_customer_as_tenant
|
62
|
+
customer = Customer.find(session[:current_customer_id])
|
63
|
+
set_current_tenant(customer)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
## Considerations when using Ruby on Rails with Citus
|
69
|
+
|
70
|
+
In case you use Ruby on Rails together with Citus, please also note the following.
|
71
|
+
|
72
|
+
You'll need to disable prepared_statements in your database.yml like this:
|
73
|
+
|
74
|
+
```
|
75
|
+
default: &default
|
76
|
+
adapter: postgresql
|
77
|
+
url: <%= ENV['DATABASE_URL'] %>
|
78
|
+
prepared_statements: false
|
79
|
+
```
|
80
|
+
|
81
|
+
## Credits
|
82
|
+
|
83
|
+
This gem was initially based on [acts_as_tenant](https://github.com/ErwinM/acts_as_tenant), and still shares some code. We thank the authors for their efforts.
|
84
|
+
|
85
|
+
## License
|
86
|
+
|
87
|
+
Licensed under the MIT license<br>
|
88
|
+
Copyright (c) 2016, Citus Data Inc.
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
$:.push File.expand_path('../lib', __FILE__)
|
2
|
+
require 'activerecord-multi-tenant/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'activerecord-multi-tenant'
|
6
|
+
s.version = MultiTenant::VERSION
|
7
|
+
s.summary = 'ActiveRecord/Rails integration for multi-tenant databases, in particular the Citus extension for PostgreSQL'
|
8
|
+
s.description = ''
|
9
|
+
s.authors = ['Citus Data']
|
10
|
+
s.email = 'engage@citusdata.com'
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
14
|
+
s.require_paths = ['lib']
|
15
|
+
s.homepage = 'https://github.com/citusdata/activerecord-multi-tenant'
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.add_runtime_dependency('request_store', '>= 1.0.5')
|
19
|
+
s.add_dependency('rails','>= 3.1')
|
20
|
+
|
21
|
+
s.add_development_dependency 'rspec', '>= 3.0'
|
22
|
+
s.add_development_dependency 'rspec-rails'
|
23
|
+
s.add_development_dependency 'database_cleaner', '~> 1.3.0'
|
24
|
+
s.add_development_dependency 'pg'
|
25
|
+
end
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
version: '2'
|
2
|
+
|
3
|
+
services:
|
4
|
+
master:
|
5
|
+
image: 'citusdata/citus:6.0.1'
|
6
|
+
ports: ['5600:5432']
|
7
|
+
labels: ['com.citusdata.role=Master']
|
8
|
+
volumes: ['/var/run/postgresql']
|
9
|
+
worker1:
|
10
|
+
image: 'citusdata/citus:6.0.1'
|
11
|
+
labels: ['com.citusdata.role=Worker']
|
12
|
+
worker2:
|
13
|
+
image: 'citusdata/citus:6.0.1'
|
14
|
+
labels: ['com.citusdata.role=Worker']
|
15
|
+
config:
|
16
|
+
image: 'citusdata/workerlist-gen:2.0.0'
|
17
|
+
volumes: ['/var/run/docker.sock:/tmp/docker.sock']
|
18
|
+
volumes_from: ['master']
|
@@ -0,0 +1,97 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionmailer (3.2.22.5)
|
5
|
+
actionpack (= 3.2.22.5)
|
6
|
+
mail (~> 2.5.4)
|
7
|
+
actionpack (3.2.22.5)
|
8
|
+
activemodel (= 3.2.22.5)
|
9
|
+
activesupport (= 3.2.22.5)
|
10
|
+
builder (~> 3.0.0)
|
11
|
+
erubis (~> 2.7.0)
|
12
|
+
journey (~> 1.0.4)
|
13
|
+
rack (~> 1.4.5)
|
14
|
+
rack-cache (~> 1.2)
|
15
|
+
rack-test (~> 0.6.1)
|
16
|
+
sprockets (~> 2.2.1)
|
17
|
+
activemodel (3.2.22.5)
|
18
|
+
activesupport (= 3.2.22.5)
|
19
|
+
builder (~> 3.0.0)
|
20
|
+
activerecord (3.2.22.5)
|
21
|
+
activemodel (= 3.2.22.5)
|
22
|
+
activesupport (= 3.2.22.5)
|
23
|
+
arel (~> 3.0.2)
|
24
|
+
tzinfo (~> 0.3.29)
|
25
|
+
activeresource (3.2.22.5)
|
26
|
+
activemodel (= 3.2.22.5)
|
27
|
+
activesupport (= 3.2.22.5)
|
28
|
+
activesupport (3.2.22.5)
|
29
|
+
i18n (~> 0.6, >= 0.6.4)
|
30
|
+
multi_json (~> 1.0)
|
31
|
+
appraisal (2.1.0)
|
32
|
+
bundler
|
33
|
+
rake
|
34
|
+
thor (>= 0.14.0)
|
35
|
+
arel (3.0.3)
|
36
|
+
builder (3.0.4)
|
37
|
+
erubis (2.7.0)
|
38
|
+
hike (1.2.3)
|
39
|
+
i18n (0.7.0)
|
40
|
+
journey (1.0.4)
|
41
|
+
json (1.8.3)
|
42
|
+
mail (2.5.4)
|
43
|
+
mime-types (~> 1.16)
|
44
|
+
treetop (~> 1.4.8)
|
45
|
+
mime-types (1.25.1)
|
46
|
+
multi_json (1.12.1)
|
47
|
+
polyglot (0.3.5)
|
48
|
+
power_assert (0.4.1)
|
49
|
+
rack (1.4.7)
|
50
|
+
rack-cache (1.6.1)
|
51
|
+
rack (>= 0.4)
|
52
|
+
rack-ssl (1.3.4)
|
53
|
+
rack
|
54
|
+
rack-test (0.6.3)
|
55
|
+
rack (>= 1.0)
|
56
|
+
rails (3.2.22.5)
|
57
|
+
actionmailer (= 3.2.22.5)
|
58
|
+
actionpack (= 3.2.22.5)
|
59
|
+
activerecord (= 3.2.22.5)
|
60
|
+
activeresource (= 3.2.22.5)
|
61
|
+
activesupport (= 3.2.22.5)
|
62
|
+
bundler (~> 1.0)
|
63
|
+
railties (= 3.2.22.5)
|
64
|
+
railties (3.2.22.5)
|
65
|
+
actionpack (= 3.2.22.5)
|
66
|
+
activesupport (= 3.2.22.5)
|
67
|
+
rack-ssl (~> 1.3.2)
|
68
|
+
rake (>= 0.8.7)
|
69
|
+
rdoc (~> 3.4)
|
70
|
+
thor (>= 0.14.6, < 2.0)
|
71
|
+
rake (12.0.0)
|
72
|
+
rdoc (3.12.2)
|
73
|
+
json (~> 1.4)
|
74
|
+
sprockets (2.2.3)
|
75
|
+
hike (~> 1.2)
|
76
|
+
multi_json (~> 1.0)
|
77
|
+
rack (~> 1.0)
|
78
|
+
tilt (~> 1.1, != 1.3.0)
|
79
|
+
test-unit (3.2.3)
|
80
|
+
power_assert
|
81
|
+
thor (0.19.4)
|
82
|
+
tilt (1.4.1)
|
83
|
+
treetop (1.4.15)
|
84
|
+
polyglot
|
85
|
+
polyglot (>= 0.3.1)
|
86
|
+
tzinfo (0.3.52)
|
87
|
+
|
88
|
+
PLATFORMS
|
89
|
+
ruby
|
90
|
+
|
91
|
+
DEPENDENCIES
|
92
|
+
appraisal
|
93
|
+
rails (= 3.2.22.5)
|
94
|
+
test-unit (~> 3.0)
|
95
|
+
|
96
|
+
BUNDLED WITH
|
97
|
+
1.11.2
|