simple_queues 1.0.3 → 1.0.4
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/.gitignore +1 -0
- data/README.textile +23 -2
- data/lib/simple_queues/redis.rb +9 -5
- data/lib/simple_queues/version.rb +1 -1
- data/spec/enqueueing_spec.rb +6 -0
- data/spec/redis_integration_spec.rb +9 -6
- metadata +4 -22
data/.gitignore
CHANGED
data/README.textile
CHANGED
@@ -13,8 +13,8 @@ h2. Usage
|
|
13
13
|
<pre><code>require "simple_queues"
|
14
14
|
Queues = SimpleQueues::Redis.new
|
15
15
|
|
16
|
-
Queues.enqueue :pages_to_crawl,
|
17
|
-
Queues.enqueue :pages_to_crawl,
|
16
|
+
Queues.enqueue :pages_to_crawl, :url => "http://blog.teksol.info"
|
17
|
+
Queues.enqueue :pages_to_crawl, :url => "http://techcrunch.com"
|
18
18
|
|
19
19
|
# In another process
|
20
20
|
|
@@ -34,6 +34,27 @@ loop do
|
|
34
34
|
end
|
35
35
|
<code></pre>
|
36
36
|
|
37
|
+
h1. Multiple Queues
|
38
|
+
|
39
|
+
Sometimes, you want to dequeue from multiple queues simultaneously, and react appropriately. When that happens, you need to use the <code>#on_dequeue</code> method:
|
40
|
+
|
41
|
+
<pre><code>require "simple_queues"
|
42
|
+
Queues = SimpleQueues::Redis.new
|
43
|
+
|
44
|
+
$running = true
|
45
|
+
Queues.on_dequeue :crawler_controls do |message|
|
46
|
+
$running = false if message["command"] == "quit"
|
47
|
+
end
|
48
|
+
|
49
|
+
Queues.on_dequeue :pages_to_crawl do |message|
|
50
|
+
# Handle crawling a page
|
51
|
+
end
|
52
|
+
|
53
|
+
while $running do
|
54
|
+
Queues.dequeue_with_timeout 5 #seconds
|
55
|
+
end
|
56
|
+
</code></pre>
|
57
|
+
|
37
58
|
h2. LICENSE
|
38
59
|
|
39
60
|
(The MIT License)
|
data/lib/simple_queues/redis.rb
CHANGED
@@ -11,10 +11,12 @@ module SimpleQueues
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def serialize(message)
|
14
|
+
raise ArgumentError, "message must be non-nil" if message.nil?
|
15
|
+
raise ArgumentError, "message must be respond to #to_json" unless message.respond_to?(:to_json)
|
14
16
|
message.to_json
|
15
17
|
end
|
16
18
|
|
17
|
-
def
|
19
|
+
def deserialize(message)
|
18
20
|
JSON.parse(message) if message
|
19
21
|
end
|
20
22
|
|
@@ -25,7 +27,9 @@ module SimpleQueues
|
|
25
27
|
# @return No useful value.
|
26
28
|
# @raise ArgumentError Whenever the queue name or the message are nil, or the queue name is empty.
|
27
29
|
def enqueue(queue_name, message)
|
28
|
-
|
30
|
+
msg = serialize(message)
|
31
|
+
@redis.rpush(q_name(queue_name), msg)
|
32
|
+
msg
|
29
33
|
end
|
30
34
|
|
31
35
|
# Dequeues a message, and waits forever for one to arrive.
|
@@ -48,12 +52,12 @@ module SimpleQueues
|
|
48
52
|
# Dequeues a message, or returns +nil+ if the timeout is exceeded.
|
49
53
|
#
|
50
54
|
# @param queue_name [String, Symbol] The queue name to read from.
|
51
|
-
# @param timeout [#
|
55
|
+
# @param timeout [#to_f] The number of seconds to wait before returning nil.
|
52
56
|
# @return [String, nil] The first message in the queue, or nil if the timeout was exceeded.
|
53
57
|
# @raise ArgumentError If +queue_name+ is nil or the empty String.
|
54
58
|
def dequeue_with_timeout(queue_name, timeout)
|
55
|
-
queue, result = @redis.blpop(q_name(queue_name), timeout)
|
56
|
-
|
59
|
+
queue, result = @redis.blpop(q_name(queue_name), timeout.to_i)
|
60
|
+
deserialize(result)
|
57
61
|
end
|
58
62
|
|
59
63
|
private
|
data/spec/enqueueing_spec.rb
CHANGED
@@ -14,6 +14,12 @@ describe SimpleQueues::Redis, "enqueue" do
|
|
14
14
|
queue.enqueue("q", "message")
|
15
15
|
end
|
16
16
|
|
17
|
+
it "should return the serialized message" do
|
18
|
+
redis.should_receive(:rpush).twice
|
19
|
+
queue.enqueue("q", "whatever").should == queue.serialize("whatever")
|
20
|
+
queue.enqueue("q", {:message => "whatever"}).should == queue.serialize(:message => "whatever")
|
21
|
+
end
|
22
|
+
|
17
23
|
it "should reject invalid queue names" do
|
18
24
|
lambda { queue.enqueue(nil, "") }.should raise_error(ArgumentError)
|
19
25
|
lambda { queue.enqueue("", "") }.should raise_error(ArgumentError)
|
@@ -5,25 +5,28 @@ describe SimpleQueues::Redis, "enqueue" do
|
|
5
5
|
SimpleQueues::Redis.new
|
6
6
|
end
|
7
7
|
|
8
|
+
before(:each) do
|
9
|
+
queue.clear(:test)
|
10
|
+
end
|
11
|
+
|
8
12
|
it "communicates with Redis as expected" do
|
9
13
|
obj = {"hello" => 42}
|
10
14
|
queue.enqueue(:test, obj)
|
11
|
-
queue.dequeue_with_timeout(:test,
|
12
|
-
queue.dequeue_with_timeout(:test,
|
15
|
+
queue.dequeue_with_timeout(:test, 1).should == obj
|
16
|
+
queue.dequeue_with_timeout(:test, 1).should == nil
|
13
17
|
end
|
14
18
|
|
15
19
|
it "clears the queue" do
|
16
|
-
queue.enqueue(:test,
|
20
|
+
queue.enqueue(:test, :yada => "whatever")
|
17
21
|
queue.clear(:test)
|
18
|
-
queue.
|
22
|
+
queue.size(:test).should be_zero
|
19
23
|
end
|
20
24
|
|
21
25
|
it "returns the queue size" do
|
22
|
-
queue.clear(:test)
|
23
26
|
queue.enqueue(:test, 42)
|
24
27
|
queue.enqueue(:test, 42)
|
25
28
|
queue.enqueue(:test, 42)
|
26
29
|
queue.enqueue(:test, 42)
|
27
30
|
queue.size(:test).should == 4
|
28
31
|
end
|
29
|
-
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_queues
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 1
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
version: 1.0.3
|
4
|
+
prerelease:
|
5
|
+
version: 1.0.4
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- "Fran\xC3\xA7ois Beausoleil"
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date: 2011-
|
13
|
+
date: 2011-03-22 00:00:00 -04:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
@@ -25,8 +21,6 @@ dependencies:
|
|
25
21
|
requirements:
|
26
22
|
- - ">="
|
27
23
|
- !ruby/object:Gem::Version
|
28
|
-
segments:
|
29
|
-
- 0
|
30
24
|
version: "0"
|
31
25
|
type: :runtime
|
32
26
|
version_requirements: *id001
|
@@ -38,8 +32,6 @@ dependencies:
|
|
38
32
|
requirements:
|
39
33
|
- - ">="
|
40
34
|
- !ruby/object:Gem::Version
|
41
|
-
segments:
|
42
|
-
- 0
|
43
35
|
version: "0"
|
44
36
|
type: :runtime
|
45
37
|
version_requirements: *id002
|
@@ -51,8 +43,6 @@ dependencies:
|
|
51
43
|
requirements:
|
52
44
|
- - ">="
|
53
45
|
- !ruby/object:Gem::Version
|
54
|
-
segments:
|
55
|
-
- 0
|
56
46
|
version: "0"
|
57
47
|
type: :development
|
58
48
|
version_requirements: *id003
|
@@ -64,8 +54,6 @@ dependencies:
|
|
64
54
|
requirements:
|
65
55
|
- - ">="
|
66
56
|
- !ruby/object:Gem::Version
|
67
|
-
segments:
|
68
|
-
- 0
|
69
57
|
version: "0"
|
70
58
|
type: :development
|
71
59
|
version_requirements: *id004
|
@@ -77,8 +65,6 @@ dependencies:
|
|
77
65
|
requirements:
|
78
66
|
- - ">="
|
79
67
|
- !ruby/object:Gem::Version
|
80
|
-
segments:
|
81
|
-
- 0
|
82
68
|
version: "0"
|
83
69
|
type: :development
|
84
70
|
version_requirements: *id005
|
@@ -121,21 +107,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
107
|
requirements:
|
122
108
|
- - ">="
|
123
109
|
- !ruby/object:Gem::Version
|
124
|
-
segments:
|
125
|
-
- 0
|
126
110
|
version: "0"
|
127
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
112
|
none: false
|
129
113
|
requirements:
|
130
114
|
- - ">="
|
131
115
|
- !ruby/object:Gem::Version
|
132
|
-
segments:
|
133
|
-
- 0
|
134
116
|
version: "0"
|
135
117
|
requirements: []
|
136
118
|
|
137
119
|
rubyforge_project:
|
138
|
-
rubygems_version: 1.
|
120
|
+
rubygems_version: 1.6.2
|
139
121
|
signing_key:
|
140
122
|
specification_version: 3
|
141
123
|
summary: Simple enqueue/dequeue API for working with queues
|