tenancy 0.2.0 → 1.0.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/.coveralls.yml +2 -0
- data/.rspec +2 -1
- data/.rvmrc +1 -1
- data/.travis.yml +5 -1
- data/CHANGELOG.md +24 -0
- data/Gemfile +13 -3
- data/README.md +57 -37
- data/Rakefile +4 -4
- data/gemfiles/active_record_32.gemfile +10 -4
- data/gemfiles/active_record_40.gemfile +10 -4
- data/gemfiles/mongoid_3.gemfile +12 -0
- data/gemfiles/mongoid_4.gemfile +12 -0
- data/lib/tenancy.rb +4 -2
- data/lib/tenancy/matchers.rb +29 -12
- data/lib/tenancy/resource.rb +2 -2
- data/lib/tenancy/resource_scope.rb +14 -51
- data/lib/tenancy/scoping.rb +13 -0
- data/lib/tenancy/scoping/active_record.rb +52 -0
- data/lib/tenancy/scoping/mongoid.rb +79 -0
- data/lib/tenancy/tenant.rb +13 -0
- data/lib/tenancy/version.rb +1 -1
- data/spec/lib/resource_spec.rb +82 -38
- data/spec/lib/scoping/active_record_spec.rb +135 -0
- data/spec/lib/scoping/mongoid_spec.rb +179 -0
- data/spec/lib/shoulda_matchers_spec.rb +39 -15
- data/spec/spec_helper.rb +57 -6
- data/spec/support/{models.rb → active_record/models.rb} +5 -5
- data/spec/support/{schema.rb → active_record/schema.rb} +3 -4
- data/spec/support/mongoid/connection.rb +3 -0
- data/spec/support/mongoid/models.rb +44 -0
- data/spec/support/mongoid/mongoid.yml +6 -0
- data/tenancy.gemspec +10 -13
- metadata +43 -97
- data/spec/lib/resource_scope_spec.rb +0 -125
metadata
CHANGED
@@ -1,141 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tenancy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Chamnap Chhorn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ~>
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 2.12.0
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: shoulda
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 3.5.0
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 3.5.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: pry
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ~>
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.9.12
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.9.12
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: sqlite3
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.3.7
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ~>
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 1.3.7
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - '>='
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - '>='
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: activerecord
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - '>='
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 3.2.13
|
19
|
+
version: '3.2'
|
90
20
|
type: :runtime
|
91
21
|
prerelease: false
|
92
22
|
version_requirements: !ruby/object:Gem::Requirement
|
93
23
|
requirements:
|
94
|
-
- -
|
24
|
+
- - ">="
|
95
25
|
- !ruby/object:Gem::Version
|
96
|
-
version: 3.2
|
26
|
+
version: '3.2'
|
97
27
|
- !ruby/object:Gem::Dependency
|
98
28
|
name: request_store
|
99
29
|
requirement: !ruby/object:Gem::Requirement
|
100
30
|
requirements:
|
101
|
-
- - ~>
|
31
|
+
- - "~>"
|
102
32
|
- !ruby/object:Gem::Version
|
103
33
|
version: 1.0.5
|
104
34
|
type: :runtime
|
105
35
|
prerelease: false
|
106
36
|
version_requirements: !ruby/object:Gem::Requirement
|
107
37
|
requirements:
|
108
|
-
- - ~>
|
38
|
+
- - "~>"
|
109
39
|
- !ruby/object:Gem::Version
|
110
40
|
version: 1.0.5
|
111
|
-
description: A simple multitenancy with activerecord through scoping
|
41
|
+
description: A simple multitenancy with activerecord/mongoid through scoping
|
112
42
|
email:
|
113
43
|
- chamnapchhorn@gmail.com
|
114
44
|
executables: []
|
115
45
|
extensions: []
|
116
46
|
extra_rdoc_files: []
|
117
47
|
files:
|
118
|
-
- .
|
119
|
-
- .
|
120
|
-
- .
|
121
|
-
- .
|
48
|
+
- ".coveralls.yml"
|
49
|
+
- ".gitignore"
|
50
|
+
- ".rspec"
|
51
|
+
- ".rvmrc"
|
52
|
+
- ".travis.yml"
|
53
|
+
- CHANGELOG.md
|
122
54
|
- Gemfile
|
123
55
|
- LICENSE.txt
|
124
56
|
- README.md
|
125
57
|
- Rakefile
|
126
58
|
- gemfiles/active_record_32.gemfile
|
127
59
|
- gemfiles/active_record_40.gemfile
|
60
|
+
- gemfiles/mongoid_3.gemfile
|
61
|
+
- gemfiles/mongoid_4.gemfile
|
128
62
|
- lib/tenancy.rb
|
129
63
|
- lib/tenancy/matchers.rb
|
130
64
|
- lib/tenancy/resource.rb
|
131
65
|
- lib/tenancy/resource_scope.rb
|
66
|
+
- lib/tenancy/scoping.rb
|
67
|
+
- lib/tenancy/scoping/active_record.rb
|
68
|
+
- lib/tenancy/scoping/mongoid.rb
|
69
|
+
- lib/tenancy/tenant.rb
|
132
70
|
- lib/tenancy/version.rb
|
133
|
-
- spec/lib/resource_scope_spec.rb
|
134
71
|
- spec/lib/resource_spec.rb
|
72
|
+
- spec/lib/scoping/active_record_spec.rb
|
73
|
+
- spec/lib/scoping/mongoid_spec.rb
|
135
74
|
- spec/lib/shoulda_matchers_spec.rb
|
136
75
|
- spec/spec_helper.rb
|
137
|
-
- spec/support/models.rb
|
138
|
-
- spec/support/schema.rb
|
76
|
+
- spec/support/active_record/models.rb
|
77
|
+
- spec/support/active_record/schema.rb
|
78
|
+
- spec/support/mongoid/connection.rb
|
79
|
+
- spec/support/mongoid/models.rb
|
80
|
+
- spec/support/mongoid/mongoid.yml
|
139
81
|
- tenancy.gemspec
|
140
82
|
homepage: https://github.com/yoolk/tenancy
|
141
83
|
licenses:
|
@@ -147,24 +89,28 @@ require_paths:
|
|
147
89
|
- lib
|
148
90
|
required_ruby_version: !ruby/object:Gem::Requirement
|
149
91
|
requirements:
|
150
|
-
- -
|
92
|
+
- - ">="
|
151
93
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
94
|
+
version: 1.9.3
|
153
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
96
|
requirements:
|
155
|
-
- -
|
97
|
+
- - ">="
|
156
98
|
- !ruby/object:Gem::Version
|
157
|
-
version:
|
99
|
+
version: 1.8.11
|
158
100
|
requirements: []
|
159
101
|
rubyforge_project:
|
160
|
-
rubygems_version: 2.
|
102
|
+
rubygems_version: 2.2.0
|
161
103
|
signing_key:
|
162
104
|
specification_version: 4
|
163
|
-
summary: A simple multitenancy with activerecord through scoping
|
105
|
+
summary: A simple multitenancy with activerecord/mongoid through scoping
|
164
106
|
test_files:
|
165
|
-
- spec/lib/resource_scope_spec.rb
|
166
107
|
- spec/lib/resource_spec.rb
|
108
|
+
- spec/lib/scoping/active_record_spec.rb
|
109
|
+
- spec/lib/scoping/mongoid_spec.rb
|
167
110
|
- spec/lib/shoulda_matchers_spec.rb
|
168
111
|
- spec/spec_helper.rb
|
169
|
-
- spec/support/models.rb
|
170
|
-
- spec/support/schema.rb
|
112
|
+
- spec/support/active_record/models.rb
|
113
|
+
- spec/support/active_record/schema.rb
|
114
|
+
- spec/support/mongoid/connection.rb
|
115
|
+
- spec/support/mongoid/models.rb
|
116
|
+
- spec/support/mongoid/mongoid.yml
|
@@ -1,125 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "Tenancy::ResourceScope" do
|
4
|
-
let(:camyp) { Portal.create(domain_name: 'yp.com.kh') }
|
5
|
-
let(:panpages) { Portal.create(domain_name: 'panpages.com') }
|
6
|
-
let(:listing) { Listing.create(name: 'Listing 1', portal_id: camyp.id) }
|
7
|
-
|
8
|
-
after(:all) do
|
9
|
-
Portal.delete_all
|
10
|
-
end
|
11
|
-
|
12
|
-
describe Listing do
|
13
|
-
it { should belong_to(:portal) }
|
14
|
-
|
15
|
-
it { should validate_presence_of(:portal) }
|
16
|
-
|
17
|
-
it { should validate_uniqueness_of(:name).scoped_to(:portal_id).case_insensitive }
|
18
|
-
|
19
|
-
it "have default_scope with :portal_id field" do
|
20
|
-
Portal.current = camyp
|
21
|
-
|
22
|
-
expect(Listing.where(nil).to_sql).to eq(Listing.where(portal_id: Portal.current_id).to_sql)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "doesn't have default_scope when it doesn't have current portal" do
|
26
|
-
Portal.current = nil
|
27
|
-
|
28
|
-
expect(Listing.where(nil).to_sql).not_to include(%{"listings"."portal_id" = #{Portal.current_id}})
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe Communication do
|
33
|
-
it { should belong_to(:portal) }
|
34
|
-
|
35
|
-
it { should validate_presence_of(:portal) }
|
36
|
-
|
37
|
-
it { should belong_to(:listing) }
|
38
|
-
|
39
|
-
it { should validate_presence_of(:listing) }
|
40
|
-
|
41
|
-
it { should validate_uniqueness_of(:value).scoped_to(:portal_id, :listing_id) }
|
42
|
-
|
43
|
-
it "have default_scope with :portal_id field" do
|
44
|
-
Portal.current = camyp
|
45
|
-
Listing.current = listing
|
46
|
-
|
47
|
-
Communication.where(nil).to_sql.should == Communication.where(portal_id: Portal.current_id, listing_id: Listing.current_id).to_sql
|
48
|
-
end
|
49
|
-
|
50
|
-
it "doesn't have default_scope when it doesn't have current portal and listing" do
|
51
|
-
Portal.current = nil
|
52
|
-
Listing.current = nil
|
53
|
-
|
54
|
-
expect(Communication.where(nil).to_sql).not_to include(%{"communications"."portal_id" = #{Portal.current_id}})
|
55
|
-
expect(Communication.where(nil).to_sql).not_to include(%{"communications"."listing_id" = #{Listing.current_id}})
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe ExtraCommunication do
|
60
|
-
it { should belong_to(:portal) }
|
61
|
-
|
62
|
-
it { should belong_to(:listing) }
|
63
|
-
|
64
|
-
it "raise exception when passing two resources and options" do
|
65
|
-
expect { ExtraCommunication.scope_to(:portal, :listing, class_name: 'Listing') }.to raise_error(ArgumentError)
|
66
|
-
end
|
67
|
-
|
68
|
-
it "uses the correct scope" do
|
69
|
-
listing2 = Listing.create(name: 'Name 2', portal: camyp)
|
70
|
-
|
71
|
-
Portal.current = camyp
|
72
|
-
Listing.current = listing2
|
73
|
-
|
74
|
-
extra_communication = ExtraCommunication.new
|
75
|
-
expect(extra_communication.listing_id).to eq(listing2.id)
|
76
|
-
expect(extra_communication.portal_id).to eq(camyp.id)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
describe "belongs_to method override" do
|
81
|
-
before(:each) { Portal.current = camyp }
|
82
|
-
after(:each) { Portal.current = nil }
|
83
|
-
|
84
|
-
it "reload belongs_to when passes true" do
|
85
|
-
listing.portal.domain_name = 'abc.com'
|
86
|
-
expect(listing.portal(true).object_id).not_to eq(Portal.current.object_id)
|
87
|
-
end
|
88
|
-
|
89
|
-
it "doesn't reload belongs_to" do
|
90
|
-
listing.portal.domain_name = 'abc.com'
|
91
|
-
expect(listing.portal.object_id).to eq(Portal.current.object_id)
|
92
|
-
end
|
93
|
-
|
94
|
-
it "returns different object" do
|
95
|
-
listing.portal_id = panpages.id
|
96
|
-
expect(listing.portal.object_id).not_to eq(Portal.current.object_id)
|
97
|
-
end
|
98
|
-
|
99
|
-
it "doesn't touch db" do
|
100
|
-
current_listing = listing
|
101
|
-
|
102
|
-
Portal.establish_connection(adapter: "sqlite3", database: "spec/invalid.sqlite3")
|
103
|
-
expect(current_listing.portal.object_id).to eq(Portal.current.object_id)
|
104
|
-
|
105
|
-
Portal.establish_connection(ActiveRecord::Base.connection_config)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
describe "#without_scope" do
|
110
|
-
before(:each) { Portal.current = camyp }
|
111
|
-
after(:each) { Portal.current = nil and Listing.current = nil }
|
112
|
-
|
113
|
-
it "unscopes :current_portal" do
|
114
|
-
expect(Listing.without_scope(:portal).to_sql).not_to include(%{"listings"."portal_id" = #{Portal.current_id}})
|
115
|
-
end
|
116
|
-
|
117
|
-
it "unscopes :current_portal and :current_listing" do
|
118
|
-
Listing.current = listing
|
119
|
-
|
120
|
-
expect(Communication.without_scope(:portal).to_sql).not_to include(%{"communications"."portal_id" = #{Portal.current_id}})
|
121
|
-
expect(Communication.without_scope(:listing).to_sql).not_to include(%{"communications"."listing_id" = #{Listing.current_id}})
|
122
|
-
expect(Communication.without_scope(:portal, :listing).to_sql).to eq(%{SELECT "communications".* FROM "communications" WHERE "communications"."is_active" = 't'})
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|