Module: Apartment

Extended by:
Forwardable
Defined in:
lib/apartment.rb,
lib/apartment/model.rb,
lib/apartment/tenant.rb,
lib/apartment/railtie.rb,
lib/apartment/version.rb,
lib/apartment/migrator.rb,
lib/apartment/deprecation.rb,
lib/apartment/custom_console.rb,
lib/apartment/elevators/host.rb,
lib/apartment/log_subscriber.rb,
lib/apartment/elevators/domain.rb,
lib/apartment/elevators/generic.rb,
lib/apartment/tasks/task_helper.rb,
lib/apartment/tasks/enhancements.rb,
lib/apartment/elevators/host_hash.rb,
lib/apartment/elevators/subdomain.rb,
lib/apartment/adapters/mysql2_adapter.rb,
lib/apartment/adapters/postgis_adapter.rb,
lib/apartment/adapters/sqlite3_adapter.rb,
lib/apartment/adapters/trilogy_adapter.rb,
lib/apartment/adapters/abstract_adapter.rb,
lib/apartment/elevators/first_subdomain.rb,
lib/apartment/adapters/jdbc_mysql_adapter.rb,
lib/apartment/adapters/postgresql_adapter.rb,
lib/apartment/adapters/abstract_jdbc_adapter.rb,
lib/apartment/adapters/jdbc_postgresql_adapter.rb,
lib/generators/apartment/install/install_generator.rb

Overview

Require this file to append Apartment rake tasks to ActiveRecord db rake tasks Enabled by default in the initializer

Defined Under Namespace

Modules: Adapters, CustomConsole, Deprecation, Elevators, Migrator, Model, PostgreSqlAdapterPatch, TaskHelper, Tenant Classes: InstallGenerator, LogSubscriber, Railtie, RakeTaskEnhancer

Constant Summary collapse

ACCESSOR_METHODS =
%i[use_schemas use_sql seed_after_create prepend_environment default_tenant
append_environment with_multi_server_setup tenant_presence_check active_record_log].freeze
WRITER_METHODS =
%i[tenant_names database_schema_file excluded_models
persistent_schemas connection_class
db_migrate_tenants db_migrate_tenant_missing_strategy seed_data_file
parallel_migration_threads pg_excluded_names].freeze
ApartmentError =

Exceptions

Class.new(StandardError)
AdapterNotFound =

Raised when apartment cannot find the adapter specified in config/database.yml

Class.new(ApartmentError)
FileNotFound =

Raised when apartment cannot find the file to be loaded

Class.new(ApartmentError)
TenantNotFound =

Tenant specified is unknown

Class.new(ApartmentError)
TenantExists =

The Tenant attempting to be created already exists

Class.new(ApartmentError)
VERSION =
'3.1.0'

Class Method Summary collapse

Class Method Details

.configure {|_self| ... } ⇒ Object

configure apartment with available options

Yields:

  • (_self)

Yield Parameters:

  • _self (Apartment)

    the object that the method was called on



37
38
39
# File 'lib/apartment.rb', line 37

def configure
  yield self if block_given?
end

.connection_classObject



93
94
95
# File 'lib/apartment.rb', line 93

def connection_class
  @connection_class || ActiveRecord::Base
end

.connection_configObject



32
33
34
# File 'lib/apartment.rb', line 32

def connection_config
  connection_db_config.configuration_hash
end

.database_schema_fileObject



97
98
99
100
101
# File 'lib/apartment.rb', line 97

def database_schema_file
  return @database_schema_file if defined?(@database_schema_file)

  @database_schema_file = Rails.root.join('db/schema.rb')
end

.db_config_for(tenant) ⇒ Object



53
54
55
# File 'lib/apartment.rb', line 53

def db_config_for(tenant)
  (tenants_with_config[tenant] || connection_config)
end

.db_migrate_tenant_missing_strategyObject

How to handle tenant missing on db:migrate defaults to :rescue_exception available options: rescue_exception, raise_exception, create_tenant

Raises:



68
69
70
71
72
73
74
75
76
77
78
# File 'lib/apartment.rb', line 68

def db_migrate_tenant_missing_strategy
  valid = %i[rescue_exception raise_exception create_tenant]
  value = @db_migrate_tenant_missing_strategy || :rescue_exception

  return value if valid.include?(value)

  key_name  = 'config.db_migrate_tenant_missing_strategy'
  opt_names = valid.join(', ')

  raise ApartmentError, "Option #{value} not valid for `#{key_name}`. Use one of #{opt_names}"
end

.db_migrate_tenantsObject

Whether or not db:migrate should also migrate tenants defaults to true



59
60
61
62
63
# File 'lib/apartment.rb', line 59

def db_migrate_tenants
  return @db_migrate_tenants if defined?(@db_migrate_tenants)

  @db_migrate_tenants = true
end

.excluded_modelsObject

Default to empty array



81
82
83
# File 'lib/apartment.rb', line 81

def excluded_models
  @excluded_models || []
end

.extract_tenant_configObject



120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/apartment.rb', line 120

def extract_tenant_config
  return {} unless @tenant_names

  values = @tenant_names.respond_to?(:call) ? @tenant_names.call : @tenant_names
  unless values.is_a? Hash
    values = values.each_with_object({}) do |tenant, hash|
      hash[tenant] = connection_config
    end
  end
  values.with_indifferent_access
rescue ActiveRecord::StatementInvalid
  {}
end

.parallel_migration_threadsObject



85
86
87
# File 'lib/apartment.rb', line 85

def parallel_migration_threads
  @parallel_migration_threads || 0
end

.persistent_schemasObject



89
90
91
# File 'lib/apartment.rb', line 89

def persistent_schemas
  @persistent_schemas || []
end

.pg_excluded_namesObject



109
110
111
# File 'lib/apartment.rb', line 109

def pg_excluded_names
  @pg_excluded_names || []
end

.resetObject

Reset all the config for Apartment



114
115
116
117
118
# File 'lib/apartment.rb', line 114

def reset
  (ACCESSOR_METHODS + WRITER_METHODS).each do |method|
    remove_instance_variable(:"@#{method}") if instance_variable_defined?(:"@#{method}")
  end
end

.seed_data_fileObject



103
104
105
106
107
# File 'lib/apartment.rb', line 103

def seed_data_file
  return @seed_data_file if defined?(@seed_data_file)

  @seed_data_file = Rails.root.join('db/seeds.rb')
end

.tenant_namesObject



41
42
43
# File 'lib/apartment.rb', line 41

def tenant_names
  extract_tenant_config.keys.map(&:to_s)
end

.tenants_with_configObject



45
46
47
# File 'lib/apartment.rb', line 45

def tenants_with_config
  extract_tenant_config
end

.tld_length=(_) ⇒ Object



49
50
51
# File 'lib/apartment.rb', line 49

def tld_length=(_)
  Apartment::Deprecation.warn('`config.tld_length` have no effect because it was removed in https://github.com/influitive/apartment/pull/309')
end