ros-apartment 2.5.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/.rubocop-linter.yml +1 -1
- data/.rubocop_todo.yml +1 -1
- data/README.md +14 -0
- data/lib/apartment/adapters/abstract_adapter.rb +8 -10
- data/lib/apartment/adapters/jdbc_postgresql_adapter.rb +9 -4
- data/lib/apartment/adapters/postgresql_adapter.rb +9 -4
- data/lib/apartment/adapters/sqlite3_adapter.rb +2 -0
- data/lib/apartment/console.rb +7 -0
- data/lib/apartment/custom_console.rb +21 -7
- data/lib/apartment/railtie.rb +1 -0
- data/lib/apartment/version.rb +1 -1
- data/lib/apartment.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0f6acd23ac1eab76581c3753f6833cb1a1b7b317e9652582721a2f6ad84500c
|
4
|
+
data.tar.gz: 0fc60c72b7148707b3d7530b41418873487cbe9de825b4e0e9bc8b82bc66a60e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b08ff81c0a66ba663774b2d96893fcbc1d5451b581b76957195bf7c09735351195368b45a7dda8f1e023f77fb0d5c8eb46c385ecae5e7d35840358cfe849a61d
|
7
|
+
data.tar.gz: c41e3675d25662bd4806466f97eff40f5f9548676a35450548fcdf98c27beca0c27e19935fe4d101b703f944bcdee09b07183314a140405183c7a192c3b4c062
|
data/.rubocop_todo.yml
CHANGED
@@ -21,7 +21,7 @@ Metrics/BlockLength:
|
|
21
21
|
# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
22
22
|
# URISchemes: http, https
|
23
23
|
Metrics/LineLength:
|
24
|
-
Max:
|
24
|
+
Max: 200
|
25
25
|
|
26
26
|
# Offense count: 4
|
27
27
|
# Configuration parameters: CountComments, ExcludedMethods.
|
data/README.md
CHANGED
@@ -324,6 +324,20 @@ Apartment.configure do |config|
|
|
324
324
|
end
|
325
325
|
```
|
326
326
|
|
327
|
+
### Skip tenant schema check
|
328
|
+
|
329
|
+
This is configurable by setting: `tenant_presence_check`. It defaults to true
|
330
|
+
in order to maintain the original gem behavior. This is only checked when using one of the PostgreSQL adapters.
|
331
|
+
The original gem behavior, when running `switch` would look for the existence of the schema before switching. This adds an extra query on every context switch. While in the default simple scenarios this is a valid check, in high volume platforms this adds some unnecessary overhead which can be detected in some other ways on the application level.
|
332
|
+
|
333
|
+
Setting this configuration value to `false` will disable the schema presence check before trying to switch the context.
|
334
|
+
|
335
|
+
```ruby
|
336
|
+
Apartment.configure do |config|
|
337
|
+
tenant_presence_check = false
|
338
|
+
end
|
339
|
+
```
|
340
|
+
|
327
341
|
### Excluding models
|
328
342
|
|
329
343
|
If you have some models that should always access the 'public' tenant, you can specify this by configuring Apartment using `Apartment.configure`. This will yield a config object for you. You can set excluded models like so:
|
@@ -68,8 +68,6 @@ module Apartment
|
|
68
68
|
#
|
69
69
|
def switch!(tenant = nil)
|
70
70
|
run_callbacks :switch do
|
71
|
-
return reset if tenant.nil?
|
72
|
-
|
73
71
|
connect_to_new(tenant).tap do
|
74
72
|
Apartment.connection.clear_query_cache
|
75
73
|
end
|
@@ -130,14 +128,12 @@ module Apartment
|
|
130
128
|
# @return {String} tenant name with Rails environment *optionally* prepended
|
131
129
|
#
|
132
130
|
def environmentify(tenant)
|
133
|
-
if
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
tenant
|
140
|
-
end
|
131
|
+
return tenant if tenant.nil? || tenant.include?(Rails.env)
|
132
|
+
|
133
|
+
if Apartment.prepend_environment
|
134
|
+
"#{Rails.env}_#{tenant}"
|
135
|
+
elsif Apartment.append_environment
|
136
|
+
"#{tenant}_#{Rails.env}"
|
141
137
|
else
|
142
138
|
tenant
|
143
139
|
end
|
@@ -175,6 +171,8 @@ module Apartment
|
|
175
171
|
# @param {String} tenant Database name
|
176
172
|
#
|
177
173
|
def connect_to_new(tenant)
|
174
|
+
return reset if tenant.nil?
|
175
|
+
|
178
176
|
query_cache_enabled = ActiveRecord::Base.connection.query_cache_enabled
|
179
177
|
|
180
178
|
Apartment.establish_connection multi_tenantify(tenant)
|
@@ -37,12 +37,11 @@ module Apartment
|
|
37
37
|
#
|
38
38
|
def connect_to_new(tenant = nil)
|
39
39
|
return reset if tenant.nil?
|
40
|
-
# rubocop:disable Style/RaiseArgs
|
41
|
-
raise ActiveRecord::StatementInvalid.new("Could not find schema #{tenant}") unless Apartment.connection.all_schemas.include? tenant.to_s
|
42
40
|
|
43
|
-
|
41
|
+
tenant = tenant.to_s
|
42
|
+
raise ActiveRecord::StatementInvalid, "Could not find schema #{tenant}" unless tenant_exists?(tenant)
|
44
43
|
|
45
|
-
@current = tenant
|
44
|
+
@current = tenant
|
46
45
|
Apartment.connection.schema_search_path = full_search_path
|
47
46
|
rescue ActiveRecord::StatementInvalid, ActiveRecord::JDBCError
|
48
47
|
raise TenantNotFound, "One of the following schema(s) is invalid: #{full_search_path}"
|
@@ -50,6 +49,12 @@ module Apartment
|
|
50
49
|
|
51
50
|
private
|
52
51
|
|
52
|
+
def tenant_exists?(tenant)
|
53
|
+
return true unless Apartment.tenant_presence_check
|
54
|
+
|
55
|
+
Apartment.connection.all_schemas.include? tenant
|
56
|
+
end
|
57
|
+
|
53
58
|
def rescue_from
|
54
59
|
ActiveRecord::JDBCError
|
55
60
|
end
|
@@ -62,12 +62,11 @@ module Apartment
|
|
62
62
|
#
|
63
63
|
def connect_to_new(tenant = nil)
|
64
64
|
return reset if tenant.nil?
|
65
|
-
# rubocop:disable Style/RaiseArgs
|
66
|
-
raise ActiveRecord::StatementInvalid.new("Could not find schema #{tenant}") unless Apartment.connection.schema_exists?(tenant.to_s)
|
67
65
|
|
68
|
-
|
66
|
+
tenant = tenant.to_s
|
67
|
+
raise ActiveRecord::StatementInvalid, "Could not find schema #{tenant}" unless tenant_exists?(tenant)
|
69
68
|
|
70
|
-
@current = tenant
|
69
|
+
@current = tenant
|
71
70
|
Apartment.connection.schema_search_path = full_search_path
|
72
71
|
|
73
72
|
# When the PostgreSQL version is < 9.3,
|
@@ -80,6 +79,12 @@ module Apartment
|
|
80
79
|
|
81
80
|
private
|
82
81
|
|
82
|
+
def tenant_exists?(tenant)
|
83
|
+
return true unless Apartment.tenant_presence_check
|
84
|
+
|
85
|
+
Apartment.connection.schema_exists?(tenant)
|
86
|
+
end
|
87
|
+
|
83
88
|
def create_tenant_command(conn, tenant)
|
84
89
|
conn.execute(%(CREATE SCHEMA "#{tenant}"))
|
85
90
|
end
|
data/lib/apartment/console.rb
CHANGED
@@ -35,3 +35,10 @@ def tenant_list
|
|
35
35
|
tenant_list += Apartment.tenant_names
|
36
36
|
tenant_list.uniq
|
37
37
|
end
|
38
|
+
|
39
|
+
def tenant_info_msg
|
40
|
+
# rubocop:disable Rails/Output
|
41
|
+
puts "Available Tenants: #{tenant_list}\n"
|
42
|
+
puts "Use `st 'tenant'` to switch tenants & `tenant_list` to see list\n"
|
43
|
+
# rubocop:enable Rails/Output
|
44
|
+
end
|
@@ -10,17 +10,31 @@ module Apartment
|
|
10
10
|
# rubocop:enable Rails/Output
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
'[1] [project_name][Rails.env][Apartment::Tenant.current] pry(main)>'
|
13
|
+
desc = "Includes the current Rails environment and project folder name.\n" \
|
14
|
+
'[1] [project_name][Rails.env][Apartment::Tenant.current] pry(main)>'
|
16
15
|
|
16
|
+
prompt_procs = [
|
17
|
+
proc { |target_self, nest_level, pry| prompt_contents(pry, target_self, nest_level, '>') },
|
18
|
+
proc { |target_self, nest_level, pry| prompt_contents(pry, target_self, nest_level, '*') }
|
19
|
+
]
|
20
|
+
|
21
|
+
if Gem::Version.new(Pry::VERSION) >= Gem::Version.new('0.13')
|
22
|
+
Pry.config.prompt = Pry::Prompt.new 'ros', desc, prompt_procs
|
23
|
+
else
|
17
24
|
Pry::Prompt.add 'ros', desc, %w[> *] do |target_self, nest_level, pry, sep|
|
18
|
-
|
19
|
-
"#{pry.config.prompt_name}(#{Pry.view_clip(target_self)})" \
|
20
|
-
"#{":#{nest_level}" unless nest_level.zero?}#{sep} "
|
25
|
+
prompt_contents(pry, target_self, nest_level, sep)
|
21
26
|
end
|
22
|
-
|
23
27
|
Pry.config.prompt = Pry::Prompt[:ros][:value]
|
24
28
|
end
|
29
|
+
|
30
|
+
Pry.config.hooks.add_hook(:when_started, 'startup message') do
|
31
|
+
tenant_info_msg
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.prompt_contents(pry, target_self, nest_level, sep)
|
35
|
+
"[#{pry.input_ring.size}] [#{PryRails::Prompt.formatted_env}][#{Apartment::Tenant.current}] " \
|
36
|
+
"#{pry.config.prompt_name}(#{Pry.view_clip(target_self)})" \
|
37
|
+
"#{":#{nest_level}" unless nest_level.zero?}#{sep} "
|
38
|
+
end
|
25
39
|
end
|
26
40
|
end
|
data/lib/apartment/railtie.rb
CHANGED
@@ -18,6 +18,7 @@ module Apartment
|
|
18
18
|
config.seed_after_create = false
|
19
19
|
config.prepend_environment = false
|
20
20
|
config.append_environment = false
|
21
|
+
config.tenant_presence_check = true
|
21
22
|
end
|
22
23
|
|
23
24
|
ActiveRecord::Migrator.migrations_paths = Rails.application.paths['db/migrate'].to_a
|
data/lib/apartment/version.rb
CHANGED
data/lib/apartment.rb
CHANGED
@@ -20,7 +20,7 @@ module Apartment
|
|
20
20
|
extend Forwardable
|
21
21
|
|
22
22
|
ACCESSOR_METHODS = %i[use_schemas use_sql seed_after_create prepend_environment
|
23
|
-
append_environment with_multi_server_setup].freeze
|
23
|
+
append_environment with_multi_server_setup tenant_presence_check].freeze
|
24
24
|
|
25
25
|
WRITER_METHODS = %i[tenant_names database_schema_file excluded_models
|
26
26
|
default_schema persistent_schemas connection_class
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ros-apartment
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Brunner
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2020-05-
|
13
|
+
date: 2020-05-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|