mercury_amqp 0.1.0 → 0.1.2

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: 22461cdd32d965f465191c9f4270ea23724d9d14
4
- data.tar.gz: 4934514f73a40ee799e174eba6dabe11add998c4
3
+ metadata.gz: c36195df1d069fa7a74656af985d056b77a609cb
4
+ data.tar.gz: 4800de94a1d94f443d769b26e335b1257595e9f2
5
5
  SHA512:
6
- metadata.gz: de0a9fa90882b011bdd0011055f2546ad1a7b6d0ed9deadc5e0c7c3c7f759a5824267fa9e6c9c75a834b23f3413be306de6b303766c5e024af32a85f4c750225
7
- data.tar.gz: 639003755c8e26bbdcf98b66178d1d32cd91a2c8b7ba4b6efb1a98996915a7715381077d06f895d892358edf719e5975da7ae34e77401cb531d62b85a4447a8b
6
+ metadata.gz: 89fd0f3e3a2821c4666e885a1c6b5ccfb9e0925620eb0bb657bad0f105a2c0d736896e0995f6dbfcbabec58dc71cf77b4ae559fe423b9eb2c631f4364584d4d1
7
+ data.tar.gz: fc2643c2a50e24fc33db009b6fd3398018eecc4dea839f375dc58a03fea5ac8b49292e0aec7f41f294d9fa566bad8e855ac0f34e39e45eac5ac6d1f4c5868fb5
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  *~
5
+ *.gem
data/lib/mercury/fake.rb CHANGED
@@ -28,9 +28,9 @@ class Mercury
28
28
  ret(k)
29
29
  end
30
30
 
31
- def publish(source_name, msg, tag: '', &k)
31
+ def publish(source_name, msg, tag: '', headers: {}, &k)
32
32
  assert_not_closed
33
- queues.values.select{|q| q.binds?(source_name, tag)}.each{|q| q.enqueue(roundtrip(msg), tag)}
33
+ queues.values.select{|q| q.binds?(source_name, tag)}.each{|q| q.enqueue(roundtrip(msg), tag, headers)}
34
34
  ret(k)
35
35
  end
36
36
 
@@ -1,10 +1,13 @@
1
1
  class Mercury
2
2
  class Fake
3
3
  class Metadata
4
- def initialize(tag, dequeue, requeue)
4
+ attr_reader :headers
5
+
6
+ def initialize(tag, headers, dequeue, requeue)
5
7
  @tag = tag
6
8
  @dequeue = dequeue
7
9
  @requeue = requeue
10
+ @headers = headers
8
11
  end
9
12
 
10
13
  def routing_key
@@ -20,8 +20,8 @@ class Mercury
20
20
  deliver # new subscriber probably wants a message
21
21
  end
22
22
 
23
- def enqueue(msg, tag)
24
- msgs.push(QueuedMessage.new(self, msg, tag, @require_ack))
23
+ def enqueue(msg, tag, headers)
24
+ msgs.push(QueuedMessage.new(self, msg, tag, headers, @require_ack))
25
25
  deliver # new message. someone probably wants it.
26
26
  end
27
27
 
@@ -4,12 +4,13 @@ require 'mercury/received_message'
4
4
  class Mercury
5
5
  class Fake
6
6
  class QueuedMessage
7
- attr_reader :received_msg
7
+ attr_reader :received_msg, :headers
8
8
  attr_accessor :delivered, :subscriber
9
9
 
10
- def initialize(queue, msg, tag, is_ackable)
11
- metadata = Metadata.new(tag, proc{queue.ack_or_reject_message(self)}, proc{queue.nack(self)})
10
+ def initialize(queue, msg, tag, headers, is_ackable)
11
+ metadata = Metadata.new(tag, headers, proc{queue.ack_or_reject_message(self)}, proc{queue.nack(self)})
12
12
  @received_msg = ReceivedMessage.new(msg, metadata, is_ackable: is_ackable)
13
+ @headers = headers
13
14
  @delivered = false
14
15
  end
15
16
  end
@@ -2,12 +2,12 @@ require 'amqp'
2
2
  require 'securerandom'
3
3
  require 'mercury/wire_serializer'
4
4
  require 'mercury/received_message'
5
- require 'logger'
5
+ require 'logatron/logatron'
6
6
 
7
7
  class Mercury
8
8
  attr_reader :amqp, :channel, :logger
9
9
 
10
- def self.open(logger: Logger.new(STDOUT), **kws, &k)
10
+ def self.open(logger: Logatron, **kws, &k)
11
11
  @logger = logger
12
12
  new(**kws, &k)
13
13
  nil
@@ -36,19 +36,19 @@ class Mercury
36
36
  end
37
37
  private_class_method :new
38
38
 
39
- def publish(source_name, msg, tag: '', &k)
39
+ def publish(source_name, msg, tag: '', headers: {}, &k)
40
40
  # The amqp gem caches exchange objects, so it's fine to
41
41
  # redeclare the exchange every time we publish.
42
42
  # TODO: wait for publish confirmations (@channel.on_ack)
43
43
  with_source(source_name) do |exchange|
44
- exchange.publish(write(msg), **Mercury.publish_opts(tag)) do
44
+ exchange.publish(write(msg), **Mercury.publish_opts(tag, headers)) do
45
45
  k.call
46
46
  end
47
47
  end
48
48
  end
49
49
 
50
- def self.publish_opts(tag)
51
- { routing_key: tag, persistent: true }
50
+ def self.publish_opts(tag, headers)
51
+ { routing_key: tag, persistent: true, headers: Logatron.http_headers.merge(headers) }
52
52
  end
53
53
 
54
54
  def start_listener(source_name, handler, tag_filter: '#', &k)
@@ -108,7 +108,9 @@ class Mercury
108
108
  private
109
109
 
110
110
  def make_received_message(payload, metadata, is_ackable)
111
- ReceivedMessage.new(read(payload), metadata, is_ackable: is_ackable)
111
+ msg = ReceivedMessage.new(read(payload), metadata, is_ackable: is_ackable)
112
+ Logatron.msg_id = msg.headers['X-Ascent-Log-Id']
113
+ msg
112
114
  end
113
115
 
114
116
  def existence_check(k, &check)
@@ -12,6 +12,10 @@ class Mercury
12
12
  metadata.routing_key
13
13
  end
14
14
 
15
+ def headers
16
+ metadata.headers
17
+ end
18
+
15
19
  def ack
16
20
  @is_ackable or raise 'This message is not ackable'
17
21
  metadata.ack
data/lib/mercury/sync.rb CHANGED
@@ -10,7 +10,7 @@ class Mercury
10
10
  ch = conn.create_channel
11
11
  ch.confirm_select
12
12
  ex = ch.topic(source_name, Mercury.source_opts)
13
- ex.publish(WireSerializer.new.write(msg), **Mercury.publish_opts(tag))
13
+ ex.publish(WireSerializer.new.write(msg), **Mercury.publish_opts(tag, {}))
14
14
  ch.wait_for_confirms or raise 'failed to confirm publication'
15
15
  ensure
16
16
  conn.close
@@ -1,3 +1,3 @@
1
1
  class Mercury
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.2'
3
3
  end
data/mercury_amqp.gemspec CHANGED
@@ -20,14 +20,15 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.7'
22
22
  spec.add_development_dependency 'rake', '~> 10.0'
23
- spec.add_development_dependency 'yard'
23
+ spec.add_development_dependency 'yard', '~> 0'
24
24
  spec.add_development_dependency 'rspec', '~> 3.0'
25
- spec.add_development_dependency 'json_spec'
26
- spec.add_development_dependency 'evented-spec'
27
- spec.add_development_dependency 'rspec_junit_formatter'
25
+ spec.add_development_dependency 'json_spec', '~> 1'
26
+ spec.add_development_dependency 'evented-spec', '~> 0.9'
27
+ spec.add_development_dependency 'rspec_junit_formatter', '~> 0'
28
28
 
29
29
  spec.add_runtime_dependency 'oj', '~> 2.12'
30
30
  spec.add_runtime_dependency 'amqp', '~> 1.5'
31
31
  spec.add_runtime_dependency 'bunny', '~> 2.1'
32
32
  spec.add_runtime_dependency 'binding_of_caller', '~> 0.7'
33
+ spec.add_runtime_dependency 'logatron', '~> 0'
33
34
  end
@@ -2,6 +2,8 @@ require 'rspec'
2
2
  require 'spec_helper'
3
3
  require 'mercury'
4
4
  require 'mercury/monadic'
5
+ require 'securerandom'
6
+ require 'logatron/logatron'
5
7
 
6
8
  describe Mercury::Monadic do
7
9
  include Cps::Methods
@@ -65,6 +67,38 @@ describe Mercury::Monadic do
65
67
  end
66
68
  end
67
69
 
70
+ itt 'sends and receives headers' do
71
+ test_with_mercury do |m|
72
+ msgs = []
73
+ seql do
74
+ and_then { m.start_listener(source, &msgs.method(:push)) }
75
+ and_then { m.publish(source, msg, headers: {'foo' => 'bar'}) }
76
+ and_then { wait_until { msgs.size == 1 } }
77
+ and_lift do
78
+ expect(msgs[0].headers['foo']).to eql 'bar'
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ it 'propagates logatron headers' do
85
+ real_msg_id = SecureRandom.uuid
86
+ Logatron.msg_id = real_msg_id
87
+ test_with_mercury do |m|
88
+ msgs = []
89
+ seql do
90
+ and_then { m.start_listener(source, &msgs.method(:push)) }
91
+ and_then { m.publish(source, msg) }
92
+ and_lift { Logatron.msg_id = 'fake_msg_id' }
93
+ and_then { wait_until { msgs.size == 1 } }
94
+ and_lift do
95
+ expect(msgs[0].headers['X-Ascent-Log-Id']).to eql real_msg_id
96
+ expect(Logatron.msg_id).to eql real_msg_id
97
+ end
98
+ end
99
+ end
100
+ end
101
+
68
102
  itt 'uses AMQP-style tag filters' do
69
103
  test_with_mercury do |m|
70
104
  successes = []
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.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Winton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-08 00:00:00.000000000 Z
11
+ date: 2015-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,14 +42,14 @@ dependencies:
42
42
  name: yard
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
@@ -70,42 +70,42 @@ dependencies:
70
70
  name: json_spec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '1'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '1'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: evented-spec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '0.9'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '0.9'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rspec_junit_formatter
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0.7'
167
+ - !ruby/object:Gem::Dependency
168
+ name: logatron
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
167
181
  description: Abstracts common patterns used with AMQP
168
182
  email:
169
183
  - wintonpc@gmail.com