turnpike 0.7.1 → 0.7.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 +4 -4
- data/.travis.yml +0 -1
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/lib/turnpike.rb +9 -2
- data/lib/turnpike/base.rb +5 -4
- data/lib/turnpike/queue.rb +15 -6
- data/lib/turnpike/unique_queue.rb +10 -8
- data/lib/turnpike/version.rb +1 -1
- data/test/turnpike_test.rb +43 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ee7b6e304b2d256bc1d0712c8b2bf806cd466b9
|
4
|
+
data.tar.gz: 8d0df7c09cb7e9960ea276f4a08ee50b20274497
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ab3f5a0ff811be7a0bc8472b84ffcee417b6983c96d32e5399de0656230e5f457c1e26674cf6738432e9ba82166c7de1424ebc5e841558a5287a78bbeb49e99
|
7
|
+
data.tar.gz: e56acce950f90bd741d388a8f2974193ca2aaaaa379162d42ef9e936fb2530aebc6133edf8e4a431b9fb040fcfc715141658d7a5494b02340438bc9923af2bae
|
data/.travis.yml
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
data/lib/turnpike.rb
CHANGED
@@ -2,7 +2,14 @@ require 'turnpike/queue'
|
|
2
2
|
require 'turnpike/unique_queue'
|
3
3
|
|
4
4
|
module Turnpike
|
5
|
-
|
6
|
-
|
5
|
+
class << self
|
6
|
+
attr_accessor :namespace
|
7
|
+
|
8
|
+
def call(name = 'default', unique: false)
|
9
|
+
(unique ? UniqueQueue : Queue).new(name)
|
10
|
+
end
|
11
|
+
alias [] call
|
7
12
|
end
|
13
|
+
|
14
|
+
@namespace = 'turnpike'
|
8
15
|
end
|
data/lib/turnpike/base.rb
CHANGED
@@ -6,13 +6,13 @@ module Turnpike
|
|
6
6
|
class Base
|
7
7
|
extend Forwardable
|
8
8
|
|
9
|
-
def_delegator :Redis, :current, :redis
|
10
9
|
def_delegators :MessagePack, :pack, :unpack
|
11
10
|
|
12
|
-
attr :name
|
11
|
+
attr :name, :redis
|
13
12
|
|
14
|
-
def initialize(name)
|
15
|
-
@name = "
|
13
|
+
def initialize(name, redis: Redis.current)
|
14
|
+
@name = "#{Turnpike.namespace}:#{name}"
|
15
|
+
@redis = redis
|
16
16
|
end
|
17
17
|
|
18
18
|
def clear
|
@@ -24,6 +24,7 @@ module Turnpike
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def pop(*); raise NotImplementedError; end
|
27
|
+
def bpop(*); raise NotImplementedError; end
|
27
28
|
def push(*); raise NotImplementedError; end
|
28
29
|
def size; raise NotImplementedError; end
|
29
30
|
def unshift(*); raise NotImplementedError; end
|
data/lib/turnpike/queue.rb
CHANGED
@@ -6,17 +6,26 @@ module Turnpike
|
|
6
6
|
#
|
7
7
|
# n - Integer number of items to pop.
|
8
8
|
#
|
9
|
-
# Returns
|
9
|
+
# Returns an item, an Array of items, or nil if the queue is empty.
|
10
10
|
def pop(n = 1)
|
11
|
-
items = []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
11
|
+
items = n.times.reduce([]) { |ary, _|
|
12
|
+
break ary unless item = redis.lpop(name)
|
13
|
+
ary << unpack(item)
|
14
|
+
}
|
16
15
|
|
17
16
|
n == 1 ? items.first : items
|
18
17
|
end
|
19
18
|
|
19
|
+
# Pop one or more items from the queue and block if the queue is empty.
|
20
|
+
#
|
21
|
+
# n - Integer number of items to pop.
|
22
|
+
#
|
23
|
+
# Returns an item or an Array of items.
|
24
|
+
def bpop(n = 1)
|
25
|
+
items = n.times.map { unpack(redis.blpop(name).last) }
|
26
|
+
n == 1 ? items.first : items
|
27
|
+
end
|
28
|
+
|
20
29
|
# Push items to the end of the queue.
|
21
30
|
#
|
22
31
|
# items - A splat Array of items.
|
@@ -15,15 +15,9 @@ module Turnpike
|
|
15
15
|
#
|
16
16
|
# n - Integer number of items to pop.
|
17
17
|
#
|
18
|
-
# Returns
|
18
|
+
# Returns an item, an Array of items, or nil if the queue is empty.
|
19
19
|
def pop(n = 1)
|
20
|
-
items =
|
21
|
-
redis.evalsha(ZPOP_SHA, [name, n])
|
22
|
-
rescue Redis::CommandError
|
23
|
-
redis.eval(ZPOP, [name, n])
|
24
|
-
end
|
25
|
-
items.map! { |i| unpack(i) }
|
26
|
-
|
20
|
+
items = zpop(n).map { |i| unpack(i) }
|
27
21
|
n == 1 ? items.first : items
|
28
22
|
end
|
29
23
|
|
@@ -52,5 +46,13 @@ module Turnpike
|
|
52
46
|
_, score = redis.zrange(name, 0, 0, with_scores: true).pop
|
53
47
|
score ? push(*items, score: score - 1) : push(*items)
|
54
48
|
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def zpop(n)
|
53
|
+
redis.evalsha(ZPOP_SHA, [name, n])
|
54
|
+
rescue Redis::CommandError
|
55
|
+
redis.eval(ZPOP, [name, n])
|
56
|
+
end
|
55
57
|
end
|
56
58
|
end
|
data/lib/turnpike/version.rb
CHANGED
data/test/turnpike_test.rb
CHANGED
@@ -4,8 +4,13 @@ require 'minitest/benchmark' if ENV['BENCH']
|
|
4
4
|
require 'turnpike'
|
5
5
|
|
6
6
|
class TestTurnpike < MiniTest::Unit::TestCase
|
7
|
-
def
|
7
|
+
def test_lambdalike
|
8
8
|
assert_kind_of Turnpike::Queue, Turnpike.call
|
9
|
+
assert_kind_of Turnpike::Queue, Turnpike.()
|
10
|
+
assert_kind_of Turnpike::Queue, Turnpike[]
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_unique_call
|
9
14
|
assert_kind_of Turnpike::UniqueQueue, Turnpike.call(unique: true)
|
10
15
|
end
|
11
16
|
|
@@ -14,9 +19,17 @@ class TestTurnpike < MiniTest::Unit::TestCase
|
|
14
19
|
assert_includes queue.name, 'foo'
|
15
20
|
end
|
16
21
|
|
22
|
+
def test_namespace
|
23
|
+
orig = Turnpike.namespace
|
24
|
+
Turnpike.namespace = 'foo'
|
25
|
+
queue = Turnpike::Base.new('bar')
|
26
|
+
assert_equal queue.name, 'foo:bar'
|
27
|
+
Turnpike.namespace = orig
|
28
|
+
end
|
29
|
+
|
17
30
|
def test_abstract_class
|
18
31
|
queue = Turnpike::Base.new('foo')
|
19
|
-
%w(push pop unshift size).each do |mth|
|
32
|
+
%w(push pop bpop unshift size).each do |mth|
|
20
33
|
assert_raises(NotImplementedError) { queue.send(mth) }
|
21
34
|
end
|
22
35
|
end
|
@@ -109,8 +122,31 @@ class TestQueue < MiniTest::Unit::TestCase
|
|
109
122
|
def peek(queue)
|
110
123
|
queue.redis.lrange(queue.name, 0, -1).map { |i| queue.unpack(i) }
|
111
124
|
end
|
112
|
-
end
|
113
125
|
|
126
|
+
def test_blocking_pop
|
127
|
+
Thread.new {
|
128
|
+
sleep 0.1
|
129
|
+
klass.new('foo', redis: Redis.new).push(3)
|
130
|
+
queue.push(3)
|
131
|
+
}
|
132
|
+
queue.push(1, 2)
|
133
|
+
assert_equal [1, 2], queue.bpop(2)
|
134
|
+
assert_equal 3, queue.bpop
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_non_blocking_enumeration
|
138
|
+
klass.class_eval do
|
139
|
+
include Enumerable
|
140
|
+
def each(&blk)
|
141
|
+
while x = pop
|
142
|
+
blk.call(x)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
queue.push(1, 2)
|
147
|
+
assert_equal [1, 2], queue.to_a
|
148
|
+
end
|
149
|
+
end
|
114
150
|
|
115
151
|
class TestUniqueQueue < MiniTest::Unit::TestCase
|
116
152
|
include QueueTests
|
@@ -120,4 +156,8 @@ class TestUniqueQueue < MiniTest::Unit::TestCase
|
|
120
156
|
def peek(queue)
|
121
157
|
queue.redis.zrange(queue.name, 0, -1).map { |i| queue.unpack(i) }
|
122
158
|
end
|
159
|
+
|
160
|
+
def test_blocking_pop
|
161
|
+
assert_raises(NotImplementedError) { queue.bpop }
|
162
|
+
end
|
123
163
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turnpike
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hakan Ensari
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
91
|
version: '0'
|
92
92
|
requirements: []
|
93
93
|
rubyforge_project:
|
94
|
-
rubygems_version: 2.0.
|
94
|
+
rubygems_version: 2.0.2
|
95
95
|
signing_key:
|
96
96
|
specification_version: 4
|
97
97
|
summary: A Redis-backed FIFO queue
|