Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ Or install it yourself as:

$ gem install activerecord-tenant-level-security

Next, run the generator:

rails generate tenant_level_security:install

## Usage

The activerecord-tenant-level-security provides an API for applying [PostgreSQL Row Level Security](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) (RLS) as follows:
Expand Down
1 change: 1 addition & 0 deletions activerecord-tenant-level-security.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
spec.add_dependency "pg", ">= 1.0"

spec.add_development_dependency "bundler", ">= 2.0"
spec.add_development_dependency "rails"
spec.add_development_dependency "rake", ">= 10.0"
spec.add_development_dependency "rspec", ">= 3.0"
end
2 changes: 2 additions & 0 deletions lib/generators/tenant_level_security/USAGE
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Description:
Copies tenant-level-security configuration file to your application's initializer directory.
11 changes: 11 additions & 0 deletions lib/generators/tenant_level_security/install_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module TenantLevelSecurity
module Generators
class InstallGenerator < ::Rails::Generators::Base
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This gem does not have an explicit dependency on Rails, so this reference is not always safe.
It might be better to make it work only if Rails is defined.

Strictly speaking, the classes and methods available will likely change depending on the version, so some version constraints may be necessary.

source_root File.expand_path("templates", __dir__)

def copy_initializer_file
copy_file "initializer.rb", "config/initializers/tenant_level_security.rb"
end
end
end
end
14 changes: 14 additions & 0 deletions lib/generators/tenant_level_security/templates/initializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Pass current tenant ID to `TenantLevelSecurity.current_tenant_id` block
# using ActiveSupport::CurrentAttributes, RequestStore, etc...
#
# The following example of using ActiveSupport::CurrentAttributes:
#
# # app/models/current.rb
# class Current < ActiveSupport::CurrentAttributes
# attribute :current_tenant_id
# end
#
# TenantLevelSecurity.current_tenant_id { Current.curent_tenant_id }

# Uncomment this line if you using activerecord-multi-tenant gem.
# TenantLevelSecurity.current_tenant_id { MultiTenant.current_tenant_id }
23 changes: 23 additions & 0 deletions spec/generators/install_generator_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
require "tmpdir"
require "rails/generators"
require "generators/tenant_level_security/install_generator"

RSpec.describe TenantLevelSecurity::Generators::InstallGenerator, type: :generators do
around do |example|
Dir.mktmpdir do |dir|
@destination_root = dir
example.run
end
end

describe "run generator" do
subject { described_class.start([], destination_root: @destination_root) }

let(:path) { "config/initializers/tenant_level_security.rb" }

it "generated initializer file" do
subject
expect(File.exist?(File.expand_path(path, @destination_root))).to be true
end
end
end