rails_multitenant 0.1.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.
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rails_multitenant/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rails_multitenant"
8
+ spec.version = RailsMultitenant::VERSION
9
+ spec.authors = ["Pat Breault"]
10
+ spec.email = ["pbreault@salsify.com"]
11
+ spec.summary = %q{Automatically configures multiple tenants in a Rails environment}
12
+ spec.description = %q{Handles multiple tenants in a Rails environment}
13
+ spec.homepage = "https://github.com/salsify/rails_multitenant"
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.test_files = Dir.glob('spec/**/*')
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.10"
21
+
22
+ spec.add_dependency 'activerecord', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 4.3'])
23
+ spec.add_dependency 'activesupport', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 4.3'])
24
+
25
+ spec.add_development_dependency 'coveralls'
26
+ spec.add_development_dependency 'database_cleaner', '>= 1.2'
27
+ spec.add_development_dependency 'rake'
28
+ spec.add_development_dependency 'rspec', '~> 2'
29
+ spec.add_development_dependency 'simplecov', '~> 0.7.1'
30
+ spec.add_development_dependency 'sqlite3'
31
+ end
@@ -0,0 +1,3 @@
1
+ sqlite3:
2
+ adapter: sqlite3
3
+ database: ":memory:"
data/spec/db/schema.rb ADDED
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+
3
+ ActiveRecord::Schema.define(:version => 0) do
4
+
5
+ create_table(:organizations, force: true) do |t|
6
+ t.string :name
7
+ end
8
+
9
+ create_table(:items, force: true) do |t|
10
+ t.string :name
11
+ t.integer :organization_id
12
+ end
13
+
14
+ end
15
+
16
+ class Organization < ActiveRecord::Base
17
+ include RailsMultitenant::GlobalContextRegistry::CurrentInstance
18
+ end
19
+
20
+ class Item < ActiveRecord::Base
21
+ include RailsMultitenant::MultitenantModel
22
+ multitenant_model_on :organization
23
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+ include RailsMultitenant
3
+
4
+ describe GlobalContextRegistry do
5
+
6
+ before do
7
+ # The framework will setup the organization; clear that out
8
+ GlobalContextRegistry.new_registry
9
+ GlobalContextRegistry.set(:foo, 'bar')
10
+ end
11
+
12
+ describe '.get and .set' do
13
+ specify do
14
+ expect(GlobalContextRegistry.get(:foo)).to eq 'bar'
15
+ end
16
+ end
17
+
18
+ describe '.delete' do
19
+ specify do
20
+ expect(GlobalContextRegistry.delete(:foo)).to eq 'bar'
21
+ expect(GlobalContextRegistry.get(:foo)).to be_nil
22
+ end
23
+ end
24
+
25
+ describe '.with_isolated_registry' do
26
+ specify do
27
+ GlobalContextRegistry.with_isolated_registry do
28
+ expect(GlobalContextRegistry.get(:foo)).to be_nil
29
+ end
30
+ end
31
+ end
32
+
33
+ describe '.replace_registry and .new_registry' do
34
+ let!(:old_registry) { GlobalContextRegistry.new_registry }
35
+
36
+ specify do
37
+ expect(old_registry).to eq ({ foo: 'bar' })
38
+ end
39
+ specify do
40
+ expect(GlobalContextRegistry.get(:foo)).to be_nil
41
+ end
42
+ specify do
43
+ GlobalContextRegistry.replace_registry(old_registry)
44
+ expect(GlobalContextRegistry.get(:foo)).to eq 'bar'
45
+ end
46
+ end
47
+
48
+ describe '.duplicate_registry' do
49
+ def setup_registry; end
50
+
51
+ before { setup_registry }
52
+ let!(:dupe) { GlobalContextRegistry.duplicate_registry }
53
+
54
+ specify do
55
+ expect(GlobalContextRegistry.new_registry).to eq dupe
56
+ end
57
+ specify do
58
+ expect(GlobalContextRegistry.new_registry.object_id).not_to eq dupe.object_id
59
+ end
60
+ specify do
61
+ expect(GlobalContextRegistry.get(:foo).object_id).not_to eq dupe[:foo].object_id
62
+ end
63
+
64
+ context 'with nils' do
65
+ def setup_registry
66
+ GlobalContextRegistry.set(:bar, nil)
67
+ end
68
+
69
+ specify do
70
+ expect(dupe).to eq GlobalContextRegistry.new_registry
71
+ end
72
+ end
73
+
74
+ context 'with fixnums' do
75
+ def setup_registry
76
+ GlobalContextRegistry.set(:bar, 5)
77
+ end
78
+
79
+ specify do
80
+ expect(dupe).to eq GlobalContextRegistry.new_registry
81
+ end
82
+ end
83
+ end
84
+ end
data/spec/item_spec.rb ADDED
@@ -0,0 +1,35 @@
1
+ # Create multiple orgs
2
+ # Create an item in each
3
+ # Make sure you can only see one org's item in one org
4
+
5
+ require 'spec_helper'
6
+
7
+ describe Item do
8
+
9
+ let!(:item1) { Item.create(name: 'item1') }
10
+
11
+ let!(:org2) { Organization.create(name: 'org2') }
12
+ let!(:item2) { org2.as_current { Item.create(name: 'item2') } }
13
+ let!(:item3) { org2.as_current { Item.create(name: 'item3') } }
14
+
15
+ specify 'default org should have one item' do
16
+ expect(Item.all).to eq [ item1 ]
17
+ end
18
+
19
+ it 'does not return item2' do
20
+ expect(Item.where(id: item2.id)).to eq []
21
+ end
22
+
23
+ specify 'org2 should have two items' do
24
+ org2.as_current do
25
+ expect(Item.all).to eq [ item2, item3]
26
+ end
27
+ end
28
+
29
+ it 'does not return item1' do
30
+ org2.as_current do
31
+ expect(Item.where(id: item1.id)).to eq []
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'simplecov'
4
+ require 'coveralls'
5
+
6
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
7
+ SimpleCov::Formatter::HTMLFormatter,
8
+ Coveralls::SimpleCov::Formatter
9
+ ]
10
+ SimpleCov.start do
11
+ add_filter 'spec'
12
+ end
13
+
14
+ require 'logger'
15
+ require 'database_cleaner'
16
+ require 'rails_multitenant'
17
+ require 'yaml'
18
+
19
+ FileUtils.makedirs('log')
20
+
21
+ ActiveRecord::Base.logger = Logger.new('log/test.log')
22
+ ActiveRecord::Base.logger.level = Logger::DEBUG
23
+ ActiveRecord::Migration.verbose = false
24
+
25
+ db_adapter = ENV.fetch('ADAPTER', 'sqlite3')
26
+ config = YAML.load(File.read('spec/db/database.yml'))
27
+ ActiveRecord::Base.establish_connection(config[db_adapter])
28
+ require 'db/schema'
29
+
30
+ RSpec.configure do |config|
31
+ config.order = 'random'
32
+
33
+ config.add_setting :test_org_id
34
+
35
+ config.before(:suite) do
36
+ DatabaseCleaner.clean_with(:truncation)
37
+ end
38
+
39
+ config.before(:each) do
40
+ DatabaseCleaner.strategy = :transaction
41
+ DatabaseCleaner.start
42
+ RailsMultitenant::GlobalContextRegistry.new_registry
43
+ org = Organization.create(name: 'test org')
44
+ RSpec.configuration.test_org_id = org.id
45
+ Organization.current_id = RSpec.configuration.test_org_id
46
+ end
47
+
48
+ config.after(:each) do
49
+ DatabaseCleaner.clean
50
+ end
51
+ end
52
+
53
+ puts "Testing with ActiveRecord #{ActiveRecord::VERSION::STRING}"
metadata ADDED
@@ -0,0 +1,207 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_multitenant
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pat Breault
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3.2'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '4.3'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '3.2'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '4.3'
47
+ - !ruby/object:Gem::Dependency
48
+ name: activesupport
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '3.2'
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: '4.3'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '3.2'
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: '4.3'
67
+ - !ruby/object:Gem::Dependency
68
+ name: coveralls
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: database_cleaner
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '1.2'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '1.2'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rake
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: rspec
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '2'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '2'
123
+ - !ruby/object:Gem::Dependency
124
+ name: simplecov
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: 0.7.1
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: 0.7.1
137
+ - !ruby/object:Gem::Dependency
138
+ name: sqlite3
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ description: Handles multiple tenants in a Rails environment
152
+ email:
153
+ - pbreault@salsify.com
154
+ executables: []
155
+ extensions: []
156
+ extra_rdoc_files: []
157
+ files:
158
+ - ".gitignore"
159
+ - ".ruby-version"
160
+ - ".travis.yml"
161
+ - CODE_OF_CONDUCT.md
162
+ - Gemfile
163
+ - README.md
164
+ - Rakefile
165
+ - bin/console
166
+ - bin/setup
167
+ - lib/rails_multitenant.rb
168
+ - lib/rails_multitenant/global_context_registry.rb
169
+ - lib/rails_multitenant/multitenant_model.rb
170
+ - lib/rails_multitenant/version.rb
171
+ - log/test.log
172
+ - rails_multitenant.gemspec
173
+ - spec/db/database.yml
174
+ - spec/db/schema.rb
175
+ - spec/global_context_registry_spec.rb
176
+ - spec/item_spec.rb
177
+ - spec/spec_helper.rb
178
+ homepage: https://github.com/salsify/rails_multitenant
179
+ licenses:
180
+ - MIT
181
+ metadata: {}
182
+ post_install_message:
183
+ rdoc_options: []
184
+ require_paths:
185
+ - lib
186
+ required_ruby_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ required_rubygems_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ requirements: []
197
+ rubyforge_project:
198
+ rubygems_version: 2.4.5.1
199
+ signing_key:
200
+ specification_version: 4
201
+ summary: Automatically configures multiple tenants in a Rails environment
202
+ test_files:
203
+ - spec/db/database.yml
204
+ - spec/db/schema.rb
205
+ - spec/global_context_registry_spec.rb
206
+ - spec/item_spec.rb
207
+ - spec/spec_helper.rb