activerecord-multi-tenant 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -70,6 +70,47 @@ describe MultiTenant do
70
70
  it { expect(@partition_key_not_model_task.non_model_id).to be 77 }
71
71
  end
72
72
 
73
+ describe 'Changes table_name after multi_tenant called' do
74
+ before do
75
+ account_klass.has_many(:posts, anonymous_class: post_klass)
76
+ post_klass.belongs_to(:account, anonymous_class: account_klass)
77
+
78
+ @account1 = account_klass.create! name: 'foo'
79
+ @account2 = account_klass.create! name: 'bar'
80
+
81
+ @post1 = @account1.posts.create! name: 'foobar'
82
+ @post2 = @account2.posts.create! name: 'baz'
83
+
84
+ MultiTenant.current_tenant = @account1
85
+ @posts = post_klass.all
86
+ end
87
+
88
+ let(:account_klass) do
89
+ Class.new(Account) do
90
+ def self.name
91
+ 'Account'
92
+ end
93
+ end
94
+ end
95
+
96
+ let(:post_klass) do
97
+ Class.new(ActiveRecord::Base) do
98
+ self.table_name = 'unknown'
99
+
100
+ multi_tenant(:account)
101
+
102
+ self.table_name = 'posts'
103
+
104
+ def self.name
105
+ 'Post'
106
+ end
107
+ end
108
+ end
109
+
110
+ it { expect(@posts.length).to eq(1) }
111
+ it { expect(@posts).to eq([@post1]) }
112
+ end
113
+
73
114
  # Scoping models
74
115
  describe 'Project.all should be scoped to the current tenant if set' do
75
116
  before do
@@ -144,6 +185,16 @@ describe MultiTenant do
144
185
  end
145
186
  end
146
187
 
188
+ it 'handles belongs_to with optional: true' do
189
+ MultiTenant.with(account) do
190
+ sub_task
191
+ end
192
+
193
+ record = sub_task.optional_sub_tasks.create!
194
+ expect(record.reload.sub_task).to eq(sub_task)
195
+ expect(record.account_id).to eq(nil)
196
+ end
197
+
147
198
  it 'handles has_many through' do
148
199
  MultiTenant.with(account) do
149
200
  expect(project.sub_tasks).to eq [sub_task]
@@ -348,9 +399,12 @@ describe MultiTenant do
348
399
  end
349
400
 
350
401
  it "applies the team_id conditions in the where clause" do
351
- expected_sql = <<-sql
352
- SELECT "sub_tasks".* FROM "sub_tasks" INNER JOIN "tasks" ON "sub_tasks"."task_id" = "tasks"."id" AND "sub_tasks"."account_id" = "tasks"."account_id" WHERE "tasks"."account_id" = 1 AND "sub_tasks"."account_id" = 1 AND "tasks"."project_id" = 1
353
- sql
402
+ option1 = <<-sql.strip
403
+ SELECT "sub_tasks".* FROM "sub_tasks" INNER JOIN "tasks" ON "sub_tasks"."task_id" = "tasks"."id" AND "sub_tasks"."account_id" = "tasks"."account_id" WHERE "tasks"."project_id" = 1 AND "sub_tasks"."account_id" = 1 AND "tasks"."account_id" = 1
404
+ sql
405
+ option2 = <<-sql.strip
406
+ SELECT "sub_tasks".* FROM "sub_tasks" INNER JOIN "tasks" ON "sub_tasks"."task_id" = "tasks"."id" AND "sub_tasks"."account_id" = "tasks"."account_id" WHERE "sub_tasks"."account_id" = 1 AND "tasks"."project_id" = 1 AND "tasks"."account_id" = 1
407
+ sql
354
408
 
355
409
  account1 = Account.create! name: 'Account 1'
356
410
 
@@ -358,7 +412,7 @@ describe MultiTenant do
358
412
  project1 = Project.create! name: 'Project 1'
359
413
  task1 = Task.create! name: 'Task 1', project: project1
360
414
  subtask1 = SubTask.create! task: task1
361
- expect(project1.sub_tasks.to_sql).to eq(expected_sql.strip)
415
+ expect(project1.sub_tasks.to_sql).to eq(option1).or(eq(option2))
362
416
  expect(project1.sub_tasks).to include(subtask1)
363
417
  end
364
418
 
@@ -373,9 +427,13 @@ describe MultiTenant do
373
427
  end
374
428
 
375
429
  it "tests joins between distributed and reference table" do
376
- expected_sql = <<-sql
377
- SELECT "categories".* FROM "categories" INNER JOIN "project_categories" ON "categories"."id" = "project_categories"."category_id" WHERE "project_categories"."account_id" = 1 AND "project_categories"."project_id" = 1
378
- sql
430
+ option1 = <<-sql.strip
431
+ SELECT "categories".* FROM "categories" INNER JOIN "project_categories" ON "categories"."id" = "project_categories"."category_id" WHERE "project_categories"."project_id" = 1 AND "project_categories"."account_id" = 1
432
+ sql
433
+ option2 = <<-sql.strip
434
+ SELECT "categories".* FROM "categories" INNER JOIN "project_categories" ON "categories"."id" = "project_categories"."category_id" WHERE "project_categories"."account_id" = 1 AND "project_categories"."project_id" = 1
435
+ sql
436
+
379
437
  account1 = Account.create! name: 'Account 1'
380
438
  category1 = Category.create! name: 'Category 1'
381
439
 
@@ -383,7 +441,7 @@ describe MultiTenant do
383
441
  project1 = Project.create! name: 'Project 1'
384
442
  projectcategory = ProjectCategory.create! name: 'project cat 1', project: project1, category: category1
385
443
 
386
- expect(project1.categories.to_sql).to eq(expected_sql.strip)
444
+ expect(project1.categories.to_sql).to eq(option1).or(eq(option2))
387
445
  expect(project1.categories).to include(category1)
388
446
  expect(project1.project_categories).to include(projectcategory)
389
447
  end
@@ -412,21 +470,18 @@ describe MultiTenant do
412
470
  account1 = Account.create! name: 'Account 1'
413
471
  category1 = Category.create! name: 'Category 1'
414
472
 
415
- expected_sql = if uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 5
416
- <<-sql
417
- SELECT "projects"."id" AS t0_r0, "projects"."account_id" AS t0_r1, "projects"."name" AS t0_r2, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1 FROM "projects" LEFT OUTER JOIN "project_categories" ON "project_categories"."project_id" = "projects"."id" AND "project_categories"."account_id" = 1 AND "projects"."account_id" = 1 LEFT OUTER JOIN "categories" ON "categories"."id" = "project_categories"."category_id" AND "project_categories"."account_id" = 1 WHERE "projects"."account_id" = 1
418
- sql
419
- else
420
- <<-sql
421
- SELECT "projects"."id" AS t0_r0, "projects"."account_id" AS t0_r1, "projects"."name" AS t0_r2, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1 FROM "projects" LEFT OUTER JOIN "project_categories" ON "project_categories"."account_id" = 1 AND "project_categories"."project_id" = "projects"."id" AND "projects"."account_id" = 1 LEFT OUTER JOIN "categories" ON "categories"."id" = "project_categories"."category_id" AND "project_categories"."account_id" = 1 WHERE "projects"."account_id" = 1
422
- sql
423
- end
473
+ option1 = <<-sql.strip
474
+ SELECT "projects"."id" AS t0_r0, "projects"."account_id" AS t0_r1, "projects"."name" AS t0_r2, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1 FROM "projects" LEFT OUTER JOIN "project_categories" ON "project_categories"."project_id" = "projects"."id" AND "project_categories"."account_id" = 1 AND "projects"."account_id" = 1 LEFT OUTER JOIN "categories" ON "categories"."id" = "project_categories"."category_id" AND "project_categories"."account_id" = 1 WHERE "projects"."account_id" = 1
475
+ sql
476
+ option2 = <<-sql.strip
477
+ SELECT "projects"."id" AS t0_r0, "projects"."account_id" AS t0_r1, "projects"."name" AS t0_r2, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1 FROM "projects" LEFT OUTER JOIN "project_categories" ON "project_categories"."account_id" = 1 AND "project_categories"."project_id" = "projects"."id" AND "projects"."account_id" = 1 LEFT OUTER JOIN "categories" ON "categories"."id" = "project_categories"."category_id" AND "project_categories"."account_id" = 1 WHERE "projects"."account_id" = 1
478
+ sql
424
479
 
425
480
  MultiTenant.with(account1) do
426
481
  project1 = Project.create! name: 'Project 1'
427
482
  projectcategory = ProjectCategory.create! name: 'project cat 1', project: project1, category: category1
428
483
 
429
- expect(Project.eager_load(:categories).to_sql).to eq(expected_sql.strip)
484
+ expect(Project.eager_load(:categories).to_sql).to eq(option1).or(eq(option2))
430
485
 
431
486
  project = Project.eager_load(:categories).first
432
487
  expect(project.categories).to include(category1)
@@ -451,21 +506,18 @@ describe MultiTenant do
451
506
  category1 = Category.create! name: 'Category 1'
452
507
 
453
508
  MultiTenant.with(account1) do
454
- expected_sql = if uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 5
455
- <<-sql
456
- SELECT "tasks".* FROM "tasks" INNER JOIN "projects" ON "projects"."id" = "tasks"."project_id" AND "projects"."account_id" = 1 LEFT JOIN project_categories pc ON project.category_id = pc.id WHERE "tasks"."account_id" = 1
457
- sql
458
- else
459
- <<-sql
460
- SELECT "tasks".* FROM "tasks" INNER JOIN "projects" ON "projects"."account_id" = 1 AND "projects"."id" = "tasks"."project_id" LEFT JOIN project_categories pc ON project.category_id = pc.id WHERE "tasks"."account_id" = 1
461
- sql
462
- end
509
+ option1 = <<-sql.strip
510
+ SELECT "tasks".* FROM "tasks" INNER JOIN "projects" ON "projects"."id" = "tasks"."project_id" AND "projects"."account_id" = 1 LEFT JOIN project_categories pc ON project.category_id = pc.id WHERE "tasks"."account_id" = 1
511
+ sql
512
+ option2 = <<-sql.strip
513
+ SELECT "tasks".* FROM "tasks" INNER JOIN "projects" ON "projects"."account_id" = 1 AND "projects"."id" = "tasks"."project_id" LEFT JOIN project_categories pc ON project.category_id = pc.id WHERE "tasks"."account_id" = 1
514
+ sql
463
515
 
464
516
  project1 = Project.create! name: 'Project 1'
465
517
  projectcategory = ProjectCategory.create! name: 'project cat 1', project: project1, category: category1
466
518
 
467
519
  project1.tasks.create! name: 'baz'
468
- expect(Task.joins(:project).joins('LEFT JOIN project_categories pc ON project.category_id = pc.id').to_sql).to eq(expected_sql.strip)
520
+ expect(Task.joins(:project).joins('LEFT JOIN project_categories pc ON project.category_id = pc.id').to_sql).to eq(option1).or(eq(option2))
469
521
  end
470
522
 
471
523
  MultiTenant.without do
@@ -485,32 +537,39 @@ describe MultiTenant do
485
537
  project2 = Project.create! name: 'Project 2', account: Account.create!(name: 'Account2')
486
538
 
487
539
  MultiTenant.with(account) do
488
- expected_sql = if uses_prepared_statements? && ActiveRecord::VERSION::MAJOR > 5
489
- <<-sql.strip
490
- SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = $1 LIMIT $2
491
- sql
492
- else
493
- <<-sql.strip
494
- SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = $1 LIMIT $2
495
- sql
496
- end
497
-
498
- expect(Project).to receive(:find_by_sql).with(expected_sql, any_args).and_call_original
540
+ option1 = <<-sql.strip
541
+ SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = $1 LIMIT $2
542
+ sql
543
+ option2 = <<-sql.strip
544
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 AND "projects"."account_id" = #{account.id} LIMIT $2
545
+ sql
546
+ option3 = <<-sql.strip
547
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 AND "projects"."account_id" = #{account.id} LIMIT $2
548
+ sql
549
+
550
+ # Couldn't make the following line pass for some reason, so came up with an uglier alternative
551
+ # expect(Project).to receive(:find_by_sql).with(eq(option1).or(eq(option2)).or(eq(option3)), any_args).and_call_original
552
+ expect(Project).to receive(:find_by_sql).and_wrap_original do |m, *args|
553
+ expect(args[0]).to(eq(option1).or(eq(option2)).or(eq(option3)))
554
+ m.call(args[0], args[1], preparable:args[2][:preparable])
555
+ end
499
556
  expect(Project.find(project.id)).to eq(project)
500
557
  end
501
558
 
502
559
  MultiTenant.without do
503
- expected_sql = if uses_prepared_statements? && ActiveRecord::VERSION::MAJOR > 5
504
- <<-sql.strip
505
- SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
506
- sql
507
- else
508
- <<-sql.strip
509
- SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
510
- sql
511
- end
512
-
513
- expect(Project).to receive(:find_by_sql).with(expected_sql, any_args).and_call_original
560
+ option1 = <<-sql.strip
561
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
562
+ sql
563
+ option2 = <<-sql.strip
564
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
565
+ sql
566
+
567
+ # Couldn't make the following line pass for some reason, so came up with an uglier alternative
568
+ # expect(Project).to receive(:find_by_sql).with(eq(option1).or(eq(option2)), any_args).and_call_original
569
+ expect(Project).to receive(:find_by_sql).and_wrap_original do |m, *args|
570
+ expect(args[0]).to(eq(option1).or(eq(option2)))
571
+ m.call(args[0], args[1], preparable:args[2][:preparable])
572
+ end
514
573
  expect(Project.find(project2.id)).to eq(project2)
515
574
  end
516
575
  end
@@ -98,4 +98,21 @@ describe "Query Rewriter" do
98
98
  }.not_to raise_error
99
99
  end
100
100
  end
101
+
102
+ context "when joining with a model with a default scope" do
103
+ let!(:account) { Account.create!(name: "Test Account") }
104
+
105
+ it "fetches only records within the default scope" do
106
+ alive = Domain.create(name: "alive", account: account)
107
+ deleted = Domain.create(name: "deleted", deleted: true, account: account)
108
+ page_in_alive_domain = Page.create(name: "alive", account: account, domain: alive)
109
+ page_in_deleted_domain = Page.create(name: "deleted", account: account, domain: deleted)
110
+
111
+ expect(
112
+ MultiTenant.with(account) do
113
+ Page.joins(:domain).pluck(:id)
114
+ end
115
+ ).to eq([page_in_alive_domain.id])
116
+ end
117
+ end
101
118
  end
@@ -59,4 +59,40 @@ describe MultiTenant, 'Record finding' do
59
59
  expect(second_found).to eq(second_record)
60
60
  end
61
61
  end
62
+
63
+ context 'model with has_many relation through multi-tenant model' do
64
+ let(:tenant_1) { Account.create! name: 'Tenant 1' }
65
+ let(:project_1) { tenant_1.projects.create! }
66
+
67
+ let(:tenant_2) { Account.create! name: 'Tenant 2' }
68
+ let(:project_2) { tenant_2.projects.create! }
69
+
70
+ let(:category) { Category.create! name: 'Category' }
71
+
72
+ before do
73
+ ProjectCategory.create! account: tenant_1, name: '1', project: project_1, category: category
74
+ ProjectCategory.create! account: tenant_2, name: '2', project: project_2, category: category
75
+ end
76
+
77
+ it 'can get model without creating query cache' do
78
+ MultiTenant.with(tenant_1) do
79
+ found_category = Project.find(project_1.id).categories.to_a.first
80
+ expect(found_category).to eq(category)
81
+ end
82
+ end
83
+
84
+ it 'can get model for other tenant' do
85
+ MultiTenant.with(tenant_2) do
86
+ found_category = Project.find(project_2.id).categories.to_a.first
87
+ expect(found_category).to eq(category)
88
+ end
89
+ end
90
+
91
+ it 'can get model without current_tenant' do
92
+ MultiTenant.without do
93
+ found_category = Project.find(project_2.id).categories.to_a.first
94
+ expect(found_category).to eq(category)
95
+ end
96
+ end
97
+ end
62
98
  end
@@ -5,6 +5,9 @@ require 'activerecord-multi-tenant/sidekiq'
5
5
  describe MultiTenant, 'Sidekiq' do
6
6
  let(:server) { Sidekiq::Middleware::MultiTenant::Server.new }
7
7
  let(:account) { Account.create(name: 'test') }
8
+ let(:deleted_acount) { Account.create(name: 'deleted') }
9
+
10
+ before { deleted_acount.destroy! }
8
11
 
9
12
  describe 'server middleware' do
10
13
  it 'sets the multitenant context when provided in message' do
@@ -15,6 +18,14 @@ describe MultiTenant, 'Sidekiq' do
15
18
  end
16
19
  end
17
20
 
21
+ it 'sets the multitenant context (id) even if tenant not found' do
22
+ server.call(double,{'bogus' => 'message',
23
+ 'multi_tenant' => { 'class' => deleted_acount.class.name, 'id' => deleted_acount.id}},
24
+ 'bogus_queue') do
25
+ expect(MultiTenant.current_tenant).to eq(deleted_acount.id)
26
+ end
27
+ end
28
+
18
29
  it 'does not set the multitenant context when no tenant provided' do
19
30
  server.call(double, {'bogus' => 'message'}, 'bogus_queue') do
20
31
  expect(MultiTenant.current_tenant).to be_nil
data/spec/schema.rb CHANGED
@@ -34,6 +34,13 @@ ARGV.grep(/\w+_spec\.rb/).empty? && ActiveRecord::Schema.define(version: 1) do
34
34
  t.column :type, :string
35
35
  end
36
36
 
37
+ create_table :optional_sub_tasks, force: true do |t|
38
+ t.references :account, :integer
39
+ t.column :sub_task_id, :integer
40
+ t.column :name, :string
41
+ t.column :type, :string
42
+ end
43
+
37
44
  create_table :countries, force: true do |t|
38
45
  t.column :name, :string
39
46
  end
@@ -89,10 +96,26 @@ ARGV.grep(/\w+_spec\.rb/).empty? && ActiveRecord::Schema.define(version: 1) do
89
96
  t.column :category_id, :integer
90
97
  end
91
98
 
92
-
93
99
  create_table :allowed_places, force: true, id: false do |t|
94
- t.string :account_id, :integer
95
- t.string :name, :string
100
+ t.string :account_id, :integer
101
+ t.string :name, :string
102
+ end
103
+
104
+ create_table :domains, force: true, partition_key: :account_id do |t|
105
+ t.column :account_id, :integer
106
+ t.column :name, :string
107
+ t.column :deleted, :boolean, default: false
108
+ end
109
+
110
+ create_table :pages, force: true, partition_key: :account_id do |t|
111
+ t.column :account_id, :integer
112
+ t.column :name, :string
113
+ t.column :domain_id, :integer
114
+ end
115
+
116
+ create_table :posts, force: true, partition_key: :account_id do |t|
117
+ t.column :account_id, :integer
118
+ t.column :name, :string
96
119
  end
97
120
 
98
121
  create_distributed_table :accounts, :id
@@ -108,6 +131,9 @@ ARGV.grep(/\w+_spec\.rb/).empty? && ActiveRecord::Schema.define(version: 1) do
108
131
  create_distributed_table :uuid_records, :organization_id
109
132
  create_distributed_table :project_categories, :account_id
110
133
  create_distributed_table :allowed_places, :account_id
134
+ create_distributed_table :domains, :account_id
135
+ create_distributed_table :pages, :account_id
136
+ create_distributed_table :posts, :account_id
111
137
  create_reference_table :categories
112
138
  end
113
139
 
@@ -115,6 +141,7 @@ class Account < ActiveRecord::Base
115
141
  multi_tenant :account
116
142
  has_many :projects
117
143
  has_one :manager, inverse_of: :account
144
+ has_many :optional_sub_tasks
118
145
  end
119
146
 
120
147
  class Project < ActiveRecord::Base
@@ -146,6 +173,15 @@ class SubTask < ActiveRecord::Base
146
173
  multi_tenant :account
147
174
  belongs_to :task
148
175
  has_one :project, through: :task
176
+ has_many :optional_sub_tasks
177
+ end
178
+
179
+ with_belongs_to_required_by_default do
180
+ class OptionalSubTask < ActiveRecord::Base
181
+ multi_tenant :account, optional: true
182
+ belongs_to :account, optional: true
183
+ belongs_to :sub_task
184
+ end
149
185
  end
150
186
 
151
187
  class StiSubTask < SubTask
@@ -185,6 +221,7 @@ class Comment < ActiveRecord::Base
185
221
  end
186
222
 
187
223
  class Organization < ActiveRecord::Base
224
+ multi_tenant :organization
188
225
  has_many :uuid_records
189
226
  end
190
227
 
@@ -204,7 +241,17 @@ class ProjectCategory < ActiveRecord::Base
204
241
  belongs_to :account
205
242
  end
206
243
 
207
-
208
244
  class AllowedPlace < ActiveRecord::Base
209
245
  multi_tenant :account
210
246
  end
247
+
248
+ class Domain < ActiveRecord::Base
249
+ multi_tenant :account
250
+ has_many :pages
251
+ default_scope { where(deleted: false) }
252
+ end
253
+
254
+ class Page < ActiveRecord::Base
255
+ multi_tenant :account
256
+ belongs_to :domain
257
+ end
data/spec/spec_helper.rb CHANGED
@@ -46,4 +46,11 @@ def uses_prepared_statements?
46
46
  ActiveRecord::Base.connection.prepared_statements
47
47
  end
48
48
 
49
+ def with_belongs_to_required_by_default(&block)
50
+ default_value = ActiveRecord::Base.belongs_to_required_by_default
51
+ ActiveRecord::Base.belongs_to_required_by_default = true
52
+ yield
53
+ ensure
54
+ ActiveRecord::Base.belongs_to_required_by_default = default_value
55
+ end
49
56
  require 'schema'
metadata CHANGED
@@ -1,43 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-multi-tenant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.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: 2020-08-06 00:00:00.000000000 Z
11
+ date: 2022-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: request_store
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 1.0.5
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 1.0.5
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rails
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - ">="
32
18
  - !ruby/object:Gem::Version
33
- version: '4.2'
19
+ version: '5.2'
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - ">="
39
25
  - !ruby/object:Gem::Version
40
- version: '4.2'
26
+ version: '5.2'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rspec
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -156,27 +142,30 @@ executables: []
156
142
  extensions: []
157
143
  extra_rdoc_files: []
158
144
  files:
145
+ - ".github/workflows/CI.yml"
159
146
  - ".gitignore"
160
- - ".travis.yml"
147
+ - ".rspec"
161
148
  - Appraisals
162
149
  - CHANGELOG.md
163
150
  - Gemfile
164
- - Gemfile.lock
165
151
  - LICENSE
166
152
  - README.md
167
153
  - Rakefile
168
154
  - activerecord-multi-tenant.gemspec
169
155
  - docker-compose.yml
170
156
  - gemfiles/.bundle/config
157
+ - gemfiles/active_record_5.2.3.gemfile
171
158
  - gemfiles/active_record_5.2.gemfile
172
- - gemfiles/active_record_5.2.gemfile.lock
173
159
  - gemfiles/active_record_6.0.gemfile
174
- - gemfiles/active_record_6.0.gemfile.lock
160
+ - gemfiles/active_record_6.1.gemfile
161
+ - gemfiles/active_record_7.0.gemfile
162
+ - gemfiles/rails_5.2.3.gemfile
175
163
  - gemfiles/rails_5.2.gemfile
176
- - gemfiles/rails_5.2.gemfile.lock
177
164
  - gemfiles/rails_6.0.gemfile
178
- - gemfiles/rails_6.0.gemfile.lock
165
+ - gemfiles/rails_6.1.gemfile
166
+ - gemfiles/rails_7.0.gemfile
179
167
  - lib/activerecord-multi-tenant.rb
168
+ - lib/activerecord-multi-tenant/arel_visitors_depth_first.rb
180
169
  - lib/activerecord-multi-tenant/controller_extensions.rb
181
170
  - lib/activerecord-multi-tenant/copy_from_client.rb
182
171
  - lib/activerecord-multi-tenant/fast_truncate.rb
@@ -221,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
210
  - !ruby/object:Gem::Version
222
211
  version: '0'
223
212
  requirements: []
224
- rubygems_version: 3.1.2
213
+ rubygems_version: 3.2.32
225
214
  signing_key:
226
215
  specification_version: 4
227
216
  summary: ActiveRecord/Rails integration for multi-tenant databases, in particular
data/.travis.yml DELETED
@@ -1,32 +0,0 @@
1
- sudo: required
2
- cache: bundler
3
-
4
- language: ruby
5
-
6
- rvm:
7
- - 2.5.8
8
- - 2.6.4
9
- - 2.7.1
10
-
11
- gemfile:
12
- - gemfiles/rails_5.2.gemfile
13
- - gemfiles/rails_6.0.gemfile
14
- - gemfiles/active_record_5.2.gemfile
15
- - gemfiles/active_record_6.0.gemfile
16
-
17
- env:
18
- - PREPARED_STATEMENTS=0
19
- - PREPARED_STATEMENTS=1
20
-
21
- matrix:
22
- fast_finish: true
23
-
24
- services:
25
- - docker
26
-
27
- before_install:
28
- - docker-compose up -d
29
- - gem install bundler -v 2.1.4
30
-
31
- script:
32
- - bundle exec rake spec