rails_multisite 4.0.1 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c1b6e5b2d0e1ca292a9ab4b32619f7b090cc8f6cd7f7e961dd8d84b6d8eb5327
4
- data.tar.gz: 24fb6fe44ef528dd8dbfdd1e79ef2b70d8c41f53d133a23ec457fea9743423fc
3
+ metadata.gz: 9b49ebb943b1cf7656cce41a93e6100b50159a5c7e389ef9629247b385b38c94
4
+ data.tar.gz: 93e51dcd1d7e91056e5643dc2b6220397e8c2672ed267aef342ebbb27efe15a1
5
5
  SHA512:
6
- metadata.gz: 597ff3dce81db99a341eb8fd10a656bc789b6f6dcc540e580b53b9e7ea8a392c006255f37bd249731412e71b883497479cd18e168871c7ee8260df712dc48d71
7
- data.tar.gz: a6dd8debbb37fba683da03fb7cf71a95c757a8ce2e9393ecbb211cfc64b407f7a78adc3bfcc357efb4049c9e60b733aa62ad6a704a7b3e31b875bef7f297ba6c
6
+ metadata.gz: 430d520b818f54f3b78eef444bc929542149c17852041ae42bd221d47188dacf927fead066ec49feae6c776d1ad2446c6ec27dae60a7d4e7e2758f407ec64921
7
+ data.tar.gz: adac4e78e18303464728db9b26f5124f4ebcf01ebf5081e8aa15d7a8103464b46ab0698facefe0d668e78e34600282cc74e53ba93a0de0ac1909b4db44d9e60d
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsMultisite
4
+ class ConnectionManagement
5
+ class NullInstance
6
+ include Singleton
7
+
8
+ def clear_settings!
9
+ end
10
+
11
+ def config_filename
12
+ end
13
+
14
+ def default_connection_handler=(_connection_handler)
15
+ end
16
+
17
+ def establish_connection(_opts)
18
+ end
19
+
20
+ def reload
21
+ end
22
+
23
+ def all_dbs
24
+ [DEFAULT]
25
+ end
26
+
27
+ def connection_spec(_opts)
28
+ ConnectionSpecification.current
29
+ end
30
+
31
+ def current_db
32
+ DEFAULT
33
+ end
34
+
35
+ def each_connection(_opts = nil, &blk)
36
+ with_connection(&blk)
37
+ end
38
+
39
+ def has_db?(db)
40
+ db == DEFAULT
41
+ end
42
+
43
+ def host(env)
44
+ env["HTTP_HOST"]
45
+ end
46
+
47
+ def with_connection(db = DEFAULT, &blk)
48
+ connected = ActiveRecord::Base.connection_pool.connected?
49
+ result = blk.call(db)
50
+ unless connected
51
+ ActiveRecord::Base.connection_handler.clear_active_connections!
52
+ end
53
+ result
54
+ end
55
+
56
+ def with_hostname(hostname, &blk)
57
+ blk.call(hostname)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,173 +1,94 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if Rails.version >= '6.1'
4
- require 'rails_multisite/connection_management/rails_61_compat'
3
+ if Rails.version >= "6.1"
4
+ require "rails_multisite/connection_management/rails_61_compat"
5
5
  else
6
- require 'rails_multisite/connection_management/rails_60_compat'
6
+ require "rails_multisite/connection_management/rails_60_compat"
7
7
  end
8
+ require "rails_multisite/connection_management/null_instance"
8
9
 
9
10
  module RailsMultisite
10
11
  class ConnectionManagement
11
- DEFAULT = 'default'
12
-
13
- def self.default_config_filename
14
- File.absolute_path(Rails.root.to_s + "/config/multisite.yml")
15
- end
16
-
17
- def self.clear_settings!
18
- @instance&.db_spec_cache&.each do |key, spec|
19
- @instance.connection_handlers.delete(self.handler_key(spec))
12
+ DEFAULT = "default"
13
+
14
+ cattr_accessor :connection_handlers, default: {}
15
+
16
+ attr_reader :config_filename, :db_spec_cache
17
+
18
+ class << self
19
+ attr_accessor :asset_hostnames
20
+
21
+ delegate :all_dbs,
22
+ :config_filename,
23
+ :connection_spec,
24
+ :current_db,
25
+ :default_connection_handler=,
26
+ :each_connection,
27
+ :establish_connection,
28
+ :has_db?,
29
+ :host,
30
+ :reload,
31
+ :with_connection,
32
+ :with_hostname,
33
+ to: :instance
34
+
35
+ def default_config_filename
36
+ File.absolute_path(Rails.root.to_s + "/config/multisite.yml")
20
37
  end
21
38
 
22
- @instance = nil
23
- end
24
-
25
- def self.load_settings!
26
- # no op only here backwards compat
27
- STDERR.puts "RailsMultisite::ConnectionManagement.load_settings! is deprecated"
28
- end
29
-
30
- def self.instance
31
- @instance
32
- end
33
-
34
- def self.config_filename=(config_filename)
35
- if config_filename.nil?
39
+ def clear_settings!
40
+ instance.clear_settings!
36
41
  @instance = nil
37
- else
38
- @instance = new(config_filename)
39
- end
40
- end
41
-
42
- def self.asset_hostnames
43
- @asset_hostnames
44
- end
45
-
46
- def self.asset_hostnames=(h)
47
- @asset_hostnames = h
48
- end
49
-
50
- def self.config_filename
51
- @instance.config_filename
52
- end
53
-
54
- def self.reload
55
- @instance.reload
56
- end
57
-
58
- def self.has_db?(db)
59
- return true if db == DEFAULT
60
- !!(@instance && @instance.has_db?(db))
61
- end
62
-
63
- def self.establish_connection(opts)
64
- @instance.establish_connection(opts) if @instance
65
- end
66
-
67
- def self.with_hostname(hostname, &blk)
68
- if @instance
69
- @instance.with_hostname(hostname, &blk)
70
- else
71
- blk.call hostname
72
42
  end
73
- end
74
43
 
75
- def self.with_connection(db = DEFAULT, &blk)
76
- if @instance
77
- @instance.with_connection(db, &blk)
78
- else
79
- connected = ActiveRecord::Base.connection_pool.connected?
80
- result = blk.call db
81
- ActiveRecord::Base.clear_active_connections! unless connected
82
- result
44
+ def load_settings!
45
+ # no op only here backwards compat
46
+ STDERR.puts "RailsMultisite::ConnectionManagement.load_settings! is deprecated"
83
47
  end
84
- end
85
48
 
86
- def self.each_connection(opts = nil, &blk)
87
- if @instance
88
- @instance.each_connection(opts, &blk)
89
- else
90
- with_connection(&blk)
49
+ def instance
50
+ @instance || NullInstance.instance
91
51
  end
92
- end
93
52
 
94
- def self.all_dbs
95
- if @instance
96
- @instance.all_dbs
97
- else
98
- [DEFAULT]
99
- end
100
- end
101
-
102
- def self.current_db
103
- if @instance
104
- instance.current_db
105
- else
106
- DEFAULT
107
- end
108
- end
109
-
110
- def self.current_hostname
111
- current_db_hostnames.first
112
- end
113
-
114
- def self.current_db_hostnames
115
- config = (@instance&.connection_spec(db: current_db) || ConnectionSpecification.current).config
116
- config[:host_names].nil? ? [config[:host]] : config[:host_names]
117
- end
118
-
119
- def self.connection_spec(opts)
120
- if @instance
121
- @instance.connection_spec(opts)
122
- else
123
- ConnectionSpecification.current
53
+ def config_filename=(config_filename)
54
+ if config_filename.blank?
55
+ @instance = nil
56
+ else
57
+ @instance = new(config_filename)
58
+ end
124
59
  end
125
- end
126
60
 
127
- def self.host(env)
128
- if @instance
129
- @instance.host(env)
130
- else
131
- env["HTTP_HOST"]
61
+ def current_hostname
62
+ current_db_hostnames.first
132
63
  end
133
- end
134
64
 
135
- def self.handler_key(spec)
136
- @handler_key_suffix ||= begin
137
- if ActiveRecord::Base.respond_to?(:writing_role)
138
- "_#{ActiveRecord::Base.writing_role}"
139
- else
140
- ""
141
- end
65
+ def current_db_hostnames
66
+ config =
67
+ (
68
+ connection_spec(db: current_db) || ConnectionSpecification.current
69
+ ).config
70
+ config[:host_names] || [config[:host]]
142
71
  end
143
72
 
144
- :"#{spec.name}#{@handler_key_suffix}"
145
- end
146
-
147
- def self.default_connection_handler=(connection_handler)
148
- if @instance
149
- unless connection_handler.is_a?(ActiveRecord::ConnectionAdapters::ConnectionHandler)
150
- raise ArgumentError.new("Invalid connection handler")
151
- end
73
+ def handler_key(spec)
74
+ @handler_key_suffix ||=
75
+ begin
76
+ if ActiveRecord.respond_to?(:writing_role)
77
+ "_#{ActiveRecord.writing_role}"
78
+ elsif ActiveRecord::Base.respond_to?(:writing_role)
79
+ "_#{ActiveRecord::Base.writing_role}"
80
+ else
81
+ ""
82
+ end
83
+ end
152
84
 
153
- @instance.default_connection_handler = connection_handler
85
+ :"#{spec.name}#{@handler_key_suffix}"
154
86
  end
155
87
  end
156
88
 
157
- attr_reader :config_filename, :db_spec_cache, :connection_handlers
158
- attr_writer :default_connection_handler
159
-
160
89
  def initialize(config_filename)
161
90
  @config_filename = config_filename
162
91
 
163
- @connection_handlers = begin
164
- if ActiveRecord::Base.respond_to?(:connection_handlers)
165
- ActiveRecord::Base.connection_handlers
166
- else
167
- {}
168
- end
169
- end
170
-
171
92
  @db_spec_cache = {}
172
93
  @default_spec = ConnectionSpecification.default
173
94
  @default_connection_handler = ActiveRecord::Base.connection_handler
@@ -178,12 +99,15 @@ module RailsMultisite
178
99
  end
179
100
 
180
101
  def load_config!
181
- configs = YAML.safe_load(File.open(@config_filename))
102
+ configs = YAML.safe_load(File.open(config_filename))
182
103
 
183
- no_prepared_statements = @default_spec.config[:prepared_statements] == false
104
+ no_prepared_statements =
105
+ @default_spec.config[:prepared_statements] == false
184
106
 
185
107
  configs.each do |k, v|
186
- raise ArgumentError.new("Please do not name any db default!") if k == DEFAULT
108
+ if k == DEFAULT
109
+ raise ArgumentError.new("Please do not name any db default!")
110
+ end
187
111
  v[:db_key] = k
188
112
  v[:prepared_statements] = false if no_prepared_statements
189
113
  end
@@ -192,8 +116,8 @@ module RailsMultisite
192
116
  new_db_spec_cache = ConnectionSpecification.db_spec_cache(configs)
193
117
  new_db_spec_cache.each do |k, v|
194
118
  # If spec already existed, use the old version
195
- if v&.to_hash == @db_spec_cache[k]&.to_hash
196
- new_db_spec_cache[k] = @db_spec_cache[k]
119
+ if v&.to_hash == db_spec_cache[k]&.to_hash
120
+ new_db_spec_cache[k] = db_spec_cache[k]
197
121
  end
198
122
  end
199
123
 
@@ -211,25 +135,22 @@ module RailsMultisite
211
135
  new_host_spec_cache[host] = @default_spec
212
136
  end
213
137
 
214
- removed_dbs = @db_spec_cache.keys - new_db_spec_cache.keys
215
- removed_specs = @db_spec_cache.values_at(*removed_dbs)
138
+ removed_dbs = db_spec_cache.keys - new_db_spec_cache.keys
139
+ removed_specs = db_spec_cache.values_at(*removed_dbs)
216
140
 
217
141
  @host_spec_cache = new_host_spec_cache
218
142
  @db_spec_cache = new_db_spec_cache
219
143
 
220
144
  # Clean up connection handler cache.
221
- removed_specs.each { |s| @connection_handlers.delete(handler_key(s)) }
145
+ removed_specs.each { |s| connection_handlers.delete(handler_key(s)) }
222
146
  end
223
147
 
224
148
  def reload
225
- @reload_mutex.synchronize do
226
- load_config!
227
- end
149
+ @reload_mutex.synchronize { load_config! }
228
150
  end
229
151
 
230
152
  def has_db?(db)
231
- return true if db == DEFAULT
232
- @db_spec_cache[db]
153
+ db == DEFAULT || !!db_spec_cache[db]
233
154
  end
234
155
 
235
156
  def establish_connection(opts)
@@ -246,11 +167,11 @@ module RailsMultisite
246
167
  spec ||= @default_spec
247
168
  handler = nil
248
169
  if spec != @default_spec
249
- handler = @connection_handlers[handler_key(spec)]
170
+ handler = connection_handlers[handler_key(spec)]
250
171
  unless handler
251
172
  handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
252
- handler_establish_connection(handler, spec)
253
- @connection_handlers[handler_key(spec)] = handler
173
+ handler.establish_connection(spec.config)
174
+ connection_handlers[handler_key(spec)] = handler
254
175
  end
255
176
  else
256
177
  handler = @default_connection_handler
@@ -270,7 +191,9 @@ module RailsMultisite
270
191
  ActiveRecord::Base.connection_handler.clear_active_connections!
271
192
 
272
193
  establish_connection(host: old)
273
- ActiveRecord::Base.connection_handler.clear_active_connections! unless connected
194
+ unless connected
195
+ ActiveRecord::Base.connection_handler.clear_active_connections!
196
+ end
274
197
  end
275
198
 
276
199
  rval
@@ -287,14 +210,15 @@ module RailsMultisite
287
210
  ActiveRecord::Base.connection_handler.clear_active_connections!
288
211
 
289
212
  establish_connection(db: old)
290
- ActiveRecord::Base.connection_handler.clear_active_connections! unless connected
213
+ unless connected
214
+ ActiveRecord::Base.connection_handler.clear_active_connections!
215
+ end
291
216
  end
292
217
 
293
218
  rval
294
219
  end
295
220
 
296
221
  def each_connection(opts = nil, &blk)
297
-
298
222
  old = current_db
299
223
  connected = ActiveRecord::Base.connection_pool.connected?
300
224
 
@@ -309,30 +233,32 @@ module RailsMultisite
309
233
  errors = nil
310
234
 
311
235
  if queue
312
- threads.times.map do
313
- Thread.new do
314
-
315
- while true
316
- begin
317
- db = queue.deq(true)
318
- rescue ThreadError
319
- db = nil
236
+ threads
237
+ .times
238
+ .map do
239
+ Thread.new do
240
+ while true
241
+ begin
242
+ db = queue.deq(true)
243
+ rescue ThreadError
244
+ db = nil
245
+ end
246
+
247
+ break unless db
248
+
249
+ establish_connection(db: db)
250
+ # no choice but to rescue, should probably log
251
+
252
+ begin
253
+ blk.call(db)
254
+ rescue => e
255
+ (errors ||= []) << e
256
+ end
257
+ ActiveRecord::Base.connection_handler.clear_active_connections!
320
258
  end
321
-
322
- break unless db
323
-
324
- establish_connection(db: db)
325
- # no choice but to rescue, should probably log
326
-
327
- begin
328
- blk.call(db)
329
- rescue => e
330
- (errors ||= []) << e
331
- end
332
- ActiveRecord::Base.connection_handler.clear_active_connections!
333
259
  end
334
260
  end
335
- end.map(&:join)
261
+ .map(&:join)
336
262
  else
337
263
  all_dbs.each do |db|
338
264
  establish_connection(db: db)
@@ -344,14 +270,15 @@ module RailsMultisite
344
270
  if errors && errors.length > 0
345
271
  raise StandardError, "Failed to run queries #{errors.inspect}"
346
272
  end
347
-
348
273
  ensure
349
274
  establish_connection(db: old)
350
- ActiveRecord::Base.connection_handler.clear_active_connections! unless connected
275
+ unless connected
276
+ ActiveRecord::Base.connection_handler.clear_active_connections!
277
+ end
351
278
  end
352
279
 
353
280
  def all_dbs
354
- [DEFAULT] + @db_spec_cache.keys.to_a
281
+ [DEFAULT] + db_spec_cache.keys.to_a
355
282
  end
356
283
 
357
284
  def current_db
@@ -370,9 +297,9 @@ module RailsMultisite
370
297
  request = Rack::Request.new(env)
371
298
 
372
299
  host =
373
- if request['__ws'] && self.class.asset_hostnames&.include?(request.host)
300
+ if request["__ws"] && self.class.asset_hostnames&.include?(request.host)
374
301
  request.cookies.clear
375
- request['__ws']
302
+ request["__ws"]
376
303
  else
377
304
  request.host
378
305
  end
@@ -381,22 +308,29 @@ module RailsMultisite
381
308
  end
382
309
 
383
310
  def connection_spec(opts)
384
- if opts[:host]
385
- @host_spec_cache[opts[:host]]
386
- else
387
- @db_spec_cache[opts[:db]]
311
+ opts[:host] ? @host_spec_cache[opts[:host]] : db_spec_cache[opts[:db]]
312
+ end
313
+
314
+ def clear_settings!
315
+ db_spec_cache.each do |key, spec|
316
+ connection_handlers.delete(handler_key(spec))
388
317
  end
389
318
  end
390
319
 
391
- private
320
+ def default_connection_handler=(connection_handler)
321
+ unless connection_handler.is_a?(
322
+ ActiveRecord::ConnectionAdapters::ConnectionHandler
323
+ )
324
+ raise ArgumentError.new("Invalid connection handler")
325
+ end
392
326
 
393
- def handler_establish_connection(handler, spec)
394
- handler.establish_connection(spec.config)
327
+ @default_connection_handler = connection_handler
395
328
  end
396
329
 
330
+ private
331
+
397
332
  def handler_key(spec)
398
333
  self.class.handler_key(spec)
399
334
  end
400
-
401
335
  end
402
336
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  module RailsMultisite
4
- VERSION = "4.0.1"
4
+ VERSION = "5.0.1"
5
5
  end
@@ -3,7 +3,7 @@ desc "generate multisite config file (if missing)"
3
3
  task "multisite:generate:config" => :environment do
4
4
  filename = RailsMultisite::ConnectionManagement.config_filename
5
5
 
6
- if File.exists?(filename)
6
+ if File.exist?(filename)
7
7
  puts "Config is already generated at #{RailsMultisite::ConnectionManagement::CONFIG_FILE}"
8
8
  else
9
9
  puts "Generated config file at #{RailsMultisite::ConnectionManagement::CONFIG_FILE}"
metadata CHANGED
@@ -1,55 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_multisite
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.1
4
+ version: 5.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-13 00:00:00.000000000 Z
11
+ date: 2024-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5.0'
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '7.1'
19
+ version: '6.0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">"
28
- - !ruby/object:Gem::Version
29
- version: '5.0'
30
- - - "<"
24
+ - - ">="
31
25
  - !ruby/object:Gem::Version
32
- version: '7.1'
26
+ version: '6.0'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: railties
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
- - - ">"
31
+ - - ">="
38
32
  - !ruby/object:Gem::Version
39
- version: '5.0'
40
- - - "<"
41
- - !ruby/object:Gem::Version
42
- version: '7.1'
33
+ version: '6.0'
43
34
  type: :runtime
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
46
37
  requirements:
47
- - - ">"
48
- - !ruby/object:Gem::Version
49
- version: '5.0'
50
- - - "<"
38
+ - - ">="
51
39
  - !ruby/object:Gem::Version
52
- version: '7.1'
40
+ version: '6.0'
53
41
  description: Multi tenancy support for Rails
54
42
  email:
55
43
  - sam.saffron@gmail.com
@@ -61,6 +49,7 @@ files:
61
49
  - README.md
62
50
  - lib/rails_multisite.rb
63
51
  - lib/rails_multisite/connection_management.rb
52
+ - lib/rails_multisite/connection_management/null_instance.rb
64
53
  - lib/rails_multisite/connection_management/rails_60_compat.rb
65
54
  - lib/rails_multisite/connection_management/rails_61_compat.rb
66
55
  - lib/rails_multisite/cookie_salt.rb
@@ -73,7 +62,7 @@ files:
73
62
  homepage: ''
74
63
  licenses: []
75
64
  metadata: {}
76
- post_install_message:
65
+ post_install_message:
77
66
  rdoc_options: []
78
67
  require_paths:
79
68
  - lib
@@ -81,15 +70,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
81
70
  requirements:
82
71
  - - ">="
83
72
  - !ruby/object:Gem::Version
84
- version: 2.5.0
73
+ version: 3.0.0
85
74
  required_rubygems_version: !ruby/object:Gem::Requirement
86
75
  requirements:
87
76
  - - ">="
88
77
  - !ruby/object:Gem::Version
89
78
  version: '0'
90
79
  requirements: []
91
- rubygems_version: 3.1.6
92
- signing_key:
80
+ rubygems_version: 3.5.3
81
+ signing_key:
93
82
  specification_version: 4
94
83
  summary: Multi tenancy support for Rails
95
84
  test_files: []