activerecord-multi-tenant 2.1.6 → 2.2.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/.github/workflows/CI.yml +0 -16
- data/Appraisals +0 -24
- data/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/activerecord-multi-tenant.gemspec +1 -1
- data/lib/activerecord-multi-tenant/migrations.rb +1 -1
- data/lib/activerecord-multi-tenant/model_extensions.rb +4 -3
- data/lib/activerecord-multi-tenant/multi_tenant.rb +2 -2
- data/lib/activerecord-multi-tenant/version.rb +1 -1
- data/spec/activerecord-multi-tenant/model_extensions_spec.rb +10 -0
- metadata +4 -6
- data/gemfiles/active_record_5.2.gemfile +0 -16
- data/gemfiles/rails_5.2.gemfile +0 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 15ad19bf20781129dc1bd57d4e4b8eb8731044cea3b89f29a62789d0f5a45aee
|
|
4
|
+
data.tar.gz: 0f76290b00a7d540495972ab5a9de09d3abbb1dde11758d58b08493bf743b5da
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 17f7b912ecc314e5462affd74daf2e1b79239f8f65bfa30c8896f4acb9e1d787c240aeefe8cb09045b34ab2772d46aab4c42bb8cdb3374df247f1131a08758d0
|
|
7
|
+
data.tar.gz: 713df8fdefb6cd50b2c02408a9763da39e532b957d176fe5a8a6e1fbe265d2cf79457ae4d196d0e6ddfdf8effe0ca370c0297ea7186a5ce145717e4a93772be1
|
data/.github/workflows/CI.yml
CHANGED
|
@@ -13,40 +13,24 @@ jobs:
|
|
|
13
13
|
fail-fast: false
|
|
14
14
|
matrix:
|
|
15
15
|
ruby:
|
|
16
|
-
- '2.5'
|
|
17
16
|
- '2.6'
|
|
18
17
|
- '2.7'
|
|
19
18
|
- '3.0'
|
|
20
19
|
- '3.1'
|
|
21
20
|
gemfile:
|
|
22
|
-
- rails_5.2
|
|
23
21
|
- rails_6.0
|
|
24
22
|
- rails_6.1
|
|
25
23
|
- rails_7.0
|
|
26
|
-
- active_record_5.2
|
|
27
24
|
- active_record_6.0
|
|
28
25
|
- active_record_6.1
|
|
29
26
|
- active_record_7.0
|
|
30
27
|
prepared_statements: [true, false]
|
|
31
28
|
exclude:
|
|
32
29
|
# activesupport-7.0.0 requires ruby version >= 2.7.0
|
|
33
|
-
- ruby: '2.5'
|
|
34
|
-
gemfile: 'rails_7.0'
|
|
35
|
-
- ruby: '2.5'
|
|
36
|
-
gemfile: 'active_record_7.0'
|
|
37
30
|
- ruby: '2.6'
|
|
38
31
|
gemfile: 'rails_7.0'
|
|
39
32
|
- ruby: '2.6'
|
|
40
33
|
gemfile: 'active_record_7.0'
|
|
41
|
-
# ruby >3 and activesupport 5.2 are not compatible
|
|
42
|
-
- ruby: '3.0'
|
|
43
|
-
gemfile: 'rails_5.2'
|
|
44
|
-
- ruby: '3.0'
|
|
45
|
-
gemfile: 'active_record_5.2'
|
|
46
|
-
- ruby: '3.1'
|
|
47
|
-
gemfile: 'rails_5.2'
|
|
48
|
-
- ruby: '3.1'
|
|
49
|
-
gemfile: 'active_record_5.2'
|
|
50
34
|
name: Ruby ${{ matrix.ruby }} / ${{ matrix.gemfile }} ${{ (matrix.prepared_statements && 'w/ prepared statements') || '' }}
|
|
51
35
|
env:
|
|
52
36
|
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
|
data/Appraisals
CHANGED
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
appraise 'rails-5.2' do
|
|
2
|
-
gem 'rails', '~> 5.2.0'
|
|
3
|
-
gem 'i18n', '~> 0.9.5'
|
|
4
|
-
gem 'nokogiri', '~> 1.7.1'
|
|
5
|
-
gem 'nio4r', '~> 2.3.1'
|
|
6
|
-
gem 'sprockets', '~> 3.7.1'
|
|
7
|
-
gem 'byebug', '~> 11.0'
|
|
8
|
-
gem 'rake', '12.0.0'
|
|
9
|
-
gem 'redis', '3.3.3'
|
|
10
|
-
gem 'pry-byebug', '3.9.0'
|
|
11
|
-
end
|
|
12
|
-
|
|
13
1
|
appraise 'rails-6.0' do
|
|
14
2
|
gem 'rails', '~> 6.0.3'
|
|
15
3
|
end
|
|
@@ -22,18 +10,6 @@ appraise 'rails-7.0' do
|
|
|
22
10
|
gem 'rails', '~> 7.0.0'
|
|
23
11
|
end
|
|
24
12
|
|
|
25
|
-
appraise 'active-record-5.2' do
|
|
26
|
-
gem 'activerecord', '~> 5.2.0'
|
|
27
|
-
gem 'i18n', '~> 0.9.5'
|
|
28
|
-
gem 'nokogiri', '~> 1.7.1'
|
|
29
|
-
gem 'nio4r', '~> 2.3.1'
|
|
30
|
-
gem 'sprockets', '~> 3.7.1'
|
|
31
|
-
gem 'byebug', '~> 11.0'
|
|
32
|
-
gem 'rake', '12.0.0'
|
|
33
|
-
gem 'redis', '3.3.3'
|
|
34
|
-
gem 'pry-byebug', '3.9.0'
|
|
35
|
-
end
|
|
36
|
-
|
|
37
13
|
appraise 'active-record-6.0' do
|
|
38
14
|
gem 'activerecord', '~> 6.0.3'
|
|
39
15
|
end
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.2.0 2022-12-06
|
|
4
|
+
* Handle changing tenant from `nil` to a value [#173](https://github.com/citusdata/activerecord-multi-tenant/pull/173)
|
|
5
|
+
* Allow Partitioned tables to be created without a primary key [#172](https://github.com/citusdata/activerecord-multi-tenant/pull/172)
|
|
6
|
+
* Only attempt to reload with MultiTenant when parition_key is present [#175](https://github.com/citusdata/activerecord-multi-tenant/pull/175)
|
|
7
|
+
* Remove support for Ruby 2.5 & ActiveRecord 5.2
|
|
8
|
+
|
|
3
9
|
## 2.1.6 2022-11-23
|
|
4
10
|
* Fix undefined wrap_methods error & wrap_methods version check [#170](https://github.com/citusdata/activerecord-multi-tenant/pull/170)
|
|
5
11
|
|
data/README.md
CHANGED
|
@@ -16,7 +16,7 @@ gem 'activerecord-multi-tenant'
|
|
|
16
16
|
|
|
17
17
|
## Supported Rails versions
|
|
18
18
|
|
|
19
|
-
All Ruby on Rails versions starting with
|
|
19
|
+
All Ruby on Rails versions starting with 6.0 or newer (up to 7.0) are supported.
|
|
20
20
|
|
|
21
21
|
This gem only supports ActiveRecord (the Rails default ORM), and not alternative ORMs like Sequel.
|
|
22
22
|
|
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
|
15
15
|
s.homepage = 'https://github.com/citusdata/activerecord-multi-tenant'
|
|
16
16
|
s.license = 'MIT'
|
|
17
17
|
|
|
18
|
-
s.add_dependency 'rails', '>=
|
|
18
|
+
s.add_dependency 'rails', '>= 6'
|
|
19
19
|
|
|
20
20
|
s.add_development_dependency 'rspec', '>= 3.0'
|
|
21
21
|
s.add_development_dependency 'rspec-rails'
|
|
@@ -71,7 +71,7 @@ module ActiveRecord
|
|
|
71
71
|
alias orig_create_table create_table
|
|
72
72
|
def create_table(table_name, options = {}, &block)
|
|
73
73
|
ret = orig_create_table(table_name, **options.except(:partition_key), &block)
|
|
74
|
-
if options[:partition_key] && options[:partition_key].to_s != 'id'
|
|
74
|
+
if options[:id] != false && options[:partition_key] && options[:partition_key].to_s != 'id'
|
|
75
75
|
execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{table_name}_pkey"
|
|
76
76
|
execute "ALTER TABLE #{table_name} ADD PRIMARY KEY(\"#{options[:partition_key]}\", id)"
|
|
77
77
|
end
|
|
@@ -75,7 +75,6 @@ module MultiTenant
|
|
|
75
75
|
# Rails 5 `attribute_will_change!` uses the attribute-method-call rather than `read_attribute`
|
|
76
76
|
# and will raise ActiveModel::MissingAttributeError if that column was not selected.
|
|
77
77
|
# This is rescued as NoMethodError and in MRI attribute_was is assigned an arbitrary Object
|
|
78
|
-
# This is still true after the Rails 5.2 refactor
|
|
79
78
|
was = send("#{partition_key}_was")
|
|
80
79
|
was_nil_or_skipped = was.nil? || was.class == Object
|
|
81
80
|
|
|
@@ -102,7 +101,8 @@ module MultiTenant
|
|
|
102
101
|
include to_include
|
|
103
102
|
|
|
104
103
|
around_save -> (record, block) {
|
|
105
|
-
|
|
104
|
+
record_tenant = record.attribute_was(partition_key)
|
|
105
|
+
if persisted? && MultiTenant.current_tenant_id.nil? && !record_tenant.nil?
|
|
106
106
|
MultiTenant.with(record.public_send(partition_key)) { block.call }
|
|
107
107
|
else
|
|
108
108
|
block.call
|
|
@@ -110,7 +110,8 @@ module MultiTenant
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
around_update -> (record, block) {
|
|
113
|
-
|
|
113
|
+
record_tenant = record.attribute_was(partition_key)
|
|
114
|
+
if MultiTenant.current_tenant_id.nil? && !record_tenant.nil?
|
|
114
115
|
MultiTenant.with(record.public_send(partition_key)) { block.call }
|
|
115
116
|
else
|
|
116
117
|
block.call
|
|
@@ -117,7 +117,7 @@ module MultiTenant
|
|
|
117
117
|
klass.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
|
118
118
|
alias_method :#{original_method_name}, :#{method_name}
|
|
119
119
|
def #{method_name}(*args, &block)
|
|
120
|
-
if MultiTenant.multi_tenant_model_for_table(#{owner}.class.table_name).present? && #{owner}.persisted? && MultiTenant.current_tenant_id.nil?
|
|
120
|
+
if MultiTenant.multi_tenant_model_for_table(#{owner}.class.table_name).present? && #{owner}.persisted? && MultiTenant.current_tenant_id.nil? && #{owner}.class.respond_to?(:partition_key) && #{owner}.attributes.include?(#{owner}.class.partition_key)
|
|
121
121
|
MultiTenant.with(#{owner}.public_send(#{owner}.class.partition_key)) { #{original_method_name}(*args, &block) }
|
|
122
122
|
else
|
|
123
123
|
#{original_method_name}(*args, &block)
|
|
@@ -133,7 +133,7 @@ module MultiTenant
|
|
|
133
133
|
klass.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
|
134
134
|
alias_method :#{original_method_name}, :#{method_name}
|
|
135
135
|
def #{method_name}(...)
|
|
136
|
-
if MultiTenant.multi_tenant_model_for_table(#{owner}.class.table_name).present? && #{owner}.persisted? && MultiTenant.current_tenant_id.nil?
|
|
136
|
+
if MultiTenant.multi_tenant_model_for_table(#{owner}.class.table_name).present? && #{owner}.persisted? && MultiTenant.current_tenant_id.nil? && #{owner}.class.respond_to?(:partition_key) && #{owner}.attributes.include?(#{owner}.class.partition_key)
|
|
137
137
|
MultiTenant.with(#{owner}.public_send(#{owner}.class.partition_key)) { #{original_method_name}(...) }
|
|
138
138
|
else
|
|
139
139
|
#{original_method_name}(...)
|
|
@@ -209,6 +209,16 @@ describe MultiTenant do
|
|
|
209
209
|
expect(record.account_id).to eq(nil)
|
|
210
210
|
end
|
|
211
211
|
|
|
212
|
+
it 'handles changing tenant from nil to a value' do
|
|
213
|
+
record = OptionalSubTask.create(sub_task_id: sub_task.id)
|
|
214
|
+
expect(record.reload.sub_task).to eq(sub_task)
|
|
215
|
+
expect(record.account_id).to eq(nil)
|
|
216
|
+
|
|
217
|
+
record.account = account
|
|
218
|
+
record.save!
|
|
219
|
+
expect(record.reload.account_id).to eq(account.id)
|
|
220
|
+
end
|
|
221
|
+
|
|
212
222
|
it 'handles has_many through' do
|
|
213
223
|
MultiTenant.with(account) do
|
|
214
224
|
expect(project.sub_tasks).to eq [sub_task]
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: activerecord-multi-tenant
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Citus Data
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-12-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '6'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '6'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rspec
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -154,11 +154,9 @@ files:
|
|
|
154
154
|
- activerecord-multi-tenant.gemspec
|
|
155
155
|
- docker-compose.yml
|
|
156
156
|
- gemfiles/.bundle/config
|
|
157
|
-
- gemfiles/active_record_5.2.gemfile
|
|
158
157
|
- gemfiles/active_record_6.0.gemfile
|
|
159
158
|
- gemfiles/active_record_6.1.gemfile
|
|
160
159
|
- gemfiles/active_record_7.0.gemfile
|
|
161
|
-
- gemfiles/rails_5.2.gemfile
|
|
162
160
|
- gemfiles/rails_6.0.gemfile
|
|
163
161
|
- gemfiles/rails_6.1.gemfile
|
|
164
162
|
- gemfiles/rails_7.0.gemfile
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# This file was generated by Appraisal
|
|
2
|
-
|
|
3
|
-
source "https://rubygems.org"
|
|
4
|
-
|
|
5
|
-
gem "appraisal"
|
|
6
|
-
gem "activerecord", "~> 5.2.0"
|
|
7
|
-
gem "i18n", "~> 0.9.5"
|
|
8
|
-
gem "nokogiri", "~> 1.7.1"
|
|
9
|
-
gem "nio4r", "~> 2.3.1"
|
|
10
|
-
gem "sprockets", "~> 3.7.1"
|
|
11
|
-
gem "byebug", "~> 11.0"
|
|
12
|
-
gem "rake", "12.0.0"
|
|
13
|
-
gem "redis", "3.3.3"
|
|
14
|
-
gem "pry-byebug", "3.9.0"
|
|
15
|
-
|
|
16
|
-
gemspec path: "../"
|
data/gemfiles/rails_5.2.gemfile
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# This file was generated by Appraisal
|
|
2
|
-
|
|
3
|
-
source "https://rubygems.org"
|
|
4
|
-
|
|
5
|
-
gem "appraisal"
|
|
6
|
-
gem "rails", "~> 5.2.0"
|
|
7
|
-
gem "i18n", "~> 0.9.5"
|
|
8
|
-
gem "nokogiri", "~> 1.7.1"
|
|
9
|
-
gem "nio4r", "~> 2.3.1"
|
|
10
|
-
gem "sprockets", "~> 3.7.1"
|
|
11
|
-
gem "byebug", "~> 11.0"
|
|
12
|
-
gem "rake", "12.0.0"
|
|
13
|
-
gem "redis", "3.3.3"
|
|
14
|
-
gem "pry-byebug", "3.9.0"
|
|
15
|
-
|
|
16
|
-
gemspec path: "../"
|