rls_multi_tenant 0.2.2 → 0.2.4

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.
@@ -1,24 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "lib/rls_multi_tenant/version"
3
+ require_relative 'lib/rls_multi_tenant/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "rls_multi_tenant"
6
+ spec.name = 'rls_multi_tenant'
7
7
  spec.version = RlsMultiTenant::VERSION
8
- spec.authors = ["Coding Ways"]
9
- spec.email = ["info@codingways.com"]
8
+ spec.authors = ['Coding Ways']
9
+ spec.email = ['info@codingways.com']
10
10
 
11
- spec.summary = "Rails gem for PostgreSQL Row Level Security (RLS) multi-tenant applications"
12
- spec.description = "A comprehensive gem that provides RLS-based multi-tenancy for Rails applications using PostgreSQL, including automatic tenant context switching, security validations, and migration helpers."
13
- spec.homepage = "https://github.com/codingways/rls_multi_tenant"
14
- spec.license = "MIT"
15
- spec.required_ruby_version = ">= 3.0.0"
11
+ spec.summary = 'Rails gem for PostgreSQL Row Level Security (RLS) multi-tenant applications'
12
+ spec.description = 'A comprehensive gem that provides RLS-based multi-tenancy for Rails applications ' \
13
+ 'using PostgreSQL, including automatic tenant context switching, security ' \
14
+ 'validations, and migration helpers.'
15
+ spec.homepage = 'https://github.com/codingways/rls_multi_tenant'
16
+ spec.license = 'MIT'
17
+ spec.required_ruby_version = '>= 3.0.0'
16
18
 
17
- spec.metadata["homepage_uri"] = spec.homepage
18
- spec.metadata["source_code_uri"] = "https://github.com/codingways/rls_multi_tenant"
19
- spec.metadata["changelog_uri"] = "https://github.com/codingways/rls_multi_tenant/blob/main/CHANGELOG.md"
20
- spec.metadata["bug_tracker_uri"] = "https://github.com/codingways/rls_multi_tenant/issues"
21
- spec.metadata["documentation_uri"] = "https://github.com/codingways/rls_multi_tenant#readme"
19
+ spec.metadata['homepage_uri'] = spec.homepage
20
+ spec.metadata['source_code_uri'] = 'https://github.com/codingways/rls_multi_tenant'
21
+ spec.metadata['changelog_uri'] = 'https://github.com/codingways/rls_multi_tenant/blob/main/CHANGELOG.md'
22
+ spec.metadata['bug_tracker_uri'] = 'https://github.com/codingways/rls_multi_tenant/issues'
23
+ spec.metadata['documentation_uri'] = 'https://github.com/codingways/rls_multi_tenant#readme'
24
+ spec.metadata['rubygems_mfa_required'] = 'true'
22
25
 
23
26
  # Specify which files should be added to the gem when it is released.
24
27
  spec.files = Dir.chdir(__dir__) do
@@ -27,20 +30,20 @@ Gem::Specification.new do |spec|
27
30
  f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile])
28
31
  end
29
32
  end
30
- spec.bindir = "exe"
33
+ spec.bindir = 'exe'
31
34
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
- spec.require_paths = ["lib"]
35
+ spec.require_paths = ['lib']
33
36
 
34
37
  # Dependencies
35
- spec.add_dependency "rails", ">= 6.0", "< 9.0"
36
- spec.add_dependency "pg", ">= 1.0", "< 3.0"
38
+ spec.add_dependency 'pg', '>= 1.0', '< 3.0'
39
+ spec.add_dependency 'rails', '>= 6.0', '< 9.0'
37
40
 
38
41
  # Development dependencies
39
- spec.add_development_dependency "rspec-rails", "~> 6.0"
40
- spec.add_development_dependency "rubocop", "~> 1.50"
41
- spec.add_development_dependency "rubocop-rails", "~> 2.20"
42
- spec.add_development_dependency "rubocop-rspec", "~> 2.20"
43
- spec.add_development_dependency "simplecov", "~> 0.22"
44
- spec.add_development_dependency "generator_spec", "~> 0.9"
45
- spec.add_development_dependency "bundler-audit", "~> 0.9"
42
+ spec.add_development_dependency 'bundler-audit', '~> 0.9'
43
+ spec.add_development_dependency 'generator_spec', '~> 0.9'
44
+ spec.add_development_dependency 'rspec-rails', '~> 6.1.0'
45
+ spec.add_development_dependency 'rubocop', '~> 1.80.0'
46
+ spec.add_development_dependency 'rubocop-rails', '~> 2.33'
47
+ spec.add_development_dependency 'rubocop-rspec', '~> 3.7'
48
+ spec.add_development_dependency 'simplecov', '~> 0.22'
46
49
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rls_multi_tenant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Coding Ways
@@ -10,143 +10,143 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: rails
13
+ name: pg
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '6.0'
18
+ version: '1.0'
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
- version: '9.0'
21
+ version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: '6.0'
28
+ version: '1.0'
29
29
  - - "<"
30
30
  - !ruby/object:Gem::Version
31
- version: '9.0'
31
+ version: '3.0'
32
32
  - !ruby/object:Gem::Dependency
33
- name: pg
33
+ name: rails
34
34
  requirement: !ruby/object:Gem::Requirement
35
35
  requirements:
36
36
  - - ">="
37
37
  - !ruby/object:Gem::Version
38
- version: '1.0'
38
+ version: '6.0'
39
39
  - - "<"
40
40
  - !ruby/object:Gem::Version
41
- version: '3.0'
41
+ version: '9.0'
42
42
  type: :runtime
43
43
  prerelease: false
44
44
  version_requirements: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - ">="
47
47
  - !ruby/object:Gem::Version
48
- version: '1.0'
48
+ version: '6.0'
49
49
  - - "<"
50
50
  - !ruby/object:Gem::Version
51
- version: '3.0'
51
+ version: '9.0'
52
52
  - !ruby/object:Gem::Dependency
53
- name: rspec-rails
53
+ name: bundler-audit
54
54
  requirement: !ruby/object:Gem::Requirement
55
55
  requirements:
56
56
  - - "~>"
57
57
  - !ruby/object:Gem::Version
58
- version: '6.0'
58
+ version: '0.9'
59
59
  type: :development
60
60
  prerelease: false
61
61
  version_requirements: !ruby/object:Gem::Requirement
62
62
  requirements:
63
63
  - - "~>"
64
64
  - !ruby/object:Gem::Version
65
- version: '6.0'
65
+ version: '0.9'
66
66
  - !ruby/object:Gem::Dependency
67
- name: rubocop
67
+ name: generator_spec
68
68
  requirement: !ruby/object:Gem::Requirement
69
69
  requirements:
70
70
  - - "~>"
71
71
  - !ruby/object:Gem::Version
72
- version: '1.50'
72
+ version: '0.9'
73
73
  type: :development
74
74
  prerelease: false
75
75
  version_requirements: !ruby/object:Gem::Requirement
76
76
  requirements:
77
77
  - - "~>"
78
78
  - !ruby/object:Gem::Version
79
- version: '1.50'
79
+ version: '0.9'
80
80
  - !ruby/object:Gem::Dependency
81
- name: rubocop-rails
81
+ name: rspec-rails
82
82
  requirement: !ruby/object:Gem::Requirement
83
83
  requirements:
84
84
  - - "~>"
85
85
  - !ruby/object:Gem::Version
86
- version: '2.20'
86
+ version: 6.1.0
87
87
  type: :development
88
88
  prerelease: false
89
89
  version_requirements: !ruby/object:Gem::Requirement
90
90
  requirements:
91
91
  - - "~>"
92
92
  - !ruby/object:Gem::Version
93
- version: '2.20'
93
+ version: 6.1.0
94
94
  - !ruby/object:Gem::Dependency
95
- name: rubocop-rspec
95
+ name: rubocop
96
96
  requirement: !ruby/object:Gem::Requirement
97
97
  requirements:
98
98
  - - "~>"
99
99
  - !ruby/object:Gem::Version
100
- version: '2.20'
100
+ version: 1.80.0
101
101
  type: :development
102
102
  prerelease: false
103
103
  version_requirements: !ruby/object:Gem::Requirement
104
104
  requirements:
105
105
  - - "~>"
106
106
  - !ruby/object:Gem::Version
107
- version: '2.20'
107
+ version: 1.80.0
108
108
  - !ruby/object:Gem::Dependency
109
- name: simplecov
109
+ name: rubocop-rails
110
110
  requirement: !ruby/object:Gem::Requirement
111
111
  requirements:
112
112
  - - "~>"
113
113
  - !ruby/object:Gem::Version
114
- version: '0.22'
114
+ version: '2.33'
115
115
  type: :development
116
116
  prerelease: false
117
117
  version_requirements: !ruby/object:Gem::Requirement
118
118
  requirements:
119
119
  - - "~>"
120
120
  - !ruby/object:Gem::Version
121
- version: '0.22'
121
+ version: '2.33'
122
122
  - !ruby/object:Gem::Dependency
123
- name: generator_spec
123
+ name: rubocop-rspec
124
124
  requirement: !ruby/object:Gem::Requirement
125
125
  requirements:
126
126
  - - "~>"
127
127
  - !ruby/object:Gem::Version
128
- version: '0.9'
128
+ version: '3.7'
129
129
  type: :development
130
130
  prerelease: false
131
131
  version_requirements: !ruby/object:Gem::Requirement
132
132
  requirements:
133
133
  - - "~>"
134
134
  - !ruby/object:Gem::Version
135
- version: '0.9'
135
+ version: '3.7'
136
136
  - !ruby/object:Gem::Dependency
137
- name: bundler-audit
137
+ name: simplecov
138
138
  requirement: !ruby/object:Gem::Requirement
139
139
  requirements:
140
140
  - - "~>"
141
141
  - !ruby/object:Gem::Version
142
- version: '0.9'
142
+ version: '0.22'
143
143
  type: :development
144
144
  prerelease: false
145
145
  version_requirements: !ruby/object:Gem::Requirement
146
146
  requirements:
147
147
  - - "~>"
148
148
  - !ruby/object:Gem::Version
149
- version: '0.9'
149
+ version: '0.22'
150
150
  description: A comprehensive gem that provides RLS-based multi-tenancy for Rails applications
151
151
  using PostgreSQL, including automatic tenant context switching, security validations,
152
152
  and migration helpers.
@@ -172,11 +172,8 @@ files:
172
172
  - lib/rls_multi_tenant/generators/setup/setup_generator.rb
173
173
  - lib/rls_multi_tenant/generators/setup/templates/tenant_model.rb
174
174
  - lib/rls_multi_tenant/generators/shared/template_helper.rb
175
- - lib/rls_multi_tenant/generators/shared/templates/create_app_user.rb
176
175
  - lib/rls_multi_tenant/generators/shared/templates/create_tenant.rb
177
- - lib/rls_multi_tenant/generators/shared/templates/db_admin.rake
178
176
  - lib/rls_multi_tenant/generators/shared/templates/enable_uuid_extension.rb
179
- - lib/rls_multi_tenant/generators/task/task_generator.rb
180
177
  - lib/rls_multi_tenant/middleware/subdomain_tenant_selector.rb
181
178
  - lib/rls_multi_tenant/railtie.rb
182
179
  - lib/rls_multi_tenant/rls_helper.rb
@@ -193,6 +190,7 @@ metadata:
193
190
  changelog_uri: https://github.com/codingways/rls_multi_tenant/blob/main/CHANGELOG.md
194
191
  bug_tracker_uri: https://github.com/codingways/rls_multi_tenant/issues
195
192
  documentation_uri: https://github.com/codingways/rls_multi_tenant#readme
193
+ rubygems_mfa_required: 'true'
196
194
  rdoc_options: []
197
195
  require_paths:
198
196
  - lib
@@ -1,49 +0,0 @@
1
- class CreateAppUser < ActiveRecord::Migration[<%= Rails.version.to_f %>]
2
- def up
3
- app_user = ENV['<%= RlsMultiTenant.app_user_env_var %>']
4
- app_password = ENV['POSTGRES_APP_PASSWORD']
5
-
6
- # Create user with RLS privileges in PostgreSQL
7
- execute <<-SQL
8
- DO $$
9
- BEGIN
10
- IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '#{app_user}') THEN
11
- CREATE ROLE #{app_user} WITH LOGIN PASSWORD '#{app_password}';
12
- END IF;
13
- END
14
- $$;
15
- SQL
16
-
17
- # Grant basic permissions to the user
18
- execute "GRANT CONNECT ON DATABASE #{ActiveRecord::Base.connection.current_database} TO #{app_user};"
19
- execute "GRANT USAGE ON SCHEMA public TO #{app_user};"
20
- execute "GRANT CREATE ON SCHEMA public TO #{app_user};"
21
-
22
- # Grant default permissions for future tables in public schema
23
- execute "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO #{app_user};"
24
- execute "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO #{app_user};"
25
-
26
- # Grant permissions on all existing tables
27
- execute "GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO #{app_user};"
28
- execute "GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO #{app_user};"
29
- end
30
-
31
- def down
32
- app_user = ENV['<%= RlsMultiTenant.app_user_env_var %>']
33
-
34
- # Revoke permissions
35
- execute "REVOKE ALL ON SCHEMA public FROM #{app_user};"
36
- execute "REVOKE CONNECT ON DATABASE #{ActiveRecord::Base.connection.current_database} FROM #{app_user};"
37
-
38
- # Revoke permissions from all existing tables and sequences
39
- execute "REVOKE ALL ON ALL TABLES IN SCHEMA public FROM #{app_user};"
40
- execute "REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM #{app_user};"
41
-
42
- # Revoke default permissions for future tables in public schema
43
- execute "ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT, INSERT, UPDATE, DELETE ON TABLES FROM #{app_user};"
44
- execute "ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE USAGE, SELECT ON SEQUENCES FROM #{app_user};"
45
-
46
- # Drop user
47
- execute "DROP ROLE IF EXISTS #{app_user};"
48
- end
49
- end
@@ -1,27 +0,0 @@
1
- namespace :db_as do
2
- desc "Run a db: task with admin privileges. Usage: `rails db_as:admin[migrate]`"
3
- task :admin, [:sub_task] do |t, args|
4
- sub_task = args[:sub_task]
5
-
6
- # Check if a sub-task was provided
7
- if sub_task.nil? || !Rake::Task.task_defined?("db:#{sub_task}")
8
- puts "Usage: rails db_as:admin[sub_task]"
9
- puts "Valid sub-tasks: #{Rake.application.tasks.map(&:name).select { |name| name.start_with?("db:") }.map { |name| name.split(':', 2).last }.uniq.sort.join(', ')}"
10
- exit
11
- end
12
-
13
- database_url = "postgresql://#{ENV['POSTGRES_USER']}:#{ENV['POSTGRES_PASSWORD']}@#{ENV['POSTGRES_HOST']}:5432/#{ENV['POSTGRES_DB']}"
14
-
15
- # Set the DATABASE_URL with admin user details.
16
- ENV['DATABASE_URL'] = database_url
17
- ENV['CACHE_DATABASE_URL'] = "#{database_url}_cache"
18
- ENV['QUEUE_DATABASE_URL'] = "#{database_url}_queue"
19
- ENV['CABLE_DATABASE_URL'] = "#{database_url}_cable"
20
-
21
- # Set a flag to indicate we're running with admin privileges
22
- ENV['RLS_MULTI_TENANT_ADMIN_MODE'] = 'true'
23
-
24
- puts "Executing db:#{sub_task} with admin privileges..."
25
- Rake::Task["db:#{sub_task}"].invoke
26
- end
27
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails/generators'
4
- require 'rls_multi_tenant/generators/shared/template_helper'
5
-
6
- module RlsMultiTenant
7
- module Generators
8
- class TaskGenerator < Rails::Generators::Base
9
- include Shared::TemplateHelper
10
-
11
- source_root File.expand_path("templates", __dir__)
12
-
13
- desc "Generate RLS Multi-tenant rake tasks"
14
-
15
- def create_db_admin_task
16
- copy_shared_template "db_admin.rake", "lib/tasks/db_admin.rake"
17
- show_instructions
18
- end
19
-
20
- def show_instructions
21
- say "\n" + "="*60, :green
22
- say "RLS Multi-tenant rake tasks created successfully!", :green
23
- say "="*60, :green
24
- say "\nWhat was created:", :yellow
25
- say "1. lib/tasks/db_admin.rake - Database admin tasks", :yellow
26
- say "\nUsage:", :yellow
27
- say "rails db_as:admin[migrate] # Run migrations with admin privileges", :yellow
28
- say "rails db_as:admin[seed] # Run seeds with admin privileges", :yellow
29
- say "\nNote: This is required because the app user doesn't have migration privileges", :yellow
30
- say "="*60, :green
31
- end
32
- end
33
- end
34
- end