redis-throttle 1.1.0 → 2.0.0

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: df74619037a1515419ebbf8381326577c540376855146fece1b9624f9ee443f6
4
- data.tar.gz: 4b465e4412d3fa8408b48470b867576457737524cded5b41ea8bb04aef53a39b
3
+ metadata.gz: 6dbef2b5249fc1cd8ff9c199e00b11b98dafa0ec8f0a707e9da8af4c5fa3ed1d
4
+ data.tar.gz: 2a8ddfd1fe58e6f9a3e63cb219ab42450518f804cce806e7778aaca251563cb1
5
5
  SHA512:
6
- metadata.gz: cfcdaef05593dd858baef2d65ae0a1240cea10cbb3adda0989f5bba724672233c4ec8551040b746421a8d40eb5240a0338de5f027bafa3eabe6a3c6a28071c0d
7
- data.tar.gz: e2a761f5962106a211ed285f527a73e24d040c414053a707c26fa11dad1b2477f73ecd38248b4ba639c32c47a773719af788dd02918af8259af1c283f100e979
6
+ metadata.gz: 74c91479a17ea0759cb6d9a9bcf78c27d1454339a3dca5678cb90aa28c582ed6f11f5d825ff38401a51e9a039728f3d4494887466674f2c29aae4615b376af41
7
+ data.tar.gz: 4e299f8ae32084daf1c5941629601ba48d4af09d5cec9504421e05a462e0be1a24131929c56c3913f5edf70b4aa53a3a8a57d0d72d90a494193695d8fffb3db5
data/README.adoc CHANGED
@@ -23,16 +23,16 @@ Or install it yourself as:
23
23
  # Allow 1 concurrent calls. If call takes more than 10 seconds, consider it
24
24
  # gone (as if process died, or by any other reason did not called `#release`):
25
25
  concurrency = RedisThrottle.concurrency(:bucket_name,
26
- :limit => 1,
26
+ limit: 1,
27
27
  :ttl => 10
28
28
  )
29
29
 
30
- concurrency.acquire(:token => "abc") # => "abc"
31
- concurrency.acquire(:token => "xyz") # => nil
30
+ concurrency.acquire(redis, token: "abc") # => "abc"
31
+ concurrency.acquire(redis, token: "xyz") # => nil
32
32
 
33
- concurrency.release(:token => "abc")
33
+ concurrency.release(redis, token: "abc")
34
34
 
35
- concurrency.acquire(:token => "xyz") # => "xyz"
35
+ concurrency.acquire(redis, token: "xyz") # => "xyz"
36
36
  ----
37
37
 
38
38
  === Rate Limit
@@ -42,15 +42,15 @@ concurrency.acquire(:token => "xyz") # => "xyz"
42
42
  # Allow 1 calls per 10 seconds:
43
43
  rate_limit = RedisThrottle.rate_limit(:bucket_name,
44
44
  :limit => 1,
45
- :period => 10
45
+ period: 10
46
46
  )
47
47
 
48
- rate_limit.acquire # => "6a6c6546-268d-4216-bcf3-3139b8e11609"
49
- rate_limit.acquire # => nil
48
+ rate_limit.acquire(redis) # => "6a6c6546-268d-4216-bcf3-3139b8e11609"
49
+ rate_limit.acquire(redis) # => nil
50
50
 
51
51
  sleep 10
52
52
 
53
- rate_limit.acquire # => "e2926a90-2cf4-4bff-9401-65f3a70d32bd"
53
+ rate_limit.acquire(redis) # => "e2926a90-2cf4-4bff-9401-65f3a70d32bd"
54
54
  ----
55
55
 
56
56
 
@@ -59,11 +59,11 @@ rate_limit.acquire # => "e2926a90-2cf4-4bff-9401-65f3a70d32bd"
59
59
  [source,ruby]
60
60
  ----
61
61
  throttle = RedisThrottle
62
- .concurrency(:db, :limit => 3, :ttl => 900)
63
- .rate_limit(:api_minutely, :limit => 1, :period => 60)
64
- .rate_limit(:api_hourly, :limit => 10, :period => 3600)
62
+ .concurrency(:db, limit: 3, ttl: 900)
63
+ .rate_limit(:api_minutely, limit: 1, period: 60)
64
+ .rate_limit(:api_hourly, limit: 10, period: 3600)
65
65
 
66
- throttle.call(:token => "abc") do
66
+ throttle.call(redis, token: "abc") do
67
67
  # do something if all strategies are resolved
68
68
  end
69
69
  ----
@@ -72,46 +72,17 @@ You can also compose multiple throttlers together:
72
72
 
73
73
  [source,ruby]
74
74
  ----
75
- db_limiter = RedisThrottle.concurrency(:db, :limit => 3, :ttl => 900)
75
+ db_limiter = RedisThrottle.concurrency(:db, limit: 3, ttl: 900)
76
76
  api_limiter = RedisThrottle
77
- .rate_limit(:api_minutely, :limit => 1, :period => 60)
78
- .rate_limit(:api_hourly, :limit => 10, :period => 3600)
77
+ .rate_limit(:api_minutely, limit: 1, period: 60)
78
+ .rate_limit(:api_hourly, limit: 10, period: 3600)
79
79
 
80
- (db_limiter + api_limiter).call do
80
+ (db_limiter + api_limiter).call(redis) do
81
81
  # ...
82
82
  end
83
83
  ----
84
84
 
85
85
 
86
- === With ConnectionPool
87
-
88
- If you're using [connection_pool](https://github.com/mperham/connection_pool),
89
- you can pass its `#with` method as connection builder:
90
-
91
- [source,ruby]
92
- ----
93
- pool = ConnectionPool.new { Redis.new }
94
- throttle = RedisThrottle.new(:redis => pool.method(:with))
95
- ----
96
-
97
- === With Sidekiq
98
-
99
- [Sidekiq](https://github.com/mperham/sidekiq): uses ConnectionPool, so you can
100
- use the same approach:
101
-
102
- [source,ruby]
103
- ----
104
- throttle = RedisThrottle.new(:redis => Sidekiq.redis_pool.method(:with))
105
- ----
106
-
107
- Or, you can use its `.redis` method directly:
108
-
109
- [source,ruby]
110
- ----
111
- throttle = RedisThrottle.new(:redis => Sidekiq.method(:redis))
112
- ----
113
-
114
-
115
86
  == Compatibility
116
87
 
117
88
  This library aims to support and is tested against:
@@ -132,8 +103,15 @@ This library aims to support and is tested against:
132
103
  ** 4.4.x
133
104
  ** 4.5.x
134
105
  ** 4.6.x
106
+ ** 4.7.x
107
+ ** 4.8.x
108
+ ** 5.0.x
135
109
  * https://github.com/resque/redis-namespace[redis-namespace]
136
110
  ** 1.10.x
111
+ * https://github.com/redis-rb/redis-client[redis-client]
112
+ ** 0.12.x
113
+ ** 0.13.x
114
+ ** 0.14.x
137
115
 
138
116
  If something doesn't work on one of these versions, it's a bug.
139
117
 
@@ -148,7 +126,8 @@ patches in a timely fashion. If critical issues for a particular implementation
148
126
  exist at the time of a major release, support for that Ruby version may be
149
127
  dropped.
150
128
 
151
- The same applies to *Redis Server*, *redis-rb*, and *redis-namespace* support.
129
+ The same applies to *Redis Server*, *redis-rb*, *redis-namespace*,
130
+ and *redis-client* support.
152
131
 
153
132
 
154
133
  == Development
@@ -1,4 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "./redis_throttle"
4
- require_relative "./redis/throttle"
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "redis"
4
- require "redis-prescription"
3
+ require "redis_prescription"
5
4
 
6
5
  require_relative "./concurrency"
7
6
  require_relative "./rate_limit"
@@ -26,14 +25,9 @@ class RedisThrottle
26
25
  SCRIPT = RedisPrescription.new(File.read("#{__dir__}/api.lua"))
27
26
  private_constant :SCRIPT
28
27
 
29
- # @param redis [Redis, Redis::Namespace, #to_proc]
30
- def initialize(redis: nil)
31
- @redis =
32
- if redis.respond_to?(:to_proc)
33
- redis.to_proc
34
- else
35
- ->(&b) { b.call(redis || Redis.current) }
36
- end
28
+ # @param redis [Redis, Redis::Namespace, RedisClient, RedisClient::Decorator::Client]
29
+ def initialize(redis)
30
+ @redis = redis
37
31
  end
38
32
 
39
33
  # @param strategies [Enumerable<Concurrency, RateLimit>]
@@ -60,12 +54,12 @@ class RedisThrottle
60
54
  # @return [Array<Concurrency, RateLimit>]
61
55
  def strategies(match:)
62
56
  results = []
57
+ block = ->(key) { from_key(key)&.then { |strategy| results << strategy } }
63
58
 
64
- @redis.call do |redis|
65
- redis.scan_each(match: "#{NAMESPACE}:*:#{match}:*:*") do |key|
66
- strategy = from_key(key)
67
- results << strategy if strategy
68
- end
59
+ if redis_client?
60
+ @redis.scan("MATCH", "#{NAMESPACE}:*:#{match}:*:*", &block)
61
+ else
62
+ @redis.scan_each(match: "#{NAMESPACE}:*:#{match}:*:*", &block)
69
63
  end
70
64
 
71
65
  results
@@ -77,16 +71,17 @@ class RedisThrottle
77
71
  strategies.zip(execute(:INFO, to_params(strategies) << :TS << Time.now.to_i)).to_h
78
72
  end
79
73
 
80
- # @note Used for specs only.
81
- # @return [void]
82
- def ping
83
- @redis.call(&:ping)
84
- end
85
-
86
74
  private
87
75
 
76
+ def redis_client?
77
+ return true if defined?(::RedisClient) && @redis.is_a?(::RedisClient)
78
+ return true if defined?(::RedisClient::Decorator::Client) && @redis.is_a?(::RedisClient::Decorator::Client)
79
+
80
+ false
81
+ end
82
+
88
83
  def execute(command, argv)
89
- @redis.call { |redis| SCRIPT.call(redis, keys: [NAMESPACE], argv: [command, *argv]) }
84
+ SCRIPT.call(@redis, keys: [NAMESPACE], argv: [command, *argv])
90
85
  end
91
86
 
92
87
  def from_key(key)
@@ -2,5 +2,5 @@
2
2
 
3
3
  class RedisThrottle
4
4
  # Gem version.
5
- VERSION = "1.1.0"
5
+ VERSION = "2.0.0"
6
6
  end
@@ -4,18 +4,46 @@ require "concurrent/set"
4
4
  require "securerandom"
5
5
 
6
6
  require_relative "./redis_throttle/api"
7
- require_relative "./redis_throttle/class_methods"
8
7
  require_relative "./redis_throttle/concurrency"
9
8
  require_relative "./redis_throttle/rate_limit"
10
9
  require_relative "./redis_throttle/version"
11
10
 
12
11
  class RedisThrottle
13
- extend ClassMethods
12
+ class << self
13
+ # Syntax sugar for `RedisThrottle.new.concurrency(...)`.
14
+ #
15
+ # @see #concurrency
16
+ # @param (see #concurrency)
17
+ # @return (see #concurrency)
18
+ def concurrency(...)
19
+ new.concurrency(...)
20
+ end
21
+
22
+ # Syntax sugar for `RedisThrottle.new.rate_limit(...)`.
23
+ #
24
+ # @see #rate_limit
25
+ # @param (see #rate_limit)
26
+ # @return (see #rate_limit)
27
+ def rate_limit(...)
28
+ new.rate_limit(...)
29
+ end
30
+
31
+ # Return usage info for all known (in use) strategies.
32
+ #
33
+ # @example
34
+ # RedisThrottle.info(:match => "*_api").each do |strategy, current_value|
35
+ # # ...
36
+ # end
37
+ #
38
+ # @param redis (see Api#initialize)
39
+ # @param match [#to_s]
40
+ # @return (see Api#info)
41
+ def info(redis, match: "*")
42
+ Api.new(redis).then { |api| api.info(strategies: api.strategies(match: match.to_s)) }
43
+ end
44
+ end
14
45
 
15
- # @param (see Api#initialize)
16
- def initialize(redis: nil)
17
- # TODO: fix api cloning/duping
18
- @api = Api.new(redis: redis)
46
+ def initialize
19
47
  @strategies = Concurrent::Set.new
20
48
  end
21
49
 
@@ -48,15 +76,15 @@ class RedisThrottle
48
76
  # throttle = RedisThrottle.new
49
77
  #
50
78
  # # Allow max 2 concurrent execution units
51
- # throttle.concurrency(:xxx, :limit => 2, :ttl => 10)
79
+ # throttle.concurrency(:xxx, limit: 2, ttl: 10)
52
80
  #
53
- # throttle.acquire(:token => "a") && :aye || :nay # => :aye
54
- # throttle.acquire(:token => "b") && :aye || :nay # => :aye
55
- # throttle.acquire(:token => "c") && :aye || :nay # => :nay
81
+ # throttle.acquire(redis, token: "a") && :aye || :nay # => :aye
82
+ # throttle.acquire(redis, token: "b") && :aye || :nay # => :aye
83
+ # throttle.acquire(redis, token: "c") && :aye || :nay # => :nay
56
84
  #
57
- # throttle.release(:token => "a")
85
+ # throttle.release(redis, token: "a")
58
86
  #
59
- # throttle.acquire(:token => "c") && :aye || :nay # => :aye
87
+ # throttle.acquire(redis, token: "c") && :aye || :nay # => :aye
60
88
  #
61
89
  #
62
90
  # @param (see Concurrency#initialize)
@@ -76,17 +104,17 @@ class RedisThrottle
76
104
  # throttle = RedisThrottle.new
77
105
  #
78
106
  # # Allow 2 execution units per 10 seconds
79
- # throttle.rate_limit(:xxx, :limit => 2, :period => 10)
107
+ # throttle.rate_limit(:xxx, limit: 2, period: 10)
80
108
  #
81
- # throttle.acquire && :aye || :nay # => :aye
109
+ # throttle.acquire(redis) && :aye || :nay # => :aye
82
110
  # sleep 5
83
111
  #
84
- # throttle.acquire && :aye || :nay # => :aye
85
- # throttle.acquire && :aye || :nay # => :nay
112
+ # throttle.acquire(redis) && :aye || :nay # => :aye
113
+ # throttle.acquire(redis) && :aye || :nay # => :nay
86
114
  #
87
115
  # sleep 6
88
- # throttle.acquire && :aye || :nay # => :aye
89
- # throttle.acquire && :aye || :nay # => :nay
116
+ # throttle.acquire(redis) && :aye || :nay # => :aye
117
+ # throttle.acquire(redis) && :aye || :nay # => :nay
90
118
  #
91
119
  # @param (see RateLimit#initialize)
92
120
  # @return [Throttle] self
@@ -101,11 +129,11 @@ class RedisThrottle
101
129
  # Merge in strategies of the `other` throttle.
102
130
  #
103
131
  # @example
104
- # a = RedisThrottle.concurrency(:a, :limit => 1, :ttl => 2)
105
- # b = RedisThrottle.rate_limit(:b, :limit => 3, :period => 4)
132
+ # a = RedisThrottle.concurrency(:a, limit: 1, ttl: 2)
133
+ # b = RedisThrottle.rate_limit(:b, limit: 3, period: 4)
106
134
  # c = RedisThrottle
107
- # .concurrency(:a, :limit => 1, :ttl => 2)
108
- # .rate_limit(:b, :limit => 3, :period => 4)
135
+ # .concurrency(:a, limit: 1, ttl: 2)
136
+ # .rate_limit(:b, limit: 3, period: 4)
109
137
  #
110
138
  # a.merge!(b)
111
139
  #
@@ -120,17 +148,15 @@ class RedisThrottle
120
148
  self
121
149
  end
122
150
 
123
- alias << merge!
124
-
125
- # Non-destructive version of {#merge!}. Returns new {Throttle} instance with
126
- # union of `self` and `other` strategies.
151
+ # Non-destructive version of {#merge!}. Returns new {RedisThrottle} instance
152
+ # with union of `self` and `other` strategies.
127
153
  #
128
154
  # @example
129
- # a = RedisThrottle.concurrency(:a, :limit => 1, :ttl => 2)
130
- # b = RedisThrottle.rate_limit(:b, :limit => 3, :period => 4)
155
+ # a = RedisThrottle.concurrency(:a, limit: 1, ttl: 2)
156
+ # b = RedisThrottle.rate_limit(:b, limit: 3, period: 4)
131
157
  # c = RedisThrottle
132
- # .concurrency(:a, :limit => 1, :ttl => 2)
133
- # .rate_limit(:b, :limit => 3, :period => 4)
158
+ # .concurrency(:a, limit: 1, ttl: 2)
159
+ # .rate_limit(:b, limit: 3, period: 4)
134
160
  #
135
161
  # a.merge(b) == c # => true
136
162
  # a == c # => false
@@ -142,9 +168,6 @@ class RedisThrottle
142
168
 
143
169
  alias + merge
144
170
 
145
- # @deprecated will be removed in 2.0.0
146
- alias | merge
147
-
148
171
  # Prevents further modifications to the throttle instance.
149
172
  #
150
173
  # @see https://docs.ruby-lang.org/en/master/Object.html#method-i-freeze
@@ -155,17 +178,17 @@ class RedisThrottle
155
178
  super
156
179
  end
157
180
 
158
- # Returns `true` if the `other` is an instance of {Throttle} with the same
159
- # set of strategies.
181
+ # Returns `true` if the `other` is an instance of {RedisThrottle} with
182
+ # the same set of strategies.
160
183
  #
161
184
  # @example
162
185
  # a = RedisThrottle
163
- # .concurrency(:a, :limit => 1, :ttl => 2)
164
- # .rate_limit(:b, :limit => 3, :period => 4)
186
+ # .concurrency(:a, limit: 1, ttl: 2)
187
+ # .rate_limit(:b, limit: 3, period: 4)
165
188
  #
166
189
  # b = RedisThrottle
167
- # .rate_limit(:b, :limit => 3, :period => 4)
168
- # .concurrency(:a, :limit => 1, :ttl => 2)
190
+ # .rate_limit(:b, limit: 3, period: 4)
191
+ # .concurrency(:a, limit: 1, ttl: 2)
169
192
  #
170
193
  # a == b # => true
171
194
  #
@@ -180,69 +203,72 @@ class RedisThrottle
180
203
  # it after the block.
181
204
  #
182
205
  # @example
183
- # throttle = RedisThrottle.concurrency(:xxx, :limit => 1, :ttl => 10)
206
+ # throttle = RedisThrottle.concurrency(:xxx, limit: 1, ttl: 10)
184
207
  #
185
- # throttle.call { :aye } # => :aye
186
- # throttle.call { :aye } # => :aye
208
+ # throttle.call(redis) { :aye } # => :aye
209
+ # throttle.call(redis) { :aye } # => :aye
187
210
  #
188
- # throttle.acquire
211
+ # throttle.acquire(redis)
189
212
  #
190
- # throttle.call { :aye } # => nil
213
+ # throttle.call(redis) { :aye } # => nil
191
214
  #
192
- # @param (see #acquire)
215
+ # @param redis (see Api#initialize)
216
+ # @param token (see #acquire)
193
217
  # @return [Object] last satement of the block if execution lock was acquired.
194
218
  # @return [nil] otherwise
195
- def call(token: SecureRandom.uuid)
196
- return unless acquire(token: token)
219
+ def call(redis, token: SecureRandom.uuid)
220
+ return unless acquire(redis, token: token)
197
221
 
198
222
  begin
199
223
  yield
200
224
  ensure
201
- release(token: token)
225
+ release(redis, token: token)
202
226
  end
203
227
  end
204
228
 
205
229
  # Acquire execution lock.
206
230
  #
207
231
  # @example
208
- # throttle = RedisThrottle.concurrency(:xxx, :limit => 1, :ttl => 10)
232
+ # throttle = RedisThrottle.concurrency(:xxx, limit: 1, ttl: 10)
209
233
  #
210
- # if (token = throttle.acquire)
234
+ # if (token = throttle.acquire(redis))
211
235
  # # ... do something
212
236
  # end
213
237
  #
214
- # throttle.release(:token => token) if token
238
+ # throttle.release(redis, token: token) if token
215
239
  #
216
240
  # @see #call
217
241
  # @see #release
242
+ # @param redis (see Api#initialize)
218
243
  # @param token [#to_s] Unit of work ID
219
244
  # @return [#to_s] `token` as is if lock was acquired
220
245
  # @return [nil] otherwise
221
- def acquire(token: SecureRandom.uuid)
222
- token if @api.acquire(strategies: @strategies, token: token.to_s)
246
+ def acquire(redis, token: SecureRandom.uuid)
247
+ token if Api.new(redis).acquire(strategies: @strategies, token: token.to_s)
223
248
  end
224
249
 
225
250
  # Release acquired execution lock. Notice that this affects {#concurrency}
226
251
  # locks only.
227
252
  #
228
253
  # @example
229
- # concurrency = RedisThrottle.concurrency(:xxx, :limit => 1, :ttl => 60)
230
- # rate_limit = RedisThrottle.rate_limit(:xxx, :limit => 1, :period => 60)
254
+ # concurrency = RedisThrottle.concurrency(:xxx, limit: 1, ttl: 60)
255
+ # rate_limit = RedisThrottle.rate_limit(:xxx, limit: 1, period: 60)
231
256
  # throttle = concurrency + rate_limit
232
257
  #
233
- # throttle.acquire(:token => "uno")
234
- # throttle.release(:token => "uno")
258
+ # throttle.acquire(redis, token: "uno")
259
+ # throttle.release(redis, token: "uno")
235
260
  #
236
- # concurrency.acquire(:token => "dos") # => "dos"
237
- # rate_limit.acquire(:token => "dos") # => nil
261
+ # concurrency.acquire(redis, token: "dos") # => "dos"
262
+ # rate_limit.acquire(redis, token: "dos") # => nil
238
263
  #
239
264
  # @see #acquire
240
265
  # @see #reset
241
266
  # @see #call
267
+ # @param redis (see Api#initialize)
242
268
  # @param token [#to_s] Unit of work ID
243
269
  # @return [void]
244
- def release(token:)
245
- @api.release(strategies: @strategies, token: token.to_s)
270
+ def release(redis, token:)
271
+ Api.new(redis).release(strategies: @strategies, token: token.to_s)
246
272
 
247
273
  nil
248
274
  end
@@ -250,20 +276,21 @@ class RedisThrottle
250
276
  # Flush all counters.
251
277
  #
252
278
  # @example
253
- # throttle = RedisThrottle.concurrency(:xxx, :limit => 2, :ttl => 60)
279
+ # throttle = RedisThrottle.concurrency(:xxx, limit: 2, ttl: 60)
254
280
  #
255
- # thottle.acquire(:token => "a") # => "a"
256
- # thottle.acquire(:token => "b") # => "b"
257
- # thottle.acquire(:token => "c") # => nil
281
+ # thottle.acquire(redis, token: "a") # => "a"
282
+ # thottle.acquire(redis, token: "b") # => "b"
283
+ # thottle.acquire(redis, token: "c") # => nil
258
284
  #
259
- # throttle.reset
285
+ # throttle.reset(redis)
260
286
  #
261
- # thottle.acquire(:token => "c") # => "c"
262
- # thottle.acquire(:token => "d") # => "d"
287
+ # thottle.acquire(redis, token: "c") # => "c"
288
+ # thottle.acquire(redis, token: "d") # => "d"
263
289
  #
290
+ # @param redis (see Api#initialize)
264
291
  # @return [void]
265
- def reset
266
- @api.reset(strategies: @strategies)
292
+ def reset(redis)
293
+ Api.new(redis).reset(strategies: @strategies)
267
294
 
268
295
  nil
269
296
  end
@@ -271,13 +298,14 @@ class RedisThrottle
271
298
  # Return usage info for all strategies of the throttle.
272
299
  #
273
300
  # @example
274
- # throttle.info.each do |strategy, current_value|
301
+ # throttle.info(redis).each do |strategy, current_value|
275
302
  # # ...
276
303
  # end
277
304
  #
305
+ # @param redis (see Api#initialize)
278
306
  # @return (see Api#info)
279
- def info
280
- @api.info(strategies: @strategies)
307
+ def info(redis)
308
+ Api.new(redis).info(strategies: @strategies)
281
309
  end
282
310
 
283
311
  protected
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-throttle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Zapparov
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: redis-prescription
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.2.0
33
+ version: '2.5'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.2.0
40
+ version: '2.5'
41
41
  description:
42
42
  email:
43
43
  - alexey@zapparov.com
@@ -48,11 +48,9 @@ files:
48
48
  - LICENSE.txt
49
49
  - README.adoc
50
50
  - lib/redis-throttle.rb
51
- - lib/redis/throttle.rb
52
51
  - lib/redis_throttle.rb
53
52
  - lib/redis_throttle/api.lua
54
53
  - lib/redis_throttle/api.rb
55
- - lib/redis_throttle/class_methods.rb
56
54
  - lib/redis_throttle/concurrency.rb
57
55
  - lib/redis_throttle/rate_limit.rb
58
56
  - lib/redis_throttle/version.rb
@@ -61,9 +59,9 @@ licenses:
61
59
  - MIT
62
60
  metadata:
63
61
  homepage_uri: https://gitlab.com/ixti/redis-throttle
64
- source_code_uri: https://gitlab.com/ixti/redis-throttle/tree/v1.1.0
62
+ source_code_uri: https://gitlab.com/ixti/redis-throttle/tree/v2.0.0
65
63
  bug_tracker_uri: https://gitlab.com/ixti/redis-throttle/issues
66
- changelog_uri: https://gitlab.com/ixti/redis-throttle/blob/v1.1.0/CHANGES.md
64
+ changelog_uri: https://gitlab.com/ixti/redis-throttle/blob/v2.0.0/CHANGES.md
67
65
  rubygems_mfa_required: 'true'
68
66
  post_install_message:
69
67
  rdoc_options: []
@@ -80,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
78
  - !ruby/object:Gem::Version
81
79
  version: '0'
82
80
  requirements: []
83
- rubygems_version: 3.3.26
81
+ rubygems_version: 3.2.33
84
82
  signing_key:
85
83
  specification_version: 4
86
84
  summary: Redis based rate limit and concurrency throttling
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../redis_throttle"
4
-
5
- class Redis
6
- # @deprecated Use ::RedisThrottle
7
- class Throttle < RedisThrottle
8
- class << self
9
- attr_accessor :silence_deprecation_warning
10
- end
11
-
12
- self.silence_deprecation_warning = false
13
-
14
- def initialize(*args, **kwargs, &block)
15
- super(*args, **kwargs, &block)
16
-
17
- return if self.class.silence_deprecation_warning
18
-
19
- warn "#{self.class} usage was deprecated, please use RedisThrottle instead"
20
- end
21
- end
22
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "./api"
4
-
5
- class RedisThrottle
6
- module ClassMethods
7
- # Syntax sugar for {Throttle#concurrency}.
8
- #
9
- # @see #concurrency
10
- # @param (see Throttle#initialize)
11
- # @param (see Throttle#concurrency)
12
- # @return (see Throttle#concurrency)
13
- def concurrency(bucket, limit:, ttl:, redis: nil)
14
- new(redis: redis).concurrency(bucket, limit: limit, ttl: ttl)
15
- end
16
-
17
- # Syntax sugar for {Throttle#rate_limit}.
18
- #
19
- # @see #concurrency
20
- # @param (see Throttle#initialize)
21
- # @param (see Throttle#rate_limit)
22
- # @return (see Throttle#rate_limit)
23
- def rate_limit(bucket, limit:, period:, redis: nil)
24
- new(redis: redis).rate_limit(bucket, limit: limit, period: period)
25
- end
26
-
27
- # Return usage info for all known (in use) strategies.
28
- #
29
- # @example
30
- # Redis::Throttle.info(:match => "*_api").each do |strategy, current_value|
31
- # # ...
32
- # end
33
- #
34
- # @param match [#to_s]
35
- # @return (see Api#info)
36
- def info(match: "*", redis: nil)
37
- api = Api.new(redis: redis)
38
- strategies = api.strategies(match: match.to_s)
39
-
40
- api.info(strategies: strategies)
41
- end
42
- end
43
- end