octoshark 0.2.0 → 0.4.0
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.
- checksums.yaml +5 -5
- data/.github/workflows/build.yml +130 -0
- data/.ruby-version +1 -1
- data/Appraisals +20 -10
- data/CHANGELOG.md +17 -0
- data/Gemfile +1 -0
- data/README.md +72 -29
- data/Rakefile +4 -4
- data/gemfiles/rails3.0.gemfile +9 -0
- data/gemfiles/rails3.1.gemfile +3 -1
- data/gemfiles/rails3.2.gemfile +3 -1
- data/gemfiles/{rails4.gemfile → rails4.0.gemfile} +3 -1
- data/gemfiles/rails4.1.gemfile +3 -1
- data/gemfiles/rails4.2.gemfile +3 -1
- data/gemfiles/rails5.0.gemfile +9 -0
- data/gemfiles/rails5.1.gemfile +9 -0
- data/gemfiles/rails5.2.gemfile +9 -0
- data/gemfiles/rails6.0.gemfile +9 -0
- data/gemfiles/rails6.1.gemfile +9 -0
- data/gemfiles/rails7.0.gemfile +9 -0
- data/lib/octoshark/active_record_extensions.rb +27 -25
- data/lib/octoshark/connection_pools_manager.rb +54 -11
- data/lib/octoshark/version.rb +1 -1
- data/octoshark.gemspec +3 -4
- data/spec/octoshark/connection_manager_spec.rb +1 -1
- data/spec/octoshark/connection_pools_manager_spec.rb +1 -1
- data/spec/support/{config.yml.travis → config.yml.github} +6 -6
- metadata +20 -28
- data/.travis.yml +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 73492e9db9cf09a361e5be45ffd95b3557e2bfa70ddb102c60631d72ffa69ad2
|
4
|
+
data.tar.gz: f12275deb8e0e43ccc0f8b4b91975fa84808d2481ffb5e6698b55fd888d72bda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03751f458070db1b198c4c5cf9820d1269308758fc950fc42126d5f75c321e77b411a1959d2da0de69432b5c5d35cbdeb8ec7f78f378fcc1e39c7220179937b2
|
7
|
+
data.tar.gz: 5d2f7ff3902769fcd8b838215e40f0b9bc53dc8333c57fb88588b79732f11bd186a6f711f621d56ae00b955f8a4adf3ec52fc6698813569fdd14e87279a6b2ae
|
@@ -0,0 +1,130 @@
|
|
1
|
+
name: Build
|
2
|
+
|
3
|
+
on:
|
4
|
+
pull_request:
|
5
|
+
branches:
|
6
|
+
- "*"
|
7
|
+
push:
|
8
|
+
branches:
|
9
|
+
- master
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
legacy:
|
13
|
+
runs-on: ubuntu-18.04
|
14
|
+
services:
|
15
|
+
mysql:
|
16
|
+
image: mysql:5.5
|
17
|
+
env:
|
18
|
+
MYSQL_ROOT_PASSWORD: pass
|
19
|
+
ports:
|
20
|
+
- "3306:3306"
|
21
|
+
options: >-
|
22
|
+
--health-cmd="mysqladmin ping"
|
23
|
+
--health-interval=10s
|
24
|
+
--health-timeout=5s
|
25
|
+
--health-retries=3
|
26
|
+
|
27
|
+
name: ruby-${{ matrix.ruby }} ${{ matrix.gemfile }}
|
28
|
+
strategy:
|
29
|
+
matrix:
|
30
|
+
include:
|
31
|
+
- gemfile: rails3.0
|
32
|
+
ruby: 2.4
|
33
|
+
- gemfile: rails3.1
|
34
|
+
ruby: 2.4
|
35
|
+
- gemfile: rails3.2
|
36
|
+
ruby: 2.4
|
37
|
+
|
38
|
+
- gemfile: rails4.0
|
39
|
+
ruby: 2.4
|
40
|
+
- gemfile: rails4.1
|
41
|
+
ruby: 2.4
|
42
|
+
- gemfile: rails4.2
|
43
|
+
ruby: 2.4
|
44
|
+
|
45
|
+
env:
|
46
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
47
|
+
BUNDLE_PATH_RELATIVE_TO_CWD: true
|
48
|
+
|
49
|
+
steps:
|
50
|
+
- uses: actions/checkout@master
|
51
|
+
|
52
|
+
- name: Set up Ruby
|
53
|
+
uses: ruby/setup-ruby@v1
|
54
|
+
with:
|
55
|
+
ruby-version: ${{ matrix.ruby }}
|
56
|
+
bundler: default
|
57
|
+
bundler-cache: true
|
58
|
+
|
59
|
+
- name: Set up database
|
60
|
+
run: |
|
61
|
+
cp spec/support/config.yml.github spec/support/config.yml
|
62
|
+
bundle exec rake db:create
|
63
|
+
|
64
|
+
- name: Run tests
|
65
|
+
run: |
|
66
|
+
bundle exec rspec spec
|
67
|
+
|
68
|
+
|
69
|
+
latest:
|
70
|
+
runs-on: ubuntu-latest
|
71
|
+
services:
|
72
|
+
mysql:
|
73
|
+
image: mysql:5.7
|
74
|
+
env:
|
75
|
+
MYSQL_ROOT_PASSWORD: pass
|
76
|
+
ports:
|
77
|
+
- "3306:3306"
|
78
|
+
options: >-
|
79
|
+
--health-cmd="mysqladmin ping"
|
80
|
+
--health-interval=10s
|
81
|
+
--health-timeout=5s
|
82
|
+
--health-retries=3
|
83
|
+
|
84
|
+
name: ruby-${{ matrix.ruby }} ${{ matrix.gemfile }}
|
85
|
+
strategy:
|
86
|
+
matrix:
|
87
|
+
include:
|
88
|
+
- gemfile: rails5.0
|
89
|
+
ruby: 2.6
|
90
|
+
- gemfile: rails5.1
|
91
|
+
ruby: 2.6
|
92
|
+
- gemfile: rails5.2
|
93
|
+
ruby: 2.6
|
94
|
+
- gemfile: rails5.2
|
95
|
+
ruby: 3.0
|
96
|
+
|
97
|
+
- gemfile: rails6.0
|
98
|
+
ruby: 2.7
|
99
|
+
- gemfile: rails6.1
|
100
|
+
ruby: 2.7
|
101
|
+
- gemfile: rails6.1
|
102
|
+
ruby: 3.0
|
103
|
+
|
104
|
+
- gemfile: rails7.0
|
105
|
+
ruby: 2.7
|
106
|
+
- gemfile: rails7.0
|
107
|
+
ruby: 3.0
|
108
|
+
|
109
|
+
env:
|
110
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
111
|
+
BUNDLE_PATH_RELATIVE_TO_CWD: true
|
112
|
+
|
113
|
+
steps:
|
114
|
+
- uses: actions/checkout@master
|
115
|
+
|
116
|
+
- name: Set up Ruby
|
117
|
+
uses: ruby/setup-ruby@v1
|
118
|
+
with:
|
119
|
+
ruby-version: ${{ matrix.ruby }}
|
120
|
+
bundler: default
|
121
|
+
bundler-cache: true
|
122
|
+
|
123
|
+
- name: Set up database
|
124
|
+
run: |
|
125
|
+
cp spec/support/config.yml.github spec/support/config.yml
|
126
|
+
bundle exec rake db:create
|
127
|
+
|
128
|
+
- name: Run tests
|
129
|
+
run: |
|
130
|
+
bundle exec rspec spec
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.0.2
|
data/Appraisals
CHANGED
@@ -1,19 +1,29 @@
|
|
1
|
-
appraise "
|
2
|
-
gem "activerecord", "~>
|
1
|
+
appraise "rails5.1" do
|
2
|
+
gem "activerecord", "~> 5.1.0"
|
3
|
+
gem "mysql2", "~> 0.5.2"
|
4
|
+
gem "sqlite3", "~> 1.4.1"
|
3
5
|
end
|
4
6
|
|
5
|
-
appraise "
|
6
|
-
gem "activerecord", "~>
|
7
|
+
appraise "rails5.2" do
|
8
|
+
gem "activerecord", "~> 5.2.0"
|
9
|
+
gem "mysql2", "~> 0.5.2"
|
10
|
+
gem "sqlite3", "~> 1.4.1"
|
7
11
|
end
|
8
12
|
|
9
|
-
appraise "
|
10
|
-
gem "activerecord", "~>
|
13
|
+
appraise "rails6.0" do
|
14
|
+
gem "activerecord", "~> 6.0.0"
|
15
|
+
gem "mysql2", "~> 0.5.2"
|
16
|
+
gem "sqlite3", "~> 1.4.1"
|
11
17
|
end
|
12
18
|
|
13
|
-
appraise "
|
14
|
-
gem "activerecord", "~>
|
19
|
+
appraise "rails6.1" do
|
20
|
+
gem "activerecord", "~> 6.1.0"
|
21
|
+
gem "mysql2", "~> 0.5.2"
|
22
|
+
gem "sqlite3", "~> 1.4.1"
|
15
23
|
end
|
16
24
|
|
17
|
-
appraise "
|
18
|
-
gem "activerecord", "~>
|
25
|
+
appraise "rails7.0" do
|
26
|
+
gem "activerecord", "~> 7.0.0"
|
27
|
+
gem "mysql2", "~> 0.5"
|
28
|
+
gem "sqlite3", "~> 1.4"
|
19
29
|
end
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## 0.4.0 2022-02-12
|
4
|
+
|
5
|
+
- Add support for Rails 7.0
|
6
|
+
- Fix `establish_connection` for Ruby 3
|
7
|
+
|
8
|
+
## 0.3.0 2021-07-20
|
9
|
+
|
10
|
+
- Add support for Rails 6.1
|
11
|
+
|
12
|
+
## 0.2.2 2016-11-09
|
13
|
+
|
14
|
+
- Fix `alias_method_chain` deprecation in Rails 5
|
15
|
+
|
16
|
+
## 0.2.1 2016-09-09
|
17
|
+
|
18
|
+
- Add support for Rails 5 and Rails 3
|
19
|
+
|
3
20
|
## 0.2.0 2016-08-29
|
4
21
|
|
5
22
|
- `Octoshark::ConnectionManager` is split in two managers `Octoshark::ConnectionPoolsManager` for persistent connections and `Octoshark::ConnectionManager` for non-persistent connections.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-

|
2
2
|
|
3
3
|

|
4
4
|
|
@@ -163,7 +163,7 @@ When using `Octoshark::ConnectionPoolsManager`, whenever ActiveRecord::Base call
|
|
163
163
|
|
164
164
|
## Cleaning test databases
|
165
165
|
|
166
|
-
|
166
|
+
For `Octoshark::ConnectionPoolsManager`, we can use [DatabaseCleaner](https://github.com/DatabaseCleaner/database_cleaner) and RSpec like:
|
167
167
|
|
168
168
|
```ruby
|
169
169
|
config.before(:suite) do
|
@@ -177,7 +177,6 @@ config.before(:each) do
|
|
177
177
|
end
|
178
178
|
|
179
179
|
config.after(:each) do
|
180
|
-
setup_database_cleaner
|
181
180
|
DatabaseCleaner.clean_with(:transaction)
|
182
181
|
end
|
183
182
|
|
@@ -191,49 +190,93 @@ def setup_database_cleaner
|
|
191
190
|
end
|
192
191
|
```
|
193
192
|
|
194
|
-
|
193
|
+
For `Octoshark::ConnectionManager` where connections and databases are dynamically created and cannot be configured in the test setup, we can write a custom database cleaner inspired by [DatabaseRewinder](https://github.com/amatsuda/database_rewinder). The example below is for a multi-tenant test setup with a main (core) database and a tenant database for the `CURRENT_USER` in the test suite. `CustomDatabaseCleaner.clean_all` cleans all core database tables before test suite and `CustomDatabaseCleaner.clean` cleans used tables in both core and tenant databases after each test.
|
194
|
+
|
195
195
|
|
196
196
|
```ruby
|
197
|
-
module
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
197
|
+
module CustomDatabaseCleaner
|
198
|
+
INSERT_REGEX = /\AINSERT(?:\s+IGNORE)?\s+INTO\s+(?:\.*[`"]?(?<table>[^.\s`"]+)[`"]?)*/i
|
199
|
+
|
200
|
+
@@tables_with_inserts = []
|
201
|
+
|
202
|
+
class << self
|
203
|
+
def record_inserted_table(connection, sql)
|
204
|
+
match = sql.match(INSERT_REGEX)
|
205
|
+
|
206
|
+
if match && match[:table] && tables_with_inserts.exclude?(match[:table])
|
207
|
+
tables_with_inserts << match[:table]
|
208
|
+
end
|
202
209
|
end
|
203
210
|
|
204
|
-
def
|
205
|
-
|
206
|
-
|
211
|
+
def clean_all
|
212
|
+
with_core_db_connection do |connection|
|
213
|
+
clean_tables(connection)
|
214
|
+
end
|
215
|
+
|
216
|
+
reset_tables_with_inserts
|
207
217
|
end
|
208
|
-
end
|
209
218
|
|
210
|
-
|
219
|
+
def clean
|
220
|
+
with_core_db_connection do |connection|
|
221
|
+
clean_tables(connection, { 'users' => [CURRENT_USER.id] })
|
222
|
+
end
|
211
223
|
|
212
|
-
|
213
|
-
|
214
|
-
|
224
|
+
CURRENT_USER.with_tenant do |connection|
|
225
|
+
clean_tables(connection)
|
226
|
+
end
|
215
227
|
|
216
|
-
|
217
|
-
|
218
|
-
tables << match[1] if match && !tables.include?(match[1])
|
219
|
-
end
|
228
|
+
reset_tables_with_inserts
|
229
|
+
end
|
220
230
|
|
221
|
-
|
222
|
-
|
223
|
-
(
|
224
|
-
|
225
|
-
|
231
|
+
private
|
232
|
+
def with_core_db_connection(&block)
|
233
|
+
CoreDBManager.with_connection(ActiveRecord::Base.configurations[Rails.env].symbolize_keys, &block)
|
234
|
+
end
|
235
|
+
|
236
|
+
def clean_tables(connection, keep_data = {})
|
237
|
+
tables_to_clean = connection.tables.reject { |t| t == ActiveRecord::Migrator.schema_migrations_table_name }
|
238
|
+
tables_to_clean = tables_to_clean & tables_with_inserts if tables_with_inserts.present?
|
239
|
+
|
240
|
+
tables_to_clean.each do |table|
|
226
241
|
connection.disable_referential_integrity do
|
227
|
-
|
242
|
+
table_name = connection.quote_table_name(table)
|
243
|
+
keep_ids = keep_data[table]
|
244
|
+
|
245
|
+
if keep_ids
|
246
|
+
connection.execute("DELETE FROM #{table_name} WHERE id NOT IN (#{keep_ids.join(',')});")
|
247
|
+
else
|
248
|
+
connection.execute("DELETE FROM #{table_name};")
|
249
|
+
end
|
228
250
|
end
|
229
251
|
end
|
230
252
|
end
|
231
|
-
|
253
|
+
|
254
|
+
def reset_tables_with_inserts
|
255
|
+
@@tables_with_inserts = []
|
256
|
+
end
|
257
|
+
|
258
|
+
def tables_with_inserts
|
259
|
+
@@tables_with_inserts
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
module CustomDatabaseCleaner
|
265
|
+
module InsertRecorder
|
266
|
+
def execute(sql, *)
|
267
|
+
CustomDatabaseCleaner.record_inserted_table(self, sql)
|
268
|
+
super
|
269
|
+
end
|
270
|
+
|
271
|
+
def exec_query(sql, *)
|
272
|
+
CustomDatabaseCleaner.record_inserted_table(self, sql)
|
273
|
+
super
|
274
|
+
end
|
232
275
|
end
|
233
276
|
end
|
234
277
|
|
235
278
|
require 'active_record/connection_adapters/abstract_mysql_adapter'
|
236
|
-
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.send(:prepend,
|
279
|
+
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.send(:prepend, CustomDatabaseCleaner::InsertRecorder)
|
237
280
|
```
|
238
281
|
|
239
282
|
|
data/Rakefile
CHANGED
@@ -10,16 +10,16 @@ task :default => :spec
|
|
10
10
|
|
11
11
|
namespace :db do
|
12
12
|
task :establish_connection do
|
13
|
-
configs = YAML.load_file('spec/support/config.yml')
|
14
|
-
config = configs[
|
15
|
-
@databases = configs.map { |_, config| config[
|
13
|
+
configs = YAML.load_file('spec/support/config.yml')
|
14
|
+
config = configs['db1'].reject { |k, v| k == 'database' }
|
15
|
+
@databases = configs.map { |_, config| config['database'] }
|
16
16
|
ActiveRecord::Base.establish_connection(config)
|
17
17
|
end
|
18
18
|
|
19
19
|
task :create => :establish_connection do
|
20
20
|
@databases.each do |database|
|
21
21
|
begin
|
22
|
-
ActiveRecord::Base.connection.create_database(database)
|
22
|
+
ActiveRecord::Base.connection.create_database(database, charset: 'utf8')
|
23
23
|
puts "#{database} created."
|
24
24
|
rescue ActiveRecord::StatementInvalid => e
|
25
25
|
if e.message.match /database exists/
|
data/gemfiles/rails3.1.gemfile
CHANGED
data/gemfiles/rails3.2.gemfile
CHANGED
data/gemfiles/rails4.1.gemfile
CHANGED
data/gemfiles/rails4.2.gemfile
CHANGED
@@ -1,43 +1,45 @@
|
|
1
1
|
module Octoshark
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
module ConnectionHandler
|
3
|
+
# def establish_connection(owner, spec) # Rails 3.x
|
4
|
+
# def establish_connection(config_or_env = nil) # Rails 4.x - 6.1
|
5
|
+
# def establish_connection(config, owner_name:, role:, shard:) # Rails 6.2+
|
6
|
+
def establish_connection(*args, **kwargs)
|
7
|
+
Octoshark::ConnectionPoolsManager.reset_connection_managers!
|
8
|
+
|
9
|
+
if kwargs.empty?
|
10
|
+
# For backward compatibility with older versions of Rails on Ruby 3
|
11
|
+
# that separates positional (args) and keyword arguments (kwargs).
|
12
|
+
super(*args)
|
13
|
+
else
|
14
|
+
super(*args, **kwargs)
|
8
15
|
end
|
9
16
|
end
|
17
|
+
end
|
10
18
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
# Octoshark connection managers.
|
16
|
-
def establish_connection_with_octoshark(*args)
|
17
|
-
establish_connection_without_octoshark(*args)
|
18
|
-
Octoshark::ConnectionPoolsManager.reset_connection_managers!
|
19
|
-
end
|
19
|
+
module ConnectionHandlerRails3
|
20
|
+
def establish_connection(*args)
|
21
|
+
Octoshark::ConnectionPoolsManager.reset_connection_managers!
|
22
|
+
super(*args)
|
20
23
|
end
|
21
24
|
end
|
22
25
|
|
23
26
|
module ActiveRecordAbstractAdapter
|
24
|
-
extend ActiveSupport::Concern
|
25
|
-
|
26
27
|
attr_accessor :connection_name, :database_name
|
27
28
|
|
28
|
-
|
29
|
-
alias_method_chain :log, :octoshark
|
30
|
-
end
|
31
|
-
|
32
|
-
def log_with_octoshark(sql, name = "SQL", *other_args, &block)
|
29
|
+
def log(sql, name = "SQL", *other_args, &block)
|
33
30
|
if connection_name || database_name
|
34
31
|
name = "[Octoshark: #{[connection_name, database_name].compact.join(' ')}] #{name}"
|
35
32
|
end
|
36
33
|
|
37
|
-
|
34
|
+
super(sql, name, *other_args, &block)
|
38
35
|
end
|
39
36
|
end
|
40
37
|
end
|
41
38
|
|
42
|
-
|
43
|
-
ActiveRecord::ConnectionAdapters::
|
39
|
+
# Rails 3.0 and 3.1 does not lazy load
|
40
|
+
unless defined?(ActiveRecord::ConnectionAdapters::ConnectionHandler)
|
41
|
+
require 'active_record/connection_adapters/abstract_adapter'
|
42
|
+
end
|
43
|
+
|
44
|
+
ActiveRecord::ConnectionAdapters::ConnectionHandler.send(:prepend, Octoshark::ConnectionHandler)
|
45
|
+
ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:prepend, Octoshark::ActiveRecordAbstractAdapter)
|
@@ -11,7 +11,7 @@ module Octoshark
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.reset_connection_managers!
|
14
|
-
connection_managers.
|
14
|
+
connection_managers.each(&:reset!)
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.disconnect!
|
@@ -61,25 +61,68 @@ module Octoshark
|
|
61
61
|
end
|
62
62
|
|
63
63
|
private
|
64
|
-
def spec_class
|
65
|
-
if defined?(ActiveRecord::ConnectionAdapters::ConnectionSpecification)
|
66
|
-
spec_class = ActiveRecord::ConnectionAdapters::ConnectionSpecification
|
67
|
-
else
|
68
|
-
spec_class = ActiveRecord::Base::ConnectionSpecification
|
69
|
-
end
|
70
|
-
end
|
71
64
|
|
72
65
|
def setup_connection_pools
|
73
66
|
@connection_pools = HashWithIndifferentAccess.new
|
74
67
|
|
75
68
|
@configs.each_pair do |name, config|
|
76
|
-
@connection_pools[name] = create_connection_pool(config)
|
69
|
+
@connection_pools[name] = create_connection_pool(name, config)
|
77
70
|
end
|
78
71
|
end
|
79
72
|
|
80
|
-
def create_connection_pool(config)
|
81
|
-
spec =
|
73
|
+
def create_connection_pool(name, config)
|
74
|
+
spec = build_connection_pool_spec(name, config)
|
75
|
+
|
82
76
|
ActiveRecord::ConnectionAdapters::ConnectionPool.new(spec)
|
83
77
|
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def build_connection_pool_spec(name, config)
|
82
|
+
if active_record_6_1_or_7?
|
83
|
+
env_name = defined?(Rails) ? Rails.env : nil
|
84
|
+
db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(env_name, name, config)
|
85
|
+
|
86
|
+
pool_config_class = ActiveRecord::ConnectionAdapters::PoolConfig
|
87
|
+
|
88
|
+
if pool_config_class.instance_method(:initialize).arity == 2
|
89
|
+
# ActiveRecord 6.1
|
90
|
+
pool_config_class.new(owner_name = ActiveRecord::Base, db_config)
|
91
|
+
else
|
92
|
+
# ActiveRecord 7.0
|
93
|
+
pool_config_class.new(
|
94
|
+
owner_name = ActiveRecord::Base,
|
95
|
+
db_config,
|
96
|
+
role = ActiveRecord::Base.current_role,
|
97
|
+
shard = ActiveRecord::Base.current_shard
|
98
|
+
)
|
99
|
+
end
|
100
|
+
else
|
101
|
+
adapter_method = "#{config[:adapter]}_connection"
|
102
|
+
|
103
|
+
if active_record_4_or_5_or_6?
|
104
|
+
spec_class = ActiveRecord::ConnectionAdapters::ConnectionSpecification
|
105
|
+
|
106
|
+
if spec_class.instance_method(:initialize).arity == 3
|
107
|
+
# ActiveRecord 5.x and 6.0
|
108
|
+
spec_class.new(name, config, adapter_method)
|
109
|
+
else
|
110
|
+
# ActiveRecord 4.x
|
111
|
+
spec_class.new(config, adapter_method)
|
112
|
+
end
|
113
|
+
else
|
114
|
+
# ActiveRecord 3.x
|
115
|
+
ActiveRecord::Base::ConnectionSpecification.new(config, adapter_method)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def active_record_6_1_or_7?
|
121
|
+
defined?(ActiveRecord::ConnectionAdapters::PoolConfig)
|
122
|
+
end
|
123
|
+
|
124
|
+
def active_record_4_or_5_or_6?
|
125
|
+
defined?(ActiveRecord::ConnectionAdapters::ConnectionSpecification)
|
126
|
+
end
|
84
127
|
end
|
85
128
|
end
|
data/lib/octoshark/version.rb
CHANGED
data/octoshark.gemspec
CHANGED
@@ -20,10 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_runtime_dependency "activerecord", ">= 3.0"
|
22
22
|
|
23
|
-
spec.add_development_dependency "bundler", "~> 1.5"
|
24
23
|
spec.add_development_dependency "rake"
|
25
|
-
spec.add_development_dependency "rspec", "~> 3.
|
26
|
-
spec.add_development_dependency "sqlite3", "~> 1.
|
27
|
-
spec.add_development_dependency "mysql2", "~> 0.
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.7.0"
|
25
|
+
spec.add_development_dependency "sqlite3", "~> 1.4.1"
|
26
|
+
spec.add_development_dependency "mysql2", "~> 0.5.2"
|
28
27
|
spec.add_development_dependency "appraisal"
|
29
28
|
end
|
@@ -67,7 +67,7 @@ describe Octoshark::ConnectionPoolsManager do
|
|
67
67
|
it "returns value from execution" do
|
68
68
|
manager = Octoshark::ConnectionPoolsManager.new(configs)
|
69
69
|
result = manager.with_connection(:db1) { |connection| connection.execute("SELECT 1") }
|
70
|
-
expect(result).to eq(
|
70
|
+
expect(result.first['1']).to eq(1)
|
71
71
|
end
|
72
72
|
|
73
73
|
it "raises Octoshark::Error::NoConnection" do
|
@@ -4,9 +4,9 @@ db1:
|
|
4
4
|
reconnect: false
|
5
5
|
database: octoshark_db1
|
6
6
|
pool: 5
|
7
|
-
username:
|
8
|
-
password:
|
9
|
-
host:
|
7
|
+
username: root
|
8
|
+
password: pass
|
9
|
+
host: 127.0.0.1
|
10
10
|
port: 3306
|
11
11
|
|
12
12
|
db2:
|
@@ -15,7 +15,7 @@ db2:
|
|
15
15
|
reconnect: false
|
16
16
|
database: octoshark_db2
|
17
17
|
pool: 5
|
18
|
-
username:
|
19
|
-
password:
|
20
|
-
host:
|
18
|
+
username: root
|
19
|
+
password: pass
|
20
|
+
host: 127.0.0.1
|
21
21
|
port: 3306
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: octoshark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dalibor Nasevic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.5'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.5'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rake
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,42 +44,42 @@ dependencies:
|
|
58
44
|
requirements:
|
59
45
|
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version: 3.
|
47
|
+
version: 3.7.0
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
52
|
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version: 3.
|
54
|
+
version: 3.7.0
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: sqlite3
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
59
|
- - "~>"
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
61
|
+
version: 1.4.1
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
66
|
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
68
|
+
version: 1.4.1
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: mysql2
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
86
72
|
requirements:
|
87
73
|
- - "~>"
|
88
74
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
75
|
+
version: 0.5.2
|
90
76
|
type: :development
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
80
|
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
82
|
+
version: 0.5.2
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: appraisal
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,21 +101,28 @@ executables: []
|
|
115
101
|
extensions: []
|
116
102
|
extra_rdoc_files: []
|
117
103
|
files:
|
104
|
+
- ".github/workflows/build.yml"
|
118
105
|
- ".gitignore"
|
119
106
|
- ".rspec"
|
120
107
|
- ".ruby-version"
|
121
|
-
- ".travis.yml"
|
122
108
|
- Appraisals
|
123
109
|
- CHANGELOG.md
|
124
110
|
- Gemfile
|
125
111
|
- LICENSE.txt
|
126
112
|
- README.md
|
127
113
|
- Rakefile
|
114
|
+
- gemfiles/rails3.0.gemfile
|
128
115
|
- gemfiles/rails3.1.gemfile
|
129
116
|
- gemfiles/rails3.2.gemfile
|
117
|
+
- gemfiles/rails4.0.gemfile
|
130
118
|
- gemfiles/rails4.1.gemfile
|
131
119
|
- gemfiles/rails4.2.gemfile
|
132
|
-
- gemfiles/
|
120
|
+
- gemfiles/rails5.0.gemfile
|
121
|
+
- gemfiles/rails5.1.gemfile
|
122
|
+
- gemfiles/rails5.2.gemfile
|
123
|
+
- gemfiles/rails6.0.gemfile
|
124
|
+
- gemfiles/rails6.1.gemfile
|
125
|
+
- gemfiles/rails7.0.gemfile
|
133
126
|
- lib/octoshark.rb
|
134
127
|
- lib/octoshark/active_record_extensions.rb
|
135
128
|
- lib/octoshark/connection_manager.rb
|
@@ -143,8 +136,8 @@ files:
|
|
143
136
|
- spec/octoshark/connection_pools_manager_spec.rb
|
144
137
|
- spec/octoshark/current_connection_spec.rb
|
145
138
|
- spec/spec_helper.rb
|
139
|
+
- spec/support/config.yml.github
|
146
140
|
- spec/support/config.yml.template
|
147
|
-
- spec/support/config.yml.travis
|
148
141
|
- spec/support/helpers.rb
|
149
142
|
homepage: https://github.com/dalibor/octoshark
|
150
143
|
licenses:
|
@@ -165,8 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
158
|
- !ruby/object:Gem::Version
|
166
159
|
version: '0'
|
167
160
|
requirements: []
|
168
|
-
|
169
|
-
rubygems_version: 2.2.2
|
161
|
+
rubygems_version: 3.3.7
|
170
162
|
signing_key:
|
171
163
|
specification_version: 4
|
172
164
|
summary: Octoshark is an ActiveRecord connection switcher
|
@@ -176,6 +168,6 @@ test_files:
|
|
176
168
|
- spec/octoshark/connection_pools_manager_spec.rb
|
177
169
|
- spec/octoshark/current_connection_spec.rb
|
178
170
|
- spec/spec_helper.rb
|
171
|
+
- spec/support/config.yml.github
|
179
172
|
- spec/support/config.yml.template
|
180
|
-
- spec/support/config.yml.travis
|
181
173
|
- spec/support/helpers.rb
|
data/.travis.yml
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
rvm:
|
2
|
-
- 2.1.0
|
3
|
-
cache:
|
4
|
-
- bundler
|
5
|
-
notifications:
|
6
|
-
email:
|
7
|
-
- dalibor.nasevic@gmail.com
|
8
|
-
gemfile:
|
9
|
-
- gemfiles/rails3.1.gemfile
|
10
|
-
- gemfiles/rails3.2.gemfile
|
11
|
-
- gemfiles/rails4.gemfile
|
12
|
-
- gemfiles/rails4.1.gemfile
|
13
|
-
- gemfiles/rails4.2.gemfile
|
14
|
-
before_script:
|
15
|
-
- cp spec/support/config.yml.travis spec/support/config.yml
|
16
|
-
- bundle exec rake db:create
|
17
|
-
script:
|
18
|
-
- bundle exec rspec spec
|