ros-apartment 2.7.0 → 2.8.1.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +78 -0
- data/.github/workflows/changelog.yml +63 -0
- data/.rubocop.yml +78 -4
- data/.rubocop_todo.yml +50 -13
- data/CHANGELOG.md +963 -0
- data/Gemfile +2 -2
- data/Guardfile +0 -15
- data/HISTORY.md +118 -84
- data/README.md +27 -0
- data/Rakefile +5 -2
- data/gemfiles/rails_5_0.gemfile +1 -1
- data/gemfiles/rails_5_1.gemfile +1 -1
- data/gemfiles/rails_5_2.gemfile +1 -1
- data/gemfiles/rails_6_0.gemfile +1 -1
- data/gemfiles/rails_master.gemfile +1 -1
- data/lib/apartment.rb +5 -3
- data/lib/apartment/active_record/connection_handling.rb +3 -0
- data/lib/apartment/active_record/internal_metadata.rb +0 -2
- data/lib/apartment/active_record/schema_migration.rb +0 -2
- data/lib/apartment/adapters/abstract_adapter.rb +5 -3
- data/lib/apartment/adapters/abstract_jdbc_adapter.rb +2 -1
- data/lib/apartment/adapters/jdbc_postgresql_adapter.rb +2 -1
- data/lib/apartment/adapters/mysql2_adapter.rb +3 -0
- data/lib/apartment/adapters/postgresql_adapter.rb +30 -7
- data/lib/apartment/console.rb +5 -9
- data/lib/apartment/custom_console.rb +2 -2
- data/lib/apartment/log_subscriber.rb +33 -0
- data/lib/apartment/railtie.rb +26 -21
- data/lib/apartment/tasks/enhancements.rb +1 -1
- data/lib/apartment/tasks/task_helper.rb +7 -2
- data/lib/apartment/tenant.rb +6 -18
- data/lib/apartment/version.rb +1 -1
- data/lib/generators/apartment/install/templates/apartment.rb +2 -1
- data/lib/tasks/apartment.rake +5 -6
- data/{apartment.gemspec → ros-apartment.gemspec} +3 -4
- metadata +14 -12
- data/.travis.yml +0 -49
- data/lib/apartment/active_record/log_subscriber.rb +0 -41
@@ -7,7 +7,7 @@ module Apartment
|
|
7
7
|
class RakeTaskEnhancer
|
8
8
|
module TASKS
|
9
9
|
ENHANCE_BEFORE = %w[db:drop].freeze
|
10
|
-
ENHANCE_AFTER = %w[db:
|
10
|
+
ENHANCE_AFTER = %w[db:migrate db:rollback db:migrate:up db:migrate:down db:migrate:redo db:seed].freeze
|
11
11
|
freeze
|
12
12
|
end
|
13
13
|
|
@@ -19,7 +19,6 @@ module Apartment
|
|
19
19
|
def self.warn_if_tenants_empty
|
20
20
|
return unless tenants.empty? && ENV['IGNORE_EMPTY_TENANTS'] != 'true'
|
21
21
|
|
22
|
-
# rubocop:disable Rails/Output
|
23
22
|
puts <<-WARNING
|
24
23
|
[WARNING] - The list of tenants to migrate appears to be empty. This could mean a few things:
|
25
24
|
|
@@ -29,7 +28,13 @@ module Apartment
|
|
29
28
|
|
30
29
|
Note that your tenants currently haven't been migrated. You'll need to run `db:migrate` to rectify this.
|
31
30
|
WARNING
|
32
|
-
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.create_tenant(tenant_name)
|
34
|
+
puts("Creating #{tenant_name} tenant")
|
35
|
+
Apartment::Tenant.create(tenant_name)
|
36
|
+
rescue Apartment::TenantExists => e
|
37
|
+
puts "Tried to create already existing tenant: #{e}"
|
33
38
|
end
|
34
39
|
end
|
35
40
|
end
|
data/lib/apartment/tenant.rb
CHANGED
@@ -15,20 +15,6 @@ module Apartment
|
|
15
15
|
|
16
16
|
attr_writer :config
|
17
17
|
|
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
|
30
|
-
end
|
31
|
-
|
32
18
|
# Fetch the proper multi-tenant adapter based on Rails config
|
33
19
|
#
|
34
20
|
# @return {subclass of Apartment::AbstractAdapter}
|
@@ -38,9 +24,10 @@ module Apartment
|
|
38
24
|
adapter_method = "#{config[:adapter]}_adapter"
|
39
25
|
|
40
26
|
if defined?(JRUBY_VERSION)
|
41
|
-
|
27
|
+
case config[:adapter]
|
28
|
+
when /mysql/
|
42
29
|
adapter_method = 'jdbc_mysql_adapter'
|
43
|
-
|
30
|
+
when /postgresql/
|
44
31
|
adapter_method = 'jdbc_postgresql_adapter'
|
45
32
|
end
|
46
33
|
end
|
@@ -51,7 +38,9 @@ module Apartment
|
|
51
38
|
raise "The adapter `#{adapter_method}` is not yet supported"
|
52
39
|
end
|
53
40
|
|
54
|
-
|
41
|
+
unless respond_to?(adapter_method)
|
42
|
+
raise AdapterNotFound, "database configuration specifies nonexistent #{config[:adapter]} adapter"
|
43
|
+
end
|
55
44
|
|
56
45
|
send(adapter_method, config)
|
57
46
|
end
|
@@ -61,7 +50,6 @@ module Apartment
|
|
61
50
|
#
|
62
51
|
def reload!(config = nil)
|
63
52
|
Thread.current[:apartment_adapter] = nil
|
64
|
-
reinitialize
|
65
53
|
@config = config
|
66
54
|
end
|
67
55
|
|
data/lib/apartment/version.rb
CHANGED
@@ -23,7 +23,8 @@ Apartment.configure do |config|
|
|
23
23
|
# You can make this dynamic by providing a Proc object to be called on migrations.
|
24
24
|
# This object should yield either:
|
25
25
|
# - an array of strings representing each Tenant name.
|
26
|
-
# - a hash which keys are tenant names, and values custom db config
|
26
|
+
# - a hash which keys are tenant names, and values custom db config
|
27
|
+
# (must contain all key/values required in database.yml)
|
27
28
|
#
|
28
29
|
# config.tenant_names = lambda{ Customer.pluck(:tenant_name) }
|
29
30
|
# config.tenant_names = ['tenant1', 'tenant2']
|
data/lib/tasks/apartment.rake
CHANGED
@@ -7,13 +7,10 @@ require 'parallel'
|
|
7
7
|
apartment_namespace = namespace :apartment do
|
8
8
|
desc 'Create all tenants'
|
9
9
|
task :create do
|
10
|
+
Apartment::TaskHelper.warn_if_tenants_empty
|
11
|
+
|
10
12
|
Apartment::TaskHelper.tenants.each do |tenant|
|
11
|
-
|
12
|
-
puts("Creating #{tenant} tenant")
|
13
|
-
Apartment::Tenant.create(tenant)
|
14
|
-
rescue Apartment::TenantExists => e
|
15
|
-
puts e.message
|
16
|
-
end
|
13
|
+
Apartment::TaskHelper.create_tenant(tenant)
|
17
14
|
end
|
18
15
|
end
|
19
16
|
|
@@ -34,6 +31,7 @@ apartment_namespace = namespace :apartment do
|
|
34
31
|
Apartment::TaskHelper.warn_if_tenants_empty
|
35
32
|
Apartment::TaskHelper.each_tenant do |tenant|
|
36
33
|
begin
|
34
|
+
Apartment::TaskHelper.create_tenant(tenant)
|
37
35
|
puts("Migrating #{tenant} tenant")
|
38
36
|
Apartment::Migrator.migrate tenant
|
39
37
|
rescue Apartment::TenantNotFound => e
|
@@ -48,6 +46,7 @@ apartment_namespace = namespace :apartment do
|
|
48
46
|
|
49
47
|
Apartment::TaskHelper.each_tenant do |tenant|
|
50
48
|
begin
|
49
|
+
Apartment::TaskHelper.create_tenant(tenant)
|
51
50
|
puts("Seeding #{tenant} tenant")
|
52
51
|
Apartment::Tenant.switch(tenant) do
|
53
52
|
Apartment::Tenant.seed
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.files = Dir.chdir(File.expand_path(__dir__)) do
|
18
18
|
`git ls-files -z`.split("\x0").reject do |f|
|
19
19
|
# NOTE: ignore all test related
|
20
|
-
f.match(%r{^(test|spec|features)/})
|
20
|
+
f.match(%r{^(test|spec|features|documentation)/})
|
21
21
|
end
|
22
22
|
end
|
23
23
|
s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
@@ -27,8 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.homepage = 'https://github.com/rails-on-services/apartment'
|
28
28
|
s.licenses = ['MIT']
|
29
29
|
|
30
|
-
|
31
|
-
s.add_dependency 'activerecord', '>= 5.0.0', '< 6.1'
|
30
|
+
s.add_dependency 'activerecord', '>= 5.0.0', '< 6.2'
|
32
31
|
s.add_dependency 'parallel', '< 2.0'
|
33
32
|
s.add_dependency 'public_suffix', '>= 2.0.5', '< 5.0'
|
34
33
|
s.add_dependency 'rack', '>= 1.3.6', '< 3.0'
|
@@ -36,7 +35,7 @@ Gem::Specification.new do |s|
|
|
36
35
|
s.add_development_dependency 'appraisal', '~> 2.2'
|
37
36
|
s.add_development_dependency 'bundler', '>= 1.3', '< 3.0'
|
38
37
|
s.add_development_dependency 'capybara', '~> 2.0'
|
39
|
-
s.add_development_dependency 'rake', '~> 0
|
38
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
40
39
|
s.add_development_dependency 'rspec', '~> 3.4'
|
41
40
|
s.add_development_dependency 'rspec-rails', '~> 3.4'
|
42
41
|
|
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.8.1.rc2
|
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-
|
13
|
+
date: 2020-12-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: 5.0.0
|
22
22
|
- - "<"
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version: '6.
|
24
|
+
version: '6.2'
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
27
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
version: 5.0.0
|
32
32
|
- - "<"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '6.
|
34
|
+
version: '6.2'
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: parallel
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
@@ -140,14 +140,14 @@ dependencies:
|
|
140
140
|
requirements:
|
141
141
|
- - "~>"
|
142
142
|
- !ruby/object:Gem::Version
|
143
|
-
version: '0
|
143
|
+
version: '13.0'
|
144
144
|
type: :development
|
145
145
|
prerelease: false
|
146
146
|
version_requirements: !ruby/object:Gem::Requirement
|
147
147
|
requirements:
|
148
148
|
- - "~>"
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version: '0
|
150
|
+
version: '13.0'
|
151
151
|
- !ruby/object:Gem::Dependency
|
152
152
|
name: rspec
|
153
153
|
requirement: !ruby/object:Gem::Requirement
|
@@ -228,22 +228,23 @@ executables: []
|
|
228
228
|
extensions: []
|
229
229
|
extra_rdoc_files: []
|
230
230
|
files:
|
231
|
+
- ".circleci/config.yml"
|
231
232
|
- ".github/ISSUE_TEMPLATE.md"
|
233
|
+
- ".github/workflows/changelog.yml"
|
232
234
|
- ".gitignore"
|
233
235
|
- ".pryrc"
|
234
236
|
- ".rspec"
|
235
237
|
- ".rubocop.yml"
|
236
238
|
- ".rubocop_todo.yml"
|
237
239
|
- ".story_branch.yml"
|
238
|
-
- ".travis.yml"
|
239
240
|
- Appraisals
|
241
|
+
- CHANGELOG.md
|
240
242
|
- Gemfile
|
241
243
|
- Guardfile
|
242
244
|
- HISTORY.md
|
243
245
|
- README.md
|
244
246
|
- Rakefile
|
245
247
|
- TODO.md
|
246
|
-
- apartment.gemspec
|
247
248
|
- docker-compose.yml
|
248
249
|
- gemfiles/rails_4_2.gemfile
|
249
250
|
- gemfiles/rails_5_0.gemfile
|
@@ -254,7 +255,6 @@ files:
|
|
254
255
|
- lib/apartment.rb
|
255
256
|
- lib/apartment/active_record/connection_handling.rb
|
256
257
|
- lib/apartment/active_record/internal_metadata.rb
|
257
|
-
- lib/apartment/active_record/log_subscriber.rb
|
258
258
|
- lib/apartment/active_record/schema_migration.rb
|
259
259
|
- lib/apartment/adapters/abstract_adapter.rb
|
260
260
|
- lib/apartment/adapters/abstract_jdbc_adapter.rb
|
@@ -273,6 +273,7 @@ files:
|
|
273
273
|
- lib/apartment/elevators/host.rb
|
274
274
|
- lib/apartment/elevators/host_hash.rb
|
275
275
|
- lib/apartment/elevators/subdomain.rb
|
276
|
+
- lib/apartment/log_subscriber.rb
|
276
277
|
- lib/apartment/migrator.rb
|
277
278
|
- lib/apartment/model.rb
|
278
279
|
- lib/apartment/railtie.rb
|
@@ -285,6 +286,7 @@ files:
|
|
285
286
|
- lib/generators/apartment/install/install_generator.rb
|
286
287
|
- lib/generators/apartment/install/templates/apartment.rb
|
287
288
|
- lib/tasks/apartment.rake
|
289
|
+
- ros-apartment.gemspec
|
288
290
|
homepage: https://github.com/rails-on-services/apartment
|
289
291
|
licenses:
|
290
292
|
- MIT
|
@@ -300,11 +302,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
300
302
|
version: '0'
|
301
303
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
302
304
|
requirements:
|
303
|
-
- - "
|
305
|
+
- - ">"
|
304
306
|
- !ruby/object:Gem::Version
|
305
|
-
version:
|
307
|
+
version: 1.3.1
|
306
308
|
requirements: []
|
307
|
-
rubygems_version: 3.
|
309
|
+
rubygems_version: 3.1.4
|
308
310
|
signing_key:
|
309
311
|
specification_version: 4
|
310
312
|
summary: A Ruby gem for managing database multitenancy. Apartment Gem drop in replacement
|
data/.travis.yml
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
os: linux
|
2
|
-
|
3
|
-
language: ruby
|
4
|
-
services:
|
5
|
-
- docker
|
6
|
-
rvm:
|
7
|
-
- jruby-9.2.11.0
|
8
|
-
- 2.4.10
|
9
|
-
- 2.5.8
|
10
|
-
- 2.6.6
|
11
|
-
- 2.7.1
|
12
|
-
- jruby-head
|
13
|
-
- ruby-head
|
14
|
-
|
15
|
-
branches:
|
16
|
-
only:
|
17
|
-
- master
|
18
|
-
- development
|
19
|
-
|
20
|
-
gemfile:
|
21
|
-
- gemfiles/rails_5_0.gemfile
|
22
|
-
- gemfiles/rails_5_1.gemfile
|
23
|
-
- gemfiles/rails_5_2.gemfile
|
24
|
-
- gemfiles/rails_6_0.gemfile
|
25
|
-
- gemfiles/rails_master.gemfile
|
26
|
-
|
27
|
-
bundler_args: --without local
|
28
|
-
before_install:
|
29
|
-
- sudo /etc/init.d/mysql stop
|
30
|
-
- sudo /etc/init.d/postgresql stop
|
31
|
-
- docker-compose up -d
|
32
|
-
|
33
|
-
env:
|
34
|
-
RUBY_GC_MALLOC_LIMIT: 90000000
|
35
|
-
RUBY_GC_HEAP_FREE_SLOTS: 200000
|
36
|
-
jobs:
|
37
|
-
include:
|
38
|
-
- name: Rubocop Lint
|
39
|
-
script: gem install perx-rubocop && rubocop
|
40
|
-
|
41
|
-
allow_failures:
|
42
|
-
- rvm: ruby-head
|
43
|
-
- rvm: jruby-head
|
44
|
-
- gemfile: gemfiles/rails_master.gemfile
|
45
|
-
exclude:
|
46
|
-
- rvm: 2.4.10
|
47
|
-
gemfile: gemfiles/rails_6_0.gemfile
|
48
|
-
fast_finish: true
|
49
|
-
cache: bundler
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ActiveRecord
|
4
|
-
class LogSubscriber
|
5
|
-
def apartment_log
|
6
|
-
return unless Apartment.active_record_log
|
7
|
-
|
8
|
-
database = color("[#{Apartment.connection.current_database}] ", ActiveSupport::LogSubscriber::MAGENTA, true)
|
9
|
-
schema = nil
|
10
|
-
schema = color("[#{Apartment.connection.schema_search_path.tr('"', '')}] ", ActiveSupport::LogSubscriber::YELLOW, true) unless Apartment.connection.schema_search_path.nil?
|
11
|
-
"#{database}#{schema}"
|
12
|
-
end
|
13
|
-
|
14
|
-
def payload_binds(binds, type_casted_binds)
|
15
|
-
return unless (binds || []).empty?
|
16
|
-
|
17
|
-
casted_params = type_casted_binds(type_casted_binds)
|
18
|
-
binds = ' ' + binds.zip(casted_params).map { |attr, value| render_bind(attr, value) }.inspect
|
19
|
-
binds
|
20
|
-
end
|
21
|
-
|
22
|
-
def sql(event)
|
23
|
-
self.class.runtime += event.duration
|
24
|
-
return unless logger.debug?
|
25
|
-
|
26
|
-
payload = event.payload
|
27
|
-
|
28
|
-
return if IGNORE_PAYLOAD_NAMES.include?(payload[:name])
|
29
|
-
|
30
|
-
name = "#{payload[:name]} (#{event.duration.round(1)}ms)"
|
31
|
-
name = "CACHE #{name}" if payload[:cached]
|
32
|
-
sql = payload[:sql]
|
33
|
-
binds = payload_binds(payload[:binds], payload[:type_casted_binds])
|
34
|
-
|
35
|
-
name = colorize_payload_name(name, payload[:name])
|
36
|
-
sql = color(sql, sql_color(sql), true) if colorize_logging
|
37
|
-
|
38
|
-
debug " #{apartment_log}#{name} #{sql}#{binds}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|