freddy 2.9.0 → 2.11.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: d37275d237bbe49c30c6ad3c93e40b30d9b3dc631d8f8156ec1812b051010c52
4
- data.tar.gz: 242f0523cb85e38ed9d295f2c99dc1668b8727fb5246fde4464018160796dfc7
3
+ metadata.gz: 0a0e451c899d3459fd4829f99e633035fa7e9c5499d0b30719b542557cb741cc
4
+ data.tar.gz: 9524f49be933a3f4b664111e8e06120e12bae0498379c2b8fb49820a90109404
5
5
  SHA512:
6
- metadata.gz: 9eabd4eb896cadfc8d43a64e4092b59ee7248b6d58e2674819951e478de8257f4e5ab4ccbffad7a0e1ca1ef3009f56a83a303fbc269711ad8fd2678ff5935606
7
- data.tar.gz: 3572bf85e93a9a741b6366c4fcd6c9634c4487b5a3254b8a8960947393f9dc92676d084b0a98f18feb3ed5c2fe36a39415d58fb2027be146acfdf68f2c637a0e
6
+ metadata.gz: 7af1a8a054e2fa285939f94b6dc696b249a6c83a0659802cd60fb88dea6e1aa067bf2dbd22b09a7cbfb75e3c0e579535801f9f10849f90302211f9d60847d96b
7
+ data.tar.gz: 11eeba115b4677a1523c95f365ce4cd87a1e5c33d649b7a548effb0a2760b1d43c2f1778e38fafa2ba2ab4007db075d13e6846d78cf5df4f18ef79aca862e67d
@@ -14,7 +14,7 @@ jobs:
14
14
  ruby-version: ['3.2']
15
15
  services:
16
16
  rabbitmq:
17
- image: public.ecr.aws/docker/library/rabbitmq:3.13.7
17
+ image: public.ecr.aws/docker/library/rabbitmq:4.0
18
18
  ports:
19
19
  - 5672:5672
20
20
  options: --health-cmd "rabbitmqctl node_health_check" --health-interval 10s --health-timeout 5s --health-retries 5
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.3.6
1
+ 3.3.8
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- freddy (2.9.0)
5
- bunny (~> 2.11)
4
+ freddy (2.11.0)
5
+ bunny (~> 2.24)
6
6
  concurrent-ruby (~> 1.0)
7
7
  oj (~> 3.6)
8
8
  opentelemetry-api (~> 1.0)
@@ -19,7 +19,7 @@ GEM
19
19
  amq-protocol (~> 2.3)
20
20
  sorted_set (~> 1, >= 1.0.2)
21
21
  coderay (1.1.3)
22
- concurrent-ruby (1.3.1)
22
+ concurrent-ruby (1.3.5)
23
23
  diff-lcs (1.4.4)
24
24
  hamster (3.0.0)
25
25
  concurrent-ruby (~> 1.0)
@@ -29,7 +29,7 @@ GEM
29
29
  oj (3.16.10)
30
30
  bigdecimal (>= 3.0)
31
31
  ostruct (>= 0.2)
32
- opentelemetry-api (1.1.0)
32
+ opentelemetry-api (1.5.0)
33
33
  opentelemetry-common (0.19.6)
34
34
  opentelemetry-api (~> 1.0)
35
35
  opentelemetry-registry (0.2.0)
@@ -39,7 +39,7 @@ GEM
39
39
  opentelemetry-common (~> 0.19.3)
40
40
  opentelemetry-registry (~> 0.2)
41
41
  opentelemetry-semantic_conventions
42
- opentelemetry-semantic_conventions (1.10.0)
42
+ opentelemetry-semantic_conventions (1.11.0)
43
43
  opentelemetry-api (~> 1.0)
44
44
  ostruct (0.6.1)
45
45
  parallel (1.26.3)
@@ -107,4 +107,4 @@ DEPENDENCIES
107
107
  rubocop-rspec (~> 3.3)
108
108
 
109
109
  BUNDLED WITH
110
- 2.3.9
110
+ 2.5.22
data/freddy.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.require_paths = ['lib']
19
19
 
20
- spec.add_dependency 'bunny', '~> 2.11'
20
+ spec.add_dependency 'bunny', '~> 2.24'
21
21
  spec.add_dependency 'concurrent-ruby', '~> 1.0'
22
22
  spec.add_dependency 'oj', '~> 3.6'
23
23
  spec.add_dependency 'opentelemetry-api', '~> 1.0'
@@ -7,11 +7,12 @@ class Freddy
7
7
  new(**attrs).consume(&)
8
8
  end
9
9
 
10
- def initialize(thread_pool:, destination:, channel:, handler_adapter_factory:)
10
+ def initialize(thread_pool:, destination:, channel:, handler_adapter_factory:, options:)
11
11
  @consume_thread_pool = thread_pool
12
12
  @destination = destination
13
13
  @channel = channel
14
14
  @handler_adapter_factory = handler_adapter_factory
15
+ @options = options
15
16
  end
16
17
 
17
18
  def consume
@@ -28,7 +29,9 @@ class Freddy
28
29
  private
29
30
 
30
31
  def consume_from_destination(&block)
31
- @channel.queue(@destination).subscribe(manual_ack: true) do |delivery|
32
+ @channel.queue(
33
+ @destination, durable: durable?, no_declare: no_declare?
34
+ ).subscribe(manual_ack: true) do |delivery|
32
35
  process_message(delivery, &block)
33
36
  end
34
37
  end
@@ -42,6 +45,14 @@ class Freddy
42
45
  @channel.acknowledge(delivery.tag, false)
43
46
  end
44
47
  end
48
+
49
+ def durable?
50
+ @options.fetch(:durable, true)
51
+ end
52
+
53
+ def no_declare?
54
+ @options.fetch(:no_declare, Freddy::DEFAULT_NO_DECLARE)
55
+ end
45
56
  end
46
57
  end
47
58
  end
@@ -12,8 +12,6 @@ class Freddy
12
12
  @patterns = patterns
13
13
  @channel = channel
14
14
  @options = options
15
-
16
- raise 'Do not use durable queues without specifying a group' if durable? && !group
17
15
  end
18
16
 
19
17
  def consume(&block)
@@ -33,7 +31,7 @@ class Freddy
33
31
 
34
32
  queue =
35
33
  if group
36
- @channel.queue("groups.#{group}", durable: durable?)
34
+ @channel.queue("groups.#{group}", durable: durable?, no_declare: no_declare?)
37
35
  else
38
36
  @channel.queue('', exclusive: true)
39
37
  end
@@ -70,7 +68,11 @@ class Freddy
70
68
  end
71
69
 
72
70
  def durable?
73
- @options.fetch(:durable, false)
71
+ @options.fetch(:durable, true)
72
+ end
73
+
74
+ def no_declare?
75
+ @options.fetch(:no_declare, Freddy::DEFAULT_NO_DECLARE)
74
76
  end
75
77
 
76
78
  def on_exception
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Freddy
4
- VERSION = '2.9.0'
4
+ VERSION = '2.11.0'
5
5
  end
data/lib/freddy.rb CHANGED
@@ -12,6 +12,7 @@ Dir["#{File.dirname(__FILE__)}/freddy/*.rb"].each(&method(:require))
12
12
  class Freddy
13
13
  FREDDY_TOPIC_EXCHANGE_NAME = 'freddy-topic'
14
14
  DEFAULT_MAX_CONCURRENCY = 4
15
+ DEFAULT_NO_DECLARE = false
15
16
 
16
17
  # Creates a new freddy instance
17
18
  #
@@ -24,14 +25,17 @@ class Freddy
24
25
  # @option config [String] :user ('guest')
25
26
  # @option config [String] :pass ('guest')
26
27
  # @option config [Integer] :max_concurrency (4)
28
+ # @option config [Boolean] :no_declare (false)
27
29
  #
28
30
  # @return [Freddy]
29
31
  #
30
32
  # @example
31
33
  # Freddy.build(Logger.new($stdout), user: 'thumper', pass: 'howdy')
32
- def self.build(logger = Logger.new($stdout), max_concurrency: DEFAULT_MAX_CONCURRENCY, **config)
34
+ def self.build(
35
+ logger = Logger.new($stdout), max_concurrency: DEFAULT_MAX_CONCURRENCY, no_declare: DEFAULT_NO_DECLARE, **config
36
+ )
33
37
  connection = Adapters.determine.connect(config)
34
- new(connection, logger, max_concurrency)
38
+ new(connection, logger, max_concurrency, no_declare)
35
39
  end
36
40
 
37
41
  # @private
@@ -39,10 +43,11 @@ class Freddy
39
43
  @tracer ||= OpenTelemetry.tracer_provider.tracer('freddy', Freddy::VERSION)
40
44
  end
41
45
 
42
- def initialize(connection, logger, max_concurrency)
46
+ def initialize(connection, logger, max_concurrency, no_declare)
43
47
  @connection = connection
44
48
  @logger = logger
45
49
  @prefetch_buffer_size = max_concurrency
50
+ @no_declare = no_declare
46
51
 
47
52
  @send_and_forget_producer = Producers::SendAndForgetProducer.new(
48
53
  connection.create_channel, logger
@@ -77,18 +82,21 @@ class Freddy
77
82
  # handler.error(message: 'Can not do')
78
83
  # end
79
84
  # end
80
- def respond_to(destination, &)
85
+ def respond_to(destination, options = {}, &)
81
86
  @logger.info "Listening for requests on #{destination}"
82
87
 
83
88
  channel = @connection.create_channel(prefetch: @prefetch_buffer_size)
84
89
  producer = Producers::ReplyProducer.new(channel, @logger)
85
90
  handler_adapter_factory = MessageHandlerAdapters::Factory.new(producer)
86
91
 
92
+ options[:no_declare] = options[:no_declare] || @no_declare
93
+
87
94
  Consumers::RespondToConsumer.consume(
88
95
  thread_pool: Concurrent::FixedThreadPool.new(@prefetch_buffer_size),
89
96
  destination: destination,
90
97
  channel: channel,
91
98
  handler_adapter_factory: handler_adapter_factory,
99
+ options: options,
92
100
  &
93
101
  )
94
102
  end
@@ -107,8 +115,9 @@ class Freddy
107
115
  # only one of the listeners in given group will receive a message. All
108
116
  # listeners will receive a message if the group is not specified.
109
117
  # @option options [Boolean] :durable
110
- # Should the consumer queue be durable? Default is `false`. This option can
111
- # be used only in combination with option `:group`.
118
+ # Should the consumer queue be durable? Default is `nil` - let server decide.
119
+ # This option can be used only in combination with option `:group`.
120
+ # Note that queues *must be durable* with "quorum" queue types.
112
121
  # @option options [Boolean] :on_exception
113
122
  # Defines consumer's behaviour when the callback fails to process a message
114
123
  # and raises an exception. Can be one of `:ack`, `:reject` or `:requeue`.
@@ -135,6 +144,8 @@ class Freddy
135
144
  def tap_into(pattern_or_patterns, options = {}, &)
136
145
  @logger.debug "Tapping into messages that match #{pattern_or_patterns}"
137
146
 
147
+ options[:no_declare] = options[:no_declare] || @no_declare
148
+
138
149
  Consumers::TapIntoConsumer.consume(
139
150
  thread_pool: Concurrent::FixedThreadPool.new(@prefetch_buffer_size),
140
151
  patterns: Array(pattern_or_patterns),
@@ -6,7 +6,8 @@ describe Freddy::Consumers::RespondToConsumer do
6
6
  thread_pool: thread_pool,
7
7
  destination: destination,
8
8
  channel: channel,
9
- handler_adapter_factory: msg_handler_adapter_factory
9
+ handler_adapter_factory: msg_handler_adapter_factory,
10
+ options: options
10
11
  )
11
12
  end
12
13
 
@@ -17,6 +18,7 @@ describe Freddy::Consumers::RespondToConsumer do
17
18
  let(:msg_handler_adapter) { Freddy::MessageHandlerAdapters::NoOpHandler.new }
18
19
  let(:prefetch_buffer_size) { 2 }
19
20
  let(:thread_pool) { Concurrent::FixedThreadPool.new(prefetch_buffer_size) }
21
+ let(:options) { { durable: false } }
20
22
 
21
23
  after do
22
24
  connection.close
@@ -11,11 +11,6 @@ describe 'Tapping into with group identifier' do
11
11
 
12
12
  after { [deliverer, responder1, responder2].each(&:close) }
13
13
 
14
- it 'raises an exception if option :durable is provided without group' do
15
- expect { responder1.tap_into(destination, durable: true) }
16
- .to raise_error(RuntimeError)
17
- end
18
-
19
14
  it 'receives a message once' do
20
15
  msg_counter = Hamster::MutableSet[]
21
16
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: freddy
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.0
4
+ version: 2.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Glia TechMovers
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '2.11'
18
+ version: '2.24'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '2.11'
25
+ version: '2.24'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: concurrent-ruby
28
28
  requirement: !ruby/object:Gem::Requirement