simple_queues 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,4 @@
3
3
  Gemfile.lock
4
4
  pkg/*
5
5
  doc/*
6
+ dump.rdb
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, {:url => "http://blog.teksol.info"}.to_json
17
- Queues.enqueue :pages_to_crawl, {:url => "http://techcrunch.com"}.to_json
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)
@@ -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 unserialize(message)
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
- @redis.rpush(q_name(queue_name), serialize(message))
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 [#to_i] The number of seconds to wait before returning nil.
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
- unserialize(result)
59
+ queue, result = @redis.blpop(q_name(queue_name), timeout.to_i)
60
+ deserialize(result)
57
61
  end
58
62
 
59
63
  private
@@ -1,3 +1,3 @@
1
1
  module SimpleQueues
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
@@ -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, 2).should == obj
12
- queue.dequeue_with_timeout(:test, 2).should == nil
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, 42)
20
+ queue.enqueue(:test, :yada => "whatever")
17
21
  queue.clear(:test)
18
- queue.dequeue_with_timeout(:test, 1).should == nil
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: false
5
- segments:
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-02-26 00:00:00 -05:00
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.3.7
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