activerecord-tenant-level-security 0.6.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: def87a150a6d3fe15b09121fe3d43aec96e367bde7179acb44ecd61f4d754533
4
- data.tar.gz: eb5d065426f49c665ea202160aafcc10e46f82c40e0d951e4457152308261c12
3
+ metadata.gz: 81fecc5ddf88902ee6cee67a10993252adde65b960a65fe9a98de17cb2068d8c
4
+ data.tar.gz: 5e00c87015dc059b04cd1d6bf53937ad5c85c600f4f03f2054070aa38b61371d
5
5
  SHA512:
6
- metadata.gz: 7a4f84edba75ba3152e78b18ab9e356c5b0a756d65892ad8dd83a9fa930088902d8f84b294591394051408315a46e5593505507b3b3bd0cdf50845c056f83067
7
- data.tar.gz: e3da985f057236d469825316690c9b5469691196bd6c4fb6973c0db58f133434a118e4ffc8d4dab2db6c0c1fef306bd18d95c09b5c40b2d2358f6e4e86cc9769
6
+ metadata.gz: 776a2762a6723583c82c0ae8429dc5cb84ad68d4ab8d1629d89f754ef1a0ff2b09856600282542daa1853b76b03b6d90a068c00884d372dbe9c638bf59157de6
7
+ data.tar.gz: 7c16407104591d25471693009c1c76f3d50bbe742f83efa9036defdf50e891c1eae79a8029f10af122be8be4ccb1f0f51e1d63b4b0220ad1b806fab2b2dae9cf
data/.circleci/config.yml CHANGED
@@ -29,5 +29,5 @@ workflows:
29
29
  matrix:
30
30
  parameters:
31
31
  ruby: ['ruby:3.3', 'ruby:3.4', 'ruby:4.0']
32
- rails: ['rails_7.2', 'rails_8.0', 'rails_8.1']
33
- postgres: ['postgres:14.20', 'postgres:15.15', 'postgres:16.11', 'postgres:17.7', 'postgres:18.1']
32
+ rails: ['rails_8.0', 'rails_8.1']
33
+ postgres: ['postgres:14.24', 'postgres:15.19', 'postgres:16.15', 'postgres:17.11', 'postgres:18.6']
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## v0.8.0 (2026-09-07)
2
+
3
+ ### Breaking Changes
4
+ - [#39](https://github.com/kufu/activerecord-tenant-level-security/pull/39): Drop support for Rails 7.2 (EOL)
5
+
6
+ ## v0.7.0 (2026-04-07)
7
+
8
+ ### Enhancements
9
+ - [#35](https://github.com/kufu/activerecord-tenant-level-security/pull/35): Preserve RLS context across automatic reconnections
10
+
1
11
  ## v0.6.0 (2026-03-11)
2
12
 
3
13
  ### Breaking Changes
@@ -24,8 +24,8 @@ Gem::Specification.new do |spec|
24
24
  end
25
25
  spec.require_paths = ["lib"]
26
26
 
27
- spec.add_dependency "activerecord", ">= 7.2"
28
- spec.add_dependency "activesupport", ">= 7.2"
27
+ spec.add_dependency "activerecord", ">= 8.0"
28
+ spec.add_dependency "activesupport", ">= 8.0"
29
29
  spec.add_dependency "pg", ">= 1.0"
30
30
 
31
31
  spec.add_development_dependency "bundler", ">= 2.0"
@@ -0,0 +1,9 @@
1
+ module TenantLevelSecurity
2
+ module ReconnectableAdapter
3
+ def configure_connection
4
+ super
5
+
6
+ TenantLevelSecurity.switch_current_tenant_context!(self)
7
+ end
8
+ end
9
+ end
@@ -1,6 +1,19 @@
1
1
  module TenantLevelSecurity
2
2
  DEFAULT_PARTITION_KEY = 'tenant_id'.freeze
3
3
 
4
+ class TenantContext < ActiveSupport::CurrentAttributes
5
+ attribute :tenant_id
6
+
7
+ def tenant_id=(val)
8
+ super
9
+ TenantLevelSecurity.switch_with_connection!(ActiveRecord::Base.connection, val)
10
+ end
11
+
12
+ resets do
13
+ TenantLevelSecurity.switch_with_connection!(ActiveRecord::Base.connection, nil)
14
+ end
15
+ end
16
+
4
17
  class << self
5
18
  # The current_tenant_id sets the default tenant from the outside.
6
19
  # Be sure to register in advance as `TenantLevelSecurity.current_tenant_id { id }` with initializers.
@@ -14,19 +27,19 @@ module TenantLevelSecurity
14
27
  end
15
28
  end
16
29
 
17
- def with(tenant_id)
18
- old_tenant_id = current_session_tenant_id
19
- return yield if old_tenant_id == tenant_id
20
- begin
21
- switch! tenant_id
22
- yield
23
- ensure
24
- switch! old_tenant_id
25
- end
30
+ def with(tenant_id, &block)
31
+ TenantContext.with(tenant_id: tenant_id, &block)
26
32
  end
27
33
 
28
34
  def switch!(tenant_id)
29
- switch_with_connection!(ActiveRecord::Base.connection, tenant_id)
35
+ TenantContext.tenant_id = tenant_id
36
+ end
37
+
38
+ def switch_current_tenant_context!(conn = ActiveRecord::Base.connection)
39
+ TenantLevelSecurity.switch_with_connection!(
40
+ conn,
41
+ TenantLevelSecurity::TenantContext.tenant_id || TenantLevelSecurity.current_tenant_id
42
+ )
30
43
  end
31
44
 
32
45
  def switch_with_connection!(conn, tenant_id)
@@ -1,3 +1,3 @@
1
1
  module TenantLevelSecurity
2
- VERSION = '0.6.0'
2
+ VERSION = '0.8.0'
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'active_support'
2
+ require 'active_support/current_attributes'
2
3
  require 'active_record'
3
4
  require 'pg'
4
5
 
@@ -7,9 +8,11 @@ require_relative 'activerecord-tenant-level-security/command_recorder'
7
8
  require_relative 'activerecord-tenant-level-security/schema_dumper'
8
9
  require_relative 'activerecord-tenant-level-security/schema_statements'
9
10
  require_relative 'activerecord-tenant-level-security/sidekiq'
11
+ require_relative 'activerecord-tenant-level-security/reconnectable_adapter'
10
12
 
11
13
  ActiveSupport.on_load(:active_record) do
12
14
  ActiveRecord::ConnectionAdapters::AbstractAdapter.include TenantLevelSecurity::SchemaStatements
15
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.prepend TenantLevelSecurity::ReconnectableAdapter
13
16
  ActiveRecord::Migration::CommandRecorder.include TenantLevelSecurity::CommandRecorder
14
17
  ActiveRecord::SchemaDumper.prepend TenantLevelSecurity::SchemaDumper
15
18
 
@@ -17,6 +20,6 @@ ActiveSupport.on_load(:active_record) do
17
20
  # Make sure that TenantLevelSecurity.current_tenant_id does not depend on database connections.
18
21
  # If a new connection is needed to get the current_tenant_id, the callback may be invoked recursively.
19
22
  ActiveRecord::ConnectionAdapters::AbstractAdapter.set_callback :checkout, :after do |conn|
20
- TenantLevelSecurity.switch_with_connection!(conn, TenantLevelSecurity.current_tenant_id)
23
+ TenantLevelSecurity.switch_current_tenant_context!(conn)
21
24
  end
22
25
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-tenant-level-security
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SmartHR
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2026-03-11 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activerecord
@@ -16,28 +15,28 @@ dependencies:
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '7.2'
18
+ version: '8.0'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: '7.2'
25
+ version: '8.0'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: activesupport
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - ">="
32
31
  - !ruby/object:Gem::Version
33
- version: '7.2'
32
+ version: '8.0'
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - ">="
39
38
  - !ruby/object:Gem::Version
40
- version: '7.2'
39
+ version: '8.0'
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: pg
43
42
  requirement: !ruby/object:Gem::Requirement
@@ -116,11 +115,11 @@ files:
116
115
  - bin/console
117
116
  - bin/setup
118
117
  - compose.yml
119
- - gemfiles/rails_7.2.gemfile
120
118
  - gemfiles/rails_8.0.gemfile
121
119
  - gemfiles/rails_8.1.gemfile
122
120
  - lib/activerecord-tenant-level-security.rb
123
121
  - lib/activerecord-tenant-level-security/command_recorder.rb
122
+ - lib/activerecord-tenant-level-security/reconnectable_adapter.rb
124
123
  - lib/activerecord-tenant-level-security/schema_dumper.rb
125
124
  - lib/activerecord-tenant-level-security/schema_statements.rb
126
125
  - lib/activerecord-tenant-level-security/sidekiq.rb
@@ -132,8 +131,7 @@ licenses:
132
131
  metadata:
133
132
  homepage_uri: https://github.com/kufu/activerecord-tenant-level-security
134
133
  source_code_uri: https://github.com/kufu/activerecord-tenant-level-security
135
- changelog_uri: https://github.com/kufu/activerecord-tenant-level-security/blob/v0.6.0/CHANGELOG.md
136
- post_install_message:
134
+ changelog_uri: https://github.com/kufu/activerecord-tenant-level-security/blob/v0.8.0/CHANGELOG.md
137
135
  rdoc_options: []
138
136
  require_paths:
139
137
  - lib
@@ -148,8 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
146
  - !ruby/object:Gem::Version
149
147
  version: '0'
150
148
  requirements: []
151
- rubygems_version: 3.5.22
152
- signing_key:
149
+ rubygems_version: 3.6.9
153
150
  specification_version: 4
154
151
  summary: An Active Record extension for Multitenancy with PostgreSQL Row Level Security
155
152
  test_files: []
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "rails", "~> 7.2.2"
4
-
5
- gemspec path: "../"