freddy 2.6.0 → 2.8.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
  SHA256:
3
- metadata.gz: 74c044f881fa44748647d92c0bb450755b69d3d1da6cbe23c87ff15e6724f415
4
- data.tar.gz: f7b80d3bebfa4240727b1cdf1f6ef84449c3e91d5db1de81dd3a6a8cb4acc0df
3
+ metadata.gz: d728d028687af2cb365212bcbdc4bb278b2116ff665f64aa35ee75c057126455
4
+ data.tar.gz: '019059f31b8da95352ec6b66e47ec73ff762b5b8c82b912d044b6e1820f717b2'
5
5
  SHA512:
6
- metadata.gz: ba8c640285852bec4f9d318ccc8278137401152a14580be46a9ec281aca5bec6c7ca6cfd674161afd7124d0c936c103513acd14283cc24310cc03d2a1572d5f9
7
- data.tar.gz: d4abff33f63da251866dc5fb9dce48a088738aa88dc70d0351bd2b633742d118d05bc8de02e5d2274da14bbbe15d225673e90870a885157334f4f5d47d77f704
6
+ metadata.gz: 4eae3c233c958e0936d1da27dc99bc83274a2e673bc4107e2716617fd23c389a4c27632777ecefebb8a7a17a73246a3ba5c208436143d5a39b7030f446bb9e6b
7
+ data.tar.gz: 17901b6c33f2a454032b23e8afb195e5f37cc1481f75f77b9f88c759f225dd4b3e1bb5a0547d6c62c0730df8d9757215ec5d2fd3c35a199a71595e07348c3277
@@ -15,8 +15,7 @@ jobs:
15
15
 
16
16
 
17
17
  - name: Release Gem
18
- uses: discourse/publish-rubygems-action@b55d7b91b55e61752dc6cbc2972f8e16fe6c1a02
18
+ uses: discourse/publish-rubygems-action@ec5415e2cc3509a5cc8c4eef9499cf3fb05f8391
19
19
  env:
20
- GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
21
20
  RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
22
21
  RELEASE_COMMAND: rake release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- freddy (2.6.0)
4
+ freddy (2.8.0)
5
5
  bunny (~> 2.11)
6
6
  concurrent-ruby (~> 1.0)
7
7
  oj (~> 3.6)
@@ -14,16 +14,16 @@ GEM
14
14
  specs:
15
15
  amq-protocol (2.3.2)
16
16
  ast (2.4.2)
17
- bunny (2.19.0)
17
+ bunny (2.22.0)
18
18
  amq-protocol (~> 2.3, >= 2.3.1)
19
19
  sorted_set (~> 1, >= 1.0.2)
20
20
  coderay (1.1.3)
21
- concurrent-ruby (1.1.9)
21
+ concurrent-ruby (1.2.2)
22
22
  diff-lcs (1.4.4)
23
23
  hamster (3.0.0)
24
24
  concurrent-ruby (~> 1.0)
25
25
  method_source (1.0.0)
26
- oj (3.13.21)
26
+ oj (3.15.0)
27
27
  opentelemetry-api (1.1.0)
28
28
  opentelemetry-common (0.19.6)
29
29
  opentelemetry-api (~> 1.0)
@@ -34,7 +34,7 @@ GEM
34
34
  opentelemetry-common (~> 0.19.3)
35
35
  opentelemetry-registry (~> 0.2)
36
36
  opentelemetry-semantic_conventions
37
- opentelemetry-semantic_conventions (1.8.0)
37
+ opentelemetry-semantic_conventions (1.10.0)
38
38
  opentelemetry-api (~> 1.0)
39
39
  parallel (1.22.1)
40
40
  parser (3.1.2.0)
@@ -44,7 +44,7 @@ GEM
44
44
  method_source (~> 1.0)
45
45
  rainbow (3.1.1)
46
46
  rake (13.0.6)
47
- rbtree (0.4.5)
47
+ rbtree (0.4.6)
48
48
  regexp_parser (2.5.0)
49
49
  rexml (3.2.5)
50
50
  rspec (3.10.0)
data/README.md CHANGED
@@ -55,6 +55,11 @@ The message heading specify the `content-encoding` indicating the compression al
55
55
  freddy.deliver(destination, message, compress: 'zlib')
56
56
  ```
57
57
 
58
+ #### Metadata through headers
59
+
60
+ Send a message with arbitrary message metadata included in the message headers
61
+ freddy.deliver(destination, message, headers: {'my-key' => 'my-value'})
62
+
58
63
  ### Request delivery
59
64
 
60
65
  #### Expiring messages
@@ -29,7 +29,7 @@ class Freddy
29
29
  private
30
30
 
31
31
  def create_queue
32
- topic_exchange = @channel.topic(Freddy::FREDDY_TOPIC_EXCHANGE_NAME)
32
+ topic_exchange = @channel.topic(exchange_name)
33
33
 
34
34
  queue =
35
35
  if group
@@ -48,7 +48,7 @@ class Freddy
48
48
  def process_message(_queue, delivery)
49
49
  @consume_thread_pool.post do
50
50
  delivery.in_span do
51
- yield delivery.payload, delivery.routing_key
51
+ yield delivery.payload, delivery.routing_key, delivery.timestamp
52
52
  @channel.acknowledge(delivery.tag)
53
53
  end
54
54
  rescue StandardError
@@ -76,6 +76,10 @@ class Freddy
76
76
  def on_exception
77
77
  @options.fetch(:on_exception, :ack)
78
78
  end
79
+
80
+ def exchange_name
81
+ @options.fetch(:exchange_name, Freddy::FREDDY_TOPIC_EXCHANGE_NAME)
82
+ end
79
83
  end
80
84
  end
81
85
  end
@@ -24,6 +24,10 @@ class Freddy
24
24
  @metadata.reply_to
25
25
  end
26
26
 
27
+ def timestamp
28
+ @metadata[:timestamp]
29
+ end
30
+
27
31
  def in_span(&block)
28
32
  name = "#{Tracing.span_destination(@exchange, @routing_key)} process"
29
33
  kind = OpenTelemetry::Trace::SpanKind::CONSUMER
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Freddy
4
- VERSION = '2.6.0'
4
+ VERSION = '2.8.0'
5
5
  end
data/lib/freddy.rb CHANGED
@@ -117,8 +117,16 @@ class Freddy
117
117
  # `:ack` simply acknowledges the message and re-raises the exception. `:reject`
118
118
  # rejects the message without requeueing it. `:requeue` rejects the message with
119
119
  # `requeue` flag.
120
+ # @option options [String] :exchange_name
121
+ # Exchange to bind to. Default is `freddy-topic`.
120
122
  #
121
- # @yield [message] Yields received message to the block
123
+ # @yield [message] Yields received message to the block.
124
+ # @yieldparam [Object] payload
125
+ # Yields the received message's payload.
126
+ # @yieldparam [String] routing_key
127
+ # Yields the received message's routing key.
128
+ # @yieldparam [Time] timestamp
129
+ # Yields received message's timestamp.
122
130
  #
123
131
  # @return [#shutdown]
124
132
  #
@@ -158,6 +166,8 @@ class Freddy
158
166
  # won't be discarded if timeout it set to 0 (default).
159
167
  # @option options [String] :compress (nil)
160
168
  # - 'zlib' - compresses the payload with zlib
169
+ # @option options [Hash] :headers (nil)
170
+ # Arbitrary headers to add as message metadata
161
171
  # @return [void]
162
172
  #
163
173
  # @example
@@ -168,6 +178,7 @@ class Freddy
168
178
  opts = {}
169
179
  opts[:expiration] = (timeout * 1000).to_i if timeout.positive?
170
180
  opts[:content_encoding] = compression_algorithm if compression_algorithm
181
+ opts[:headers] = options[:headers] if options[:headers]
171
182
 
172
183
  @send_and_forget_producer.produce(destination, payload, opts)
173
184
  end
@@ -7,7 +7,15 @@ describe Freddy do
7
7
  let(:destination2) { random_destination }
8
8
  let(:payload) { { pay: 'load' } }
9
9
 
10
- after { freddy.close }
10
+ before do
11
+ @bunny = Bunny.new(config)
12
+ @bunny.start
13
+ end
14
+
15
+ after do
16
+ @bunny.close
17
+ freddy.close
18
+ end
11
19
 
12
20
  def respond_to(&block)
13
21
  freddy.respond_to(destination, &block)
@@ -72,6 +80,24 @@ describe Freddy do
72
80
  expect(@tapped_message).to eq(payload)
73
81
  end
74
82
  end
83
+
84
+ it 'accepts custom headers' do
85
+ headers = nil
86
+ queue = exclusive_subscribe do |_info, metadata, _payload|
87
+ headers = metadata[:headers]
88
+ end
89
+ freddy.deliver(queue, payload, headers: { 'foo' => 'bar' })
90
+
91
+ wait_for { headers }
92
+ expect(headers).to include({ 'foo' => 'bar' })
93
+ end
94
+ end
95
+
96
+ def exclusive_subscribe(&block)
97
+ channel = @bunny.create_channel
98
+ queue = channel.queue('', exclusive: true)
99
+ queue.subscribe(&block)
100
+ queue.name
75
101
  end
76
102
 
77
103
  context 'when making a synchronized request' do
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Tapping into with exchange identifier' do
4
+ let(:freddy) { Freddy.build(logger, **config) }
5
+
6
+ let(:connection) { Freddy::Adapters.determine.connect(config) }
7
+ let(:topic) { 'test_topic_exchange' }
8
+ let(:channel) { connection.create_channel }
9
+ let(:message_payload) { { test: 'test' }.to_json }
10
+ let(:expected_payload) { { test: 'test' } }
11
+ let(:publish_timestamp) { Time.now.to_i }
12
+
13
+ after do
14
+ connection.close
15
+ freddy.close
16
+ end
17
+
18
+ it 'receives message' do
19
+ freddy.tap_into('pattern.*', exchange_name: topic) do |payload, _routing_key, timestamp|
20
+ @received_payload = payload
21
+ @received_timestamp = timestamp
22
+ end
23
+
24
+ channel.topic(topic).publish(message_payload, { routing_key: 'pattern.random', timestamp: publish_timestamp })
25
+
26
+ wait_for { @received_payload }
27
+ wait_for { @received_timestamp }
28
+
29
+ expect(@received_payload).to eq(expected_payload)
30
+ expect(@received_timestamp.to_i).to eq(publish_timestamp)
31
+ end
32
+
33
+ it 'receives message with nil timestamp when timestamp is not published' do
34
+ received_timestamp = 0
35
+ freddy.tap_into('pattern.*', exchange_name: topic) do |_payload, _routing_key, timestamp|
36
+ received_timestamp = timestamp
37
+ end
38
+
39
+ channel.topic(topic).publish(message_payload, { routing_key: 'pattern.random' })
40
+ default_sleep
41
+
42
+ expect(received_timestamp).to eq(nil)
43
+ end
44
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freddy
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Glia TechMovers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-17 00:00:00.000000000 Z
11
+ date: 2023-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -176,6 +176,7 @@ files:
176
176
  - spec/freddy/sync_response_container_spec.rb
177
177
  - spec/integration/concurrency_spec.rb
178
178
  - spec/integration/reply_spec.rb
179
+ - spec/integration/tap_into_with_exchange_spec.rb
179
180
  - spec/integration/tap_into_with_group_spec.rb
180
181
  - spec/integration/tracing_spec.rb
181
182
  - spec/spec_helper.rb