activerecord-multi-tenant 2.1.5 → 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 +9 -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 +6 -3
- data/lib/activerecord-multi-tenant/multi_tenant.rb +3 -3
- 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,14 @@
|
|
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
|
+
|
9
|
+
## 2.1.6 2022-11-23
|
10
|
+
* Fix undefined wrap_methods error & wrap_methods version check [#170](https://github.com/citusdata/activerecord-multi-tenant/pull/170)
|
11
|
+
|
3
12
|
## 2.1.5 2022-11-20
|
4
13
|
* Fix `MultiTenant.without` codegen bug in Rails 6.1+ [#168](https://github.com/citusdata/activerecord-multi-tenant/pull/168)
|
5
14
|
|
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
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative './multi_tenant'
|
2
|
+
|
1
3
|
module MultiTenant
|
2
4
|
module ModelExtensionsClassMethods
|
3
5
|
DEFAULT_ID_FIELD = 'id'.freeze
|
@@ -73,7 +75,6 @@ module MultiTenant
|
|
73
75
|
# Rails 5 `attribute_will_change!` uses the attribute-method-call rather than `read_attribute`
|
74
76
|
# and will raise ActiveModel::MissingAttributeError if that column was not selected.
|
75
77
|
# This is rescued as NoMethodError and in MRI attribute_was is assigned an arbitrary Object
|
76
|
-
# This is still true after the Rails 5.2 refactor
|
77
78
|
was = send("#{partition_key}_was")
|
78
79
|
was_nil_or_skipped = was.nil? || was.class == Object
|
79
80
|
|
@@ -100,7 +101,8 @@ module MultiTenant
|
|
100
101
|
include to_include
|
101
102
|
|
102
103
|
around_save -> (record, block) {
|
103
|
-
|
104
|
+
record_tenant = record.attribute_was(partition_key)
|
105
|
+
if persisted? && MultiTenant.current_tenant_id.nil? && !record_tenant.nil?
|
104
106
|
MultiTenant.with(record.public_send(partition_key)) { block.call }
|
105
107
|
else
|
106
108
|
block.call
|
@@ -108,7 +110,8 @@ module MultiTenant
|
|
108
110
|
}
|
109
111
|
|
110
112
|
around_update -> (record, block) {
|
111
|
-
|
113
|
+
record_tenant = record.attribute_was(partition_key)
|
114
|
+
if MultiTenant.current_tenant_id.nil? && !record_tenant.nil?
|
112
115
|
MultiTenant.with(record.public_send(partition_key)) { block.call }
|
113
116
|
else
|
114
117
|
block.call
|
@@ -110,14 +110,14 @@ module MultiTenant
|
|
110
110
|
end
|
111
111
|
|
112
112
|
# Wrap calls to any of `method_names` on an instance Class `klass` with MultiTenant.with when `'owner'` (evaluated in context of the klass instance) is a ActiveRecord model instance that is multi-tenant
|
113
|
-
if Gem::Version.create(RUBY_VERSION) < Gem::Version.new(
|
113
|
+
if Gem::Version.create(RUBY_VERSION) < Gem::Version.new('3.0.0')
|
114
114
|
def self.wrap_methods(klass, owner, *method_names)
|
115
115
|
method_names.each do |method_name|
|
116
116
|
original_method_name = :"_mt_original_#{method_name}"
|
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: "../"
|