penthouse 0.7.5 → 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
  SHA1:
3
- metadata.gz: a49b8e9cb0526dc97db28adae4d815d6e7159d0f
4
- data.tar.gz: 2e4a8a76a90e3c4ef3cc61fd791cde94cd37b5b3
3
+ metadata.gz: 92248bef6760f1ed6455c27c851fce79e267b8e7
4
+ data.tar.gz: cc5a1f2bfdda094227a8449123dd8178a09305a0
5
5
  SHA512:
6
- metadata.gz: fb84d69706713d17af8970d5f7c5b201cd9ff836543b164d3df2ed744e5014b295001b4926348ea15780c45abecb569093be4c4a47866f6834cbe2c7f381ae34
7
- data.tar.gz: c9fe8a286abdf9f2fbd42d656a33c9bfecb17ca8eb467b9cdc2816fed0aa8cbd960b4269a4f414fbcc23f2c3f49d207f8efdd84c262caeaa3d73720b264acec6
6
+ metadata.gz: 41bcde8417c7e7c4ee517682c47230a91dcf72fa918b8834a7ad21032daf3c661ea5c38374c129a9cbdc7b5754faf65eaf85d783f72aceca938996fc20301e85
7
+ data.tar.gz: 2c1fe638a8a09aabce3a3c80813f4f4f4ed5106b794688f6b083b8c35413dd7e94d1387370feeeb7a2bc26acd777d592991e4804e056278d619cbe784c8d1278
data/README.md CHANGED
@@ -30,7 +30,11 @@ Penthouse.configure do |config|
30
30
  # enhance migrations to migrate all tenants
31
31
  config.migrate_tenants = true
32
32
  # setup a proc which will return the tenants
33
- config.tenant_identifiers = Proc.new { Account.pluck(:tenant_name) }
33
+ config.tenants = Proc.new do
34
+ Account.each_with_object({}) do |account, result|
35
+ result.merge!(account.slug => account)
36
+ end
37
+ end
34
38
  end
35
39
 
36
40
  Rails.application.config.middleware.use Penthouse::App
@@ -12,19 +12,21 @@
12
12
 
13
13
  module Penthouse
14
14
  class Configuration
15
- attr_accessor :router, :runner, :migrate_tenants, :db_schema_file, :tenant_identifiers
15
+ attr_accessor :router, :runner, :migrate_tenants, :db_schema_file, :tenants
16
16
 
17
17
  # @param router [Penthouse::Routers::BaseRouter] the default router for your application to use
18
18
  # @param runner [Penthouse::Runners::BaseRunner] the default runner for your application to use
19
19
  # @param migrate_tenants [Boolean] whether you want Penthouse to automatically migrate all tenants
20
- # @param db_schema_file [String] a path to your schema file (typically `db/schema.rb` or `db/structure.sql` in Rails)
21
- # @param tenant_identifiers [Proc] some code which must return an array of tenant identifiers (strings/symbols)
22
- def initialize(router: nil, runner: nil, migrate_tenants: false, db_schema_file: nil, tenant_identifiers: -> { raise NotImplementedError })
20
+ # @param db_schema_file [String] a path to your schema file
21
+ # (typically `db/schema.rb` or `db/structure.sql` in Rails)
22
+ # @param tenants [Proc] some code which must return an hash of tenant identifiers (strings/symbols)
23
+ # mapped to tenant objects, which can be anything your runner needs
24
+ def initialize(router: nil, runner: nil, migrate_tenants: false, db_schema_file: nil, tenants: -> { raise NotImplementedError })
23
25
  self.router = router
24
26
  self.runner = runner
25
27
  self.migrate_tenants = migrate_tenants
26
28
  self.db_schema_file = db_schema_file
27
- self.tenant_identifiers = tenant_identifiers
29
+ self.tenants = tenants
28
30
 
29
31
  if migrate_tenants? && !db_schema_file
30
32
  raise ArgumentError, "If you want to migrate tenants, we need a path to a DB schema file"
@@ -42,76 +42,56 @@ module Penthouse
42
42
 
43
43
  module ClassMethods
44
44
  def migrate_with_penthouse(migrations_paths, target_version = nil, &block)
45
- puts "#migrate_with_penthouse called"
46
-
47
45
  unless Penthouse.configuration.migrate_tenants?
48
- puts "Skipping penthouse integration"
49
46
  return migrate_without_penthouse(migrations_paths, target_version, &block)
50
47
  end
51
48
 
52
49
  Penthouse.each_tenant(tenant_identifiers: tenants_to_migrate) do |tenant|
53
- puts "Migrating #{tenant.identifier}"
54
- puts "calling #migrate_without_penthouse"
55
50
  migrate_without_penthouse(migrations_paths, target_version, &block)
56
51
  end
57
52
  end
58
53
 
59
54
  def up_with_penthouse(migrations_paths, target_version = nil, &block)
60
- puts "#up_with_penthouse called"
61
-
62
55
  unless Penthouse.configuration.migrate_tenants?
63
- puts "Skipping penthouse integration"
64
56
  return up_without_penthouse(migrations_paths, target_version, &block)
65
57
  end
66
58
 
67
59
  Penthouse.each_tenant(tenant_identifiers: tenants_to_migrate) do |tenant|
68
- puts "Migrating #{tenant.identifier}"
69
- puts "calling #up_without_penthouse"
70
60
  up_without_penthouse(migrations_paths, target_version, &block)
71
61
  end
72
62
  end
73
63
 
74
64
  def down_with_penthouse(migrations_paths, target_version = nil, &block)
75
- puts "#down_with_penthouse called"
76
-
77
65
  unless Penthouse.configuration.migrate_tenants?
78
- puts "Skipping penthouse integration"
79
66
  return down_without_penthouse(migrations_paths, target_version, &block)
80
67
  end
81
68
 
82
69
  Penthouse.each_tenant(tenant_identifiers: tenants_to_migrate) do |tenant|
83
- puts "Migrating #{tenant.identifier}"
84
- puts "calling #down_without_penthouse"
85
70
  down_without_penthouse(migrations_paths, target_version, &block)
86
71
  end
87
72
  end
88
73
 
89
74
  def run_with_penthouse(direction, migrations_paths, target_version)
90
- puts "#run_with_penthouse called"
91
-
92
75
  unless Penthouse.configuration.migrate_tenants?
93
- puts "Skipping penthouse integration"
94
76
  return run_without_penthouse(direction, migrations_paths, target_version)
95
77
  end
96
78
 
97
79
  Penthouse.each_tenant(tenant_identifiers: tenants_to_migrate) do |tenant|
98
- puts "Migrating #{tenant.identifier}"
99
- puts "calling #run_without_penthouse"
100
80
  run_without_penthouse(direction, migrations_paths, target_version)
101
81
  end
102
82
  end
103
83
 
84
+ private
85
+
104
86
  def tenants_to_migrate
105
87
  return @tenants_to_migrate if defined?(@tenants_to_migrate)
106
88
  @tenants_to_migrate = begin
107
- if (t = ENV["TENANT"] || ENV["TENANTS"])
89
+ if !!(t = (ENV["TENANT"] || ENV["TENANTS"]))
108
90
  t.split(",").map(&:strip)
109
91
  else
110
92
  Penthouse.tenant_identifiers
111
93
  end
112
94
  end
113
- puts "#tenants_to_migrate = #{@tenants_to_migrate}"
114
- @tenants_to_migrate
115
95
  end
116
96
  end
117
97
  end
@@ -20,7 +20,7 @@ module Penthouse
20
20
  # @param block [Block] The code to execute within the schema
21
21
  # @yield [SchemaTenant] The current tenant instance
22
22
  # @return [void]
23
- def call(shard: :master, &block)
23
+ def call(shard: Octopus.master_shard, &block)
24
24
  Octopus.using(shard) do
25
25
  super(&block)
26
26
  end
@@ -18,7 +18,7 @@ module Penthouse
18
18
  # @param identifier [String, Symbol] An identifier for the tenant
19
19
  # @param shard [String, Symbol] the configured Octopus shard to use for this tenant
20
20
  # @param tenant_schema [String] your tenant's schema name within the Postgres shard, typically just 'public' as the shard should be dedicated
21
- def initialize(identifer, shard:, tenant_schema: "public", **options)
21
+ def initialize(identifier, shard:, tenant_schema: "public", **options)
22
22
  self.shard = shard
23
23
  super(identifier, tenant_schema: tenant_schema, **options)
24
24
  end
@@ -1,3 +1,3 @@
1
1
  module Penthouse
2
- VERSION = "0.7.5"
2
+ VERSION = "0.8.0"
3
3
  end
data/lib/penthouse.rb CHANGED
@@ -6,19 +6,20 @@ require "penthouse/runners/base_runner"
6
6
 
7
7
  module Penthouse
8
8
  class TenantNotFound < RuntimeError; end
9
+ CURRENT_TENANT_KEY = 'penthouse_tenant'.freeze
9
10
 
10
11
  class << self
11
12
  # Retrieves the currently active tenant identifier
12
13
  # @return [String, Symbol] the current tenant name
13
14
  def tenant
14
- Thread.current[:tenant]
15
+ Thread.current[CURRENT_TENANT_KEY]
15
16
  end
16
17
 
17
18
  # Sets the currently active tenant identifier
18
19
  # @param tenant_identifier [String, Symbol] the identifier for the tenant
19
20
  # @return [void]
20
21
  def tenant=(tenant_identifier)
21
- Thread.current[:tenant] = tenant_identifier
22
+ Thread.current[CURRENT_TENANT_KEY] = tenant_identifier
22
23
  end
23
24
 
24
25
  # Similar to Penthouse.tenant=, except this will switch back after the given
@@ -28,7 +29,7 @@ module Penthouse
28
29
  # @param block [Block] the code to execute
29
30
  # @yield [String, Symbol] the identifier for the tenant
30
31
  # @return [void]
31
- def with_tenant(tenant_identifier, default_tenant: tenant, &block)
32
+ def with_tenant(tenant_identifier, default_tenant: self.tenant, &block)
32
33
  self.tenant = tenant_identifier
33
34
  block.yield(tenant_identifier)
34
35
  ensure
@@ -42,8 +43,8 @@ module Penthouse
42
43
  # @param block [Block] the code to execute
43
44
  # @yield [String, Symbol] the identifier for the tenant
44
45
  # @return [void]
45
- def each_tenant(tenant_identifiers: nil, default_tenant: tenant, runner: configuration.runner, &block)
46
- (tenant_identifiers || self.tenant_identifiers).each do |tenant_identifier|
46
+ def each_tenant(tenant_identifiers: self.tenant_identifiers, default_tenant: self.tenant, runner: self.configuration.runner, &block)
47
+ tenant_identifiers.each do |tenant_identifier|
47
48
  switch(tenant_identifier, runner: runner, &block)
48
49
  end
49
50
  end
@@ -54,7 +55,7 @@ module Penthouse
54
55
  # @param block [Block] the code to execute
55
56
  # @yield [Penthouse::Tenants::BaseTenant] the tenant instance
56
57
  # @return [void]
57
- def switch(tenant_identifier, runner: configuration.runner, &block)
58
+ def switch(tenant_identifier, runner: self.configuration.runner, &block)
58
59
  runner.call(tenant_identifier, &block)
59
60
  end
60
61
 
@@ -62,7 +63,7 @@ module Penthouse
62
63
  # @param tenant_identifier [String, Symbol] the identifier for the tenant
63
64
  # @see Penthouse::Tenants::BaseTenant#delete
64
65
  # @return [void]
65
- def create(tenant_identifier, runner: configuration.runner, **options)
66
+ def create(tenant_identifier, runner: self.configuration.runner, **options)
66
67
  switch(tenant_identifier, runner: runner) do |tenant|
67
68
  tenant.create(**options)
68
69
  end
@@ -72,7 +73,7 @@ module Penthouse
72
73
  # @param tenant_identifier [String, Symbol] the identifier for the tenant
73
74
  # @see Penthouse::Tenants::BaseTenant#delete
74
75
  # @return [void]
75
- def delete(tenant_identifier, runner: configuration.runner, **options)
76
+ def delete(tenant_identifier, runner: self.configuration.runner, **options)
76
77
  switch(tenant_identifier, runner: runner) do |tenant|
77
78
  tenant.delete(**options)
78
79
  end
@@ -97,10 +98,16 @@ module Penthouse
97
98
  )
98
99
  end
99
100
 
101
+ # Returns a hash of tenant identifiers based on the configured setting
102
+ # @return [Hash<String, Symbol => Object>] the hash of tenants
103
+ def tenants
104
+ configuration.tenants.call
105
+ end
106
+
100
107
  # Returns a array of tenant identifiers based on the configured setting
101
108
  # @return [Array<String, Symbol>] the list of tenant identifiers
102
109
  def tenant_identifiers
103
- configuration.tenant_identifiers.call
110
+ tenants.keys
104
111
  end
105
112
  end
106
113
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: penthouse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.5
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Townsend