mongoid-multitenancy 0.3.1 → 0.3.2

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Y2Y1ODVlM2ZlMzZlMDRlZmEzM2MwOTRiNWI3NzRjZmRkNTNlNDI5MQ==
4
+ ZWQ3NzVkNzFkZGVlMDc3Y2Y5NTc1ZjI0MDhkNjA0YWRhNDIxMzMzNA==
5
5
  data.tar.gz: !binary |-
6
- Yjc4MjEyYTlkZWUxNDAwYjNlZTU5ZGQ3NmVkYWUzYWRlNDU1ZDE0NA==
6
+ ZDMzNmQyMmFmZmEyYTYwYWM5ZjA3NGI0NzkxOGI1MGIxYTU0NGM2OA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MDYyZjllZGM4ZDFjNmU2ZWYxNGZlMTE1ZTUwZTQ0YmU2MjU4MTg4YmY2OWYx
10
- ZWI2MGU0ZTdmNjY2YTEwMmYxZTBmOWRlMDQ5OWIwN2QxYjM4NjRiZTEyMjll
11
- MGYzOTUwOGUyMjNmMmY4M2NkNWMyYzc3ZmU3NjBhNGM4Y2RlYTY=
9
+ YjJkOGZlZDVkODlhODE3ZWUwYzM2NjliZmRhNjRhMDYxYWI3NWJiZDE5YWU3
10
+ YWQ3ODg1OWUwNzRmYTg2OWMyMDA2OTY2MmNlZGE1Y2JkNWExNTM1NjI4YTc0
11
+ NWYwZGE3MmE2OGYxMzNhZWNkMjI2YzE0ZmE2NGMyNzAzMmZiYTg=
12
12
  data.tar.gz: !binary |-
13
- N2VjZDQ1N2MzZTE4MjVhOTI2NDhkN2YzMGEwNTQwYzQyYjIwMzk2N2IyMTNh
14
- NjM3MDQ4MWVlMThjZjVjNDc1OTkyNGJmZWE0OGNhZGQxZGYzNTg3Mzc1MTAy
15
- NzEzZTI3ZThjYzA0ODdlMDE2YTMzMmZhYTIwNmU1N2Y4MDk5MDI=
13
+ YTBlZjk0OGFmM2Q4YjZhYjYyNjc3MTY0MmNiYTBjZjgxODNjM2Y3ZDA1NzMx
14
+ YmQ4MDkxOGU4MTgyMWM5ZWRiYThkMTUxMGJkYmQxOTY0OTYwMGM2ZWE3YTAy
15
+ ZDFmYzg3Y2FjOTAxMDZkZWMwNTg1NjExOWY5NjFlZjc2NzJmNDg=
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mongoid-multitenancy (0.3.1)
4
+ mongoid-multitenancy (0.3.2)
5
5
  mongoid (~> 3)
6
6
 
7
7
  GEM
@@ -1,7 +1,7 @@
1
1
  require "mongoid"
2
2
  require "mongoid/multitenancy/document"
3
3
  require "mongoid/multitenancy/version"
4
- require "mongoid/validators/immutable_validator"
4
+ require "mongoid/validators/tenant_validator"
5
5
 
6
6
  module Mongoid
7
7
  module Multitenancy
@@ -16,13 +16,12 @@ module Mongoid
16
16
  tenant_field = reflect_on_association(association).foreign_key
17
17
  self.tenant_field = tenant_field
18
18
 
19
- # Validates the presence of the association key
20
- validates_presence_of tenant_field unless tenant_options[:optional]
21
- validates tenant_field, immutable: { field: tenant_field } if tenant_options[:immutable]
19
+ # Validates the tenant field
20
+ validates tenant_field, tenant: tenant_options
22
21
 
23
22
  # Set the current_tenant on newly created objects
24
- after_initialize lambda { |m|
25
- if Multitenancy.current_tenant #and !self.class.tenant_options[:optional]
23
+ before_validation lambda { |m|
24
+ if Multitenancy.current_tenant and !tenant_options[:optional] and m.send(association.to_sym).nil?
26
25
  m.send "#{association}=".to_sym, Multitenancy.current_tenant
27
26
  end
28
27
  true
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Multitenancy
3
- VERSION = "0.3.1"
3
+ VERSION = "0.3.2"
4
4
  end
5
5
  end
@@ -0,0 +1,20 @@
1
+ class TenantValidator < ActiveModel::EachValidator
2
+ def validate_each(object, attribute, value)
3
+ # Immutable Check
4
+ if options[:immutable]
5
+ if object.send(:attribute_changed?, attribute) and object.send(:attribute_was, attribute)
6
+ object.errors.add(attribute, 'is immutable and cannot be updated')
7
+ end
8
+ end
9
+
10
+ # Ownership check
11
+ if value and Mongoid::Multitenancy.current_tenant and value != Mongoid::Multitenancy.current_tenant.id
12
+ object.errors.add(attribute, "not authorized")
13
+ end
14
+
15
+ # Optional Check
16
+ if !options[:optional] and value.nil?
17
+ object.errors.add(attribute, 'is mandatory')
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Immutable do
4
+
5
+ it_behaves_like "a tenantable model"
6
+
7
+ let(:client) { Account.create!(:name => "client") }
8
+ let(:another_client) { Account.create!(:name => "another client") }
9
+
10
+ describe "#valid?" do
11
+ before { Mongoid::Multitenancy.current_tenant = client; }
12
+ after { Mongoid::Multitenancy.current_tenant = nil }
13
+
14
+ let(:item) { Immutable.new(:title => "title X", :slug => "page-x") }
15
+
16
+ it_behaves_like "a tenant validator"
17
+
18
+ context "when the tenant has not changed" do
19
+ before { item.save! }
20
+ it 'should be valid' do
21
+ item.title = "title X (2)"
22
+ item.should be_valid
23
+ end
24
+ end
25
+
26
+ context "when the tenant has changed" do
27
+ before { item.save!; Mongoid::Multitenancy.current_tenant = another_client }
28
+ it 'should not be valid' do
29
+ item.client = another_client
30
+ item.should_not be_valid
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mandatory do
4
+
5
+ it_behaves_like "a tenantable model"
6
+
7
+ let(:client) { Account.create!(:name => "client") }
8
+ let(:another_client) { Account.create!(:name => "another client") }
9
+
10
+ describe ".default_scope" do
11
+ before {
12
+ Mongoid::Multitenancy.with_tenant(client) { @itemX = Mandatory.create!(:title => "title X", :slug => "article-x") }
13
+ Mongoid::Multitenancy.with_tenant(another_client) { @itemY = Mandatory.create!(:title => "title Y", :slug => "article-y") }
14
+ }
15
+
16
+ context "with a current tenant" do
17
+ before { Mongoid::Multitenancy.current_tenant = another_client }
18
+ after { Mongoid::Multitenancy.current_tenant = nil }
19
+
20
+ it "should filter on the current tenant" do
21
+ Mandatory.all.to_a.should =~ [@itemY]
22
+ end
23
+ end
24
+
25
+ context "without a current tenant" do
26
+ before { Mongoid::Multitenancy.current_tenant = nil }
27
+
28
+ it "should not filter on any tenant" do
29
+ Mandatory.all.to_a.should =~ [@itemX, @itemY]
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "#delete_all" do
35
+ before {
36
+ Mongoid::Multitenancy.with_tenant(client) { @itemX = Mandatory.create!(:title => "title X", :slug => "article-x") }
37
+ Mongoid::Multitenancy.with_tenant(another_client) { @itemY = Mandatory.create!(:title => "title Y", :slug => "article-y") }
38
+ }
39
+
40
+ context "with a current tenant" do
41
+ it "should only delete the current tenant" do
42
+ Mongoid::Multitenancy.with_tenant(another_client) { Mandatory.delete_all }
43
+ Mandatory.all.to_a.should =~ [@itemX]
44
+ end
45
+ end
46
+
47
+ context "without a current tenant" do
48
+ it "should delete all the items" do
49
+ Mandatory.delete_all
50
+ Mandatory.all.to_a.should be_empty
51
+ end
52
+ end
53
+ end
54
+
55
+ describe "#valid?" do
56
+ after { Mongoid::Multitenancy.current_tenant = nil }
57
+
58
+ let(:item) { Mandatory.new(:title => "title X", :slug => "page-x") }
59
+
60
+ it_behaves_like "a tenant validator"
61
+
62
+ context "with a current tenant" do
63
+ before { Mongoid::Multitenancy.current_tenant = client }
64
+
65
+ it "should set the client field" do
66
+ item.valid?
67
+ item.client.should eq client
68
+ end
69
+ end
70
+
71
+ context "without a current tenant" do
72
+ it "should not set the client field" do
73
+ item.valid?
74
+ item.client.should be_nil
75
+ end
76
+
77
+ it "should be invalid" do
78
+ item.should_not be_valid
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,15 @@
1
+ class Immutable
2
+ include Mongoid::Document
3
+ include Mongoid::Multitenancy::Document
4
+
5
+ tenant(:client, :class_name => 'Account', :immutable => true)
6
+
7
+ field :slug, :type => String
8
+ field :title, :type => String
9
+
10
+ validates_uniqueness_of :slug
11
+ validates_presence_of :slug
12
+ validates_presence_of :title
13
+
14
+ index({ :title => 1 })
15
+ end
@@ -1,8 +1,8 @@
1
- class Page
1
+ class Mandatory
2
2
  include Mongoid::Document
3
3
  include Mongoid::Multitenancy::Document
4
4
 
5
- tenant(:client, :class_name => 'Account', :optional => true )
5
+ tenant(:client, :class_name => 'Account')
6
6
 
7
7
  field :slug, :type => String
8
8
  field :title, :type => String
@@ -12,4 +12,4 @@ class Page
12
12
  validates_presence_of :title
13
13
 
14
14
  index({ :title => 1 })
15
- end
15
+ end
@@ -1,4 +1,4 @@
1
- class Article
1
+ class Mutable
2
2
  include Mongoid::Document
3
3
  include Mongoid::Multitenancy::Document
4
4
 
@@ -0,0 +1,15 @@
1
+ class Optional
2
+ include Mongoid::Document
3
+ include Mongoid::Multitenancy::Document
4
+
5
+ tenant(:client, :class_name => 'Account', :optional => true)
6
+
7
+ field :slug, :type => String
8
+ field :title, :type => String
9
+
10
+ validates_uniqueness_of :slug
11
+ validates_presence_of :slug
12
+ validates_presence_of :title
13
+
14
+ index({ :title => 1 })
15
+ end
@@ -19,182 +19,4 @@ describe Mongoid::Multitenancy do
19
19
  Mongoid::Multitenancy.current_tenant.should == client
20
20
  end
21
21
  end
22
- end
23
-
24
- shared_examples_for "a tenantable model" do
25
-
26
- it { should belong_to(:client) }
27
- it { should validate_uniqueness_of(:slug).scoped_to(:client_id) }
28
- it { should have_index_for(:client_id => 1, :title => 1) }
29
-
30
- let(:client) { Account.create!(:name => "client") }
31
- let(:another_client) { Account.create!(:name => "another client") }
32
-
33
- describe ".initialize" do
34
- before { Mongoid::Multitenancy.current_tenant = client }
35
- after { Mongoid::Multitenancy.current_tenant = nil }
36
-
37
- it "should set the client field" do
38
- described_class.new.client.should eq client
39
- end
40
- end
41
-
42
- end
43
-
44
- describe Page do
45
-
46
- it_behaves_like "a tenantable model"
47
-
48
- it { should_not validate_presence_of(:client_id) }
49
-
50
- let(:client) { Account.create!(:name => "client") }
51
- let(:another_client) { Account.create!(:name => "another client") }
52
-
53
- describe ".default_scope" do
54
- before {
55
- @itemC = described_class.create!(:title => "title C", :slug => "article-c")
56
- Mongoid::Multitenancy.with_tenant(client) { @itemX = described_class.create!(:title => "title X", :slug => "article-x") }
57
- Mongoid::Multitenancy.with_tenant(another_client) { @itemY = described_class.create!(:title => "title Y", :slug => "article-y") }
58
- }
59
-
60
- context "with a current tenant" do
61
- before { Mongoid::Multitenancy.current_tenant = another_client }
62
- after { Mongoid::Multitenancy.current_tenant = nil }
63
-
64
- it "should filter on the current tenant / free-tenant items" do
65
- described_class.all.to_a.should =~ [@itemY, @itemC]
66
- end
67
- end
68
-
69
- context "without a current tenant" do
70
- before { Mongoid::Multitenancy.current_tenant = nil }
71
-
72
- it "should not filter on any tenant" do
73
- described_class.all.to_a.should =~ [@itemC, @itemX, @itemY]
74
- end
75
- end
76
- end
77
-
78
- describe "#delete_all" do
79
- before {
80
- @itemC = described_class.create!(:title => "title C", :slug => "article-c")
81
- Mongoid::Multitenancy.with_tenant(client) { @itemX = described_class.create!(:title => "title X", :slug => "article-x") }
82
- Mongoid::Multitenancy.with_tenant(another_client) { @itemY = described_class.create!(:title => "title Y", :slug => "article-y") }
83
- }
84
-
85
- context "with a current tenant" do
86
- it "should only delete the current tenant / free-tenant items" do
87
- Mongoid::Multitenancy.with_tenant(another_client) { described_class.delete_all }
88
- described_class.all.to_a.should =~ [@itemX]
89
- end
90
- end
91
-
92
- context "without a current tenant" do
93
- it "should delete all the pages" do
94
- described_class.delete_all
95
- described_class.all.to_a.should be_empty
96
- end
97
- end
98
- end
99
-
100
- end
101
-
102
- describe Article do
103
-
104
- it_behaves_like "a tenantable model"
105
-
106
- it { should validate_presence_of(:client_id) }
107
-
108
- let(:client) { Account.create!(:name => "client") }
109
- let(:another_client) { Account.create!(:name => "another client") }
110
-
111
- describe ".default_scope" do
112
- before {
113
- Mongoid::Multitenancy.with_tenant(client) { @itemX = described_class.create!(:title => "title X", :slug => "article-x") }
114
- Mongoid::Multitenancy.with_tenant(another_client) { @itemY = described_class.create!(:title => "title Y", :slug => "article-y") }
115
- }
116
-
117
- context "with a current tenant" do
118
- before { Mongoid::Multitenancy.current_tenant = another_client }
119
- after { Mongoid::Multitenancy.current_tenant = nil }
120
-
121
- it "should filter on the current tenant" do
122
- described_class.all.to_a.should =~ [@itemY]
123
- end
124
- end
125
-
126
- context "without a current tenant" do
127
- before { Mongoid::Multitenancy.current_tenant = nil }
128
-
129
- it "should not filter on any tenant" do
130
- described_class.all.to_a.should =~ [@itemX, @itemY]
131
- end
132
- end
133
- end
134
-
135
- describe "#valid?" do
136
- before { Mongoid::Multitenancy.current_tenant = client }
137
- after { Mongoid::Multitenancy.current_tenant = nil }
138
-
139
- context "with :immutable" do
140
- let(:item) { Page.create!(:title => "title X", :slug => "article-x") }
141
-
142
- context "when the tenant has not changed" do
143
- it 'should be valid' do
144
- item.title = "title X (2)"
145
- item.should be_valid
146
- end
147
- end
148
-
149
- context "when the tenant has changed" do
150
- it 'should be invalid' do
151
- item.title = "title X (2)"
152
- item.client = another_client
153
- item.should_not be_valid
154
- end
155
- end
156
- end
157
-
158
- context "without :immutable" do
159
- let(:item) { Article.create!(:title => "title X", :slug => "article-x") }
160
-
161
- context "when the tenant has not changed" do
162
- it 'should be valid' do
163
- item.title = "title X (2)"
164
- item.should be_valid
165
- end
166
- end
167
-
168
- context "when the tenant has changed" do
169
- it 'should be valid' do
170
- item.title = "title X (2)"
171
- item.client = another_client
172
- item.should be_valid
173
- end
174
- end
175
- end
176
-
177
- end
178
-
179
- describe "#delete_all" do
180
- before {
181
- Mongoid::Multitenancy.with_tenant(client) { @itemX = described_class.create!(:title => "title X", :slug => "article-x") }
182
- Mongoid::Multitenancy.with_tenant(another_client) { @itemY = described_class.create!(:title => "title Y", :slug => "article-y") }
183
- }
184
-
185
- context "with a current tenant" do
186
- it "should only delete the current tenant articles" do
187
- Mongoid::Multitenancy.with_tenant(another_client) { described_class.delete_all }
188
- described_class.all.to_a.should =~ [@itemX]
189
- end
190
- end
191
-
192
- context "without a current tenant" do
193
- it "should delete all the articles" do
194
- described_class.delete_all
195
- described_class.all.to_a.should be_empty
196
- end
197
- end
198
- end
199
-
200
- end
22
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutable do
4
+
5
+ it_behaves_like "a tenantable model"
6
+
7
+ let(:client) { Account.create!(:name => "client") }
8
+ let(:another_client) { Account.create!(:name => "another client") }
9
+
10
+ describe "#valid?" do
11
+ before { Mongoid::Multitenancy.current_tenant = client; }
12
+ after { Mongoid::Multitenancy.current_tenant = nil }
13
+
14
+ let(:item) { Mutable.new(:title => "title X", :slug => "page-x") }
15
+
16
+ it_behaves_like "a tenant validator"
17
+
18
+ context "when the tenant has not changed" do
19
+ before { item.save! }
20
+ it 'should be valid' do
21
+ item.title = "title X (2)"
22
+ item.should be_valid
23
+ end
24
+ end
25
+
26
+ context "when the tenant has changed" do
27
+ before { item.save!; Mongoid::Multitenancy.current_tenant = another_client }
28
+ it 'should be valid' do
29
+ item.client = another_client
30
+ item.should be_valid
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe Optional do
4
+
5
+ it_behaves_like "a tenantable model"
6
+
7
+ let(:client) { Account.create!(:name => "client") }
8
+ let(:another_client) { Account.create!(:name => "another client") }
9
+
10
+ describe ".default_scope" do
11
+ before {
12
+ @itemC = Optional.create!(:title => "title C", :slug => "article-c")
13
+ Mongoid::Multitenancy.with_tenant(client) { @itemX = Optional.create!(:title => "title X", :slug => "article-x", :client => client) }
14
+ Mongoid::Multitenancy.with_tenant(another_client) { @itemY = Optional.create!(:title => "title Y", :slug => "article-y", :client => another_client) }
15
+ }
16
+
17
+ context "with a current tenant" do
18
+ before { Mongoid::Multitenancy.current_tenant = another_client }
19
+ after { Mongoid::Multitenancy.current_tenant = nil }
20
+
21
+ it "should filter on the current tenant / free-tenant items" do
22
+ Optional.all.to_a.should =~ [@itemY, @itemC]
23
+ end
24
+ end
25
+
26
+ context "without a current tenant" do
27
+ before { Mongoid::Multitenancy.current_tenant = nil }
28
+
29
+ it "should not filter on any tenant" do
30
+ Optional.all.to_a.should =~ [@itemC, @itemX, @itemY]
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "#delete_all" do
36
+ before {
37
+ @itemC = Optional.create!(:title => "title C", :slug => "article-c")
38
+ Mongoid::Multitenancy.with_tenant(client) { @itemX = Optional.create!(:title => "title X", :slug => "article-x", :client => client) }
39
+ Mongoid::Multitenancy.with_tenant(another_client) { @itemY = Optional.create!(:title => "title Y", :slug => "article-y", :client => another_client) }
40
+ }
41
+
42
+ context "with a current tenant" do
43
+ it "should only delete the current tenant / free-tenant items" do
44
+ Mongoid::Multitenancy.with_tenant(another_client) { Optional.delete_all }
45
+ Optional.all.to_a.should =~ [@itemX]
46
+ end
47
+ end
48
+
49
+ context "without a current tenant" do
50
+ it "should delete all the pages" do
51
+ Optional.delete_all
52
+ Optional.all.to_a.should be_empty
53
+ end
54
+ end
55
+ end
56
+
57
+ describe "#valid?" do
58
+ after { Mongoid::Multitenancy.current_tenant = nil }
59
+
60
+ let(:item) { Optional.new(:title => "title X", :slug => "page-x") }
61
+
62
+ it_behaves_like "a tenant validator"
63
+
64
+ context "with a current tenant" do
65
+ before { Mongoid::Multitenancy.current_tenant = client }
66
+
67
+ it "should not set the client field" do
68
+ item.valid?
69
+ item.client.should be_nil
70
+ end
71
+ end
72
+
73
+ context "without a current tenant" do
74
+ it "should not set the client field" do
75
+ item.valid?
76
+ item.client.should be_nil
77
+ end
78
+
79
+ it "should be valid" do
80
+ item.should be_valid
81
+ end
82
+ end
83
+ end
84
+ end
data/spec/spec_helper.rb CHANGED
@@ -36,3 +36,53 @@ RSpec.configure do |config|
36
36
  DatabaseCleaner.clean
37
37
  end
38
38
  end
39
+
40
+ shared_examples_for "a tenantable model" do
41
+
42
+ it { should belong_to(:client) }
43
+ it { should validate_uniqueness_of(:slug).scoped_to(:client_id) }
44
+ it { should have_index_for(:client_id => 1, :title => 1) }
45
+
46
+ end
47
+
48
+ shared_examples_for "a tenant validator" do
49
+ context "within a client context" do
50
+ before { Mongoid::Multitenancy.current_tenant = client }
51
+
52
+ context "with the client id" do
53
+ before { item.client = client }
54
+
55
+ it "should be valid" do
56
+ item.should be_valid
57
+ end
58
+ end
59
+
60
+ context "with another client id" do
61
+ before { item.client = another_client }
62
+
63
+ it "should be invalid" do
64
+ item.should_not be_valid
65
+ end
66
+ end
67
+ end
68
+
69
+ context "without a client context" do
70
+ before { Mongoid::Multitenancy.current_tenant = nil }
71
+
72
+ context "with the client id" do
73
+ before { item.client = client }
74
+
75
+ it "should be valid" do
76
+ item.should be_valid
77
+ end
78
+ end
79
+
80
+ context "with another client id" do
81
+ before { item.client = another_client }
82
+
83
+ it "should be valid" do
84
+ item.should be_valid
85
+ end
86
+ end
87
+ end
88
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-multitenancy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aymeric Brisse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-30 00:00:00.000000000 Z
11
+ date: 2013-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -126,12 +126,18 @@ files:
126
126
  - lib/mongoid/multitenancy.rb
127
127
  - lib/mongoid/multitenancy/document.rb
128
128
  - lib/mongoid/multitenancy/version.rb
129
- - lib/mongoid/validators/immutable_validator.rb
129
+ - lib/mongoid/validators/tenant_validator.rb
130
130
  - mongoid-multitenancy.gemspec
131
+ - spec/immutable_spec.rb
132
+ - spec/mandatory_spec.rb
131
133
  - spec/models/account.rb
132
- - spec/models/article.rb
133
- - spec/models/page.rb
134
+ - spec/models/immutable.rb
135
+ - spec/models/mandatory.rb
136
+ - spec/models/mutable.rb
137
+ - spec/models/optional.rb
134
138
  - spec/mongoid-multitenancy_spec.rb
139
+ - spec/mutable_spec.rb
140
+ - spec/optional_spec.rb
135
141
  - spec/spec_helper.rb
136
142
  homepage: https://github.com/PerfectMemory/mongoid-multitenancy
137
143
  licenses: []
@@ -157,9 +163,15 @@ signing_key:
157
163
  specification_version: 4
158
164
  summary: Support of a multi-tenant database with Mongoid
159
165
  test_files:
166
+ - spec/immutable_spec.rb
167
+ - spec/mandatory_spec.rb
160
168
  - spec/models/account.rb
161
- - spec/models/article.rb
162
- - spec/models/page.rb
169
+ - spec/models/immutable.rb
170
+ - spec/models/mandatory.rb
171
+ - spec/models/mutable.rb
172
+ - spec/models/optional.rb
163
173
  - spec/mongoid-multitenancy_spec.rb
174
+ - spec/mutable_spec.rb
175
+ - spec/optional_spec.rb
164
176
  - spec/spec_helper.rb
165
177
  has_rdoc:
@@ -1,7 +0,0 @@
1
- class ImmutableValidator < ActiveModel::EachValidator
2
- def validate_each(object, attribute, value)
3
- if object.send(:attribute_changed?, options[:field]) and object.send(:attribute_was, options[:field])
4
- object.errors.add(options[:field], 'is immutable and cannot be updated') and false
5
- end
6
- end
7
- end