ros-apartment 2.3.0.alpha2 → 2.6.1

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.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/.rubocop-linter.yml +22 -0
  3. data/.pryrc +5 -3
  4. data/.rubocop.yml +21 -0
  5. data/.rubocop_todo.yml +29 -0
  6. data/.story_branch.yml +4 -0
  7. data/.travis.yml +15 -36
  8. data/Appraisals +16 -29
  9. data/Gemfile +4 -1
  10. data/Guardfile +3 -1
  11. data/HISTORY.md +7 -0
  12. data/README.md +80 -39
  13. data/Rakefile +45 -23
  14. data/apartment.gemspec +33 -25
  15. data/gemfiles/rails_4_2.gemfile +12 -10
  16. data/gemfiles/rails_5_0.gemfile +2 -1
  17. data/gemfiles/rails_5_1.gemfile +2 -1
  18. data/gemfiles/rails_5_2.gemfile +2 -1
  19. data/gemfiles/rails_6_0.gemfile +6 -5
  20. data/gemfiles/rails_master.gemfile +2 -1
  21. data/lib/apartment.rb +36 -11
  22. data/lib/apartment/active_record/connection_handling.rb +17 -0
  23. data/lib/apartment/active_record/internal_metadata.rb +11 -0
  24. data/lib/apartment/active_record/schema_migration.rb +13 -0
  25. data/lib/apartment/adapters/abstract_adapter.rb +50 -45
  26. data/lib/apartment/adapters/abstract_jdbc_adapter.rb +4 -3
  27. data/lib/apartment/adapters/jdbc_mysql_adapter.rb +3 -3
  28. data/lib/apartment/adapters/jdbc_postgresql_adapter.rb +20 -13
  29. data/lib/apartment/adapters/mysql2_adapter.rb +10 -9
  30. data/lib/apartment/adapters/postgis_adapter.rb +3 -2
  31. data/lib/apartment/adapters/postgresql_adapter.rb +55 -27
  32. data/lib/apartment/adapters/sqlite3_adapter.rb +18 -8
  33. data/lib/apartment/console.rb +35 -3
  34. data/lib/apartment/custom_console.rb +42 -0
  35. data/lib/apartment/deprecation.rb +2 -1
  36. data/lib/apartment/elevators/domain.rb +4 -3
  37. data/lib/apartment/elevators/first_subdomain.rb +3 -2
  38. data/lib/apartment/elevators/generic.rb +4 -3
  39. data/lib/apartment/elevators/host.rb +6 -1
  40. data/lib/apartment/elevators/host_hash.rb +6 -2
  41. data/lib/apartment/elevators/subdomain.rb +9 -5
  42. data/lib/apartment/migrator.rb +4 -3
  43. data/lib/apartment/model.rb +27 -0
  44. data/lib/apartment/railtie.rb +26 -15
  45. data/lib/apartment/reloader.rb +2 -1
  46. data/lib/apartment/tasks/enhancements.rb +4 -6
  47. data/lib/apartment/tenant.rb +19 -9
  48. data/lib/apartment/version.rb +3 -1
  49. data/lib/generators/apartment/install/install_generator.rb +4 -3
  50. data/lib/generators/apartment/install/templates/apartment.rb +3 -2
  51. data/lib/tasks/apartment.rake +24 -19
  52. metadata +79 -256
  53. data/spec/adapters/jdbc_mysql_adapter_spec.rb +0 -19
  54. data/spec/adapters/jdbc_postgresql_adapter_spec.rb +0 -41
  55. data/spec/adapters/mysql2_adapter_spec.rb +0 -59
  56. data/spec/adapters/postgresql_adapter_spec.rb +0 -61
  57. data/spec/adapters/sqlite3_adapter_spec.rb +0 -83
  58. data/spec/apartment_spec.rb +0 -11
  59. data/spec/config/database.yml.sample +0 -49
  60. data/spec/dummy/Rakefile +0 -7
  61. data/spec/dummy/app/controllers/application_controller.rb +0 -6
  62. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  63. data/spec/dummy/app/models/company.rb +0 -3
  64. data/spec/dummy/app/models/user.rb +0 -3
  65. data/spec/dummy/app/views/application/index.html.erb +0 -1
  66. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  67. data/spec/dummy/config.ru +0 -4
  68. data/spec/dummy/config/application.rb +0 -49
  69. data/spec/dummy/config/boot.rb +0 -11
  70. data/spec/dummy/config/database.yml.sample +0 -44
  71. data/spec/dummy/config/environment.rb +0 -5
  72. data/spec/dummy/config/environments/development.rb +0 -28
  73. data/spec/dummy/config/environments/production.rb +0 -51
  74. data/spec/dummy/config/environments/test.rb +0 -34
  75. data/spec/dummy/config/initializers/apartment.rb +0 -4
  76. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  77. data/spec/dummy/config/initializers/inflections.rb +0 -10
  78. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  79. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  80. data/spec/dummy/config/initializers/session_store.rb +0 -8
  81. data/spec/dummy/config/locales/en.yml +0 -5
  82. data/spec/dummy/config/routes.rb +0 -3
  83. data/spec/dummy/db/migrate/20110613152810_create_dummy_models.rb +0 -39
  84. data/spec/dummy/db/migrate/20111202022214_create_table_books.rb +0 -14
  85. data/spec/dummy/db/migrate/20180415260934_create_public_tokens.rb +0 -13
  86. data/spec/dummy/db/schema.rb +0 -55
  87. data/spec/dummy/db/seeds.rb +0 -5
  88. data/spec/dummy/db/seeds/import.rb +0 -5
  89. data/spec/dummy/public/404.html +0 -26
  90. data/spec/dummy/public/422.html +0 -26
  91. data/spec/dummy/public/500.html +0 -26
  92. data/spec/dummy/public/favicon.ico +0 -0
  93. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  94. data/spec/dummy/script/rails +0 -6
  95. data/spec/dummy_engine/.gitignore +0 -8
  96. data/spec/dummy_engine/Gemfile +0 -15
  97. data/spec/dummy_engine/Rakefile +0 -34
  98. data/spec/dummy_engine/bin/rails +0 -12
  99. data/spec/dummy_engine/config/initializers/apartment.rb +0 -51
  100. data/spec/dummy_engine/dummy_engine.gemspec +0 -24
  101. data/spec/dummy_engine/lib/dummy_engine.rb +0 -4
  102. data/spec/dummy_engine/lib/dummy_engine/engine.rb +0 -4
  103. data/spec/dummy_engine/lib/dummy_engine/version.rb +0 -3
  104. data/spec/dummy_engine/test/dummy/Rakefile +0 -6
  105. data/spec/dummy_engine/test/dummy/config.ru +0 -4
  106. data/spec/dummy_engine/test/dummy/config/application.rb +0 -22
  107. data/spec/dummy_engine/test/dummy/config/boot.rb +0 -5
  108. data/spec/dummy_engine/test/dummy/config/database.yml +0 -25
  109. data/spec/dummy_engine/test/dummy/config/environment.rb +0 -5
  110. data/spec/dummy_engine/test/dummy/config/environments/development.rb +0 -37
  111. data/spec/dummy_engine/test/dummy/config/environments/production.rb +0 -78
  112. data/spec/dummy_engine/test/dummy/config/environments/test.rb +0 -39
  113. data/spec/dummy_engine/test/dummy/config/initializers/assets.rb +0 -8
  114. data/spec/dummy_engine/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  115. data/spec/dummy_engine/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  116. data/spec/dummy_engine/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  117. data/spec/dummy_engine/test/dummy/config/initializers/inflections.rb +0 -16
  118. data/spec/dummy_engine/test/dummy/config/initializers/mime_types.rb +0 -4
  119. data/spec/dummy_engine/test/dummy/config/initializers/session_store.rb +0 -3
  120. data/spec/dummy_engine/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  121. data/spec/dummy_engine/test/dummy/config/locales/en.yml +0 -23
  122. data/spec/dummy_engine/test/dummy/config/routes.rb +0 -56
  123. data/spec/dummy_engine/test/dummy/config/secrets.yml +0 -22
  124. data/spec/examples/connection_adapter_examples.rb +0 -42
  125. data/spec/examples/generic_adapter_custom_configuration_example.rb +0 -95
  126. data/spec/examples/generic_adapter_examples.rb +0 -163
  127. data/spec/examples/schema_adapter_examples.rb +0 -234
  128. data/spec/integration/apartment_rake_integration_spec.rb +0 -107
  129. data/spec/integration/query_caching_spec.rb +0 -81
  130. data/spec/integration/use_within_an_engine_spec.rb +0 -28
  131. data/spec/schemas/v1.rb +0 -16
  132. data/spec/schemas/v2.rb +0 -43
  133. data/spec/schemas/v3.rb +0 -49
  134. data/spec/spec_helper.rb +0 -61
  135. data/spec/support/apartment_helpers.rb +0 -43
  136. data/spec/support/capybara_sessions.rb +0 -15
  137. data/spec/support/config.rb +0 -10
  138. data/spec/support/contexts.rb +0 -52
  139. data/spec/support/requirements.rb +0 -35
  140. data/spec/support/setup.rb +0 -46
  141. data/spec/tasks/apartment_rake_spec.rb +0 -129
  142. data/spec/tenant_spec.rb +0 -190
  143. data/spec/unit/config_spec.rb +0 -112
  144. data/spec/unit/elevators/domain_spec.rb +0 -32
  145. data/spec/unit/elevators/first_subdomain_spec.rb +0 -24
  146. data/spec/unit/elevators/generic_spec.rb +0 -54
  147. data/spec/unit/elevators/host_hash_spec.rb +0 -32
  148. data/spec/unit/elevators/host_spec.rb +0 -89
  149. data/spec/unit/elevators/subdomain_spec.rb +0 -76
  150. data/spec/unit/migrator_spec.rb +0 -77
  151. data/spec/unit/reloader_spec.rb +0 -24
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'apartment/elevators/generic'
2
4
 
3
5
  module Apartment
@@ -12,8 +14,10 @@ module Apartment
12
14
  end
13
15
 
14
16
  def parse_tenant_name(request)
15
- raise TenantNotFound,
16
- "Cannot find tenant for host #{request.host}" unless @hash.has_key?(request.host)
17
+ unless @hash.key?(request.host)
18
+ raise TenantNotFound,
19
+ "Cannot find tenant for host #{request.host}"
20
+ end
17
21
 
18
22
  @hash[request.host]
19
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'apartment/elevators/generic'
2
4
  require 'public_suffix'
3
5
 
@@ -11,9 +13,11 @@ module Apartment
11
13
  @excluded_subdomains ||= []
12
14
  end
13
15
 
16
+ # rubocop:disable Style/TrivialAccessors
14
17
  def self.excluded_subdomains=(arg)
15
18
  @excluded_subdomains = arg
16
19
  end
20
+ # rubocop:enable Style/TrivialAccessors
17
21
 
18
22
  def parse_tenant_name(request)
19
23
  request_subdomain = subdomain(request.host)
@@ -21,15 +25,15 @@ module Apartment
21
25
  # If the domain acquired is set to be excluded, set the tenant to whatever is currently
22
26
  # next in line in the schema search path.
23
27
  tenant = if self.class.excluded_subdomains.include?(request_subdomain)
24
- nil
25
- else
26
- request_subdomain
27
- end
28
+ nil
29
+ else
30
+ request_subdomain
31
+ end
28
32
 
29
33
  tenant.presence
30
34
  end
31
35
 
32
- protected
36
+ protected
33
37
 
34
38
  # *Almost* a direct ripoff of ActionDispatch::Request subdomain methods
35
39
 
@@ -1,16 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'apartment/tenant'
2
4
 
3
5
  module Apartment
4
6
  module Migrator
5
-
6
7
  extend self
7
8
 
8
9
  # Migrate to latest
9
10
  def migrate(database)
10
11
  Tenant.switch(database) do
11
- version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
12
+ version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
12
13
 
13
- migration_scope_block = -> (migration) { ENV["SCOPE"].blank? || (ENV["SCOPE"] == migration.scope) }
14
+ migration_scope_block = ->(migration) { ENV['SCOPE'].blank? || (ENV['SCOPE'] == migration.scope) }
14
15
 
15
16
  if activerecord_below_5_2?
16
17
  ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, version, &migration_scope_block)
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apartment
4
+ module Model
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ # NOTE: key can either be an array of symbols or a single value.
9
+ # E.g. If we run the following query:
10
+ # `Setting.find_by(key: 'something', value: 'amazing')` key will have an array of symbols: `[:key, :something]`
11
+ # while if we run:
12
+ # `Setting.find(10)` key will have the value 'id'
13
+ def cached_find_by_statement(key, &block)
14
+ # Modifying the cache key to have a reference to the current tenant,
15
+ # so the cached statement is referring only to the tenant in which we've
16
+ # executed this
17
+ cache_key = if key.is_a? String
18
+ "#{Apartment::Tenant.current}_#{key}"
19
+ else
20
+ [Apartment::Tenant.current] + key
21
+ end
22
+ cache = @find_by_statement_cache[connection.prepared_statements]
23
+ cache.compute_if_absent(cache_key) { ActiveRecord::StatementCache.create(connection, &block) }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails'
2
4
  require 'apartment/tenant'
3
5
  require 'apartment/reloader'
4
6
 
5
7
  module Apartment
6
8
  class Railtie < Rails::Railtie
7
-
8
9
  #
9
10
  # Set up our default config options
10
11
  # Do this before the app initializers run so we don't override custom settings
@@ -17,27 +18,34 @@ module Apartment
17
18
  config.seed_after_create = false
18
19
  config.prepend_environment = false
19
20
  config.append_environment = false
21
+ config.tenant_presence_check = true
20
22
  end
21
23
 
22
24
  ActiveRecord::Migrator.migrations_paths = Rails.application.paths['db/migrate'].to_a
23
25
  end
24
26
 
25
- # Hook into ActionDispatch::Reloader to ensure Apartment is properly initialized
26
- # Note that this doens't entirely work as expected in Development, because this is called before classes are reloaded
27
- # See the middleware/console declarations below to help with this. Hope to fix that soon.
28
- #
27
+ # Make sure Apartment is reconfigured when the code is reloaded
29
28
  config.to_prepare do
30
- next if ARGV.any? { |arg| arg =~ /\Aassets:(?:precompile|clean)\z/ }
29
+ Apartment::Tenant.reinitialize
30
+ end
31
31
 
32
- begin
33
- Apartment.connection_class.connection_pool.with_connection do
34
- Apartment::Tenant.init
32
+ #
33
+ # Ensure that Apartment::Tenant.init is called when
34
+ # a new connection is requested.
35
+ #
36
+ module ApartmentInitializer
37
+ def connection
38
+ super.tap do
39
+ Apartment::Tenant.init_once
35
40
  end
36
- rescue ::ActiveRecord::NoDatabaseError
37
- # Since `db:create` and other tasks invoke this block from Rails 5.2.0,
38
- # we need to swallow the error to execute `db:create` properly.
41
+ end
42
+
43
+ def arel_table
44
+ Apartment::Tenant.init_once
45
+ super
39
46
  end
40
47
  end
48
+ ActiveRecord::Base.singleton_class.prepend ApartmentInitializer
41
49
 
42
50
  #
43
51
  # Ensure rake tasks are loaded
@@ -48,8 +56,10 @@ module Apartment
48
56
  end
49
57
 
50
58
  #
51
- # The following initializers are a workaround to the fact that I can't properly hook into the rails reloader
52
- # Note this is technically valid for any environment where cache_classes is false, for us, it's just development
59
+ # The following initializers are a workaround to the fact that I can't
60
+ # properly hook into the rails reloader
61
+ # Note this is technically valid for any environment where cache_classes
62
+ # is false, for us, it's just development
53
63
  #
54
64
  if Rails.env.development?
55
65
 
@@ -58,7 +68,8 @@ module Apartment
58
68
  app.config.middleware.use Apartment::Reloader
59
69
  end
60
70
 
61
- # Overrides reload! to also call Apartment::Tenant.init as well so that the reloaded classes have the proper table_names
71
+ # Overrides reload! to also call Apartment::Tenant.init as well so that the
72
+ # reloaded classes have the proper table_names
62
73
  console do
63
74
  require 'apartment/console'
64
75
  end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Apartment
2
4
  class Reloader
3
-
4
5
  # Middleware used in development to init Apartment for each request
5
6
  # Necessary due to code reload (annoying). When models are reloaded, they no longer have the proper table_name
6
7
  # That is prepended with the schema (if using postgresql schemas)
@@ -1,12 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Require this file to append Apartment rake tasks to ActiveRecord db rake tasks
2
4
  # Enabled by default in the initializer
3
5
 
4
6
  module Apartment
5
7
  class RakeTaskEnhancer
6
-
7
8
  module TASKS
8
- ENHANCE_BEFORE = %w(db:drop)
9
- ENHANCE_AFTER = %w(db:migrate db:rollback db:migrate:up db:migrate:down db:migrate:redo db:seed)
9
+ ENHANCE_BEFORE = %w[db:drop].freeze
10
+ ENHANCE_AFTER = %w[db:create db:migrate db:rollback db:migrate:up db:migrate:down db:migrate:redo db:seed].freeze
10
11
  freeze
11
12
  end
12
13
 
@@ -28,7 +29,6 @@ module Apartment
28
29
  task = Rake::Task[name]
29
30
  enhance_after_task(task)
30
31
  end
31
-
32
32
  end
33
33
 
34
34
  def should_enhance?
@@ -48,9 +48,7 @@ module Apartment
48
48
  def inserted_task_name(task)
49
49
  task.name.sub(/db:/, 'apartment:')
50
50
  end
51
-
52
51
  end
53
-
54
52
  end
55
53
  end
56
54
 
@@ -1,21 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
 
3
5
  module Apartment
4
6
  # The main entry point to Apartment functions
5
7
  #
6
8
  module Tenant
7
-
8
9
  extend self
9
10
  extend Forwardable
10
11
 
11
- def_delegators :adapter, :create, :drop, :switch, :switch!, :current, :each, :reset, :set_callback, :seed, :current_tenant, :default_tenant, :environmentify
12
+ def_delegators :adapter, :create, :drop, :switch, :switch!, :current, :each,
13
+ :reset, :init, :set_callback, :seed, :current_tenant,
14
+ :default_tenant, :environmentify
12
15
 
13
16
  attr_writer :config
14
17
 
15
- # Initialize Apartment config options such as excluded_models
16
- #
17
- def init
18
- adapter.process_excluded_models
18
+ def init_once
19
+ return if @already_initialized
20
+
21
+ # To avoid infinite loops in work init is doing,
22
+ # we need to set @already_initialized to true
23
+ # before init is called
24
+ @already_initialized = true
25
+ init
26
+ end
27
+
28
+ def reinitialize
29
+ @already_initialized = false
19
30
  end
20
31
 
21
32
  # Fetch the proper multi-tenant adapter based on Rails config
@@ -40,9 +51,7 @@ module Apartment
40
51
  raise "The adapter `#{adapter_method}` is not yet supported"
41
52
  end
42
53
 
43
- unless respond_to?(adapter_method)
44
- raise AdapterNotFound, "database configuration specifies nonexistent #{config[:adapter]} adapter"
45
- end
54
+ raise AdapterNotFound, "database configuration specifies nonexistent #{config[:adapter]} adapter" unless respond_to?(adapter_method)
46
55
 
47
56
  send(adapter_method, config)
48
57
  end
@@ -52,6 +61,7 @@ module Apartment
52
61
  #
53
62
  def reload!(config = nil)
54
63
  Thread.current[:apartment_adapter] = nil
64
+ reinitialize
55
65
  @config = config
56
66
  end
57
67
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Apartment
2
- VERSION = "2.3.0.alpha2"
4
+ VERSION = '2.6.1'
3
5
  end
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Apartment
2
4
  class InstallGenerator < Rails::Generators::Base
3
- source_root File.expand_path('../templates', __FILE__)
5
+ source_root File.expand_path('templates', __dir__)
4
6
 
5
7
  def copy_files
6
- template "apartment.rb", File.join("config", "initializers", "apartment.rb")
8
+ template 'apartment.rb', File.join('config', 'initializers', 'apartment.rb')
7
9
  end
8
-
9
10
  end
10
11
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # You can have Apartment route to the appropriate Tenant by adding some Rack middleware.
2
4
  # Apartment can support many different "Elevators" that can take care of this routing to your data.
3
5
  # Require whichever Elevator you're using below or none if you have a custom one.
@@ -12,7 +14,6 @@ require 'apartment/elevators/subdomain'
12
14
  # Apartment Configuration
13
15
  #
14
16
  Apartment.configure do |config|
15
-
16
17
  # Add any models that you do not want to be multi-tenanted, but remain in the global (public) namespace.
17
18
  # A typical example would be a Customer or Tenant model that stores each Tenant's information.
18
19
  #
@@ -48,7 +49,7 @@ Apartment.configure do |config|
48
49
  # end
49
50
  # end
50
51
  #
51
- config.tenant_names = lambda { ToDo_Tenant_Or_User_Model.pluck :database }
52
+ config.tenant_names = -> { ToDo_Tenant_Or_User_Model.pluck :database }
52
53
 
53
54
  # PostgreSQL:
54
55
  # Specifies whether to use PostgreSQL schemas or create a new database per Tenant.
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'apartment/migrator'
2
4
  require 'parallel'
3
5
 
4
6
  apartment_namespace = namespace :apartment do
5
-
6
- desc "Create all tenants"
7
+ desc 'Create all tenants'
7
8
  task :create do
8
9
  tenants.each do |tenant|
9
10
  begin
@@ -15,19 +16,19 @@ apartment_namespace = namespace :apartment do
15
16
  end
16
17
  end
17
18
 
18
- desc "Drop all tenants"
19
+ desc 'Drop all tenants'
19
20
  task :drop do
20
21
  tenants.each do |tenant|
21
22
  begin
22
23
  puts("Dropping #{tenant} tenant")
23
24
  Apartment::Tenant.drop(tenant)
24
- rescue Apartment::TenantNotFound => e
25
+ rescue Apartment::TenantNotFound, ActiveRecord::NoDatabaseError => e
25
26
  puts e.message
26
27
  end
27
28
  end
28
29
  end
29
30
 
30
- desc "Migrate all tenants"
31
+ desc 'Migrate all tenants'
31
32
  task :migrate do
32
33
  warn_if_tenants_empty
33
34
  each_tenant do |tenant|
@@ -40,7 +41,7 @@ apartment_namespace = namespace :apartment do
40
41
  end
41
42
  end
42
43
 
43
- desc "Seed all tenants"
44
+ desc 'Seed all tenants'
44
45
  task :seed do
45
46
  warn_if_tenants_empty
46
47
 
@@ -56,7 +57,7 @@ apartment_namespace = namespace :apartment do
56
57
  end
57
58
  end
58
59
 
59
- desc "Rolls the migration back to the previous version (specify steps w/ STEP=n) across all tenants."
60
+ desc 'Rolls the migration back to the previous version (specify steps w/ STEP=n) across all tenants.'
60
61
  task :rollback do
61
62
  warn_if_tenants_empty
62
63
 
@@ -107,7 +108,7 @@ apartment_namespace = namespace :apartment do
107
108
  end
108
109
  end
109
110
 
110
- desc 'Rolls back the tenant one migration and re migrate up (options: STEP=x, VERSION=x).'
111
+ desc 'Rolls back the tenant one migration and re migrate up (options: STEP=x, VERSION=x).'
111
112
  task :redo do
112
113
  if ENV['VERSION']
113
114
  apartment_namespace['migrate:down'].invoke
@@ -120,26 +121,30 @@ apartment_namespace = namespace :apartment do
120
121
  end
121
122
 
122
123
  def each_tenant(&block)
123
- Parallel.each(tenants, in_threads: Apartment.parallel_migration_threads) do |tenant|
124
+ Parallel.each(tenants_without_default, in_threads: Apartment.parallel_migration_threads) do |tenant|
124
125
  block.call(tenant)
125
126
  end
126
127
  end
127
128
 
129
+ def tenants_without_default
130
+ tenants - [Apartment.default_schema]
131
+ end
132
+
128
133
  def tenants
129
- ENV['DB'] ? ENV['DB'].split(',').map { |s| s.strip } : Apartment.tenant_names || []
134
+ ENV['DB'] ? ENV['DB'].split(',').map(&:strip) : Apartment.tenant_names || []
130
135
  end
131
136
 
132
137
  def warn_if_tenants_empty
133
- if tenants.empty? && ENV['IGNORE_EMPTY_TENANTS'] != "true"
134
- puts <<-WARNING
135
- [WARNING] - The list of tenants to migrate appears to be empty. This could mean a few things:
138
+ return unless tenants.empty? && ENV['IGNORE_EMPTY_TENANTS'] != 'true'
136
139
 
137
- 1. You may not have created any, in which case you can ignore this message
138
- 2. You've run `apartment:migrate` directly without loading the Rails environment
139
- * `apartment:migrate` is now deprecated. Tenants will automatically be migrated with `db:migrate`
140
+ puts <<-WARNING
141
+ [WARNING] - The list of tenants to migrate appears to be empty. This could mean a few things:
140
142
 
141
- Note that your tenants currently haven't been migrated. You'll need to run `db:migrate` to rectify this.
142
- WARNING
143
- end
143
+ 1. You may not have created any, in which case you can ignore this message
144
+ 2. You've run `apartment:migrate` directly without loading the Rails environment
145
+ * `apartment:migrate` is now deprecated. Tenants will automatically be migrated with `db:migrate`
146
+
147
+ Note that your tenants currently haven't been migrated. You'll need to run `db:migrate` to rectify this.
148
+ WARNING
144
149
  end
145
150
  end
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ros-apartment
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0.alpha2
4
+ version: 2.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Brunner
8
8
  - Brad Robertson
9
+ - Rui Baltazar
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2020-01-02 00:00:00.000000000 Z
13
+ date: 2020-06-02 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: activerecord
@@ -17,7 +18,7 @@ dependencies:
17
18
  requirements:
18
19
  - - ">="
19
20
  - !ruby/object:Gem::Version
20
- version: 3.1.2
21
+ version: 5.0.0
21
22
  - - "<"
22
23
  - !ruby/object:Gem::Version
23
24
  version: '6.1'
@@ -27,170 +28,182 @@ dependencies:
27
28
  requirements:
28
29
  - - ">="
29
30
  - !ruby/object:Gem::Version
30
- version: 3.1.2
31
+ version: 5.0.0
31
32
  - - "<"
32
33
  - !ruby/object:Gem::Version
33
34
  version: '6.1'
34
35
  - !ruby/object:Gem::Dependency
35
- name: rack
36
+ name: parallel
36
37
  requirement: !ruby/object:Gem::Requirement
37
38
  requirements:
38
- - - ">="
39
+ - - "<"
39
40
  - !ruby/object:Gem::Version
40
- version: 1.3.6
41
+ version: '2.0'
41
42
  type: :runtime
42
43
  prerelease: false
43
44
  version_requirements: !ruby/object:Gem::Requirement
44
45
  requirements:
45
- - - ">="
46
+ - - "<"
46
47
  - !ruby/object:Gem::Version
47
- version: 1.3.6
48
+ version: '2.0'
48
49
  - !ruby/object:Gem::Dependency
49
50
  name: public_suffix
50
51
  requirement: !ruby/object:Gem::Requirement
51
52
  requirements:
52
53
  - - ">="
53
54
  - !ruby/object:Gem::Version
54
- version: '2'
55
+ version: 2.0.5
56
+ - - "<"
57
+ - !ruby/object:Gem::Version
58
+ version: '5.0'
55
59
  type: :runtime
56
60
  prerelease: false
57
61
  version_requirements: !ruby/object:Gem::Requirement
58
62
  requirements:
59
63
  - - ">="
60
64
  - !ruby/object:Gem::Version
61
- version: '2'
65
+ version: 2.0.5
66
+ - - "<"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
62
69
  - !ruby/object:Gem::Dependency
63
- name: parallel
70
+ name: rack
64
71
  requirement: !ruby/object:Gem::Requirement
65
72
  requirements:
66
73
  - - ">="
67
74
  - !ruby/object:Gem::Version
68
- version: 0.7.1
75
+ version: 1.3.6
76
+ - - "<"
77
+ - !ruby/object:Gem::Version
78
+ version: '3.0'
69
79
  type: :runtime
70
80
  prerelease: false
71
81
  version_requirements: !ruby/object:Gem::Requirement
72
82
  requirements:
73
83
  - - ">="
74
84
  - !ruby/object:Gem::Version
75
- version: 0.7.1
85
+ version: 1.3.6
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
76
89
  - !ruby/object:Gem::Dependency
77
90
  name: appraisal
78
91
  requirement: !ruby/object:Gem::Requirement
79
92
  requirements:
80
- - - ">="
93
+ - - "~>"
81
94
  - !ruby/object:Gem::Version
82
- version: '0'
95
+ version: '2.2'
83
96
  type: :development
84
97
  prerelease: false
85
98
  version_requirements: !ruby/object:Gem::Requirement
86
99
  requirements:
87
- - - ">="
100
+ - - "~>"
88
101
  - !ruby/object:Gem::Version
89
- version: '0'
102
+ version: '2.2'
90
103
  - !ruby/object:Gem::Dependency
91
- name: rake
104
+ name: bundler
92
105
  requirement: !ruby/object:Gem::Requirement
93
106
  requirements:
94
- - - "~>"
107
+ - - ">="
95
108
  - !ruby/object:Gem::Version
96
- version: '0.9'
109
+ version: '1.3'
110
+ - - "<"
111
+ - !ruby/object:Gem::Version
112
+ version: '3.0'
97
113
  type: :development
98
114
  prerelease: false
99
115
  version_requirements: !ruby/object:Gem::Requirement
100
116
  requirements:
101
- - - "~>"
117
+ - - ">="
102
118
  - !ruby/object:Gem::Version
103
- version: '0.9'
119
+ version: '1.3'
120
+ - - "<"
121
+ - !ruby/object:Gem::Version
122
+ version: '3.0'
104
123
  - !ruby/object:Gem::Dependency
105
- name: rspec
124
+ name: capybara
106
125
  requirement: !ruby/object:Gem::Requirement
107
126
  requirements:
108
127
  - - "~>"
109
128
  - !ruby/object:Gem::Version
110
- version: '3.4'
129
+ version: '2.0'
111
130
  type: :development
112
131
  prerelease: false
113
132
  version_requirements: !ruby/object:Gem::Requirement
114
133
  requirements:
115
134
  - - "~>"
116
135
  - !ruby/object:Gem::Version
117
- version: '3.4'
136
+ version: '2.0'
118
137
  - !ruby/object:Gem::Dependency
119
- name: rspec-rails
138
+ name: rake
120
139
  requirement: !ruby/object:Gem::Requirement
121
140
  requirements:
122
141
  - - "~>"
123
142
  - !ruby/object:Gem::Version
124
- version: '3.4'
143
+ version: '0.9'
125
144
  type: :development
126
145
  prerelease: false
127
146
  version_requirements: !ruby/object:Gem::Requirement
128
147
  requirements:
129
148
  - - "~>"
130
149
  - !ruby/object:Gem::Version
131
- version: '3.4'
150
+ version: '0.9'
132
151
  - !ruby/object:Gem::Dependency
133
- name: capybara
152
+ name: rspec
134
153
  requirement: !ruby/object:Gem::Requirement
135
154
  requirements:
136
155
  - - "~>"
137
156
  - !ruby/object:Gem::Version
138
- version: '2.0'
157
+ version: '3.4'
139
158
  type: :development
140
159
  prerelease: false
141
160
  version_requirements: !ruby/object:Gem::Requirement
142
161
  requirements:
143
162
  - - "~>"
144
163
  - !ruby/object:Gem::Version
145
- version: '2.0'
164
+ version: '3.4'
146
165
  - !ruby/object:Gem::Dependency
147
- name: bundler
166
+ name: rspec-rails
148
167
  requirement: !ruby/object:Gem::Requirement
149
168
  requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '1.3'
153
- - - "<"
169
+ - - "~>"
154
170
  - !ruby/object:Gem::Version
155
- version: '2.0'
171
+ version: '3.4'
156
172
  type: :development
157
173
  prerelease: false
158
174
  version_requirements: !ruby/object:Gem::Requirement
159
175
  requirements:
160
- - - ">="
161
- - !ruby/object:Gem::Version
162
- version: '1.3'
163
- - - "<"
176
+ - - "~>"
164
177
  - !ruby/object:Gem::Version
165
- version: '2.0'
178
+ version: '3.4'
166
179
  - !ruby/object:Gem::Dependency
167
180
  name: mysql2
168
181
  requirement: !ruby/object:Gem::Requirement
169
182
  requirements:
170
- - - ">="
183
+ - - "~>"
171
184
  - !ruby/object:Gem::Version
172
- version: '0'
185
+ version: '0.5'
173
186
  type: :development
174
187
  prerelease: false
175
188
  version_requirements: !ruby/object:Gem::Requirement
176
189
  requirements:
177
- - - ">="
190
+ - - "~>"
178
191
  - !ruby/object:Gem::Version
179
- version: '0'
192
+ version: '0.5'
180
193
  - !ruby/object:Gem::Dependency
181
194
  name: pg
182
195
  requirement: !ruby/object:Gem::Requirement
183
196
  requirements:
184
- - - ">="
197
+ - - "~>"
185
198
  - !ruby/object:Gem::Version
186
- version: '0'
199
+ version: '1.2'
187
200
  type: :development
188
201
  prerelease: false
189
202
  version_requirements: !ruby/object:Gem::Requirement
190
203
  requirements:
191
- - - ">="
204
+ - - "~>"
192
205
  - !ruby/object:Gem::Version
193
- version: '0'
206
+ version: '1.2'
194
207
  - !ruby/object:Gem::Dependency
195
208
  name: sqlite3
196
209
  requirement: !ruby/object:Gem::Requirement
@@ -210,14 +223,19 @@ description: Apartment allows Rack applications to deal with database multitenan
210
223
  email:
211
224
  - ryan@influitive.com
212
225
  - brad@influitive.com
226
+ - rui.p.baltazar@gmail.com
213
227
  executables: []
214
228
  extensions: []
215
229
  extra_rdoc_files: []
216
230
  files:
217
231
  - ".github/ISSUE_TEMPLATE.md"
232
+ - ".github/workflows/.rubocop-linter.yml"
218
233
  - ".gitignore"
219
234
  - ".pryrc"
220
235
  - ".rspec"
236
+ - ".rubocop.yml"
237
+ - ".rubocop_todo.yml"
238
+ - ".story_branch.yml"
221
239
  - ".travis.yml"
222
240
  - Appraisals
223
241
  - Gemfile
@@ -235,6 +253,9 @@ files:
235
253
  - gemfiles/rails_6_0.gemfile
236
254
  - gemfiles/rails_master.gemfile
237
255
  - lib/apartment.rb
256
+ - lib/apartment/active_record/connection_handling.rb
257
+ - lib/apartment/active_record/internal_metadata.rb
258
+ - lib/apartment/active_record/schema_migration.rb
238
259
  - lib/apartment/adapters/abstract_adapter.rb
239
260
  - lib/apartment/adapters/abstract_jdbc_adapter.rb
240
261
  - lib/apartment/adapters/jdbc_mysql_adapter.rb
@@ -244,6 +265,7 @@ files:
244
265
  - lib/apartment/adapters/postgresql_adapter.rb
245
266
  - lib/apartment/adapters/sqlite3_adapter.rb
246
267
  - lib/apartment/console.rb
268
+ - lib/apartment/custom_console.rb
247
269
  - lib/apartment/deprecation.rb
248
270
  - lib/apartment/elevators/domain.rb
249
271
  - lib/apartment/elevators/first_subdomain.rb
@@ -252,6 +274,7 @@ files:
252
274
  - lib/apartment/elevators/host_hash.rb
253
275
  - lib/apartment/elevators/subdomain.rb
254
276
  - lib/apartment/migrator.rb
277
+ - lib/apartment/model.rb
255
278
  - lib/apartment/railtie.rb
256
279
  - lib/apartment/reloader.rb
257
280
  - lib/apartment/tasks/enhancements.rb
@@ -261,106 +284,6 @@ files:
261
284
  - lib/generators/apartment/install/install_generator.rb
262
285
  - lib/generators/apartment/install/templates/apartment.rb
263
286
  - lib/tasks/apartment.rake
264
- - spec/adapters/jdbc_mysql_adapter_spec.rb
265
- - spec/adapters/jdbc_postgresql_adapter_spec.rb
266
- - spec/adapters/mysql2_adapter_spec.rb
267
- - spec/adapters/postgresql_adapter_spec.rb
268
- - spec/adapters/sqlite3_adapter_spec.rb
269
- - spec/apartment_spec.rb
270
- - spec/config/database.yml.sample
271
- - spec/dummy/Rakefile
272
- - spec/dummy/app/controllers/application_controller.rb
273
- - spec/dummy/app/helpers/application_helper.rb
274
- - spec/dummy/app/models/company.rb
275
- - spec/dummy/app/models/user.rb
276
- - spec/dummy/app/views/application/index.html.erb
277
- - spec/dummy/app/views/layouts/application.html.erb
278
- - spec/dummy/config.ru
279
- - spec/dummy/config/application.rb
280
- - spec/dummy/config/boot.rb
281
- - spec/dummy/config/database.yml.sample
282
- - spec/dummy/config/environment.rb
283
- - spec/dummy/config/environments/development.rb
284
- - spec/dummy/config/environments/production.rb
285
- - spec/dummy/config/environments/test.rb
286
- - spec/dummy/config/initializers/apartment.rb
287
- - spec/dummy/config/initializers/backtrace_silencers.rb
288
- - spec/dummy/config/initializers/inflections.rb
289
- - spec/dummy/config/initializers/mime_types.rb
290
- - spec/dummy/config/initializers/secret_token.rb
291
- - spec/dummy/config/initializers/session_store.rb
292
- - spec/dummy/config/locales/en.yml
293
- - spec/dummy/config/routes.rb
294
- - spec/dummy/db/migrate/20110613152810_create_dummy_models.rb
295
- - spec/dummy/db/migrate/20111202022214_create_table_books.rb
296
- - spec/dummy/db/migrate/20180415260934_create_public_tokens.rb
297
- - spec/dummy/db/schema.rb
298
- - spec/dummy/db/seeds.rb
299
- - spec/dummy/db/seeds/import.rb
300
- - spec/dummy/db/test.sqlite3
301
- - spec/dummy/public/404.html
302
- - spec/dummy/public/422.html
303
- - spec/dummy/public/500.html
304
- - spec/dummy/public/favicon.ico
305
- - spec/dummy/public/stylesheets/.gitkeep
306
- - spec/dummy/script/rails
307
- - spec/dummy_engine/.gitignore
308
- - spec/dummy_engine/Gemfile
309
- - spec/dummy_engine/Rakefile
310
- - spec/dummy_engine/bin/rails
311
- - spec/dummy_engine/config/initializers/apartment.rb
312
- - spec/dummy_engine/dummy_engine.gemspec
313
- - spec/dummy_engine/lib/dummy_engine.rb
314
- - spec/dummy_engine/lib/dummy_engine/engine.rb
315
- - spec/dummy_engine/lib/dummy_engine/version.rb
316
- - spec/dummy_engine/test/dummy/Rakefile
317
- - spec/dummy_engine/test/dummy/config.ru
318
- - spec/dummy_engine/test/dummy/config/application.rb
319
- - spec/dummy_engine/test/dummy/config/boot.rb
320
- - spec/dummy_engine/test/dummy/config/database.yml
321
- - spec/dummy_engine/test/dummy/config/environment.rb
322
- - spec/dummy_engine/test/dummy/config/environments/development.rb
323
- - spec/dummy_engine/test/dummy/config/environments/production.rb
324
- - spec/dummy_engine/test/dummy/config/environments/test.rb
325
- - spec/dummy_engine/test/dummy/config/initializers/assets.rb
326
- - spec/dummy_engine/test/dummy/config/initializers/backtrace_silencers.rb
327
- - spec/dummy_engine/test/dummy/config/initializers/cookies_serializer.rb
328
- - spec/dummy_engine/test/dummy/config/initializers/filter_parameter_logging.rb
329
- - spec/dummy_engine/test/dummy/config/initializers/inflections.rb
330
- - spec/dummy_engine/test/dummy/config/initializers/mime_types.rb
331
- - spec/dummy_engine/test/dummy/config/initializers/session_store.rb
332
- - spec/dummy_engine/test/dummy/config/initializers/wrap_parameters.rb
333
- - spec/dummy_engine/test/dummy/config/locales/en.yml
334
- - spec/dummy_engine/test/dummy/config/routes.rb
335
- - spec/dummy_engine/test/dummy/config/secrets.yml
336
- - spec/examples/connection_adapter_examples.rb
337
- - spec/examples/generic_adapter_custom_configuration_example.rb
338
- - spec/examples/generic_adapter_examples.rb
339
- - spec/examples/schema_adapter_examples.rb
340
- - spec/integration/apartment_rake_integration_spec.rb
341
- - spec/integration/query_caching_spec.rb
342
- - spec/integration/use_within_an_engine_spec.rb
343
- - spec/schemas/v1.rb
344
- - spec/schemas/v2.rb
345
- - spec/schemas/v3.rb
346
- - spec/spec_helper.rb
347
- - spec/support/apartment_helpers.rb
348
- - spec/support/capybara_sessions.rb
349
- - spec/support/config.rb
350
- - spec/support/contexts.rb
351
- - spec/support/requirements.rb
352
- - spec/support/setup.rb
353
- - spec/tasks/apartment_rake_spec.rb
354
- - spec/tenant_spec.rb
355
- - spec/unit/config_spec.rb
356
- - spec/unit/elevators/domain_spec.rb
357
- - spec/unit/elevators/first_subdomain_spec.rb
358
- - spec/unit/elevators/generic_spec.rb
359
- - spec/unit/elevators/host_hash_spec.rb
360
- - spec/unit/elevators/host_spec.rb
361
- - spec/unit/elevators/subdomain_spec.rb
362
- - spec/unit/migrator_spec.rb
363
- - spec/unit/reloader_spec.rb
364
287
  homepage: https://github.com/rails-on-services/apartment
365
288
  licenses:
366
289
  - MIT
@@ -376,112 +299,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
376
299
  version: '0'
377
300
  required_rubygems_version: !ruby/object:Gem::Requirement
378
301
  requirements:
379
- - - ">"
302
+ - - ">="
380
303
  - !ruby/object:Gem::Version
381
- version: 1.3.1
304
+ version: '0'
382
305
  requirements: []
383
- rubygems_version: 3.0.6
306
+ rubygems_version: 3.0.3
384
307
  signing_key:
385
308
  specification_version: 4
386
- summary: A Ruby gem for managing database multitenancy
387
- test_files:
388
- - spec/adapters/jdbc_mysql_adapter_spec.rb
389
- - spec/adapters/jdbc_postgresql_adapter_spec.rb
390
- - spec/adapters/mysql2_adapter_spec.rb
391
- - spec/adapters/postgresql_adapter_spec.rb
392
- - spec/adapters/sqlite3_adapter_spec.rb
393
- - spec/apartment_spec.rb
394
- - spec/config/database.yml.sample
395
- - spec/dummy/Rakefile
396
- - spec/dummy/app/controllers/application_controller.rb
397
- - spec/dummy/app/helpers/application_helper.rb
398
- - spec/dummy/app/models/company.rb
399
- - spec/dummy/app/models/user.rb
400
- - spec/dummy/app/views/application/index.html.erb
401
- - spec/dummy/app/views/layouts/application.html.erb
402
- - spec/dummy/config.ru
403
- - spec/dummy/config/application.rb
404
- - spec/dummy/config/boot.rb
405
- - spec/dummy/config/database.yml.sample
406
- - spec/dummy/config/environment.rb
407
- - spec/dummy/config/environments/development.rb
408
- - spec/dummy/config/environments/production.rb
409
- - spec/dummy/config/environments/test.rb
410
- - spec/dummy/config/initializers/apartment.rb
411
- - spec/dummy/config/initializers/backtrace_silencers.rb
412
- - spec/dummy/config/initializers/inflections.rb
413
- - spec/dummy/config/initializers/mime_types.rb
414
- - spec/dummy/config/initializers/secret_token.rb
415
- - spec/dummy/config/initializers/session_store.rb
416
- - spec/dummy/config/locales/en.yml
417
- - spec/dummy/config/routes.rb
418
- - spec/dummy/db/migrate/20110613152810_create_dummy_models.rb
419
- - spec/dummy/db/migrate/20111202022214_create_table_books.rb
420
- - spec/dummy/db/migrate/20180415260934_create_public_tokens.rb
421
- - spec/dummy/db/schema.rb
422
- - spec/dummy/db/seeds.rb
423
- - spec/dummy/db/seeds/import.rb
424
- - spec/dummy/db/test.sqlite3
425
- - spec/dummy/public/404.html
426
- - spec/dummy/public/422.html
427
- - spec/dummy/public/500.html
428
- - spec/dummy/public/favicon.ico
429
- - spec/dummy/public/stylesheets/.gitkeep
430
- - spec/dummy/script/rails
431
- - spec/dummy_engine/.gitignore
432
- - spec/dummy_engine/Gemfile
433
- - spec/dummy_engine/Rakefile
434
- - spec/dummy_engine/bin/rails
435
- - spec/dummy_engine/config/initializers/apartment.rb
436
- - spec/dummy_engine/dummy_engine.gemspec
437
- - spec/dummy_engine/lib/dummy_engine.rb
438
- - spec/dummy_engine/lib/dummy_engine/engine.rb
439
- - spec/dummy_engine/lib/dummy_engine/version.rb
440
- - spec/dummy_engine/test/dummy/Rakefile
441
- - spec/dummy_engine/test/dummy/config.ru
442
- - spec/dummy_engine/test/dummy/config/application.rb
443
- - spec/dummy_engine/test/dummy/config/boot.rb
444
- - spec/dummy_engine/test/dummy/config/database.yml
445
- - spec/dummy_engine/test/dummy/config/environment.rb
446
- - spec/dummy_engine/test/dummy/config/environments/development.rb
447
- - spec/dummy_engine/test/dummy/config/environments/production.rb
448
- - spec/dummy_engine/test/dummy/config/environments/test.rb
449
- - spec/dummy_engine/test/dummy/config/initializers/assets.rb
450
- - spec/dummy_engine/test/dummy/config/initializers/backtrace_silencers.rb
451
- - spec/dummy_engine/test/dummy/config/initializers/cookies_serializer.rb
452
- - spec/dummy_engine/test/dummy/config/initializers/filter_parameter_logging.rb
453
- - spec/dummy_engine/test/dummy/config/initializers/inflections.rb
454
- - spec/dummy_engine/test/dummy/config/initializers/mime_types.rb
455
- - spec/dummy_engine/test/dummy/config/initializers/session_store.rb
456
- - spec/dummy_engine/test/dummy/config/initializers/wrap_parameters.rb
457
- - spec/dummy_engine/test/dummy/config/locales/en.yml
458
- - spec/dummy_engine/test/dummy/config/routes.rb
459
- - spec/dummy_engine/test/dummy/config/secrets.yml
460
- - spec/examples/connection_adapter_examples.rb
461
- - spec/examples/generic_adapter_custom_configuration_example.rb
462
- - spec/examples/generic_adapter_examples.rb
463
- - spec/examples/schema_adapter_examples.rb
464
- - spec/integration/apartment_rake_integration_spec.rb
465
- - spec/integration/query_caching_spec.rb
466
- - spec/integration/use_within_an_engine_spec.rb
467
- - spec/schemas/v1.rb
468
- - spec/schemas/v2.rb
469
- - spec/schemas/v3.rb
470
- - spec/spec_helper.rb
471
- - spec/support/apartment_helpers.rb
472
- - spec/support/capybara_sessions.rb
473
- - spec/support/config.rb
474
- - spec/support/contexts.rb
475
- - spec/support/requirements.rb
476
- - spec/support/setup.rb
477
- - spec/tasks/apartment_rake_spec.rb
478
- - spec/tenant_spec.rb
479
- - spec/unit/config_spec.rb
480
- - spec/unit/elevators/domain_spec.rb
481
- - spec/unit/elevators/first_subdomain_spec.rb
482
- - spec/unit/elevators/generic_spec.rb
483
- - spec/unit/elevators/host_hash_spec.rb
484
- - spec/unit/elevators/host_spec.rb
485
- - spec/unit/elevators/subdomain_spec.rb
486
- - spec/unit/migrator_spec.rb
487
- - spec/unit/reloader_spec.rb
309
+ summary: A Ruby gem for managing database multitenancy. Apartment Gem drop in replacement
310
+ test_files: []