mercury_amqp 0.9.0 → 0.10.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef40a35dae3b1d1db2beb819ebe1766437ff9c3c
4
- data.tar.gz: 15cf5e985cf94f764c8a20be782ad752cd665927
3
+ metadata.gz: 16118238db6731dd009db956a965bdc70f73c6c5
4
+ data.tar.gz: fcf5cdbe1e5fcf2a45835dc8fce12933acf65216
5
5
  SHA512:
6
- metadata.gz: 09651918c0545cfdefc67d701b93a14176ffb38120a5eb81d4091465e9d8b8368e8d3021ca2cd8eacf75824342943a1e956e92d99773626d3a8d27ca981bc31e
7
- data.tar.gz: 785a0ad5cf45c076e7a5a90588f087033108411aeffab3e10e447efb26c7a7886b91419fc4a0fcb808779d4559a268dc58601041b70e5496e35469421c849355
6
+ metadata.gz: 23d4b1f2bfee00745bac70bba0f362e022a5360c7c6bd1d6b7e76a756d7b6aeb45ee74181e2f45f5628d2602fb66c42d9e5ebe682fc58648034eaf200722db7a
7
+ data.tar.gz: c48a33ed99cb871992de68403a43dac7fee3f1ad8ced8a6513f7608c1f8f9c574af3f2e75c907f467f3d091c397d5597ac11cb385697e55646ac13347b857873
@@ -0,0 +1 @@
1
+ 2.4.1
@@ -10,7 +10,7 @@ class Mercury
10
10
  end
11
11
 
12
12
  def seql(&block)
13
- Cps.seql(2, &block)
13
+ Cps.seql(&block)
14
14
  end
15
15
 
16
16
  def seqp(&block)
@@ -1,9 +1,7 @@
1
- require 'binding_of_caller'
2
-
3
1
  class Mercury
4
2
  class Cps
5
3
  # Syntactic sugar for and_then chains.
6
- def self.seql(depth=1, &block)
4
+ def self.seql(&block)
7
5
  # EXPERIMENTAL
8
6
  # The trick here is to execute the block in a context where
9
7
  # 1. we can simulate local let-bound variables, and
@@ -17,7 +15,7 @@ class Mercury
17
15
  #
18
16
  # Note: parent instance variables are not available inside the block.
19
17
  # Note: keyword arguments are not proxied to methods called in the parent binding
20
- context = SeqWithLet.new(binding.of_caller(depth))
18
+ context = SeqWithLet.new(block.binding)
21
19
  context.instance_exec(&block)
22
20
  context.__chain
23
21
  end
@@ -114,14 +114,29 @@ class Mercury
114
114
  guard_public(k)
115
115
  with_source(source_name) do |exchange|
116
116
  with_work_queue(worker_group, exchange, tag_filter) do |queue|
117
- queue.subscribe(ack: true) do |metadata, payload|
118
- handler.call(make_received_message(payload, metadata, work_queue_name: worker_group))
119
- end
117
+ subscribe_worker(queue, handler)
120
118
  k.call
121
119
  end
122
120
  end
123
121
  end
124
122
 
123
+ # Production code should not call this.
124
+ # Only test/tool code should call this, and only if you're sure
125
+ # the worker queue already exists and is bound to the source
126
+ def start_queue_worker(worker_group, handler, &k)
127
+ guard_public(k)
128
+ @channel.queue(worker_group, work_queue_opts) do |queue|
129
+ subscribe_worker(queue, handler)
130
+ k.call
131
+ end
132
+ end
133
+
134
+ private def subscribe_worker(queue, handler)
135
+ queue.subscribe(ack: true) do |metadata, payload|
136
+ handler.call(make_received_message(payload, metadata, work_queue_name: queue.name))
137
+ end
138
+ end
139
+
125
140
  def delete_source(source_name, &k)
126
141
  guard_public(k)
127
142
  with_source(source_name) do |exchange|
@@ -202,11 +217,11 @@ class Mercury
202
217
 
203
218
  def dispatch_publisher_confirm(basic_ack)
204
219
  confirmed_tags =
205
- if basic_ack.multiple
206
- @confirm_handlers.keys.select { |tag| tag <= basic_ack.delivery_tag }.sort # sort just to be deterministic
207
- else
208
- [basic_ack.delivery_tag]
209
- end
220
+ if basic_ack.multiple
221
+ @confirm_handlers.keys.select { |tag| tag <= basic_ack.delivery_tag }.sort # sort just to be deterministic
222
+ else
223
+ [basic_ack.delivery_tag]
224
+ end
210
225
  confirmed_tags.each do |tag|
211
226
  @confirm_handlers.delete(tag).call
212
227
  end
@@ -310,9 +325,10 @@ class Mercury
310
325
 
311
326
  def bind_queue(exchange, queue_name, tag_filter, opts, &k)
312
327
  tag_filter ||= '#'
313
- queue = @channel.queue(queue_name, opts)
314
- queue.bind(exchange, routing_key: tag_filter) do
315
- k.call(queue)
328
+ @channel.queue(queue_name, opts) do |queue|
329
+ queue.bind(exchange, routing_key: tag_filter) do
330
+ k.call(queue)
331
+ end
316
332
  end
317
333
  end
318
334
 
@@ -28,6 +28,7 @@ class Mercury
28
28
  wrap(:republish)
29
29
  wrap(:start_listener)
30
30
  wrap(:start_worker)
31
+ wrap(:start_queue_worker)
31
32
  wrap(:delete_source)
32
33
  wrap(:delete_work_queue)
33
34
  wrap(:source_exists?)
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'mercury_amqp'
7
- spec.version = '0.9.0'
7
+ spec.version = '0.10.0'
8
8
  spec.authors = ['Peter Winton']
9
9
  spec.email = ['wintonpc@gmail.com']
10
10
  spec.summary = 'AMQP-backed messaging layer'
@@ -28,6 +28,5 @@ Gem::Specification.new do |spec|
28
28
  spec.add_runtime_dependency 'oj', '~> 3.0'
29
29
  spec.add_runtime_dependency 'amqp', '~> 1.5'
30
30
  spec.add_runtime_dependency 'bunny', '~> 2.1'
31
- spec.add_runtime_dependency 'binding_of_caller', '~> 0.7'
32
31
  spec.add_runtime_dependency 'activesupport', '> 4.0', '< 6.0'
33
32
  end
@@ -76,7 +76,7 @@ describe Mercury::Monadic do
76
76
  end
77
77
  end
78
78
  seql do
79
- and_then { m.start_worker('worker1', source1, handle_msg) }
79
+ and_then { m.start_worker(queue1, source1, handle_msg) }
80
80
  and_then { m.publish(source1, {'id' => 1, 'sleep_seconds' => 0.1}) }
81
81
  and_then { m.publish(source1, {'id' => 2, 'sleep_seconds' => 0.1}) }
82
82
  and_then { wait_until { events.size == 4 } }
@@ -87,6 +87,20 @@ describe Mercury::Monadic do
87
87
  end
88
88
  end
89
89
 
90
+ it 'subscribes to a preexisting queue' do
91
+ test_with_mercury do |m|
92
+ msgs = []
93
+ seql do
94
+ let(:other_m) { Mercury::Monadic.open }
95
+ and_then { other_m.start_worker(queue1, source1, :nack.to_proc) }
96
+ and_then { other_m.close }
97
+ and_then { m.start_queue_worker(queue1, msgs.method(:push)) }
98
+ and_then { m.publish(source1, {'id' => 1}) }
99
+ and_then { wait_until { msgs.size == 1 } }
100
+ end
101
+ end
102
+ end
103
+
90
104
  itt 'sends and receives tagged messages' do
91
105
  test_with_mercury do |m|
92
106
  msgs = []
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.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Winton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-24 00:00:00.000000000 Z
11
+ date: 2018-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -150,20 +150,6 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '2.1'
153
- - !ruby/object:Gem::Dependency
154
- name: binding_of_caller
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '0.7'
160
- type: :runtime
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: '0.7'
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: activesupport
169
155
  requirement: !ruby/object:Gem::Requirement
@@ -193,6 +179,7 @@ extra_rdoc_files: []
193
179
  files:
194
180
  - ".gitignore"
195
181
  - ".rspec"
182
+ - ".ruby-version"
196
183
  - CHANGES.md
197
184
  - Gemfile
198
185
  - README.md
@@ -250,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
250
237
  version: '0'
251
238
  requirements: []
252
239
  rubyforge_project:
253
- rubygems_version: 2.6.2
240
+ rubygems_version: 2.6.12
254
241
  signing_key:
255
242
  specification_version: 4
256
243
  summary: AMQP-backed messaging layer