rails_multitenant 0.11.0 → 0.15.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.
Files changed (39) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.txt +21 -0
  3. data/lib/rails_multitenant.rb +7 -4
  4. data/lib/rails_multitenant/global_context_registry.rb +43 -198
  5. data/lib/rails_multitenant/global_context_registry/current.rb +98 -0
  6. data/lib/rails_multitenant/global_context_registry/current_instance.rb +103 -0
  7. data/lib/rails_multitenant/global_context_registry/registry_dependent_on.rb +13 -0
  8. data/lib/rails_multitenant/middleware/extensions.rb +3 -3
  9. data/lib/rails_multitenant/middleware/isolated_context_registry.rb +2 -0
  10. data/lib/rails_multitenant/middleware/railtie.rb +3 -1
  11. data/lib/rails_multitenant/multitenant_model.rb +6 -2
  12. data/lib/rails_multitenant/rspec.rb +2 -0
  13. data/lib/rails_multitenant/version.rb +3 -1
  14. metadata +69 -76
  15. data/.gitignore +0 -14
  16. data/.rspec +0 -3
  17. data/.ruby-version +0 -1
  18. data/.travis.yml +0 -29
  19. data/CHANGELOG.md +0 -57
  20. data/CODE_OF_CONDUCT.md +0 -13
  21. data/Gemfile +0 -4
  22. data/README.md +0 -120
  23. data/Rakefile +0 -8
  24. data/bin/console +0 -14
  25. data/bin/setup +0 -7
  26. data/rails_multitenant.gemspec +0 -33
  27. data/spec/be_multitenant_on_matcher_spec.rb +0 -15
  28. data/spec/current_spec.rb +0 -118
  29. data/spec/db/database.yml +0 -3
  30. data/spec/db/schema.rb +0 -60
  31. data/spec/external_item_spec.rb +0 -36
  32. data/spec/external_item_with_optional_org_spec.rb +0 -25
  33. data/spec/global_context_registry_spec.rb +0 -113
  34. data/spec/item_spec.rb +0 -78
  35. data/spec/item_subtype_spec.rb +0 -37
  36. data/spec/item_with_optional_org_spec.rb +0 -26
  37. data/spec/middleware_isolated_context_registry_spec.rb +0 -15
  38. data/spec/rails_multitenant_spec.rb +0 -51
  39. data/spec/spec_helper.rb +0 -54
@@ -1,25 +0,0 @@
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
@@ -1,113 +0,0 @@
1
- include RailsMultitenant
2
-
3
- describe GlobalContextRegistry do
4
-
5
- before do
6
- # The framework will setup the organization; clear that out
7
- GlobalContextRegistry.new_registry
8
- GlobalContextRegistry.set(:foo, 'bar')
9
- end
10
-
11
- describe '.get and .set' do
12
- specify do
13
- expect(GlobalContextRegistry.get(:foo)).to eq 'bar'
14
- end
15
- end
16
-
17
- describe '.[] and .[]=' do
18
- before do
19
- GlobalContextRegistry[:boo] = 'baz'
20
- end
21
-
22
- specify do
23
- expect(GlobalContextRegistry[:boo]).to eq 'baz'
24
- end
25
- end
26
-
27
- describe '.delete' do
28
- specify do
29
- expect(GlobalContextRegistry.delete(:foo)).to eq 'bar'
30
- expect(GlobalContextRegistry.get(:foo)).to be_nil
31
- end
32
- end
33
-
34
- describe '.with_isolated_registry' do
35
- specify do
36
- GlobalContextRegistry.with_isolated_registry do
37
- expect(GlobalContextRegistry.get(:foo)).to be_nil
38
- end
39
- end
40
-
41
- specify do
42
- GlobalContextRegistry.with_isolated_registry(foo: 'updated') do
43
- expect(GlobalContextRegistry.get(:foo)).to eq 'updated'
44
- end
45
- end
46
- end
47
-
48
- describe '.replace_registry and .new_registry' do
49
- let!(:old_registry) { GlobalContextRegistry.new_registry }
50
-
51
- specify do
52
- expect(old_registry).to eq({ foo: 'bar' })
53
- end
54
- specify do
55
- expect(GlobalContextRegistry.get(:foo)).to be_nil
56
- end
57
- specify do
58
- GlobalContextRegistry.replace_registry(old_registry)
59
- expect(GlobalContextRegistry.get(:foo)).to eq 'bar'
60
- end
61
-
62
- context 'when a new registry is specified' do
63
- let!(:old_registry) { GlobalContextRegistry.new_registry(bar: 'foo') }
64
-
65
- specify do
66
- expect(old_registry).to eq({ foo: 'bar' })
67
- end
68
- specify do
69
- expect(GlobalContextRegistry.get(:foo)).to be_nil
70
- end
71
- specify do
72
- expect(GlobalContextRegistry.get(:bar)).to eq 'foo'
73
- end
74
- end
75
- end
76
-
77
- describe '.duplicate_registry' do
78
- def setup_registry; end
79
-
80
- before { setup_registry }
81
- let!(:dupe) { GlobalContextRegistry.duplicate_registry }
82
-
83
- specify do
84
- expect(GlobalContextRegistry.new_registry).to eq dupe
85
- end
86
- specify do
87
- expect(GlobalContextRegistry.new_registry.object_id).not_to eq dupe.object_id
88
- end
89
- specify do
90
- expect(GlobalContextRegistry.get(:foo).object_id).not_to eq dupe[:foo].object_id
91
- end
92
-
93
- context 'with nils' do
94
- def setup_registry
95
- GlobalContextRegistry.set(:bar, nil)
96
- end
97
-
98
- specify do
99
- expect(dupe).to eq GlobalContextRegistry.new_registry
100
- end
101
- end
102
-
103
- context 'with integers' do
104
- def setup_registry
105
- GlobalContextRegistry.set(:bar, 5)
106
- end
107
-
108
- specify do
109
- expect(dupe).to eq GlobalContextRegistry.new_registry
110
- end
111
- end
112
- end
113
- end
@@ -1,78 +0,0 @@
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
- describe Item do
6
-
7
- let!(:item1) { Item.create! }
8
-
9
- let!(:org2) { Organization.create! }
10
- let!(:item2) { org2.as_current { Item.create! } }
11
- let!(:item3) { org2.as_current { Item.create! } }
12
-
13
- specify 'default org should have one item' do
14
- expect(Item.all).to eq [ item1 ]
15
- end
16
-
17
- it 'does not return item2' do
18
- expect(Item.where(id: item2.id)).to eq []
19
- end
20
-
21
- specify 'org2 should have two items' do
22
- org2.as_current do
23
- expect(Item.all).to eq [ item2, item3]
24
- end
25
- end
26
-
27
- it 'does not return item1' do
28
- org2.as_current do
29
- expect(Item.where(id: item1.id)).to eq []
30
- end
31
- end
32
-
33
- class DependentClass
34
- include RailsMultitenant::GlobalContextRegistry::Current
35
- global_context_dependent_on Organization
36
- end
37
-
38
- class SubOrganization < Organization
39
-
40
- end
41
-
42
- describe '.as_current' do
43
- it 'returns the correct items with an org supplied' do
44
- Organization.as_current(org2) do
45
- expect(Item.all).to eq [ item2, item3]
46
- end
47
- end
48
-
49
- it 'allows a nil org to be supplied' do
50
- Organization.as_current(nil) do
51
- expect(Item.all).to eq []
52
- end
53
- end
54
-
55
- it 'rejects models of the wrong type' do
56
- model = Item.new
57
- expect { Organization.as_current(model) {}}.to raise_error("#{model} is not a Organization")
58
- end
59
-
60
- it 'invalidates dependent models' do
61
- DependentModel.current = DependentModel.create!
62
- dependent = DependentModel.current
63
-
64
- SubOrganization.create!.as_current do
65
- expect(DependentModel.current).not_to equal(dependent)
66
- end
67
- end
68
-
69
- it 'invalidates dependent objects' do
70
- dependent = DependentClass.current
71
-
72
- SubOrganization.create!.as_current do
73
- expect(DependentClass.current).not_to equal(dependent)
74
- end
75
- end
76
- end
77
-
78
- end
@@ -1,37 +0,0 @@
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
- describe ItemSubtype do
6
-
7
- let!(:item1) { ItemSubtype.create! }
8
-
9
- let!(:org2) { Organization.create! }
10
- let!(:item2) { org2.as_current { ItemSubtype.create! } }
11
- let!(:item3) { org2.as_current { ItemSubtype.create! } }
12
-
13
- it 'inherits the multitenant settings from its parent class' do
14
- expect(ItemSubtype).to be_multitenant_on(:organization_id)
15
- end
16
-
17
- specify 'default org should have one item' do
18
- expect(ItemSubtype.all).to eq([item1])
19
- end
20
-
21
- it 'does not return item2' do
22
- expect(ItemSubtype.where(id: item2.id)).to eq([])
23
- end
24
-
25
- specify 'org2 should have two items' do
26
- org2.as_current do
27
- expect(ItemSubtype.all).to eq([item2, item3])
28
- end
29
- end
30
-
31
- it 'does not return item1' do
32
- org2.as_current do
33
- expect(ItemSubtype.where(id: item1.id)).to eq([])
34
- end
35
- end
36
-
37
- end
@@ -1,26 +0,0 @@
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
@@ -1,15 +0,0 @@
1
- describe Middleware::IsolatedContextRegistry do
2
- let(:payload) { [200, {'Content-Type' => 'text/plain'}, ['OK']] }
3
- let(:app) { lambda { |env| env[2] = GlobalContextRegistry.get(:foo); env } }
4
- let(:middleware) { described_class.new(app) }
5
-
6
- describe '.call' do
7
- specify do
8
- GlobalContextRegistry.set(:foo, 'bar')
9
- # Assert that a new global registry is created and read from, where :foo is not set
10
- expect(middleware.call(payload)).to eq [200, {'Content-Type' => 'text/plain'}, nil]
11
- # Assert that the outer global context registry is restored
12
- expect(GlobalContextRegistry.get(:foo)).to eq 'bar'
13
- end
14
- end
15
- end
@@ -1,51 +0,0 @@
1
- describe "delegating to GlobalContextRegistry" do
2
- it "RailsMultitenant.get returns values from the GlobalContextRegistry" do
3
- RailsMultitenant::GlobalContextRegistry.set(:organization_id, 'Salsify Housing Authority')
4
-
5
- expect(RailsMultitenant.get(:organization_id)).to eq('Salsify Housing Authority')
6
- end
7
-
8
- it "RailsMultitenant[] returns values from the GlobalContextRegistry" do
9
- RailsMultitenant::GlobalContextRegistry.set(:organization_id, 'Salsify Farmland Inc.')
10
-
11
- expect(RailsMultitenant[:organization_id]).to eq('Salsify Farmland Inc.')
12
- end
13
-
14
- it "RailsMultitenant.set assigns values in the GlobalContextRegistry" do
15
- RailsMultitenant.set(:organization_id, 'Salsify Eminient Domain')
16
-
17
- expect(RailsMultitenant::GlobalContextRegistry.get(:organization_id)).to eq('Salsify Eminient Domain')
18
- end
19
-
20
- it "RailsMultitenant[]= assigns values in the GlobalContextRegistry" do
21
- RailsMultitenant[:organization_id] = 'Salsify Co-op'
22
-
23
- expect(RailsMultitenant::GlobalContextRegistry[:organization_id]).to eq('Salsify Co-op')
24
- end
25
-
26
- it "RailsMultitenant.fetch checks and sets the GlobalContextRegistry" do
27
- RailsMultitenant::GlobalContextRegistry[:organization_id] = nil
28
-
29
- expect(RailsMultitenant.fetch(:organization_id) { 'Salsify Anarchists' }).to eq('Salsify Anarchists')
30
-
31
- expect(RailsMultitenant.fetch(:organization_id) { 'Salsify Crypto Anarchists' }).to eq('Salsify Anarchists')
32
- end
33
-
34
- it "RailsMultitenant.delete removes from the GlobalContextRegistry" do
35
- RailsMultitenant::GlobalContextRegistry[:organization_id] = 'Not Salsify'
36
-
37
- RailsMultitenant.delete(:organization_id)
38
-
39
- expect(RailsMultitenant.get(:organization_id)).to be_nil
40
- end
41
-
42
- it "RailsMultitenant.with_isolated_registry leverages the GlobalContextRegistry" do
43
- RailsMultitenant::GlobalContextRegistry[:organization_id] = 'Salsify Mainland'
44
-
45
- RailsMultitenant.with_isolated_registry({ organization_id: 'Salsify Private Island' }) do
46
- expect(RailsMultitenant::GlobalContextRegistry[:organization_id]).to eq('Salsify Private Island')
47
- end
48
-
49
- expect(RailsMultitenant::GlobalContextRegistry[:organization_id]).to eq('Salsify Mainland')
50
- end
51
- end
@@ -1,54 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'simplecov'
4
- require 'coveralls'
5
-
6
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
7
- SimpleCov::Formatter::HTMLFormatter,
8
- Coveralls::SimpleCov::Formatter
9
- ])
10
- SimpleCov.start do
11
- add_filter 'spec'
12
- end
13
-
14
- require 'active_record'
15
- if ActiveRecord::VERSION::MAJOR >= 5
16
- ActiveRecord::Base.belongs_to_required_by_default = true
17
- end
18
-
19
- require 'logger'
20
- require 'database_cleaner'
21
- require 'rails_multitenant'
22
- require 'yaml'
23
-
24
- FileUtils.makedirs('log')
25
-
26
- ActiveRecord::Base.logger = Logger.new('log/test.log')
27
- ActiveRecord::Base.logger.level = Logger::DEBUG
28
- ActiveRecord::Migration.verbose = false
29
-
30
- db_adapter = ENV.fetch('ADAPTER', 'sqlite3')
31
- config = YAML.load(File.read('spec/db/database.yml'))
32
- ActiveRecord::Base.establish_connection(config[db_adapter])
33
- require 'db/schema'
34
-
35
- RSpec.configure do |config|
36
- config.order = 'random'
37
-
38
- config.before(:suite) do
39
- DatabaseCleaner.clean_with(:truncation)
40
- end
41
-
42
- config.before(:each) do
43
- DatabaseCleaner.strategy = :transaction
44
- DatabaseCleaner.start
45
- RailsMultitenant::GlobalContextRegistry.new_registry
46
- Organization.current_id = Organization.create!.id
47
- end
48
-
49
- config.after(:each) do
50
- DatabaseCleaner.clean
51
- end
52
- end
53
-
54
- puts "Testing with Ruby #{RUBY_VERSION} and ActiveRecord #{ActiveRecord::VERSION::STRING}"