simple_queues 1.2.2 → 1.3.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.
@@ -62,6 +62,48 @@ while $running do
62
62
  end
63
63
  </code></pre>
64
64
 
65
+ Alternatively, the block you provide to #on_dequeue can accept two parameters and will be provided with the queue name:
66
+
67
+ <pre><code>require "simple_queues"
68
+ # Provides #underscore, #classify, #constantize and friends
69
+ require "active_support/inflector"
70
+
71
+ # Provides #seconds, #minutes and friends
72
+ require "active_support/core_ext/numeric/time"
73
+
74
+ Queues = SimpleQueues::Redis.new
75
+
76
+ class BaseWorker
77
+ def initialize(message)
78
+ @message = message
79
+ end
80
+ end
81
+
82
+ class CrawlerControlWorker < BaseWorker
83
+ def run
84
+ $running = false
85
+ end
86
+ end
87
+
88
+ class PagesToCrawlWorker < BaseWorker
89
+ def run
90
+ # Crawl, do your own stuff here
91
+ end
92
+ end
93
+
94
+ def handler(queue_name, message)
95
+ klass = (queue_name.to_s << "_worker").classify.constantize
96
+ klass.new(message).run
97
+ end
98
+
99
+ Queues.on_dequeue :crawler_controls, &method(:handler)
100
+ Queues.on_dequeue :pages_to_crawl, &method(:handler)
101
+
102
+ while $running
103
+ Queues.dequeue_with_timeout(30.seconds)
104
+ end
105
+ </code></pre>
106
+
65
107
  h2. LICENSE
66
108
 
67
109
  (The MIT License)
@@ -29,7 +29,13 @@ module SimpleQueues
29
29
  @queues = Hash.new
30
30
  end
31
31
 
32
+ # Saves a block for later execution from #dequeue_with_timeout or #dequeue.
33
+ #
34
+ # When the block's arity is 1, only the message will be passed.
35
+ # When the block's arity is 2, the queue's name and the message will be passed along, in that order.
36
+ # When the block's arity is negative (accepts a variable number of arguments), SimpleQueues::Redis behaves as if the block's arity was 2.
32
37
  def on_dequeue(queue_name, &block)
38
+ raise ArgumentError, "The provided block must accept at least one argument - #{block.inspect} accepts no arguments" if block.arity.zero?
33
39
  @queues[q_name(queue_name)] = block
34
40
  end
35
41
 
@@ -86,7 +92,16 @@ module SimpleQueues
86
92
  raise ArgumentError, "Timeout must not be nil" if timeout.nil? || timeout.to_s.empty?
87
93
 
88
94
  queue, result = @redis.blpop(*[@queues.keys, timeout.to_i].flatten)
89
- @queues.fetch(queue).call(decode(result)) if queue
95
+ if queue then
96
+ block = @queues.fetch(queue)
97
+ message = decode(result)
98
+
99
+ if block.arity == 1 then
100
+ block.call(message)
101
+ else
102
+ block.call(queue, message)
103
+ end
104
+ end
90
105
  queue
91
106
  when 2
92
107
  queue_name, timeout = args.shift, args.shift
@@ -1,3 +1,3 @@
1
1
  module SimpleQueues
2
- VERSION = "1.2.2"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -23,6 +23,14 @@ describe SimpleQueues::Redis, "dequeue_blocking" do
23
23
  lambda { queue.dequeue_blocking(nil) }.should raise_error(ArgumentError)
24
24
  lambda { queue.dequeue_blocking("") }.should raise_error(ArgumentError)
25
25
  end
26
+
27
+ it "should reraise underlying connection errors"
28
+ # Errno::ECONNREFUSED
29
+ # Errno::EAGAIN
30
+
31
+ context "given #exception_handler= is set with a block" do
32
+ it "should call the block to handle underlying connection exceptions"
33
+ end
26
34
  end
27
35
 
28
36
  describe SimpleQueues::Redis, "dequeue_with_timeout" do
@@ -13,17 +13,23 @@ describe SimpleQueues::Redis, "multiple dequeue" do
13
13
  redis.flushdb
14
14
  end
15
15
 
16
- it "should accept setting up a dequeue block" do
17
- lambda do
18
- queue.on_dequeue(:pages_to_crawl) {|message| message}
19
- end.should_not raise_error
20
- end
16
+ context "#on_dequeue" do
17
+ it "should accept setting up a dequeue block" do
18
+ lambda do
19
+ queue.on_dequeue(:pages_to_crawl) {|message| message}
20
+ end.should_not raise_error
21
+ end
21
22
 
22
- it "should accept setting up multiple dequeue block" do
23
- lambda do
24
- queue.on_dequeue(:pages_to_crawl) {|message| message}
25
- queue.on_dequeue(:pages_to_analyze) {|message| message}
26
- end.should_not raise_error
23
+ it "should accept setting up multiple dequeue block" do
24
+ lambda do
25
+ queue.on_dequeue(:pages_to_crawl) {|message| message}
26
+ queue.on_dequeue(:pages_to_analyze) {|message| message}
27
+ end.should_not raise_error
28
+ end
29
+
30
+ it "should raise an ArgumentError when the block accepts no arguments" do
31
+ lambda { queue.on_dequeue(:a) { fail } }.should raise_error(ArgumentError)
32
+ end
27
33
  end
28
34
 
29
35
  context "#dequeue_with_timeout" do
@@ -39,7 +45,7 @@ describe SimpleQueues::Redis, "multiple dequeue" do
39
45
  queue.dequeue_with_timeout(1).should be_nil
40
46
  end
41
47
 
42
- it "should call into the correct block" do
48
+ it "should send only the message when the block has an arity of 1" do
43
49
  a, b = [], []
44
50
  queue.on_dequeue(:a) {|message| a << message}
45
51
  queue.on_dequeue(:b) {|message| b << message}
@@ -53,5 +59,44 @@ describe SimpleQueues::Redis, "multiple dequeue" do
53
59
  a.should == [{"sent_to" => "a", "serial" => 1}, {"sent_to" => "a", "serial" => 2}]
54
60
  b.should == [{"sent_to" => "b", "serial" => 1}]
55
61
  end
62
+
63
+ it "should send the queue name and the message when the block has an arity of 2" do
64
+ received = []
65
+ queue.on_dequeue(:a) {|queue, message| received << [queue, message]}
66
+ queue.on_dequeue(:b) {|queue, message| received << [queue, message]}
67
+
68
+ queue.enqueue(:a, "a" => 1)
69
+ queue.enqueue(:b, "b" => 2)
70
+
71
+ 2.times { queue.dequeue_with_timeout(1) }
72
+
73
+ received.should == [["a", {"a" => 1}], ["b", {"b" => 2}]]
74
+ end
75
+
76
+ it "should send the queue name and the message when the block has an arity of -1" do
77
+ received = []
78
+ queue.on_dequeue(:a) {|*args| received << args}
79
+ queue.on_dequeue(:b) {|*args| received << args}
80
+
81
+ queue.enqueue(:a, "a" => 1)
82
+ queue.enqueue(:b, "b" => 2)
83
+
84
+ 2.times { queue.dequeue_with_timeout(1) }
85
+
86
+ received.should == [["a", {"a" => 1}], ["b", {"b" => 2}]]
87
+ end
88
+
89
+ it "should send the queue name and the message when the block has an arity of -2" do
90
+ received = []
91
+ queue.on_dequeue(:a) {|queue, *args| received << [queue, args]}
92
+ queue.on_dequeue(:b) {|queue, *args| received << [queue, args]}
93
+
94
+ queue.enqueue(:a, "a" => 1)
95
+ queue.enqueue(:b, "b" => 2)
96
+
97
+ 2.times { queue.dequeue_with_timeout(1) }
98
+
99
+ received.should == [["a", [{"a" => 1}]], ["b", [{"b" => 2}]]]
100
+ end
56
101
  end
57
102
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: simple_queues
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.2.2
5
+ version: 1.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - "Fran\xC3\xA7ois Beausoleil"
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-30 00:00:00 -04:00
13
+ date: 2011-05-31 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency