mercury_amqp 0.1.4 → 0.1.5
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/lib/mercury/fake/queue.rb +4 -4
- data/lib/mercury/fake/subscriber.rb +3 -3
- data/lib/mercury/fake.rb +3 -2
- data/lib/mercury/mercury.rb +2 -1
- data/lib/mercury/version.rb +1 -1
- data/spec/lib/mercury/monadic_spec.rb +42 -2
- data/spec/spec_helper.rb +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95133530de1763cec95808562a5e7fc63051357c
|
4
|
+
data.tar.gz: 0c67f736b817ae297846b28daee0ecaba4b5db44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d41a7d999b7f16ba2a19cd5a1bf625bf0899cffadfa08ae0d4a7d0db636ee37786ab752747a2e0e59a5a609d22be36bbf2ef1921aaa01edcb0c58a20ae49427
|
7
|
+
data.tar.gz: 31cee609bd834fc298f7879fb8ef26d65f3cd6cbe5219825c409a638049a9747fbacd9f01711d2d603d96182e611ab7f0280869d31d805bb3526b1e08d7b810a
|
data/lib/mercury/fake/queue.rb
CHANGED
@@ -27,13 +27,13 @@ class Mercury
|
|
27
27
|
|
28
28
|
def ack_or_reject_message(msg)
|
29
29
|
msgs.delete(msg) or raise 'tried to delete message that was not in queue!!'
|
30
|
-
msg.subscriber.
|
30
|
+
msg.subscriber.handle_capacity += 1
|
31
31
|
deliver # a subscriber just freed up
|
32
32
|
end
|
33
33
|
|
34
34
|
def nack(msg)
|
35
35
|
msg.delivered = false
|
36
|
-
msg.subscriber.
|
36
|
+
msg.subscriber.handle_capacity += 1
|
37
37
|
deliver
|
38
38
|
end
|
39
39
|
|
@@ -57,7 +57,7 @@ class Mercury
|
|
57
57
|
subscriber = idle_subscribers.sample
|
58
58
|
if @require_ack
|
59
59
|
msg.delivered = true
|
60
|
-
subscriber.
|
60
|
+
subscriber.handle_capacity -= 1
|
61
61
|
else
|
62
62
|
msgs.delete(msg)
|
63
63
|
end
|
@@ -73,7 +73,7 @@ class Mercury
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def idle_subscribers
|
76
|
-
subscribers.reject
|
76
|
+
subscribers.reject { |s| s.handle_capacity == 0 }
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
@@ -2,11 +2,11 @@ class Mercury
|
|
2
2
|
class Fake
|
3
3
|
class Subscriber
|
4
4
|
attr_reader :handler
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :handle_capacity
|
6
6
|
|
7
|
-
def initialize(handler)
|
7
|
+
def initialize(handler, handle_capacity)
|
8
8
|
@handler = handler
|
9
|
-
@
|
9
|
+
@handle_capacity = handle_capacity
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
data/lib/mercury/fake.rb
CHANGED
@@ -15,8 +15,9 @@ require 'mercury/fake/subscriber'
|
|
15
15
|
# broken sockets, etc.
|
16
16
|
class Mercury
|
17
17
|
class Fake
|
18
|
-
def initialize(domain=:default)
|
18
|
+
def initialize(domain=:default, parallelism: 1)
|
19
19
|
@domain = Fake.domains[domain]
|
20
|
+
@parallelism = parallelism
|
20
21
|
end
|
21
22
|
|
22
23
|
def self.domains
|
@@ -46,7 +47,7 @@ class Mercury
|
|
46
47
|
assert_not_closed
|
47
48
|
q = ensure_queue(source_name, tag_filter, !!worker_group, worker_group)
|
48
49
|
ret(k) # it's important we show the "start" operation finishing before delivery starts (in add_subscriber)
|
49
|
-
q.add_subscriber(Subscriber.new(handler))
|
50
|
+
q.add_subscriber(Subscriber.new(handler, @parallelism))
|
50
51
|
end
|
51
52
|
private :start_worker_or_listener
|
52
53
|
|
data/lib/mercury/mercury.rb
CHANGED
@@ -24,10 +24,11 @@ class Mercury
|
|
24
24
|
vhost: '/',
|
25
25
|
username: 'guest',
|
26
26
|
password: 'guest',
|
27
|
+
parallelism: 1,
|
27
28
|
&k)
|
28
29
|
AMQP.connect(host: host, port: port, vhost: vhost, username: username, password: password) do |amqp|
|
29
30
|
@amqp = amqp
|
30
|
-
@channel = AMQP::Channel.new(amqp, prefetch:
|
31
|
+
@channel = AMQP::Channel.new(amqp, prefetch: parallelism) do
|
31
32
|
@channel.confirm_select
|
32
33
|
install_default_error_handler
|
33
34
|
k.call(self)
|
data/lib/mercury/version.rb
CHANGED
@@ -48,6 +48,46 @@ describe Mercury::Monadic do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
itt 'broadcasts messages to listeners' do
|
52
|
+
test_with_mercury do |m|
|
53
|
+
msgs1 = []
|
54
|
+
msgs2 = []
|
55
|
+
seql do
|
56
|
+
and_then { m.start_listener(source1, &msgs1.method(:push)) }
|
57
|
+
and_then { m.start_listener(source1, &msgs2.method(:push)) }
|
58
|
+
and_then { m.publish(source1, msg1) }
|
59
|
+
and_then { wait_until { msgs1.size == 1 && msgs2.size == 1 } }
|
60
|
+
and_lift do
|
61
|
+
expect(msgs1[0].content).to eql(msg1)
|
62
|
+
expect(msgs2[0].content).to eql(msg1)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
itt 'it receives messages in parallel' do
|
69
|
+
test_with_mercury(parallelism: 2) do |m|
|
70
|
+
events = []
|
71
|
+
handle_msg = proc do |msg|
|
72
|
+
content = msg.content
|
73
|
+
events.push "received #{content['id']}"
|
74
|
+
EventMachine.add_timer(content['sleep_seconds']) do
|
75
|
+
events.push "finished #{content['id']}"
|
76
|
+
msg.ack
|
77
|
+
end
|
78
|
+
end
|
79
|
+
seql do
|
80
|
+
and_then { m.start_worker('worker1', source1, handle_msg) }
|
81
|
+
and_then { m.publish(source1, {'id' => 1, 'sleep_seconds' => 0.01}) }
|
82
|
+
and_then { m.publish(source1, {'id' => 2, 'sleep_seconds' => 0.01}) }
|
83
|
+
and_then { wait_until { events.size == 4 } }
|
84
|
+
and_lift do
|
85
|
+
expect(events).to eql ['received 1', 'received 2', 'finished 1', 'finished 2']
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
51
91
|
itt 'sends and receives tagged messages' do
|
52
92
|
test_with_mercury do |m|
|
53
93
|
msgs = []
|
@@ -338,10 +378,10 @@ describe Mercury::Monadic do
|
|
338
378
|
end
|
339
379
|
|
340
380
|
# the block must return a Cps
|
341
|
-
def test_with_mercury(&block)
|
381
|
+
def test_with_mercury(parallelism: 1, &block)
|
342
382
|
sources = [source1, source2]
|
343
383
|
queues = [queue1, queue2]
|
344
|
-
test_with_mercury_cps(sources, queues, &block)
|
384
|
+
test_with_mercury_cps(sources, queues, parallelism: parallelism, &block)
|
345
385
|
end
|
346
386
|
end
|
347
387
|
|
data/spec/spec_helper.rb
CHANGED
@@ -4,10 +4,10 @@ require 'mercury/fake'
|
|
4
4
|
include Mercury::TestUtils
|
5
5
|
|
6
6
|
# the block must return a Cps
|
7
|
-
def test_with_mercury_cps(sources, queues, &block)
|
7
|
+
def test_with_mercury_cps(sources, queues, parallelism: 1, &block)
|
8
8
|
em do
|
9
9
|
seql do
|
10
|
-
let(:m) { Mercury::Monadic.open }
|
10
|
+
let(:m) { Mercury::Monadic.open(parallelism: parallelism) }
|
11
11
|
and_then { delete_sources_and_queues_cps(sources, queues) }
|
12
12
|
and_then { block.call(m) }
|
13
13
|
and_then { delete_sources_and_queues_cps(sources, queues) }
|
@@ -28,8 +28,8 @@ module MercuryFakeSpec
|
|
28
28
|
it(name, &block)
|
29
29
|
context 'with Mercury::Fake' do
|
30
30
|
before :each do
|
31
|
-
allow(Mercury).to receive(:open) do
|
32
|
-
EM.next_tick { k.call(Mercury::Fake.new) }
|
31
|
+
allow(Mercury).to receive(:open) do |parallelism:1, &k|
|
32
|
+
EM.next_tick { k.call(Mercury::Fake.new(parallelism: parallelism)) }
|
33
33
|
end
|
34
34
|
end
|
35
35
|
it(name, &block)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mercury_amqp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Winton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|