bearcat 1.5.6 → 1.5.7
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/bearcat.gemspec +1 -0
- data/lib/bearcat/client.rb +2 -2
- data/lib/bearcat/rate_limiting.rb +1 -2
- data/lib/bearcat/redis_connection.rb +103 -0
- data/lib/bearcat/version.rb +1 -1
- data/lib/bearcat.rb +13 -0
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a944f30f69dd137902c99b5810bb29eebbdf48136039160b5259106f722661e
|
4
|
+
data.tar.gz: 044c52dc104b65aac858da9f53f44de11ad8ac08a956cd9fdd21fb458a0d6b0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a02a9c9a4ff44e03da5a5e3b0de9aefa1565814aeb2ab8d2099d90eaf9388fae9de67118905b3fa4d72ec6684092b1ece95bc68bdd486494d221a2e05ace823f
|
7
|
+
data.tar.gz: 0a42a5dfee36522129ad182a88318891de98da90b6f120f269a93ea8f041d72b6482c0a77e711b1c75873356af10ea508c826e497a7c2c78b2b6481ce7e2c8ba
|
data/bearcat.gemspec
CHANGED
data/lib/bearcat/client.rb
CHANGED
@@ -85,8 +85,8 @@ module Bearcat
|
|
85
85
|
rl = config[:rate_limiter] || Bearcat.rate_limiter
|
86
86
|
master_rate_limit = config[:master_rate_limit].present? ? config[:master_rate_limit] : Bearcat.master_rate_limit
|
87
87
|
|
88
|
-
if rl.nil? && master_rate_limit.nil? && defined?(Rails) && Rails.env.production?
|
89
|
-
master_rate_limit = true
|
88
|
+
if rl.nil? && master_rate_limit.nil? && defined?(Rails) && Rails.env.production? && defined?(::Redis) && RedisConnection.configured?("BEARCAT", explicit: false)
|
89
|
+
master_rate_limit = true
|
90
90
|
end
|
91
91
|
|
92
92
|
if rl.nil? && master_rate_limit
|
@@ -58,11 +58,10 @@ module Bearcat
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def redis(&blk)
|
61
|
-
# TODO Add bearcat-native ConnectionPool instead of relying on application or Sidekiq to do so
|
62
61
|
if @params[:redis]
|
63
62
|
@params[:redis].call(blk)
|
64
63
|
else
|
65
|
-
::
|
64
|
+
::Bearcat.redis(&blk)
|
66
65
|
end
|
67
66
|
end
|
68
67
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "connection_pool"
|
4
|
+
require "redis"
|
5
|
+
require "uri"
|
6
|
+
|
7
|
+
# Adapted from Sidekiq 6.x Implementation
|
8
|
+
|
9
|
+
module Bearcat
|
10
|
+
module RedisConnection
|
11
|
+
KNOWN_REDIS_URL_ENVS = %w[REDIS_URL REDISTOGO_URL REDISCLOUD_URL].freeze
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def configured?(prefix, explicit: false)
|
15
|
+
determine_redis_provider(prefix: prefix, explicit: true)
|
16
|
+
end
|
17
|
+
|
18
|
+
def create(options = {})
|
19
|
+
symbolized_options = options.transform_keys(&:to_sym)
|
20
|
+
|
21
|
+
if !symbolized_options[:url] && (u = determine_redis_provider(prefix: options[:env_prefix]))
|
22
|
+
symbolized_options[:url] = u
|
23
|
+
end
|
24
|
+
|
25
|
+
size = if symbolized_options[:size]
|
26
|
+
symbolized_options[:size]
|
27
|
+
elsif symbolized_options[:env_prefix] && (v = ENV["#{symbolized_options[:env_prefix]}_REDIS_POOL_SIZE"])
|
28
|
+
Integer(v)
|
29
|
+
elsif ENV["RAILS_MAX_THREADS"]
|
30
|
+
Integer(ENV["RAILS_MAX_THREADS"])
|
31
|
+
else
|
32
|
+
5
|
33
|
+
end
|
34
|
+
|
35
|
+
pool_timeout = symbolized_options[:pool_timeout] || 1
|
36
|
+
|
37
|
+
ConnectionPool.new(timeout: pool_timeout, size: size) do
|
38
|
+
namespace = symbolized_options[:namespace]
|
39
|
+
client = Redis.new client_opts(symbolized_options)
|
40
|
+
|
41
|
+
if namespace
|
42
|
+
begin
|
43
|
+
require "redis/namespace"
|
44
|
+
Redis::Namespace.new(namespace, redis: client)
|
45
|
+
rescue LoadError
|
46
|
+
Rails.logger.error("Your Redis configuration uses the namespace '#{namespace}' but the redis-namespace gem is not included in the Gemfile." \
|
47
|
+
"Add the gem to your Gemfile to continue using a namespace. Otherwise, remove the namespace parameter.")
|
48
|
+
exit(-127)
|
49
|
+
end
|
50
|
+
else
|
51
|
+
client
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def client_opts(options)
|
59
|
+
opts = options.dup
|
60
|
+
if opts[:namespace]
|
61
|
+
opts.delete(:namespace)
|
62
|
+
end
|
63
|
+
|
64
|
+
if opts[:network_timeout]
|
65
|
+
opts[:timeout] = opts[:network_timeout]
|
66
|
+
opts.delete(:network_timeout)
|
67
|
+
end
|
68
|
+
|
69
|
+
opts[:reconnect_attempts] ||= 1
|
70
|
+
|
71
|
+
opts
|
72
|
+
end
|
73
|
+
|
74
|
+
def determine_redis_provider(prefix: nil, explicit: false)
|
75
|
+
vars = []
|
76
|
+
|
77
|
+
if prefix.present?
|
78
|
+
if (ptr = ENV["#{prefix}_REDIS_PROVIDER"]).present?
|
79
|
+
return ENV[ptr]
|
80
|
+
else
|
81
|
+
vars.push(*KNOWN_REDIS_URL_ENVS.map { |e| ENV["#{prefix}_#{e}"] })
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
if !explicit || !prefix.present?
|
86
|
+
if (ptr = ENV["REDIS_PROVIDER"]).present?
|
87
|
+
vars << ptr # Intentionally not a return
|
88
|
+
else
|
89
|
+
vars.push(*KNOWN_REDIS_URL_ENVS)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
vars.select!(&:present?)
|
94
|
+
|
95
|
+
vars.each do |e|
|
96
|
+
return ENV[e] if ENV[e].present?
|
97
|
+
end
|
98
|
+
|
99
|
+
nil
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/bearcat/version.rb
CHANGED
data/lib/bearcat.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'bearcat/version'
|
2
2
|
require 'bearcat/client'
|
3
|
+
require 'bearcat/redis_connection'
|
3
4
|
|
4
5
|
module Bearcat
|
5
6
|
class << self
|
@@ -27,6 +28,7 @@ module Bearcat
|
|
27
28
|
@max_sleep_seconds ||= 60
|
28
29
|
end
|
29
30
|
|
31
|
+
# @deprecated
|
30
32
|
def master_rate_limit
|
31
33
|
@master_rate_limit ||= false
|
32
34
|
end
|
@@ -37,5 +39,16 @@ module Bearcat
|
|
37
39
|
@logger.level = Logger::DEBUG
|
38
40
|
@logger
|
39
41
|
end
|
42
|
+
|
43
|
+
def redis_pool
|
44
|
+
@redis_pool ||= RedisConnection.create(env_prefix: "BEARCAT")
|
45
|
+
end
|
46
|
+
|
47
|
+
def redis
|
48
|
+
raise ArgumentError, "requires a block" unless block_given?
|
49
|
+
redis_pool.with do |conn|
|
50
|
+
yield conn
|
51
|
+
end
|
52
|
+
end
|
40
53
|
end
|
41
54
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bearcat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Instructure CustomDev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -122,6 +122,26 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 0.2.2
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: connection_pool
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 2.2.0
|
132
|
+
- - "<"
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '3.0'
|
135
|
+
type: :runtime
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 2.2.0
|
142
|
+
- - "<"
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '3.0'
|
125
145
|
description: Ruby interface for interacting with the canvas API
|
126
146
|
email:
|
127
147
|
- pseng@instructure.com
|
@@ -187,6 +207,7 @@ files:
|
|
187
207
|
- lib/bearcat/rate_limiting/functions.lua
|
188
208
|
- lib/bearcat/rate_limiting/increment_bucket.lua
|
189
209
|
- lib/bearcat/rate_limiting/redis_script.rb
|
210
|
+
- lib/bearcat/redis_connection.rb
|
190
211
|
- lib/bearcat/spec_helpers.rb
|
191
212
|
- lib/bearcat/version.rb
|
192
213
|
- lib/catalogcat.rb
|