Module: Apartment

Extended by:
Forwardable
Defined in:
lib/apartment/tasks/enhancements.rb,
lib/apartment.rb,
lib/apartment/tenant.rb,
lib/apartment/railtie.rb,
lib/apartment/version.rb,
lib/apartment/migrator.rb,
lib/apartment/reloader.rb,
lib/apartment/deprecation.rb,
lib/apartment/elevators/domain.rb,
lib/apartment/elevators/generic.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/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, Deprecation, Elevators, Migrator, Tenant Classes: InstallGenerator, Railtie, RakeTaskEnhancer, Reloader

Constant Summary collapse

ACCESSOR_METHODS =
[:use_schemas, :use_sql, :seed_after_create, :prepend_environment, :append_environment, :with_multi_server_setup ]
WRITER_METHODS =
[:tenant_names, :database_schema_file, :excluded_models, :default_schema, :persistent_schemas, :connection_class, :tld_length, :db_migrate_tenants, :seed_data_file]
ApartmentError =

Exceptions

Class.new(StandardError)
AdapterNotFound =

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

Class.new(ApartmentError)
TenantNotFound =

Tenant specified is unknown

Class.new(ApartmentError)
TenantExists =

The Tenant attempting to be created already exists

Class.new(ApartmentError)
VERSION =
"1.2.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



23
24
25
# File 'lib/apartment.rb', line 23

def configure
  yield self if block_given?
end

.connection_classObject



62
63
64
# File 'lib/apartment.rb', line 62

def connection_class
  @connection_class || ActiveRecord::Base
end

.const_missing(const_name) ⇒ Object



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

def self.const_missing(const_name)
  if const_name == :Database
    Apartment::Deprecation.warn "`Apartment::Database` has been deprecated. Use `Apartment::Tenant` instead."
    Tenant
  else
    super
  end
end

.database_namesObject



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

def database_names
  Apartment::Deprecation.warn "[Deprecation Warning] `database_names` is now deprecated, please use `tenant_names`"
  tenant_names
end

.database_names=(names) ⇒ Object



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

def database_names=(names)
  Apartment::Deprecation.warn "[Deprecation Warning] `database_names=` is now deprecated, please use `tenant_names=`"
  self.tenant_names=(names)
end

.database_schema_fileObject



66
67
68
69
70
# File 'lib/apartment.rb', line 66

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



35
36
37
# File 'lib/apartment.rb', line 35

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

.db_migrate_tenantsObject

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



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

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

  @db_migrate_tenants = true
end

.default_schemaObject Also known as: default_tenant



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

def default_schema
  @default_schema || "public" # TODO 'public' is postgres specific
end

.excluded_modelsObject

Default to empty array



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

def excluded_models
  @excluded_models || []
end

.extract_tenant_configObject



107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/apartment.rb', line 107

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

.persistent_schemasObject



58
59
60
# File 'lib/apartment.rb', line 58

def persistent_schemas
  @persistent_schemas || []
end

.resetObject

Reset all the config for Apartment



83
84
85
# File 'lib/apartment.rb', line 83

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

.seed_data_fileObject



72
73
74
75
76
# File 'lib/apartment.rb', line 72

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

  @seed_data_file = "#{Rails.root}/db/seeds.rb"
end

.tenant_namesObject



27
28
29
# File 'lib/apartment.rb', line 27

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

.tenants_with_configObject



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

def tenants_with_config
  extract_tenant_config
end

.tld_lengthObject



78
79
80
# File 'lib/apartment.rb', line 78

def tld_length
  @tld_length || 1
end

.use_postgres_schemasObject



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

def use_postgres_schemas
  Apartment::Deprecation.warn "[Deprecation Warning] `use_postgresql_schemas` is now deprecated, please use `use_schemas`"
  use_schemas
end

.use_postgres_schemas=(to_use_or_not_to_use) ⇒ Object



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

def use_postgres_schemas=(to_use_or_not_to_use)
  Apartment::Deprecation.warn "[Deprecation Warning] `use_postgresql_schemas=` is now deprecated, please use `use_schemas=`"
  self.use_schemas = to_use_or_not_to_use
end