resque-rate_limited_queue 1.0.0 → 1.0.2
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10b17055e5a285f6724e2bb8b857e8258b78dfd5
|
4
|
+
data.tar.gz: 144bf7bb14973f0e3e1a317c58aff1f46965c4f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 048a567b7ffc945ec45334e215c55f86596569f9780b1e3564b067b4fb83935ab08e5fdde8a0a79f339a2226900d15f67014c0daba1f31c636e01a03d148597a
|
7
|
+
data.tar.gz: 294537d08ab7611a9611658d4ae53fdaad4b3bbb37e73d936004cec4fb4dcdba82f6cbdf29ef05a1bf19b9e3a812d625b14ac8b52a8c38a5aa00cd4a312af475
|
data/README.md
CHANGED
@@ -15,7 +15,7 @@ If you are using another API, then you need to write a little code that catches
|
|
15
15
|
Add this line to your application's Gemfile:
|
16
16
|
|
17
17
|
```ruby
|
18
|
-
gem 'resque-
|
18
|
+
gem 'resque-rate_limited_queue'
|
19
19
|
```
|
20
20
|
|
21
21
|
And then execute:
|
@@ -24,7 +24,7 @@ And then execute:
|
|
24
24
|
|
25
25
|
Or install it yourself as:
|
26
26
|
|
27
|
-
$ gem install resque-
|
27
|
+
$ gem install resque-rate_limited_queue
|
28
28
|
|
29
29
|
## Usage
|
30
30
|
|
@@ -80,8 +80,8 @@ Resque::Plugins::RateLimitedQueue.AngellistQueue.un_pause
|
|
80
80
|
MyQueue.un_pause
|
81
81
|
MyJob.un_pause
|
82
82
|
```
|
83
|
-
### A
|
84
|
-
If you're using the [twitter gem
|
83
|
+
### A pausable job using one of the build-in queues (Twitter, Angellist, Evernote)
|
84
|
+
If you're using the [twitter gem](https://github.com/sferik/twitter), this is really simple. Instead of queuing using Resque.enqueue, you just use Resque::Plugins::RateLimitedQueue:TwitterQueue.enqueue.
|
85
85
|
|
86
86
|
Make sure your code in perform doesn't catch the rate_limit exception.
|
87
87
|
|
@@ -124,7 +124,7 @@ end
|
|
124
124
|
````
|
125
125
|
|
126
126
|
### Multiple classes of pausable job using a new api
|
127
|
-
If you have more than one class of job you want to queue to the api, then you
|
127
|
+
If you have more than one class of job you want to queue to the api, then you need to add another Queue class. This isn't hard
|
128
128
|
|
129
129
|
```ruby
|
130
130
|
class MyApiQueue < Resque::Plugins::RateLimitedQueue::BaseApiQueue
|
@@ -148,7 +148,8 @@ All the functions are class methods
|
|
148
148
|
rate_limited_enqueue(klass, *params)
|
149
149
|
rate_limited_requeue(klass, *params)
|
150
150
|
````
|
151
|
-
Queue the job specified to the resque queue specified by `@queue`. `rate_limited_requeue` is intended for use when you need the job to be pushed back to the queue;
|
151
|
+
Queue the job specified to the resque queue specified by `@queue`. `rate_limited_requeue` is intended for use when you need the job to be pushed back to the queue; there are two reasons to split this from `queue`. Firstly it makes testing easier - secondly there is a boundary condition when you need to requeue the last job in the queue.
|
152
|
+
`, but they are split to make testing with stubs easier.
|
152
153
|
|
153
154
|
```ruby
|
154
155
|
pause
|
@@ -25,8 +25,14 @@ module Resque
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def rate_limited_requeue(klass, *params)
|
28
|
-
#
|
29
|
-
|
28
|
+
# if the queue is empty, this was the last job - so queue to the paused queue
|
29
|
+
with_lock do
|
30
|
+
if paused?(true)
|
31
|
+
Resque.enqueue_to(paused_queue_name, klass, *params)
|
32
|
+
else
|
33
|
+
Resque.enqueue_to(@queue, klass, *params)
|
34
|
+
end
|
35
|
+
end
|
30
36
|
end
|
31
37
|
|
32
38
|
def pause_until(timestamp)
|
@@ -49,8 +55,15 @@ module Resque
|
|
49
55
|
false
|
50
56
|
end
|
51
57
|
|
52
|
-
def paused?
|
53
|
-
|
58
|
+
def paused?(unknown = false)
|
59
|
+
# parameter is what to return if the queue is empty, and so the state is unknown
|
60
|
+
if Resque.redis.exists(RESQUE_PREFIX + @queue.to_s)
|
61
|
+
false
|
62
|
+
elsif Resque.redis.exists(RESQUE_PREFIX + paused_queue_name)
|
63
|
+
true
|
64
|
+
else
|
65
|
+
unknown
|
66
|
+
end
|
54
67
|
end
|
55
68
|
|
56
69
|
def paused_queue_name
|
@@ -10,11 +10,11 @@ class RateLimitedTestQueue
|
|
10
10
|
rate_limited_requeue(self, succeed) unless succeed
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.
|
13
|
+
def self.queue_name_private
|
14
14
|
@queue.to_s
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.
|
17
|
+
def self.queue_private
|
18
18
|
@queue
|
19
19
|
end
|
20
20
|
end
|
@@ -26,7 +26,7 @@ describe Resque::Plugins::RateLimitedQueue do
|
|
26
26
|
|
27
27
|
shared_examples_for 'queue' do |queue_suffix|
|
28
28
|
it 'should queue to the correct queue' do
|
29
|
-
queue_param = queue_suffix.empty? ? RateLimitedTestQueue.
|
29
|
+
queue_param = queue_suffix.empty? ? RateLimitedTestQueue.queue_private : "#{RateLimitedTestQueue.queue_name_private}#{queue_suffix}"
|
30
30
|
Resque.should_receive(:enqueue_to).with(queue_param, nil, nil)
|
31
31
|
RateLimitedTestQueue.rate_limited_enqueue(nil, nil)
|
32
32
|
end
|
@@ -55,19 +55,18 @@ describe Resque::Plugins::RateLimitedQueue do
|
|
55
55
|
Resque.should_not_receive(:enqueue_to)
|
56
56
|
RateLimitedTestQueue.perform(true)
|
57
57
|
end
|
58
|
-
|
59
58
|
end
|
60
59
|
|
61
60
|
describe 'pause' do
|
62
61
|
it 'should rename the queue to paused' do
|
63
|
-
Resque.redis.should_receive(:renamenx).with("queue:#{RateLimitedTestQueue.
|
62
|
+
Resque.redis.should_receive(:renamenx).with("queue:#{RateLimitedTestQueue.queue_name_private}", "queue:#{RateLimitedTestQueue.queue_name_private}_paused")
|
64
63
|
RateLimitedTestQueue.pause
|
65
64
|
end
|
66
65
|
end
|
67
66
|
|
68
67
|
describe 'un_pause' do
|
69
68
|
it 'should not unpause the queue' do
|
70
|
-
Resque.redis.should_not_receive(:renamenx).with("queue:#{RateLimitedTestQueue.
|
69
|
+
Resque.redis.should_not_receive(:renamenx).with("queue:#{RateLimitedTestQueue.queue_name_private}", "queue:#{RateLimitedTestQueue.queue_name_private}_paused")
|
71
70
|
RateLimitedTestQueue.un_pause
|
72
71
|
end
|
73
72
|
end
|
@@ -105,7 +104,7 @@ describe Resque::Plugins::RateLimitedQueue do
|
|
105
104
|
|
106
105
|
describe 'perform' do
|
107
106
|
it 'should not execute the block' do
|
108
|
-
Resque.should_receive(:enqueue_to).with("#{RateLimitedTestQueue.
|
107
|
+
Resque.should_receive(:enqueue_to).with("#{RateLimitedTestQueue.queue_name_private}_paused", RateLimitedTestQueue, true)
|
109
108
|
RateLimitedTestQueue.should_not_receive(:perform)
|
110
109
|
RateLimitedTestQueue.around_perform_with_check_and_requeue(true)
|
111
110
|
end
|
@@ -113,7 +112,7 @@ describe Resque::Plugins::RateLimitedQueue do
|
|
113
112
|
|
114
113
|
describe 'un_pause' do
|
115
114
|
it 'should rename the queue to live' do
|
116
|
-
Resque.redis.should_receive(:renamenx).with("queue:#{RateLimitedTestQueue.
|
115
|
+
Resque.redis.should_receive(:renamenx).with("queue:#{RateLimitedTestQueue.queue_name_private}_paused", "queue:#{RateLimitedTestQueue.queue_name_private}")
|
117
116
|
RateLimitedTestQueue.un_pause
|
118
117
|
end
|
119
118
|
end
|
@@ -153,7 +152,6 @@ describe Resque::Plugins::RateLimitedQueue do
|
|
153
152
|
expect { RateLimitedTestQueue.un_pause }.to_not raise_error
|
154
153
|
end
|
155
154
|
end
|
156
|
-
|
157
155
|
end
|
158
156
|
|
159
157
|
context 'with other errror' do
|
@@ -178,7 +176,8 @@ describe Resque::Plugins::RateLimitedQueue do
|
|
178
176
|
describe 'paused?' do
|
179
177
|
context 'with paused queue' do
|
180
178
|
before do
|
181
|
-
Resque.redis.stub(:exists).and_return(true)
|
179
|
+
Resque.redis.stub(:exists).with("queue:#{RateLimitedTestQueue.queue_name_private}_paused").and_return(true)
|
180
|
+
Resque.redis.stub(:exists).with("queue:#{RateLimitedTestQueue.queue_name_private}").and_return(false)
|
182
181
|
end
|
183
182
|
|
184
183
|
it 'should return the true if the paused queue exists' do
|
@@ -188,12 +187,25 @@ describe Resque::Plugins::RateLimitedQueue do
|
|
188
187
|
|
189
188
|
context 'with un paused queue' do
|
190
189
|
before do
|
191
|
-
Resque.redis.stub(:exists).and_return(false)
|
190
|
+
Resque.redis.stub(:exists).with("queue:#{RateLimitedTestQueue.queue_name_private}_paused").and_return(false)
|
191
|
+
Resque.redis.stub(:exists).with("queue:#{RateLimitedTestQueue.queue_name_private}").and_return(true)
|
192
192
|
end
|
193
193
|
|
194
|
-
it 'should return the false if the
|
194
|
+
it 'should return the false if the main queue exists exist' do
|
195
195
|
expect(RateLimitedTestQueue.paused?).to eq(false)
|
196
196
|
end
|
197
197
|
end
|
198
|
+
|
199
|
+
context 'with unknown queue state' do
|
200
|
+
before do
|
201
|
+
Resque.redis.stub(:exists).with("queue:#{RateLimitedTestQueue.queue_name_private}_paused").and_return(false)
|
202
|
+
Resque.redis.stub(:exists).with("queue:#{RateLimitedTestQueue.queue_name_private}").and_return(false)
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should return the default' do
|
206
|
+
expect(RateLimitedTestQueue.paused?(true)).to eq(true)
|
207
|
+
expect(RateLimitedTestQueue.paused?(false)).to eq(false)
|
208
|
+
end
|
209
|
+
end
|
198
210
|
end
|
199
211
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque-rate_limited_queue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Dowling
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: resque
|
@@ -219,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
219
|
version: '0'
|
220
220
|
requirements: []
|
221
221
|
rubyforge_project:
|
222
|
-
rubygems_version: 2.4.
|
222
|
+
rubygems_version: 2.4.3
|
223
223
|
signing_key:
|
224
224
|
specification_version: 4
|
225
225
|
summary: A Resque plugin to help manage jobs that use rate limited apis, pausing when
|
@@ -231,3 +231,4 @@ test_files:
|
|
231
231
|
- spec/rate_limited_queue_spec.rb
|
232
232
|
- spec/rate_limited_un_pause_spec.rb
|
233
233
|
- spec/spec_helper.rb
|
234
|
+
has_rdoc:
|