pg_rls 0.0.1.alpha → 0.0.1.beta

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: 5ed56d6024c7658ebdf54879615273e29b9337f178b27a56352d2b3ba831b53d
4
- data.tar.gz: 10ed3f8ae3350ef016a0138fcee0dfaa875c93f399ec3bca3a258f3f6f8d1639
3
+ metadata.gz: eff1edae4e2b864b6d1c50dbe73330ddd3092314fc0f0654ce631dd3f2381e73
4
+ data.tar.gz: f61c086a2319def269009a8acd4bb712457913cb23703d4f592486c1adc76161
5
5
  SHA512:
6
- metadata.gz: 7bc62b85e6065bcfd687de04809efffd295a47b66f9ef72afa8f236a7b2750888ebc55df8e8b371c674a879d18204338328c5684835ca6fb09bb2d6456985302
7
- data.tar.gz: 28ab96d49303876ed85573439140695db0adf475f4b2f2253d99c5c99f6b2069eda679c10b87c9275bd7e40b8cd2c4981cf5e6614b61cb8417f9e9ec431b7c23
6
+ metadata.gz: 88eaa010df64b8ba78630841f3ac886c44dca7929e43016e2dcbe6b4000a06ad41d0606e94fe7457eb3c46fe0e3c341d2208bf6b5fd64553fcd9eedbaee59c7a
7
+ data.tar.gz: 70aef5056d562fb96a2189d580f3b3cc31b1efb4ef71433969f8896268cdf0286bc5450b9b855166e48580d12aed451d0771c672611c3a934f7f046be2ea8dc9
data/.rubocop.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 3.0
3
3
  NewCops: enable
4
+ Exclude:
5
+ - lib/generators/pg_rls/active_record/templates/migration.rb
4
6
  Layout/LineLength:
5
7
  Max: 120
data/Gemfile CHANGED
@@ -13,3 +13,5 @@ gem 'rake'
13
13
  gem 'rspec'
14
14
 
15
15
  gem 'rubocop'
16
+
17
+ gem 'rspec-rails'
data/Gemfile.lock CHANGED
@@ -2,6 +2,7 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  pg_rls (0.0.1.alpha)
5
+ bundler (>= 2.2.10)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
@@ -136,6 +137,14 @@ GEM
136
137
  rspec-mocks (3.10.2)
137
138
  diff-lcs (>= 1.2.0, < 2.0)
138
139
  rspec-support (~> 3.10.0)
140
+ rspec-rails (5.0.2)
141
+ actionpack (>= 5.2)
142
+ activesupport (>= 5.2)
143
+ railties (>= 5.2)
144
+ rspec-core (~> 3.10)
145
+ rspec-expectations (~> 3.10)
146
+ rspec-mocks (~> 3.10)
147
+ rspec-support (~> 3.10)
139
148
  rspec-support (3.10.2)
140
149
  rubocop (1.22.1)
141
150
  parallel (~> 1.10)
@@ -173,6 +182,7 @@ DEPENDENCIES
173
182
  rails (~> 6.1.4, >= 6.1.4.1)
174
183
  rake
175
184
  rspec
185
+ rspec-rails
176
186
  rubocop
177
187
 
178
188
  RUBY VERSION
data/README.md CHANGED
@@ -22,8 +22,17 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ RUN `rails generate pg_rls:install company`
26
26
 
27
+ You can change company to anything you'd like like for example `tenant`
28
+ this will generate the model and inject all the required code
29
+
30
+ for any new model that required to be under rls you can generate it by writing
31
+
32
+ `rails generate pg_rls user`
33
+ and it will generate all the necesary information for you
34
+
35
+ enjoy the gem :)
27
36
  ## Development
28
37
 
29
38
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -32,7 +41,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
41
 
33
42
  ## Contributing
34
43
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/pg_rls. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/pg_rls/blob/master/CODE_OF_CONDUCT.md).
44
+ Bug reports and pull requests are welcome on GitHub at https://github.com/dandush03/pg_rls. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/dandush03/pg_rls/blob/master/CODE_OF_CONDUCT.md).
36
45
 
37
46
  ## License
38
47
 
@@ -40,4 +49,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
40
49
 
41
50
  ## Code of Conduct
42
51
 
43
- Everyone interacting in the PgRls project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/pg_rls/blob/master/CODE_OF_CONDUCT.md).
52
+ Everyone interacting in the PgRls project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/dandush03/pg_rls/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -10,3 +10,12 @@ require 'rubocop/rake_task'
10
10
  RuboCop::RakeTask.new
11
11
 
12
12
  task default: %i[spec rubocop]
13
+
14
+ desc 'Generate documentation for PgRls.'
15
+ Rake::RDocTask.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'PgRls'
18
+ rdoc.options << '--line-numbers' << '--inline-source'
19
+ rdoc.rdoc_files.include('README.md')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/active_record/model/model_generator'
4
+ require File.join(File.dirname(__FILE__), '../base')
5
+
6
+ module PgRls
7
+ module Generators
8
+ # Active Record Generator
9
+ class ActiveRecordGenerator < ::ActiveRecord::Generators::ModelGenerator
10
+ include ::PgRls::Base
11
+
12
+ source_root File.expand_path('./templates', __dir__)
13
+
14
+ hook_for :test_framework
15
+
16
+ def create_migration_file
17
+ migration_template migration_template_path, "#{migration_path}/#{file_sub_name}_#{table_name}.rb",
18
+ migration_version: migration_version
19
+ end
20
+
21
+ def create_model_file
22
+ generate_abstract_class if database && !parent
23
+ template model_template_path, File.join('app/models', class_path, "#{file_name}.rb")
24
+ end
25
+
26
+ def migration_template_path
27
+ return 'init_migration.rb.tt' if installation_in_progress?
28
+
29
+ 'migration.rb.tt'
30
+ end
31
+
32
+ def model_template_path
33
+ return 'init_model.rb.tt' if installation_in_progress?
34
+
35
+ 'model.rb.tt'
36
+ end
37
+
38
+ def file_sub_name
39
+ return 'pg_rls_tenant_create' if installation_in_progress?
40
+
41
+ 'pg_rls_create'
42
+ end
43
+
44
+ def installation_in_progress?
45
+ shell.base.class.name.include?('Install')
46
+ end
47
+
48
+ def migration_version
49
+ "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
50
+ end
51
+
52
+ def migration_path
53
+ db_migrate_path
54
+ end
55
+
56
+ protected
57
+
58
+ def migration_action() = 'add'
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= abstract_class_name %> < ApplicationRecord
5
+ self.abstract_class = true
6
+
7
+ connects_to database: { <%= ActiveRecord.writing_role %>: :<%= database -%> }
8
+ end
9
+ <% end -%>
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PgRlsTenantCreate<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
4
+ def up
5
+ create_rls_tenant_table :<%= table_name %>, id: :uuid do |t|
6
+ t.string :name
7
+ t.string :logo
8
+
9
+ t.string :identification
10
+ t.string :subdomain
11
+ t.string :domain
12
+
13
+ t.timestamps
14
+ end
15
+
16
+ add_index :companies, :name, unique: true
17
+ add_index :companies, :identification, unique: true
18
+ add_index :companies, :domain, unique: true
19
+ add_index :companies, :subdomain, unique: true
20
+ end
21
+
22
+ def down
23
+ drop_rls_tenant_table :companies
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= class_name %> < <%= parent_class_name.classify %>
5
+ def self.current
6
+ find_by_tenant_id(connection.execute("SELECT current_setting('rls.tenant_id')").getvalue(0, 0))
7
+ rescue ActiveRecord::StatementInvalid
8
+ 'no tenant is selected'
9
+ end
10
+ <% attributes.select(&:reference?).each do |attribute| -%>
11
+ belongs_to :<%= attribute.name %><%= ", polymorphic: true" if attribute.polymorphic? %>
12
+ <% end -%>
13
+ <% attributes.select(&:rich_text?).each do |attribute| -%>
14
+ has_rich_text :<%= attribute.name %>
15
+ <% end -%>
16
+ <% attributes.select(&:attachment?).each do |attribute| -%>
17
+ has_one_attached :<%= attribute.name %>
18
+ <% end -%>
19
+ <% attributes.select(&:attachments?).each do |attribute| -%>
20
+ has_many_attached :<%= attribute.name %>
21
+ <% end -%>
22
+ <% attributes.select(&:token?).each do |attribute| -%>
23
+ has_secure_token<% if attribute.name != "token" %> :<%= attribute.name %><% end %>
24
+ <% end -%>
25
+ <% if attributes.any?(&:password_digest?) -%>
26
+ has_secure_password
27
+ <% end -%>
28
+ end
29
+ <% end -%>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PgRlsCreate<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
4
+ def up
5
+ create_rls_table :<%= table_name %><%= primary_key_type %> do |t|
6
+ <% attributes.each do |attribute| -%>
7
+ t.<%= attribute.type %> :<%= attribute.name %>
8
+ <% end -%>
9
+
10
+ t.timestamps null: false
11
+ end
12
+ end
13
+
14
+ def down
15
+ drop_rls_table :<%= table_name %>
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= class_name %> < <%= parent_class_name.classify %>
5
+ <% attributes.select(&:reference?).each do |attribute| -%>
6
+ belongs_to :<%= attribute.name %><%= ", polymorphic: true" if attribute.polymorphic? %>
7
+ <% end -%>
8
+ <% attributes.select(&:rich_text?).each do |attribute| -%>
9
+ has_rich_text :<%= attribute.name %>
10
+ <% end -%>
11
+ <% attributes.select(&:attachment?).each do |attribute| -%>
12
+ has_one_attached :<%= attribute.name %>
13
+ <% end -%>
14
+ <% attributes.select(&:attachments?).each do |attribute| -%>
15
+ has_many_attached :<%= attribute.name %>
16
+ <% end -%>
17
+ <% attributes.select(&:token?).each do |attribute| -%>
18
+ has_secure_token<% if attribute.name != "token" %> :<%= attribute.name %><% end %>
19
+ <% end -%>
20
+ <% if attributes.any?(&:password_digest?) -%>
21
+ has_secure_password
22
+ <% end -%>
23
+ end
24
+ <% end -%>
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PgRls
4
+ # Main Definition for Generator
5
+ module Base
6
+ protected
7
+
8
+ def nested_parent_name
9
+ @class_path.join('/')
10
+ end
11
+
12
+ def nested_parent_id
13
+ "#{nested_parent_name}_id"
14
+ end
15
+
16
+ def nested_parent_class_name
17
+ nested_parent_name.classify
18
+ end
19
+
20
+ def plural_nested_parent_name
21
+ nested_parent_name.pluralize
22
+ end
23
+
24
+ def class_path
25
+ []
26
+ end
27
+
28
+ def regular_class_path
29
+ []
30
+ end
31
+
32
+ def controller_class_path
33
+ []
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/base'
4
+ require 'securerandom'
5
+
6
+ module PgRls
7
+ module Generators
8
+ MissingORMError = Class.new(Thor::Error)
9
+ # Installer Generator
10
+ class InstallGenerator < Rails::Generators::Base
11
+ APPLICATION_RECORD_LINE = 'class ApplicationRecord < ActiveRecord::Base'
12
+ APPLICATION_RECORD_PATH = 'app/models/application_record.rb'
13
+ APPLICATION_CONTROLLER_LINE = 'class ApplicationController < ActionController::Base'
14
+ APPLICATION_CONTROLLER_PATH = 'app/controllers/application_controller.rb'
15
+ source_root File.expand_path('../templates', __dir__)
16
+
17
+ desc 'Creates a PgRls initializer and copy locale files to your application.'
18
+
19
+ def orm_error_message
20
+ <<-ERROR.strip_heredoc
21
+ An ORM must be set to install PgRls in your application.
22
+ Be sure to have an ORM like Active Record or loaded in your
23
+ app or configure your own at `config/application.rb`.
24
+ config.generators do |g|
25
+ g.orm :your_orm_gem
26
+ end
27
+ ERROR
28
+ end
29
+
30
+ def copy_initializer
31
+ raise MissingORMError, orm_error_message unless options[:orm]
32
+
33
+ template 'pg_rls.rb.tt', 'config/initializers/pg_rls.rb'
34
+
35
+ inject_include_to_application_record
36
+ inject_include_to_application_controller
37
+ end
38
+
39
+ def inject_include_to_application_record
40
+ return if aplication_record_already_included?
41
+
42
+ gsub_file(APPLICATION_RECORD_PATH, /(#{Regexp.escape(APPLICATION_RECORD_LINE)})/mi) do |match|
43
+ "#{match}\n include PgRls::SecureConnection\n"
44
+ end
45
+ end
46
+
47
+ def inject_include_to_application_controller
48
+ return if aplication_controller_already_included?
49
+
50
+ gsub_file(APPLICATION_CONTROLLER_PATH, /(#{Regexp.escape(APPLICATION_CONTROLLER_LINE)})/mi) do |match|
51
+ "#{match}\n include PgRls::MultiTenancy\n"
52
+ end
53
+ end
54
+
55
+ def aplication_controller_already_included?
56
+ File.readlines(APPLICATION_CONTROLLER_PATH).grep(/include PgRls::MultiTenancy/).any?
57
+ end
58
+
59
+ def aplication_record_already_included?
60
+ File.readlines(APPLICATION_RECORD_PATH).grep(/include PgRls::SecureConnection/).any?
61
+ end
62
+
63
+ def initialize_error_text
64
+ <<-ERROR.strip_heredoc
65
+ ERROR
66
+ end
67
+
68
+ def show_readme
69
+ readme 'README' if behavior == :invoke
70
+ end
71
+
72
+ hook_for :orm, required: true
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative File.join(File.dirname(__FILE__), 'active_record/active_record_generator')
4
+
5
+ module PgRls
6
+ module Generators
7
+ class PgRlsGenerator < ::Rails::Generators::NamedBase
8
+ # override ModelGenerator
9
+ hook_for :orm, required: true
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/named_base'
4
+ require 'rails/generators/active_model'
5
+ require 'rails/generators/active_record/migration'
6
+ require 'active_record'
7
+
8
+ module PgRls
9
+ module Generators # :nodoc:
10
+ class PgRlsGenerator < Rails::Generators::NamedBase # :nodoc:
11
+ include PgRls::Generators::Migration
12
+
13
+ # Set the current directory as base for the inherited generators.
14
+ def self.base_root
15
+ __dir__
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ README
2
+ ===============================================================================
3
+ WARNING!!
4
+
5
+ Once you remove a tenant all of his data would be removed as well
6
+
7
+ PgRls::SecureConnection was included to your ApplicationRecord do not remove it
8
+
9
+ ===============================================================================
10
+
11
+ to generate secure model run
12
+
13
+ rails g pg_rls model_name
14
+
15
+ or
16
+
17
+ rails generate pg_rls model_name
18
+
19
+ ===============================================================================
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pg_rls'
4
+
5
+ PgRls.setup do |_config|
6
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.include PgRls::Schema::Statements
7
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PgRls
4
+ # Ensure Connection is with App_use
5
+ module MultiTenancy
6
+ def self.included(base)
7
+ base.class_eval do
8
+ before_action :switch_tenant
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def switch_tenant
15
+ Tenant.switch request.subdomain
16
+ rescue NoMethodError
17
+ redirect_to '/'
18
+ end
19
+ end
20
+ end
@@ -4,8 +4,8 @@ module PgRls
4
4
  module Schema
5
5
  # Down Schema Statements
6
6
  module DownStatements
7
- def drop_rls_user(name = :app_user)
8
- ActiveRecord::Migration.execute "DROP USER #{name};"
7
+ def drop_rls_user
8
+ ActiveRecord::Migration.execute "DROP USER #{PgRls::SECURE_USERNAME};"
9
9
  end
10
10
 
11
11
  def drop_rls_blocking_function
@@ -37,9 +37,9 @@ module PgRls
37
37
  SQL
38
38
  end
39
39
 
40
- def drop_rls_policy(table_name, user = :app_user)
40
+ def drop_rls_policy(table_name)
41
41
  ActiveRecord::Migration.execute <<-SQL
42
- DROP POLICY #{table_name}_#{user} ON #{table_name};
42
+ DROP POLICY #{table_name}_#{PgRls::SECURE_USERNAME} ON #{table_name};
43
43
  ALTER TABLE #{table_name} DISABLE ROW LEVEL SECURITY;
44
44
  SQL
45
45
  end
@@ -4,7 +4,7 @@ module PgRls
4
4
  module Schema
5
5
  # Up Schema Statements
6
6
  module UpStatements
7
- def create_rls_user(name: :app_user, password: 'password')
7
+ def create_rls_user(name: PgRls::SECURE_USERNAME, password: 'password')
8
8
  PgRls.execute <<-SQL
9
9
  DROP ROLE IF EXISTS #{name};
10
10
  CREATE USER #{name} WITH PASSWORD '#{password}';
@@ -71,7 +71,7 @@ module PgRls
71
71
  SQL
72
72
  end
73
73
 
74
- def create_rls_policy(table_name, user = :app_user)
74
+ def create_rls_policy(table_name, user = PgRls::SECURE_USERNAME)
75
75
  ActiveRecord::Migration.execute <<-SQL
76
76
  ALTER TABLE #{table_name} ENABLE ROW LEVEL SECURITY;
77
77
  CREATE POLICY #{table_name}_#{user}
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PgRls
4
+ # Ensure Connection is with App_use
5
+ module SecureConnection
6
+ def self.included(base)
7
+ base.class_eval do
8
+ after_initialize :establish_secure_connection
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def establish_secure_connection
15
+ return if secure_connection_established?
16
+
17
+ PgRls.establish_new_connection
18
+ end
19
+
20
+ def secure_connection_established?
21
+ PgRls.current_connection_username == PgRls::SECURE_USERNAME
22
+ end
23
+ end
24
+ end
@@ -6,10 +6,11 @@ module PgRls
6
6
  class << self
7
7
  SET_COMPANY_ID_SQL = 'SET rls.tenant_id = %s'
8
8
  def switch(resource)
9
- connection_adapter = PgRls.establish_new_connection
9
+ connection_adapter = PgRls.connection_class
10
10
  tenant = tenant_by_subdomain_uuid_or_tenant_id(resource)
11
- connection_adapter.connection.execute(format('SET rls.tenant_id = %s', connection_adapter.connection.quote(tenant.tenant_id)))
12
- puts "connected to #{resource}"
11
+ connection_adapter.connection.execute(format(SET_COMPANY_ID_SQL,
12
+ connection_adapter.connection.quote(tenant.tenant_id)))
13
+ "RLS changed to '#{tenant}'"
13
14
  rescue StandardError => e
14
15
  puts 'connection was not made'
15
16
  puts e
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRls
4
- VERSION = '0.0.1.alpha'
4
+ VERSION = '0.0.1.beta'
5
5
  end
data/lib/pg_rls.rb CHANGED
@@ -4,11 +4,14 @@ require 'active_record'
4
4
  require 'forwardable'
5
5
  require_relative 'pg_rls/version'
6
6
  require_relative 'pg_rls/schema/statements'
7
- require_relative 'pg_rls/tenant/tenant'
7
+ require_relative 'pg_rls/tenant'
8
+ require_relative 'pg_rls/secure_connection'
9
+ require_relative 'pg_rls/multi_tenancy'
8
10
 
9
11
  # PostgreSQL Row Level Security
10
12
  module PgRls
11
13
  class Error < StandardError; end
14
+ SECURE_USERNAME = 'app_user'
12
15
 
13
16
  class << self
14
17
  extend Forwardable
@@ -38,17 +41,21 @@ module PgRls
38
41
 
39
42
  def establish_new_connection
40
43
  connection_class.establish_connection(
41
- connection_class.connection_config.dup.tap { |n| n[:username] = 'app_user' }
44
+ **database_configuration
42
45
  )
43
46
  end
44
47
 
48
+ def current_connection_username
49
+ PgRls.connection_class.connection_db_config.configuration_hash[:username]
50
+ end
51
+
45
52
  def execute(query)
46
53
  @execute = ActiveRecord::Migration.execute(query)
47
54
  end
48
55
 
49
56
  def database_configuration
50
57
  @database_configuration ||= database_connection_file[Rails.env].tap do |config|
51
- config['username'] = 'app_user'
58
+ config['username'] = PgRls::SECURE_USERNAME
52
59
  end
53
60
  end
54
61
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_rls
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha
4
+ version: 0.0.1.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Laloush
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-05 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-10-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.2.10
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.2.10
13
27
  description: Write a longer description or delete this line.
14
28
  email:
15
29
  - daniel.laloush@influitive.com
@@ -28,11 +42,25 @@ files:
28
42
  - Rakefile
29
43
  - bin/console
30
44
  - bin/setup
45
+ - lib/generators/pg_rls.rb
46
+ - lib/generators/pg_rls/active_record/active_record_generator.rb
47
+ - lib/generators/pg_rls/active_record/templates/abstract_base_class.rb.tt
48
+ - lib/generators/pg_rls/active_record/templates/init_migration.rb.tt
49
+ - lib/generators/pg_rls/active_record/templates/init_model.rb.tt
50
+ - lib/generators/pg_rls/active_record/templates/migration.rb.tt
51
+ - lib/generators/pg_rls/active_record/templates/model.rb.tt
52
+ - lib/generators/pg_rls/base.rb
53
+ - lib/generators/pg_rls/install_generator.rb
54
+ - lib/generators/pg_rls/pg_rls_generator.rb
55
+ - lib/generators/templates/README
56
+ - lib/generators/templates/pg_rls.rb.tt
31
57
  - lib/pg_rls.rb
58
+ - lib/pg_rls/multi_tenancy.rb
32
59
  - lib/pg_rls/schema/down_statements.rb
33
60
  - lib/pg_rls/schema/statements.rb
34
61
  - lib/pg_rls/schema/up_statements.rb
35
- - lib/pg_rls/tenant/tenant.rb
62
+ - lib/pg_rls/secure_connection.rb
63
+ - lib/pg_rls/tenant.rb
36
64
  - lib/pg_rls/version.rb
37
65
  homepage: https://github.com/Dandush03/pg_rls
38
66
  licenses: