rails_multitenant 0.4.0 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +6 -0
- data/lib/rails_multitenant/multitenant_model.rb +13 -5
- data/lib/rails_multitenant/version.rb +1 -1
- data/spec/db/schema.rb +19 -0
- data/spec/external_item_with_optional_org_spec.rb +25 -0
- data/spec/item_with_optional_org_spec.rb +26 -0
- data/spec/spec_helper.rb +5 -0
- metadata +14 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b26ac97762bed39380b26b1f08db3198f3d7d91f
|
4
|
+
data.tar.gz: ef72bdd22908dfc9e150c168655db4f42ae26738
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 046aaf25a46bd08c344718ec700344b441f3b8131667f4295e0b7c6cdd7a5d2de17320356f6a94b43a8ae68907b4071a59352b6bbf0f04edcf9e693093d25ad6
|
7
|
+
data.tar.gz: 2d1d346080098b3989eae5a089aa4a1d426081a1ce7413c718d81e60c2425076c9c2fc75387f7067414d873d55cbd29922ed94eb28206b871e241bc52b05d163
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
### 0.5.0
|
4
|
+
* Add `required` option to `multitenant_on` and `multitenant_on_model`.
|
5
|
+
|
3
6
|
### 0.4.0
|
4
7
|
* Fix be_multitenant_on matcher to handle models that don't include the `RailsMultitenant::MultitenantModel` module.
|
5
8
|
* Fix `context_entity_id_field` to work with inheritance.
|
data/README.md
CHANGED
@@ -58,6 +58,9 @@ RailsMultitenant::GlobalContextRegistry.with_isolated_registry(organization_id:
|
|
58
58
|
end
|
59
59
|
```
|
60
60
|
|
61
|
+
By default this adds an ActiveRecord validation to ensure the multi-tenant attribute is present but this can be disabled
|
62
|
+
by passing `required: false` to `multitenant_on`.
|
63
|
+
|
61
64
|
### Multi-tenancy Based on Associated Models
|
62
65
|
|
63
66
|
The following model is multi-tenant based on an `Organization` model:
|
@@ -89,6 +92,9 @@ Organization.as_current_id(1) do
|
|
89
92
|
end
|
90
93
|
```
|
91
94
|
|
95
|
+
By default this adds an ActiveRecord validation to ensure the tenant model is present but this can be disabled
|
96
|
+
by passing `required: false` to `multitenant_on_model`.
|
97
|
+
|
92
98
|
## Development
|
93
99
|
|
94
100
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake false` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -8,9 +8,9 @@ module RailsMultitenant
|
|
8
8
|
|
9
9
|
module ClassMethods
|
10
10
|
|
11
|
-
def multitenant_on(context_entity_id_field)
|
11
|
+
def multitenant_on(context_entity_id_field, required: true)
|
12
12
|
self.context_entity_id_field = context_entity_id_field
|
13
|
-
validates_presence_of
|
13
|
+
validates_presence_of(context_entity_id_field) if required
|
14
14
|
|
15
15
|
context_entity = context_entity_id_field.to_s.gsub(/_id$/, '')
|
16
16
|
scope_sym = "from_current_#{context_entity}".to_sym
|
@@ -26,9 +26,17 @@ module RailsMultitenant
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def multitenant_on_model(context_entity)
|
30
|
-
multitenant_on("#{context_entity}_id".to_sym)
|
31
|
-
|
29
|
+
def multitenant_on_model(context_entity, required: true)
|
30
|
+
multitenant_on("#{context_entity}_id".to_sym, required: required)
|
31
|
+
|
32
|
+
if ActiveRecord::VERSION::MAJOR < 5
|
33
|
+
belongs_to(context_entity)
|
34
|
+
else
|
35
|
+
# Rails 5 added required validation to belongs_to associations and
|
36
|
+
# an `optional` setting to disable it. We already do validation on
|
37
|
+
# the foreign key so we always disable the native Rails validation.
|
38
|
+
belongs_to(context_entity, optional: true)
|
39
|
+
end
|
32
40
|
end
|
33
41
|
|
34
42
|
def validates_multitenant_uniqueness_of(*attr_names)
|
data/spec/db/schema.rb
CHANGED
@@ -9,9 +9,18 @@ ActiveRecord::Schema.define(version: 0) do
|
|
9
9
|
t.string :type
|
10
10
|
end
|
11
11
|
|
12
|
+
create_table(:item_with_optional_orgs, force: true) do |t|
|
13
|
+
t.integer :organization_id
|
14
|
+
t.string :type
|
15
|
+
end
|
16
|
+
|
12
17
|
create_table(:external_items, force: true) do |t|
|
13
18
|
t.integer :external_organization_id
|
14
19
|
end
|
20
|
+
|
21
|
+
create_table(:external_item_with_optional_orgs, force: true) do |t|
|
22
|
+
t.integer :external_organization_id
|
23
|
+
end
|
15
24
|
end
|
16
25
|
|
17
26
|
class Organization < ActiveRecord::Base
|
@@ -23,6 +32,11 @@ class Item < ActiveRecord::Base
|
|
23
32
|
multitenant_on_model :organization
|
24
33
|
end
|
25
34
|
|
35
|
+
class ItemWithOptionalOrg < ActiveRecord::Base
|
36
|
+
include RailsMultitenant::MultitenantModel
|
37
|
+
multitenant_on_model :organization, required: false
|
38
|
+
end
|
39
|
+
|
26
40
|
class ItemSubtype < Item
|
27
41
|
|
28
42
|
end
|
@@ -32,3 +46,8 @@ class ExternalItem < ActiveRecord::Base
|
|
32
46
|
multitenant_on :external_organization_id
|
33
47
|
end
|
34
48
|
|
49
|
+
class ExternalItemWithOptionalOrg < ActiveRecord::Base
|
50
|
+
include RailsMultitenant::MultitenantModel
|
51
|
+
multitenant_on :external_organization_id, required: false
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
include RailsMultitenant
|
2
|
+
|
3
|
+
describe ExternalItemWithOptionalOrg do
|
4
|
+
|
5
|
+
let!(:external_item_without_org) { as_external_org(nil) { described_class.create! } }
|
6
|
+
|
7
|
+
let!(:external_item_with_org) { as_external_org(1) { described_class.create! } }
|
8
|
+
let!(:external_item_with_other_org) { as_external_org(2) { described_class.create! } }
|
9
|
+
|
10
|
+
specify 'the nil org has the correct external items' do
|
11
|
+
as_external_org(nil) do
|
12
|
+
expect(described_class.all).to eq([external_item_without_org])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
specify 'org1 has the correct external items' do
|
17
|
+
as_external_org(1) do
|
18
|
+
expect(described_class.all).to eq([external_item_with_org])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def as_external_org(id, &block)
|
23
|
+
GlobalContextRegistry.with_isolated_registry(external_organization_id: id, &block)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
describe ItemWithOptionalOrg do
|
2
|
+
|
3
|
+
let!(:item_without_org) { without_org { described_class.create! } }
|
4
|
+
|
5
|
+
let!(:org) { Organization.create! }
|
6
|
+
let!(:item_with_org) { org.as_current { described_class.create! } }
|
7
|
+
|
8
|
+
let!(:other_org) { Organization.create! }
|
9
|
+
let!(:item_with_other_org) { other_org.as_current { described_class.create! } }
|
10
|
+
|
11
|
+
it "returns the correct items when no org is set" do
|
12
|
+
without_org do
|
13
|
+
expect(described_class.all).to eq([item_without_org])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns the correct items when an org is set" do
|
18
|
+
org.as_current do
|
19
|
+
expect(described_class.all).to eq([item_with_org])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def without_org(&block)
|
24
|
+
GlobalContextRegistry.with_isolated_registry(&block)
|
25
|
+
end
|
26
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,6 +11,11 @@ SimpleCov.start do
|
|
11
11
|
add_filter 'spec'
|
12
12
|
end
|
13
13
|
|
14
|
+
require 'active_record'
|
15
|
+
if ActiveRecord::VERSION::MAJOR >= 5
|
16
|
+
ActiveRecord::Base.belongs_to_required_by_default = true
|
17
|
+
end
|
18
|
+
|
14
19
|
require 'logger'
|
15
20
|
require 'database_cleaner'
|
16
21
|
require 'rails_multitenant'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_multitenant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pat Breault
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,42 +28,30 @@ dependencies:
|
|
28
28
|
name: activerecord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '4.1'
|
34
|
-
- - "<"
|
31
|
+
- - '='
|
35
32
|
- !ruby/object:Gem::Version
|
36
|
-
version: '
|
33
|
+
version: '4.2'
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '4.1'
|
44
|
-
- - "<"
|
38
|
+
- - '='
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
40
|
+
version: '4.2'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: activesupport
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
44
|
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '4.1'
|
54
|
-
- - "<"
|
45
|
+
- - '='
|
55
46
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
47
|
+
version: '4.2'
|
57
48
|
type: :runtime
|
58
49
|
prerelease: false
|
59
50
|
version_requirements: !ruby/object:Gem::Requirement
|
60
51
|
requirements:
|
61
|
-
- -
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: '4.1'
|
64
|
-
- - "<"
|
52
|
+
- - '='
|
65
53
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
54
|
+
version: '4.2'
|
67
55
|
- !ruby/object:Gem::Dependency
|
68
56
|
name: coveralls
|
69
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -176,9 +164,11 @@ files:
|
|
176
164
|
- spec/db/database.yml
|
177
165
|
- spec/db/schema.rb
|
178
166
|
- spec/external_item_spec.rb
|
167
|
+
- spec/external_item_with_optional_org_spec.rb
|
179
168
|
- spec/global_context_registry_spec.rb
|
180
169
|
- spec/item_spec.rb
|
181
170
|
- spec/item_subtype_spec.rb
|
171
|
+
- spec/item_with_optional_org_spec.rb
|
182
172
|
- spec/spec_helper.rb
|
183
173
|
homepage: https://github.com/salsify/rails_multitenant
|
184
174
|
licenses:
|
@@ -209,7 +199,9 @@ test_files:
|
|
209
199
|
- spec/db/database.yml
|
210
200
|
- spec/db/schema.rb
|
211
201
|
- spec/external_item_spec.rb
|
202
|
+
- spec/external_item_with_optional_org_spec.rb
|
212
203
|
- spec/global_context_registry_spec.rb
|
213
204
|
- spec/item_spec.rb
|
214
205
|
- spec/item_subtype_spec.rb
|
206
|
+
- spec/item_with_optional_org_spec.rb
|
215
207
|
- spec/spec_helper.rb
|