rails_failover 0.6.5 → 0.8.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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +12 -14
- data/.gitignore +1 -0
- data/CHANGELOG.md +20 -0
- data/README.md +1 -1
- data/lib/rails_failover/active_record/handler.rb +10 -3
- data/lib/rails_failover/active_record/middleware.rb +6 -1
- data/lib/rails_failover/active_record/railtie.rb +16 -3
- data/lib/rails_failover/active_record.rb +1 -2
- data/lib/rails_failover/redis/handler.rb +19 -3
- data/lib/rails_failover/version.rb +1 -1
- data/rails_failover.gemspec +5 -4
- metadata +25 -14
- data/Gemfile.lock +0 -123
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b0f3e010743d83bd67b2cce785fde0952ba32c82c8c1ab5fef3aa56e5baa520
|
4
|
+
data.tar.gz: 26cc2466069dfe48b691d8676078b3ed9ee3ce82e7a8d4447fa327436741fd39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ce28a0d758dde383537bce455502edfcbf9388ad4c2835edc17b2e259156affc885153f728e39fa66c8c25d3f9dfea34a8f489b663e7738fc092dc6c76dccb8
|
7
|
+
data.tar.gz: 0f0c08446e0e64c5eb6ee972e80e8776e58fbd32877254e50098a17a4d4475db64379d7ad237933b054e5eaf7c54df72785c69253e7d31be1b28d38028fcaf11
|
data/.github/workflows/ci.yml
CHANGED
@@ -5,8 +5,7 @@ on:
|
|
5
5
|
push:
|
6
6
|
branches:
|
7
7
|
- master
|
8
|
-
|
9
|
-
- v*
|
8
|
+
- main
|
10
9
|
|
11
10
|
jobs:
|
12
11
|
build:
|
@@ -18,22 +17,19 @@ jobs:
|
|
18
17
|
strategy:
|
19
18
|
fail-fast: false
|
20
19
|
matrix:
|
21
|
-
ruby:
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
exclude:
|
26
|
-
- ruby: 2.6
|
20
|
+
ruby: ["2.6", "2.7", "3.0", "3.1"]
|
21
|
+
build_types: ["REDIS", "ACTIVERECORD"]
|
22
|
+
include:
|
23
|
+
- ruby: "3.1"
|
27
24
|
build_types: "LINT"
|
28
25
|
|
29
26
|
steps:
|
30
|
-
- uses: actions/checkout@
|
27
|
+
- uses: actions/checkout@v2
|
31
28
|
|
32
29
|
- name: Setup ruby
|
33
|
-
uses:
|
30
|
+
uses: ruby/setup-ruby@v1
|
34
31
|
with:
|
35
32
|
ruby-version: ${{ matrix.ruby }}
|
36
|
-
architecture: 'x64'
|
37
33
|
|
38
34
|
- name: Setup bundler
|
39
35
|
run: gem install bundler
|
@@ -68,7 +64,7 @@ jobs:
|
|
68
64
|
if: env.BUILD_TYPE == 'ACTIVERECORD'
|
69
65
|
|
70
66
|
publish:
|
71
|
-
if:
|
67
|
+
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master')
|
72
68
|
needs: build
|
73
69
|
runs-on: ubuntu-latest
|
74
70
|
|
@@ -76,6 +72,8 @@ jobs:
|
|
76
72
|
- uses: actions/checkout@v2
|
77
73
|
|
78
74
|
- name: Release Gem
|
79
|
-
uses:
|
75
|
+
uses: discourse/publish-rubygems-action@v2
|
80
76
|
env:
|
81
|
-
RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
|
77
|
+
RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
78
|
+
GIT_EMAIL: team@discourse.org
|
79
|
+
GIT_NAME: discoursebot
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.8.0] - 2022-01-17
|
10
|
+
|
11
|
+
- FEATURE: Compatibility with Rails 7.0+
|
12
|
+
|
13
|
+
## [0.7.3] - 2021-04-15
|
14
|
+
|
15
|
+
- FEATURE: Compatibility with Rails 6.1
|
16
|
+
|
17
|
+
## [0.7.2] - 2021-04-14
|
18
|
+
|
19
|
+
No changes.
|
20
|
+
|
21
|
+
## [0.7.1] - 2021-04-14
|
22
|
+
|
23
|
+
- FIX: Backward compatability with Rails 6.0
|
24
|
+
|
25
|
+
## [0.7.0] - 2021-04-14
|
26
|
+
|
27
|
+
- FEATURE: Partial compatibility with Rails 6.1
|
28
|
+
|
9
29
|
## [0.6.5] - 2020-12-16
|
10
30
|
|
11
31
|
- FIX: Catch exceptions that are not intercepted by `ActionDispatch::DebugExceptions`.
|
data/README.md
CHANGED
@@ -53,7 +53,7 @@ end
|
|
53
53
|
|
54
54
|
#### Multiple connection handlers
|
55
55
|
|
56
|
-
Note: This API is unstable and is likely to
|
56
|
+
Note: This API is unstable and is likely to change when Rails 6.1 is released with sharding support.
|
57
57
|
|
58
58
|
```
|
59
59
|
# config/database.yml
|
@@ -56,13 +56,20 @@ module RailsFailover
|
|
56
56
|
|
57
57
|
primaries_down.keys.each do |handler_key|
|
58
58
|
connection_handler = ::ActiveRecord::Base.connection_handlers[handler_key]
|
59
|
-
|
60
|
-
|
59
|
+
|
60
|
+
connection_pool = connection_handler.retrieve_connection_pool(spec_name)
|
61
|
+
if connection_pool.respond_to?(:db_config)
|
62
|
+
config = connection_pool.db_config.configuration_hash
|
63
|
+
adapter_method = connection_pool.db_config.adapter_method
|
64
|
+
else
|
65
|
+
config = connection_pool.spec.config
|
66
|
+
adapter_method = connection_pool.spec.adapter_method
|
67
|
+
end
|
61
68
|
logger.debug "#{Process.pid} Checking server for '#{handler_key} #{spec_name}'..."
|
62
69
|
connection_active = false
|
63
70
|
|
64
71
|
begin
|
65
|
-
connection = ::ActiveRecord::Base.public_send(
|
72
|
+
connection = ::ActiveRecord::Base.public_send(adapter_method, config)
|
66
73
|
connection_active = connection.active?
|
67
74
|
rescue => e
|
68
75
|
logger.debug "#{Process.pid} Connection to server for '#{handler_key} #{spec_name}' failed with '#{e.message}'"
|
@@ -80,7 +80,12 @@ module RailsFailover
|
|
80
80
|
handler = ::ActiveRecord::ConnectionAdapters::ConnectionHandler.new
|
81
81
|
|
82
82
|
::ActiveRecord::Base.connection_handlers[writing_role].connection_pools.each do |pool|
|
83
|
-
|
83
|
+
if pool.respond_to?(:db_config)
|
84
|
+
config = pool.db_config.configuration_hash
|
85
|
+
else
|
86
|
+
config = pool.spec.config
|
87
|
+
end
|
88
|
+
::RailsFailover::ActiveRecord.establish_reading_connection(handler, config)
|
84
89
|
end
|
85
90
|
|
86
91
|
handler
|
@@ -4,7 +4,15 @@ module RailsFailover
|
|
4
4
|
module ActiveRecord
|
5
5
|
class Railtie < ::Rails::Railtie
|
6
6
|
initializer "rails_failover.init", after: "active_record.initialize_database" do |app|
|
7
|
-
|
7
|
+
|
8
|
+
# AR 6.0 / 6.1 compat
|
9
|
+
config =
|
10
|
+
if ::ActiveRecord::Base.respond_to? :connection_db_config
|
11
|
+
::ActiveRecord::Base.connection_db_config.configuration_hash
|
12
|
+
else
|
13
|
+
::ActiveRecord::Base.connection_config
|
14
|
+
end
|
15
|
+
|
8
16
|
app.config.active_record_rails_failover = false
|
9
17
|
|
10
18
|
if !!(config[:replica_host] && config[:replica_port])
|
@@ -19,9 +27,14 @@ module RailsFailover
|
|
19
27
|
::ActiveRecord::ConnectionAdapters::ConnectionHandler.new
|
20
28
|
|
21
29
|
::ActiveRecord::Base.connection_handlers[::ActiveRecord::Base.writing_role].connection_pools.each do |connection_pool|
|
30
|
+
if connection_pool.respond_to?(:db_config)
|
31
|
+
config = connection_pool.db_config.configuration_hash
|
32
|
+
else
|
33
|
+
config = connection_pool.spec.config
|
34
|
+
end
|
22
35
|
RailsFailover::ActiveRecord.establish_reading_connection(
|
23
36
|
::ActiveRecord::Base.connection_handlers[::ActiveRecord::Base.reading_role],
|
24
|
-
|
37
|
+
config
|
25
38
|
)
|
26
39
|
end
|
27
40
|
|
@@ -29,7 +42,7 @@ module RailsFailover
|
|
29
42
|
::ActiveRecord::Base.connection
|
30
43
|
rescue ::ActiveRecord::NoDatabaseError
|
31
44
|
# Do nothing since database hasn't been created
|
32
|
-
rescue ::PG::Error
|
45
|
+
rescue ::PG::Error, ::ActiveRecord::ConnectionNotEstablished
|
33
46
|
Handler.instance.verify_primary(::ActiveRecord::Base.writing_role)
|
34
47
|
::ActiveRecord::Base.connection_handler = ::ActiveRecord::Base.lookup_connection_handler(:reading)
|
35
48
|
end
|
@@ -27,8 +27,7 @@ module RailsFailover
|
|
27
27
|
@verify_primary_frequency_seconds || 5
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.establish_reading_connection(handler,
|
31
|
-
config = connection_spec.config
|
30
|
+
def self.establish_reading_connection(handler, config)
|
32
31
|
|
33
32
|
if config[:replica_host] && config[:replica_port]
|
34
33
|
replica_config = config.dup
|
@@ -169,7 +169,7 @@ module RailsFailover
|
|
169
169
|
# Calling .disconnect can cause a running subscribe() to block forever
|
170
170
|
# Therefore try to acquire the lock
|
171
171
|
def soft_disconnect(redis, client, role)
|
172
|
-
has_lock = redis
|
172
|
+
has_lock = redis_mon_try_enter(redis)
|
173
173
|
|
174
174
|
if !has_lock
|
175
175
|
begin
|
@@ -180,7 +180,7 @@ module RailsFailover
|
|
180
180
|
|
181
181
|
waiting_since = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
182
182
|
loop do # Keep trying
|
183
|
-
break if has_lock = redis
|
183
|
+
break if has_lock = redis_mon_try_enter(redis)
|
184
184
|
break if !client.connection.connected? # Disconnected by other thread
|
185
185
|
break if client.connection.rails_failover_role != role # Reconnected by other thread
|
186
186
|
time_now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
@@ -191,12 +191,28 @@ module RailsFailover
|
|
191
191
|
|
192
192
|
client.disconnect if client.connection&.rails_failover_role == role
|
193
193
|
ensure
|
194
|
-
redis
|
194
|
+
redis_mon_exit(redis) if has_lock
|
195
195
|
end
|
196
196
|
|
197
197
|
def logger
|
198
198
|
RailsFailover::Redis.logger
|
199
199
|
end
|
200
|
+
|
201
|
+
def redis_mon_try_enter(redis)
|
202
|
+
if redis.respond_to? :mon_try_enter
|
203
|
+
redis.mon_try_enter
|
204
|
+
else
|
205
|
+
redis.instance_variable_get(:@monitor).mon_try_enter
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def redis_mon_exit(redis)
|
210
|
+
if redis.respond_to? :mon_exit
|
211
|
+
redis.mon_exit
|
212
|
+
else
|
213
|
+
redis.instance_variable_get(:@monitor).mon_exit
|
214
|
+
end
|
215
|
+
end
|
200
216
|
end
|
201
217
|
end
|
202
218
|
end
|
data/rails_failover.gemspec
CHANGED
@@ -9,8 +9,9 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.email = ["tgx@discourse.org"]
|
10
10
|
|
11
11
|
spec.summary = %q{Failover for ActiveRecord and Redis}
|
12
|
+
spec.homepage = "https://github.com/discourse/rails_failover"
|
12
13
|
spec.license = "MIT"
|
13
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
|
14
15
|
|
15
16
|
# Specify which files should be added to the gem when it is released.
|
16
17
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
@@ -21,8 +22,8 @@ Gem::Specification.new do |spec|
|
|
21
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
23
|
spec.require_paths = ["lib"]
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
spec.add_dependency "activerecord", "> 6.0", "< 7.1"
|
26
|
+
spec.add_dependency "railties", "> 6.0", "< 7.1"
|
27
|
+
|
27
28
|
spec.add_dependency "concurrent-ruby"
|
28
29
|
end
|
metadata
CHANGED
@@ -1,43 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_failover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alan Tan
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-15 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
19
|
version: '6.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '7.1'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">"
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '6.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '7.1'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: railties
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
37
|
+
- - ">"
|
32
38
|
- !ruby/object:Gem::Version
|
33
39
|
version: '6.0'
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '7.1'
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
|
-
- - "
|
47
|
+
- - ">"
|
39
48
|
- !ruby/object:Gem::Version
|
40
49
|
version: '6.0'
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '7.1'
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: concurrent-ruby
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +64,7 @@ dependencies:
|
|
52
64
|
- - ">="
|
53
65
|
- !ruby/object:Gem::Version
|
54
66
|
version: '0'
|
55
|
-
description:
|
67
|
+
description:
|
56
68
|
email:
|
57
69
|
- tgx@discourse.org
|
58
70
|
executables: []
|
@@ -66,7 +78,6 @@ files:
|
|
66
78
|
- CHANGELOG.md
|
67
79
|
- CODE_OF_CONDUCT.md
|
68
80
|
- Gemfile
|
69
|
-
- Gemfile.lock
|
70
81
|
- LICENSE.txt
|
71
82
|
- README.md
|
72
83
|
- Rakefile
|
@@ -87,11 +98,11 @@ files:
|
|
87
98
|
- postgresql.mk
|
88
99
|
- rails_failover.gemspec
|
89
100
|
- redis.mk
|
90
|
-
homepage:
|
101
|
+
homepage: https://github.com/discourse/rails_failover
|
91
102
|
licenses:
|
92
103
|
- MIT
|
93
104
|
metadata: {}
|
94
|
-
post_install_message:
|
105
|
+
post_install_message:
|
95
106
|
rdoc_options: []
|
96
107
|
require_paths:
|
97
108
|
- lib
|
@@ -99,15 +110,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
110
|
requirements:
|
100
111
|
- - ">="
|
101
112
|
- !ruby/object:Gem::Version
|
102
|
-
version: 2.
|
113
|
+
version: 2.5.0
|
103
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
115
|
requirements:
|
105
116
|
- - ">="
|
106
117
|
- !ruby/object:Gem::Version
|
107
118
|
version: '0'
|
108
119
|
requirements: []
|
109
|
-
rubygems_version: 3.1.
|
110
|
-
signing_key:
|
120
|
+
rubygems_version: 3.1.6
|
121
|
+
signing_key:
|
111
122
|
specification_version: 4
|
112
123
|
summary: Failover for ActiveRecord and Redis
|
113
124
|
test_files: []
|
data/Gemfile.lock
DELETED
@@ -1,123 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
rails_failover (0.6.5)
|
5
|
-
activerecord (~> 6.0)
|
6
|
-
concurrent-ruby
|
7
|
-
railties (~> 6.0)
|
8
|
-
|
9
|
-
GEM
|
10
|
-
remote: https://rubygems.org/
|
11
|
-
specs:
|
12
|
-
actionpack (6.0.3.1)
|
13
|
-
actionview (= 6.0.3.1)
|
14
|
-
activesupport (= 6.0.3.1)
|
15
|
-
rack (~> 2.0, >= 2.0.8)
|
16
|
-
rack-test (>= 0.6.3)
|
17
|
-
rails-dom-testing (~> 2.0)
|
18
|
-
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
19
|
-
actionview (6.0.3.1)
|
20
|
-
activesupport (= 6.0.3.1)
|
21
|
-
builder (~> 3.1)
|
22
|
-
erubi (~> 1.4)
|
23
|
-
rails-dom-testing (~> 2.0)
|
24
|
-
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
25
|
-
activemodel (6.0.3.1)
|
26
|
-
activesupport (= 6.0.3.1)
|
27
|
-
activerecord (6.0.3.1)
|
28
|
-
activemodel (= 6.0.3.1)
|
29
|
-
activesupport (= 6.0.3.1)
|
30
|
-
activesupport (6.0.3.1)
|
31
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
32
|
-
i18n (>= 0.7, < 2)
|
33
|
-
minitest (~> 5.1)
|
34
|
-
tzinfo (~> 1.1)
|
35
|
-
zeitwerk (~> 2.2, >= 2.2.2)
|
36
|
-
ast (2.4.0)
|
37
|
-
builder (3.2.4)
|
38
|
-
byebug (11.1.3)
|
39
|
-
concurrent-ruby (1.1.6)
|
40
|
-
crass (1.0.6)
|
41
|
-
diff-lcs (1.3)
|
42
|
-
erubi (1.10.0)
|
43
|
-
i18n (1.8.2)
|
44
|
-
concurrent-ruby (~> 1.0)
|
45
|
-
loofah (2.7.0)
|
46
|
-
crass (~> 1.0.2)
|
47
|
-
nokogiri (>= 1.5.9)
|
48
|
-
method_source (1.0.0)
|
49
|
-
mini_portile2 (2.4.0)
|
50
|
-
minitest (5.14.1)
|
51
|
-
nokogiri (1.10.10)
|
52
|
-
mini_portile2 (~> 2.4.0)
|
53
|
-
parallel (1.19.1)
|
54
|
-
parser (2.7.1.2)
|
55
|
-
ast (~> 2.4.0)
|
56
|
-
pg (1.2.3)
|
57
|
-
rack (2.2.3)
|
58
|
-
rack-test (1.1.0)
|
59
|
-
rack (>= 1.0, < 3)
|
60
|
-
rails-dom-testing (2.0.3)
|
61
|
-
activesupport (>= 4.2.0)
|
62
|
-
nokogiri (>= 1.6)
|
63
|
-
rails-html-sanitizer (1.3.0)
|
64
|
-
loofah (~> 2.3)
|
65
|
-
railties (6.0.3.1)
|
66
|
-
actionpack (= 6.0.3.1)
|
67
|
-
activesupport (= 6.0.3.1)
|
68
|
-
method_source
|
69
|
-
rake (>= 0.8.7)
|
70
|
-
thor (>= 0.20.3, < 2.0)
|
71
|
-
rainbow (3.0.0)
|
72
|
-
rake (12.3.3)
|
73
|
-
redis (4.1.4)
|
74
|
-
rexml (3.2.4)
|
75
|
-
rspec (3.9.0)
|
76
|
-
rspec-core (~> 3.9.0)
|
77
|
-
rspec-expectations (~> 3.9.0)
|
78
|
-
rspec-mocks (~> 3.9.0)
|
79
|
-
rspec-core (3.9.2)
|
80
|
-
rspec-support (~> 3.9.3)
|
81
|
-
rspec-expectations (3.9.2)
|
82
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
83
|
-
rspec-support (~> 3.9.0)
|
84
|
-
rspec-mocks (3.9.1)
|
85
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
86
|
-
rspec-support (~> 3.9.0)
|
87
|
-
rspec-support (3.9.3)
|
88
|
-
rubocop (0.83.0)
|
89
|
-
parallel (~> 1.10)
|
90
|
-
parser (>= 2.7.0.1)
|
91
|
-
rainbow (>= 2.2.2, < 4.0)
|
92
|
-
rexml
|
93
|
-
ruby-progressbar (~> 1.7)
|
94
|
-
unicode-display_width (>= 1.4.0, < 2.0)
|
95
|
-
rubocop-discourse (2.1.2)
|
96
|
-
rubocop (>= 0.69.0)
|
97
|
-
rubocop-rspec (>= 1.39.0)
|
98
|
-
rubocop-rspec (1.39.0)
|
99
|
-
rubocop (>= 0.68.1)
|
100
|
-
ruby-progressbar (1.10.1)
|
101
|
-
thor (1.0.1)
|
102
|
-
thread_safe (0.3.6)
|
103
|
-
tzinfo (1.2.7)
|
104
|
-
thread_safe (~> 0.1)
|
105
|
-
unicode-display_width (1.7.0)
|
106
|
-
zeitwerk (2.3.0)
|
107
|
-
|
108
|
-
PLATFORMS
|
109
|
-
ruby
|
110
|
-
|
111
|
-
DEPENDENCIES
|
112
|
-
activerecord (~> 6.0)
|
113
|
-
byebug
|
114
|
-
pg (~> 1.2)
|
115
|
-
rack
|
116
|
-
rails_failover!
|
117
|
-
rake (~> 12.0)
|
118
|
-
redis (~> 4.1)
|
119
|
-
rspec (~> 3.0)
|
120
|
-
rubocop-discourse
|
121
|
-
|
122
|
-
BUNDLED WITH
|
123
|
-
2.1.4
|