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 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