resque-uniqueue 0.1.1 → 0.2.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.
- data/VERSION +1 -1
- data/lib/resque/uniqueue.rb +33 -17
- data/resque-uniqueue.gemspec +1 -1
- data/test/test_resque-uniqueue.rb +42 -3
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/resque/uniqueue.rb
CHANGED
@@ -16,26 +16,32 @@ module Resque
|
|
16
16
|
redis.del("queue:#{queue}:uniqueue")
|
17
17
|
end
|
18
18
|
|
19
|
-
def push_unique(queue, item)
|
19
|
+
def push_unique(queue, item, time = Time.now.utc.to_i)
|
20
20
|
confirm_unique_queue_validity(queue)
|
21
21
|
watch_queue(queue)
|
22
22
|
queue = "queue:#{queue}"
|
23
|
-
redis.evalsha push_unique_eval_sha, [queue], [encode(item)]
|
23
|
+
redis.evalsha push_unique_eval_sha, [queue], [encode(item), time]
|
24
24
|
end
|
25
25
|
|
26
26
|
def pop_unique(queue)
|
27
27
|
confirm_unique_queue_validity(queue)
|
28
28
|
queue = "queue:#{queue}"
|
29
|
-
|
29
|
+
results = redis.evalsha pop_unique_eval_sha, [queue]
|
30
|
+
return nil unless results[0]
|
31
|
+
job = decode results[0]
|
32
|
+
job['start_at'] = results[1].to_i
|
33
|
+
return job
|
30
34
|
end
|
31
35
|
|
32
36
|
def push_unique_eval_sha
|
33
37
|
@push_unique_eval_sha ||= load_script <<-LUA
|
34
|
-
local
|
35
|
-
local
|
36
|
-
local
|
38
|
+
local queue_name = KEYS[1]
|
39
|
+
local uniqueue_name = queue_name..':uniqueue'
|
40
|
+
local start_at_name = queue_name..':start_at'
|
41
|
+
local in_set = redis.call('sadd', uniqueue_name , ARGV[1])
|
37
42
|
if in_set == 1 then
|
38
|
-
|
43
|
+
redis.call('rpush', start_at_name, ARGV[2])
|
44
|
+
return redis.call('rpush', queue_name, ARGV[1])
|
39
45
|
end
|
40
46
|
return false
|
41
47
|
LUA
|
@@ -43,21 +49,31 @@ module Resque
|
|
43
49
|
|
44
50
|
def pop_unique_eval_sha
|
45
51
|
@pop_unique_eval_sha ||= load_script <<-LUA
|
46
|
-
local
|
47
|
-
local
|
48
|
-
local
|
49
|
-
|
50
|
-
|
52
|
+
local queue_name = KEYS[1]
|
53
|
+
local uniqueue_name = queue_name..':uniqueue'
|
54
|
+
local start_at_name = queue_name..':start_at'
|
55
|
+
local results = {}
|
56
|
+
results[1] = redis.call('lpop', queue_name)
|
57
|
+
results[2] = redis.call('lpop', start_at_name)
|
58
|
+
redis.call('srem', uniqueue_name, results[1])
|
59
|
+
return results
|
51
60
|
LUA
|
52
61
|
end
|
53
62
|
|
54
63
|
def queue_and_set_length_equal_eval_sha
|
55
64
|
@queue_and_set_length_equal_eval_sha ||= load_script <<-LUA
|
56
|
-
local
|
57
|
-
local
|
58
|
-
local
|
59
|
-
local
|
60
|
-
|
65
|
+
local queue_name = KEYS[1]
|
66
|
+
local uniqueue_name = queue_name..':uniqueue'
|
67
|
+
local start_at_name = queue_name..':start_at'
|
68
|
+
local queue_size = redis.call('llen', queue_name)
|
69
|
+
local uniqueue_size = redis.call('scard', uniqueue_name)
|
70
|
+
local start_at_size = redis.call('llen', start_at_name)
|
71
|
+
if queue_size == uniqueue_size then
|
72
|
+
if queue_size == start_at_size then
|
73
|
+
return true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
return false
|
61
77
|
LUA
|
62
78
|
end
|
63
79
|
|
data/resque-uniqueue.gemspec
CHANGED
@@ -195,17 +195,28 @@ class TestResqueUniqueue < Test::Unit::TestCase
|
|
195
195
|
Resque.redis.flushall
|
196
196
|
end
|
197
197
|
|
198
|
-
should "return true if
|
198
|
+
should "return true if queue, uniqueue & start_at length are the same" do
|
199
199
|
Resque.redis.sadd "priority_10:uniqueue", "test"
|
200
200
|
Resque.redis.rpush "priority_10", "test"
|
201
|
+
Resque.redis.rpush "priority_10:start_at", "test"
|
201
202
|
Resque.confirm_unique_queue_validity("priority_10")
|
202
203
|
end
|
203
204
|
|
204
|
-
should 'raise exception if length of
|
205
|
+
should 'raise exception if length of queue is off' do
|
205
206
|
Resque.redis.rpush "priority_10", "test"
|
206
207
|
assert_raises(RuntimeError){ Resque.confirm_unique_queue_validity("priority_10") }
|
207
208
|
end
|
208
209
|
|
210
|
+
should 'raise exception if length of uniqueue is off' do
|
211
|
+
Resque.redis.sadd "priority_10:uniqueue", "test"
|
212
|
+
assert_raises(RuntimeError){ Resque.confirm_unique_queue_validity("priority_10") }
|
213
|
+
end
|
214
|
+
|
215
|
+
should 'raise exception if length of start_at is off' do
|
216
|
+
Resque.redis.rpush "priority_10:start_at", "test"
|
217
|
+
assert_raises(RuntimeError){ Resque.confirm_unique_queue_validity("priority_10") }
|
218
|
+
end
|
219
|
+
|
209
220
|
end
|
210
221
|
|
211
222
|
context "queue names" do
|
@@ -257,9 +268,11 @@ class TestResqueUniqueue < Test::Unit::TestCase
|
|
257
268
|
Resque.push('priority_10', {'name' => 'bob'})
|
258
269
|
assert_equal Resque.redis.llen('queue:priority_10'), 1
|
259
270
|
assert_equal Resque.redis.scard('queue:priority_10:uniqueue'), 1
|
271
|
+
assert_equal Resque.redis.llen('queue:priority_10:start_at'), 1
|
260
272
|
Resque.push('priority_10', {'name' => 'bob'})
|
261
273
|
assert_equal Resque.redis.llen('queue:priority_10'), 1
|
262
274
|
assert_equal Resque.redis.scard('queue:priority_10:uniqueue'), 1
|
275
|
+
assert_equal Resque.redis.llen('queue:priority_10:start_at'), 1
|
263
276
|
end
|
264
277
|
|
265
278
|
should "return queue length if unique job" do
|
@@ -272,6 +285,18 @@ class TestResqueUniqueue < Test::Unit::TestCase
|
|
272
285
|
assert_nil Resque.push('priority_10', {'name' => 'bob'})
|
273
286
|
end
|
274
287
|
|
288
|
+
should 'create start_at list if does not exist' do
|
289
|
+
refute Resque.redis.exists 'queue:priority_10:start_at'
|
290
|
+
Resque.push('priority_10', {'name' => 'bob'})
|
291
|
+
assert Resque.redis.exists 'queue:priority_10:start_at'
|
292
|
+
end
|
293
|
+
|
294
|
+
should 'add current time to start_at list' do
|
295
|
+
Resque.push_unique('priority_10', {'name' => 'bob'}, 1370213794)
|
296
|
+
assert_equal Resque.redis.llen('queue:priority_10:start_at'), 1
|
297
|
+
assert_equal Resque.redis.rpop('queue:priority_10:start_at').to_i, 1370213794
|
298
|
+
end
|
299
|
+
|
275
300
|
end
|
276
301
|
|
277
302
|
context "pop_unique" do
|
@@ -281,7 +306,8 @@ class TestResqueUniqueue < Test::Unit::TestCase
|
|
281
306
|
job = Resque.pop('priority_20')
|
282
307
|
Resque.push('priority_10', {'name' => 'bob'})
|
283
308
|
uniqueue_job = Resque.pop('priority_10')
|
284
|
-
assert_equal job,
|
309
|
+
assert_equal job['name'], 'bob'
|
310
|
+
assert_equal job['name'], uniqueue_job['name']
|
285
311
|
end
|
286
312
|
|
287
313
|
should "return same item whether unique queue or not when queue is empty" do
|
@@ -299,6 +325,19 @@ class TestResqueUniqueue < Test::Unit::TestCase
|
|
299
325
|
assert_equal Resque.redis.scard('queue:priority_10:uniqueue'), 0
|
300
326
|
end
|
301
327
|
|
328
|
+
should 'remove current time from start_at list' do
|
329
|
+
Resque.push_unique('priority_10', {'name' => 'bob'}, 1370213794)
|
330
|
+
assert_equal Resque.redis.llen('queue:priority_10:start_at'), 1
|
331
|
+
Resque.pop('priority_10')
|
332
|
+
assert_equal Resque.redis.llen('queue:priority_10:start_at'), 0
|
333
|
+
end
|
334
|
+
|
335
|
+
should 'return start_at as part of job hash' do
|
336
|
+
Resque.push_unique('priority_10', {'name' => 'bob'}, 1370213794)
|
337
|
+
job = Resque.pop('priority_10')
|
338
|
+
assert_equal job['start_at'], 1370213794
|
339
|
+
end
|
340
|
+
|
302
341
|
end
|
303
342
|
|
304
343
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque-uniqueue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -158,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
158
158
|
version: '0'
|
159
159
|
segments:
|
160
160
|
- 0
|
161
|
-
hash:
|
161
|
+
hash: -2707351707401238460
|
162
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
163
|
none: false
|
164
164
|
requirements:
|