activerecord-multi-tenant 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79f35cfc24d053c192a889fcb387c764cf2580e350aa8c7db5ff4ea84d3c44df
4
- data.tar.gz: 04bb2200ae11168efe55090482686b00e457f267696d110fec5669ae1e2c70fd
3
+ metadata.gz: fa2e595cc76e33a877613504121106791680118da0a0c4957ff1190e75e99c3a
4
+ data.tar.gz: 8a232e3431462d5b8b3972f0825664c210cc51729b2e94d08c5529851365d7f8
5
5
  SHA512:
6
- metadata.gz: 5b807cc7064efd06487fa8995f49cfbfdc7b15e5ccbc1e84510e0c742d6b14f8e7168145e6a520c8ea613735621b799dc6478ed8a749db68c7020ebe936b73b1
7
- data.tar.gz: 4e8aca6b32a413a54ecc900dc6e36ee57f06faf88504d4c4b210153456b5090aa8a2a660555c1587d1c1a06ae0126db3002e0cba0d0d935f0688f7bc84c9c362
6
+ metadata.gz: a2df2315ca041de29d2e82786a33904a9ac1dedd3f1ee4a2e470822cff977e9f4548ab0d33bd6eefec8055b9fc74ff8db2fdcf4c93cba4992aaaa681dcd1a695
7
+ data.tar.gz: 9da5eec93a1bcd33bff29ab1e0035022592802f512d27139608e92988a17365d3fe4cff0a73fc0f83e9513cea9dd2bf6233bb4deac9533320fb0884f7ef8b219
@@ -0,0 +1,63 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ ruby:
16
+ - '2.5'
17
+ - '2.6'
18
+ - '2.7'
19
+ - '3.0'
20
+ - '3.1'
21
+ gemfile:
22
+ - rails_5.2
23
+ - rails_6.0
24
+ - rails_6.1
25
+ - rails_7.0
26
+ - active_record_5.2
27
+ - active_record_6.0
28
+ - active_record_6.1
29
+ - active_record_7.0
30
+ prepared_statements: [true, false]
31
+ exclude:
32
+ # 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
+ - ruby: '2.6'
38
+ gemfile: 'rails_7.0'
39
+ - ruby: '2.6'
40
+ 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
+ name: Ruby ${{ matrix.ruby }} / ${{ matrix.gemfile }} ${{ (matrix.prepared_statements && 'w/ prepared statements') || '' }}
51
+ env:
52
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
53
+ PREPARED_STATEMENTS: ${{ matrix.prepared_statements && '1' }}
54
+ steps:
55
+ - uses: actions/checkout@v2
56
+ - run: |
57
+ docker-compose up -d
58
+ - uses: ruby/setup-ruby@v1
59
+ with:
60
+ ruby-version: ${{ matrix.ruby }}
61
+ bundler-cache: true
62
+ - run: |
63
+ bundle exec rake spec
data/.gitignore CHANGED
@@ -2,3 +2,5 @@ spec/debug.log
2
2
  pkg/
3
3
  *.rb#
4
4
  *.*~
5
+ Gemfile.lock
6
+ *.gemfile.lock
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --force-color
data/Appraisals CHANGED
@@ -18,6 +18,10 @@ appraise 'rails-6.1' do
18
18
  gem 'rails', '~> 6.1.0'
19
19
  end
20
20
 
21
+ appraise 'rails-7.0' do
22
+ gem 'rails', '~> 7.0.0'
23
+ end
24
+
21
25
  appraise 'active-record-5.2' do
22
26
  gem 'activerecord', '~> 5.2.0'
23
27
  gem 'i18n', '~> 0.9.5'
@@ -37,3 +41,7 @@ end
37
41
  appraise 'active-record-6.1' do
38
42
  gem 'activerecord', '~> 6.1.0'
39
43
  end
44
+
45
+ appraise 'active-record-7.0' do
46
+ gem 'activerecord', '~> 7.0.0'
47
+ end
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.0 2022-03-29
4
+
5
+ * Test Rails 7 & Ruby 3
6
+ * Fix regression in 1.1.1 involving deleted tenants [#123](https://github.com/citusdata/activerecord-multi-tenant/pull/123)
7
+ * Fix incorrect SQL generated when joining two models and one has a default scope [#132](https://github.com/citusdata/activerecord-multi-tenant/pull/132)
8
+ * Update for Rails 5+ removal of type_cast_for_database [#135](https://github.com/citusdata/activerecord-multi-tenant/pull/135)
9
+
10
+
3
11
  ## 1.1.1 2021-01-15
4
12
 
5
13
  * Add support for Rails 6.1 [#108](https://github.com/citusdata/activerecord-multi-tenant/pull/108)
@@ -3,7 +3,7 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "appraisal"
6
- gem "activerecord", "~> 5.2.0"
6
+ gem "activerecord", "~> 5.2.0", "< 5.2.4" # FIXME
7
7
  gem "i18n", "~> 0.9.5"
8
8
  gem "nokogiri", "~> 1.7.1"
9
9
  gem "nio4r", "~> 2.3.1"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "activerecord", "~> 7.0.0"
7
+
8
+ gemspec path: "../"
@@ -3,7 +3,7 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "appraisal"
6
- gem "rails", "~> 5.2.0"
6
+ gem "rails", "~> 5.2.0", "< 5.2.4" # FIXME
7
7
  gem "i18n", "~> 0.9.5"
8
8
  gem "nokogiri", "~> 1.7.1"
9
9
  gem "nio4r", "~> 2.3.1"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal"
6
+ gem "rails", "~> 7.0.0"
7
+
8
+ gemspec path: "../"
@@ -9,7 +9,7 @@ module MultiTenant
9
9
  end
10
10
 
11
11
  def <<(row)
12
- row = row.map.with_index { |val, idx| @column_types[idx].type_cast_for_database(val) }
12
+ row = row.map.with_index { |val, idx| @column_types[idx].serialize(val) }
13
13
  @conn.put_copy_data(row)
14
14
  @count += 1
15
15
  end
@@ -18,7 +18,7 @@ module MultiTenant
18
18
  module CopyFromClient
19
19
  def copy_from_client(columns, &block)
20
20
  conn = connection.raw_connection
21
- column_types = columns.map { |c| columns_hash[c.to_s] }
21
+ column_types = columns.map { |c| type_for_attribute(c.to_s) }
22
22
  helper = MultiTenant::CopyFromClientHelper.new(conn, column_types)
23
23
  conn.copy_data %{COPY #{quoted_table_name}("#{columns.join('","')}") FROM STDIN}, PG::TextEncoder::CopyRow.new do
24
24
  block.call helper
@@ -122,6 +122,8 @@ module MultiTenant
122
122
  alias :visit_Arel_Nodes_FullOuterJoin :visit_Arel_Nodes_OuterJoin
123
123
  alias :visit_Arel_Nodes_RightOuterJoin :visit_Arel_Nodes_OuterJoin
124
124
 
125
+ alias :visit_ActiveModel_Attribute :terminal
126
+
125
127
  private
126
128
 
127
129
  def tenant_relation?(table_name)
@@ -274,7 +276,11 @@ module ActiveRecord
274
276
  if node.wheres.empty?
275
277
  node.wheres = [enforcement_clause]
276
278
  else
277
- node.wheres[0] = enforcement_clause.and(node.wheres[0])
279
+ if node.wheres[0].is_a?(Arel::Nodes::And)
280
+ node.wheres[0].children << enforcement_clause
281
+ else
282
+ node.wheres[0] = enforcement_clause.and(node.wheres[0])
283
+ end
278
284
  end
279
285
  else
280
286
  raise "UnknownContext"
@@ -18,7 +18,11 @@ module Sidekiq::Middleware::MultiTenant
18
18
  class Server
19
19
  def call(worker_class, msg, queue)
20
20
  if msg.has_key?('multi_tenant')
21
- tenant = msg['multi_tenant']['class'].constantize.find(msg['multi_tenant']['id'])
21
+ tenant = begin
22
+ msg['multi_tenant']['class'].constantize.find(msg['multi_tenant']['id'])
23
+ rescue ActiveRecord::RecordNotFound
24
+ msg['multi_tenant']['id']
25
+ end
22
26
  MultiTenant.with(tenant) do
23
27
  yield
24
28
  end
@@ -1,3 +1,3 @@
1
1
  module MultiTenant
2
- VERSION = '1.1.1'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -348,9 +348,12 @@ describe MultiTenant do
348
348
  end
349
349
 
350
350
  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
351
+ option1 = <<-sql.strip
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"."project_id" = 1 AND "sub_tasks"."account_id" = 1 AND "tasks"."account_id" = 1
353
+ sql
354
+ option2 = <<-sql.strip
355
+ 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
356
+ sql
354
357
 
355
358
  account1 = Account.create! name: 'Account 1'
356
359
 
@@ -358,7 +361,7 @@ describe MultiTenant do
358
361
  project1 = Project.create! name: 'Project 1'
359
362
  task1 = Task.create! name: 'Task 1', project: project1
360
363
  subtask1 = SubTask.create! task: task1
361
- expect(project1.sub_tasks.to_sql).to eq(expected_sql.strip)
364
+ expect(project1.sub_tasks.to_sql).to eq(option1).or(eq(option2))
362
365
  expect(project1.sub_tasks).to include(subtask1)
363
366
  end
364
367
 
@@ -373,9 +376,13 @@ describe MultiTenant do
373
376
  end
374
377
 
375
378
  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
379
+ option1 = <<-sql.strip
380
+ 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
381
+ sql
382
+ option2 = <<-sql.strip
383
+ 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
384
+ sql
385
+
379
386
  account1 = Account.create! name: 'Account 1'
380
387
  category1 = Category.create! name: 'Category 1'
381
388
 
@@ -383,7 +390,7 @@ describe MultiTenant do
383
390
  project1 = Project.create! name: 'Project 1'
384
391
  projectcategory = ProjectCategory.create! name: 'project cat 1', project: project1, category: category1
385
392
 
386
- expect(project1.categories.to_sql).to eq(expected_sql.strip)
393
+ expect(project1.categories.to_sql).to eq(option1).or(eq(option2))
387
394
  expect(project1.categories).to include(category1)
388
395
  expect(project1.project_categories).to include(projectcategory)
389
396
  end
@@ -412,21 +419,18 @@ describe MultiTenant do
412
419
  account1 = Account.create! name: 'Account 1'
413
420
  category1 = Category.create! name: 'Category 1'
414
421
 
415
- expected_sql = if uses_prepared_statements? && (ActiveRecord::VERSION::MAJOR == 5 || (ActiveRecord::VERSION::MAJOR == 6 && ActiveRecord::VERSION::MINOR >= 1))
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
422
+ option1 = <<-sql.strip
423
+ 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
424
+ sql
425
+ option2 = <<-sql.strip
426
+ 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
427
+ sql
424
428
 
425
429
  MultiTenant.with(account1) do
426
430
  project1 = Project.create! name: 'Project 1'
427
431
  projectcategory = ProjectCategory.create! name: 'project cat 1', project: project1, category: category1
428
432
 
429
- expect(Project.eager_load(:categories).to_sql).to eq(expected_sql.strip)
433
+ expect(Project.eager_load(:categories).to_sql).to eq(option1).or(eq(option2))
430
434
 
431
435
  project = Project.eager_load(:categories).first
432
436
  expect(project.categories).to include(category1)
@@ -451,21 +455,18 @@ describe MultiTenant do
451
455
  category1 = Category.create! name: 'Category 1'
452
456
 
453
457
  MultiTenant.with(account1) do
454
- expected_sql = if uses_prepared_statements? && (ActiveRecord::VERSION::MAJOR == 5 || (ActiveRecord::VERSION::MAJOR == 6 && ActiveRecord::VERSION::MINOR >= 1))
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
458
+ option1 = <<-sql.strip
459
+ 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
460
+ sql
461
+ option2 = <<-sql.strip
462
+ 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
463
+ sql
463
464
 
464
465
  project1 = Project.create! name: 'Project 1'
465
466
  projectcategory = ProjectCategory.create! name: 'project cat 1', project: project1, category: category1
466
467
 
467
468
  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)
469
+ 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
470
  end
470
471
 
471
472
  MultiTenant.without do
@@ -485,32 +486,39 @@ describe MultiTenant do
485
486
  project2 = Project.create! name: 'Project 2', account: Account.create!(name: 'Account2')
486
487
 
487
488
  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
489
+ option1 = <<-sql.strip
490
+ SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = $1 LIMIT $2
491
+ sql
492
+ option2 = <<-sql.strip
493
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 AND "projects"."account_id" = #{account.id} LIMIT $2
494
+ sql
495
+ option3 = <<-sql.strip
496
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 AND "projects"."account_id" = #{account.id} LIMIT $2
497
+ sql
498
+
499
+ # Couldn't make the following line pass for some reason, so came up with an uglier alternative
500
+ # expect(Project).to receive(:find_by_sql).with(eq(option1).or(eq(option2)).or(eq(option3)), any_args).and_call_original
501
+ expect(Project).to receive(:find_by_sql).and_wrap_original do |m, *args|
502
+ expect(args[0]).to(eq(option1).or(eq(option2)).or(eq(option3)))
503
+ m.call(args[0], args[1], preparable:args[2][:preparable])
504
+ end
499
505
  expect(Project.find(project.id)).to eq(project)
500
506
  end
501
507
 
502
508
  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
509
+ option1 = <<-sql.strip
510
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
511
+ sql
512
+ option2 = <<-sql.strip
513
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
514
+ sql
515
+
516
+ # Couldn't make the following line pass for some reason, so came up with an uglier alternative
517
+ # expect(Project).to receive(:find_by_sql).with(eq(option1).or(eq(option2)), any_args).and_call_original
518
+ expect(Project).to receive(:find_by_sql).and_wrap_original do |m, *args|
519
+ expect(args[0]).to(eq(option1).or(eq(option2)))
520
+ m.call(args[0], args[1], preparable:args[2][:preparable])
521
+ end
514
522
  expect(Project.find(project2.id)).to eq(project2)
515
523
  end
516
524
  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
@@ -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
@@ -89,10 +89,21 @@ ARGV.grep(/\w+_spec\.rb/).empty? && ActiveRecord::Schema.define(version: 1) do
89
89
  t.column :category_id, :integer
90
90
  end
91
91
 
92
-
93
92
  create_table :allowed_places, force: true, id: false do |t|
94
- t.string :account_id, :integer
95
- t.string :name, :string
93
+ t.string :account_id, :integer
94
+ t.string :name, :string
95
+ end
96
+
97
+ create_table :domains, force: true, partition_key: :account_id do |t|
98
+ t.column :account_id, :integer
99
+ t.column :name, :string
100
+ t.column :deleted, :boolean, default: false
101
+ end
102
+
103
+ create_table :pages, force: true, partition_key: :account_id do |t|
104
+ t.column :account_id, :integer
105
+ t.column :name, :string
106
+ t.column :domain_id, :integer
96
107
  end
97
108
 
98
109
  create_distributed_table :accounts, :id
@@ -108,6 +119,8 @@ ARGV.grep(/\w+_spec\.rb/).empty? && ActiveRecord::Schema.define(version: 1) do
108
119
  create_distributed_table :uuid_records, :organization_id
109
120
  create_distributed_table :project_categories, :account_id
110
121
  create_distributed_table :allowed_places, :account_id
122
+ create_distributed_table :domains, :account_id
123
+ create_distributed_table :pages, :account_id
111
124
  create_reference_table :categories
112
125
  end
113
126
 
@@ -204,7 +217,17 @@ class ProjectCategory < ActiveRecord::Base
204
217
  belongs_to :account
205
218
  end
206
219
 
207
-
208
220
  class AllowedPlace < ActiveRecord::Base
209
221
  multi_tenant :account
210
222
  end
223
+
224
+ class Domain < ActiveRecord::Base
225
+ multi_tenant :account
226
+ has_many :pages
227
+ default_scope { where(deleted: false) }
228
+ end
229
+
230
+ class Page < ActiveRecord::Base
231
+ multi_tenant :account
232
+ belongs_to :domain
233
+ end
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: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Citus Data
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-16 00:00:00.000000000 Z
11
+ date: 2022-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: request_store
@@ -156,12 +156,12 @@ executables: []
156
156
  extensions: []
157
157
  extra_rdoc_files: []
158
158
  files:
159
+ - ".github/workflows/CI.yml"
159
160
  - ".gitignore"
160
- - ".travis.yml"
161
+ - ".rspec"
161
162
  - Appraisals
162
163
  - CHANGELOG.md
163
164
  - Gemfile
164
- - Gemfile.lock
165
165
  - LICENSE
166
166
  - README.md
167
167
  - Rakefile
@@ -169,17 +169,13 @@ files:
169
169
  - docker-compose.yml
170
170
  - gemfiles/.bundle/config
171
171
  - gemfiles/active_record_5.2.gemfile
172
- - gemfiles/active_record_5.2.gemfile.lock
173
172
  - gemfiles/active_record_6.0.gemfile
174
- - gemfiles/active_record_6.0.gemfile.lock
175
173
  - gemfiles/active_record_6.1.gemfile
176
- - gemfiles/active_record_6.1.gemfile.lock
174
+ - gemfiles/active_record_7.0.gemfile
177
175
  - gemfiles/rails_5.2.gemfile
178
- - gemfiles/rails_5.2.gemfile.lock
179
176
  - gemfiles/rails_6.0.gemfile
180
- - gemfiles/rails_6.0.gemfile.lock
181
177
  - gemfiles/rails_6.1.gemfile
182
- - gemfiles/rails_6.1.gemfile.lock
178
+ - gemfiles/rails_7.0.gemfile
183
179
  - lib/activerecord-multi-tenant.rb
184
180
  - lib/activerecord-multi-tenant/arel_visitors_depth_first.rb
185
181
  - lib/activerecord-multi-tenant/controller_extensions.rb
@@ -211,7 +207,7 @@ homepage: https://github.com/citusdata/activerecord-multi-tenant
211
207
  licenses:
212
208
  - MIT
213
209
  metadata: {}
214
- post_install_message:
210
+ post_install_message:
215
211
  rdoc_options: []
216
212
  require_paths:
217
213
  - lib
@@ -226,8 +222,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
222
  - !ruby/object:Gem::Version
227
223
  version: '0'
228
224
  requirements: []
229
- rubygems_version: 3.1.2
230
- signing_key:
225
+ rubygems_version: 3.2.32
226
+ signing_key:
231
227
  specification_version: 4
232
228
  summary: ActiveRecord/Rails integration for multi-tenant databases, in particular
233
229
  the Citus extension for PostgreSQL
data/.travis.yml DELETED
@@ -1,34 +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/rails_6.1.gemfile
15
- - gemfiles/active_record_5.2.gemfile
16
- - gemfiles/active_record_6.0.gemfile
17
- - gemfiles/active_record_6.1.gemfile
18
-
19
- env:
20
- - PREPARED_STATEMENTS=0
21
- - PREPARED_STATEMENTS=1
22
-
23
- matrix:
24
- fast_finish: true
25
-
26
- services:
27
- - docker
28
-
29
- before_install:
30
- - docker-compose up -d
31
- - gem install bundler -v 2.1.4
32
-
33
- script:
34
- - bundle exec rake spec