kicks 3.1.0 → 3.2.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: b553911947a5b50df9d2576610c02c448873a359bf8641116c3bdaeb10539fd4
4
- data.tar.gz: 8fd78e33555ba42a001781c204ca22e9e875a22d96eb53374dcc1a3d0af2ac06
3
+ metadata.gz: 7899bb171d5e5399547c0b02c33753e23bc8cfaec63e614baa84cd473448a45d
4
+ data.tar.gz: 3b5b708557aae6c815a2ad23cf86115e5d39ad397cd1e52099ed2e621b26848a
5
5
  SHA512:
6
- metadata.gz: cf96bb1a274d3ad4da6f904c6395156541b750a78d20130226e3404f00f97853a71a0327db11b96193affe54a94217b909600ffb9c9e8527c3bcb5b88e51590b
7
- data.tar.gz: 0244cdda5904875397992237239b67649c6c4ef2affb0962a040d8f06849549b816a371280ef870fb04e16db9c768b948c8b96196e75337c3303131b5c333122
6
+ metadata.gz: 57565fbb9e74e4b990f62e482293ff41cdffebb0b75875b4c654a34e4bb6ed037e2cc9305f15c1c6920e789749a484403badbc2f7aad58b811d614b0d2e51080
7
+ data.tar.gz: e6516ab5c10e167a1e94b0a80f82b68dbe330be53603d4cc7132104e0827f013c3cc930b1f3fe2ecc5f2f65a6cbf140707ccd3bd709fbae5ae0eae0747e2b8d7
data/ChangeLog.md CHANGED
@@ -1,8 +1,29 @@
1
1
  # Change Log
2
2
 
3
- ## Changes Between 3.1.0 and 3.2.0 (in development)
3
+ ## Changes Between 3.2.0 and 3.3.0 (in development)
4
4
 
5
- No changes yet.
5
+ No (documented) changes yet.
6
+
7
+
8
+ ## Changes Between 3.1.0 and 3.2.0 (Jan 26, 2025)
9
+
10
+ ### Improved Support for Bring-Your-Own-Connection (BYOC)
11
+
12
+ Kicks now supports a callable (e.g. a proc) to be passed for an externally-initialized
13
+ and managed Bunny connection. In this case, it is entirely up to the caller
14
+ to configure the connection and call `Bunny::Session#start` on it
15
+ at the right moment.
16
+
17
+ Contributed by @tie.
18
+
19
+ GitHub issue: [#29](https://github.com/ruby-amqp/kicks/pull/29)
20
+
21
+
22
+ ### ActiveJob Adapter Compatibility with Ruby on Rails Older Than 7.2
23
+
24
+ Contributed by @dixpac.
25
+
26
+ GitHub issues: [#19](https://github.com/ruby-amqp/kicks/pull/19), [#28](https://github.com/ruby-amqp/kicks/pull/28)
6
27
 
7
28
 
8
29
  ## Changes Between 3.0.0 and 3.1.0 (Oct 20, 2024)
data/README.md CHANGED
@@ -212,5 +212,6 @@ See [LICENSE](LICENSE.txt) for further details.
212
212
 
213
213
  ## Copyright
214
214
 
215
- Copyright (c) 2023-2024 Kicks contributors
215
+ Copyright (c) 2023-2024 Kicks contributors.
216
+
216
217
  Copyright (c) 2015-2023 [Dotan Nahum](http://gplus.to/dotan) [@jondot](http://twitter.com/jondot).
data/kicks.gemspec CHANGED
@@ -31,8 +31,8 @@ Gem::Specification.new do |gem|
31
31
  gem.add_dependency 'rake', '>= 12.3', '< 14.0'
32
32
 
33
33
  # for integration environment (see .travis.yml and integration_spec)
34
- gem.add_development_dependency 'activejob', '>= 7.1'
35
- gem.add_development_dependency 'activesupport', '>= 7.1'
34
+ gem.add_development_dependency 'activejob', '>= 7.2'
35
+ gem.add_development_dependency 'activesupport', '>= 7.2'
36
36
  gem.add_development_dependency 'rabbitmq_http_api_client'
37
37
  gem.add_development_dependency 'redis'
38
38
 
@@ -1,14 +1,14 @@
1
1
  module ActiveJob
2
2
  module QueueAdapters
3
- # Explicitly remove the implementation existing in older rails'.
4
- remove_const(:SneakersAdapter) if defined?(:SneakersAdapter)
3
+ # Explicitly remove the implementation existing in older Rails versions'.
4
+ remove_const(:SneakersAdapter) if const_defined?(:SneakersAdapter)
5
5
 
6
6
  # = Sneakers adapter for Active Job
7
7
  #
8
8
  # To use Sneakers set the queue_adapter config to +:sneakers+.
9
9
  #
10
10
  # Rails.application.config.active_job.queue_adapter = :sneakers
11
- class SneakersAdapter < ::ActiveJob::QueueAdapters::AbstractAdapter
11
+ class SneakersAdapter
12
12
  def initialize
13
13
  @monitor = Monitor.new
14
14
  end
@@ -5,7 +5,7 @@ module Sneakers
5
5
  class Configuration
6
6
 
7
7
  extend Forwardable
8
- def_delegators :@hash, :to_hash, :[], :[]=, :==, :fetch, :delete, :has_key?
8
+ def_delegators :@hash, :to_hash, :[], :[]=, :==, :fetch, :delete, :has_key?, :dig
9
9
 
10
10
  EXCHANGE_OPTION_DEFAULTS = {
11
11
  :type => :direct,
@@ -84,8 +84,12 @@ module Sneakers
84
84
 
85
85
  def self.configure_queue(name, opts)
86
86
  retry_name = opts.fetch(:retry_exchange, "#{name}-retry")
87
- opt_args = opts[:queue_options][:arguments] ? opts[:queue_options][:arguments].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} : {}
88
- opts[:queue_options][:arguments] = { :'x-dead-letter-exchange' => retry_name }.merge(opt_args)
87
+ opt_args = if opts.dig(:queue_options, :arguments).blank?
88
+ {}
89
+ else
90
+ opts.dig(:queue_options, :arguments).transform_keys(&:to_sym)
91
+ end
92
+ opts[:queue_options][:arguments] = { :'x-dead-letter-exchange' => retry_name }.merge!(opt_args)
89
93
  opts[:queue_options]
90
94
  end
91
95
 
@@ -6,9 +6,6 @@ module Sneakers
6
6
  def initialize(opts = {})
7
7
  @mutex = Mutex.new
8
8
  @opts = Sneakers::CONFIG.merge(opts)
9
- # If we've already got a bunny object, use it. This allows people to
10
- # specify all kinds of options we don't need to know about (e.g. for ssl).
11
- @bunny = @opts[:connection]
12
9
  end
13
10
 
14
11
  def publish(msg, options = {})
@@ -29,8 +26,15 @@ module Sneakers
29
26
 
30
27
  private
31
28
  def connect!
32
- @bunny ||= create_bunny_connection
33
- @bunny.start
29
+ # If we've already got a bunny object, use it. This allows people to
30
+ # specify all kinds of options we don't need to know about (e.g. for ssl).
31
+ @bunny = @opts[:connection]
32
+ if @bunny.respond_to?(:call)
33
+ @bunny = @bunny.call
34
+ else
35
+ @bunny ||= create_bunny_connection
36
+ @bunny.start
37
+ end
34
38
  @channel = @bunny.create_channel
35
39
  @exchange = @channel.exchange(@opts[:exchange], **@opts[:exchange_options])
36
40
  end
@@ -19,8 +19,12 @@ class Sneakers::Queue
19
19
  # If we've already got a bunny object, use it. This allows people to
20
20
  # specify all kinds of options we don't need to know about (e.g. for ssl).
21
21
  @bunny = @opts[:connection]
22
- @bunny ||= create_bunny_connection
23
- @bunny.start
22
+ if @bunny.respond_to?(:call)
23
+ @bunny = @bunny.call
24
+ else
25
+ @bunny ||= create_bunny_connection
26
+ @bunny.start
27
+ end
24
28
 
25
29
  @channel = @bunny.create_channel
26
30
  @channel.prefetch(@opts[:prefetch])
@@ -1,3 +1,3 @@
1
1
  module Sneakers
2
- VERSION = "3.1.0"
2
+ VERSION = "3.2.0"
3
3
  end
@@ -122,19 +122,44 @@ describe Sneakers::Publisher do
122
122
  durable: false
123
123
  )
124
124
  @existing_session = existing_session
125
+ @exchange = exchange
126
+ @channel = channel
125
127
  end
126
128
 
127
- it 'can handle an existing connection that is offline' do
129
+ it 'can handle an existing connection object' do
128
130
  p = Sneakers::Publisher.new
129
131
  p.publish('test msg', my_vars)
130
132
  _(p.instance_variable_get(:@bunny)).must_equal @existing_session
131
133
  end
132
134
 
135
+ it 'can handle an existing connection function' do
136
+ @existing_session.start
137
+ p = Sneakers::Publisher.new(connection: ->() { @existing_session })
138
+ p.publish('test msg', my_vars)
139
+ _(p.instance_variable_get(:@bunny)).must_equal @existing_session
140
+ end
141
+
133
142
  it 'can handle an existing connection that is online' do
143
+ p = Sneakers::Publisher.new
144
+ p.publish('test msg', my_vars)
145
+ _(p.instance_variable_get(:@bunny)).must_equal @existing_session
134
146
  mock(@existing_session).connected? { true }
147
+ mock(@exchange).publish('test msg 2', my_vars)
148
+ p.publish('test msg 2', my_vars)
149
+ end
150
+
151
+ it 'can handle an existing connection that goes offline' do
135
152
  p = Sneakers::Publisher.new
136
153
  p.publish('test msg', my_vars)
137
154
  _(p.instance_variable_get(:@bunny)).must_equal @existing_session
155
+ mock(@existing_session).connected? { false }
156
+ mock(@existing_session).start
157
+ mock(@existing_session).create_channel { @channel }
158
+ mock(@channel).exchange('another_exchange', type: :topic, durable: false, :auto_delete => false, arguments: { 'x-arg' => 'value' }) do
159
+ @exchange
160
+ end
161
+ mock(@exchange).publish('test msg 2', my_vars)
162
+ p.publish('test msg 2', my_vars)
138
163
  end
139
164
  end
140
165
 
@@ -150,19 +150,24 @@ describe Sneakers::Queue do
150
150
  :type => :direct,
151
151
  :durable => true,
152
152
  :arguments => { 'x-arg' => 'value' }){ @mkex }
153
-
154
- queue_name = 'foo'
155
- mock(@mkchan).queue(queue_name, :durable => true) { @mkqueue }
156
- mock(@mkqueue).bind(@mkex, :routing_key => queue_name)
153
+ mock(@mkchan).queue('foo', :durable => true) { @mkqueue }
154
+ mock(@mkqueue).bind(@mkex, :routing_key => 'foo')
157
155
  mock(@mkqueue).subscribe(:block => false, :manual_ack => true)
158
-
159
- my_vars = queue_vars.merge(:connection => @external_connection)
160
- @q = Sneakers::Queue.new(queue_name, my_vars)
161
156
  end
162
157
 
163
158
  it 'uses that object' do
164
- @q.subscribe(@mkworker)
165
- _(@q.instance_variable_get(:@bunny)).must_equal @external_connection
159
+ q = Sneakers::Queue.new('foo',
160
+ queue_vars.merge(:connection => @external_connection))
161
+ q.subscribe(@mkworker)
162
+ _(q.instance_variable_get(:@bunny)).must_equal @external_connection
163
+ end
164
+
165
+ it 'uses that function' do
166
+ @external_connection.start
167
+ q = Sneakers::Queue.new('foo',
168
+ queue_vars.merge(:connection => ->() { @external_connection }))
169
+ q.subscribe(@mkworker)
170
+ _(q.instance_variable_get(:@bunny)).must_equal @external_connection
166
171
  end
167
172
  end
168
173
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kicks
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dotan Nahum
8
8
  - Michael Klishin
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2024-10-21 00:00:00.000000000 Z
11
+ date: 2025-01-26 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: serverengine
@@ -93,28 +92,28 @@ dependencies:
93
92
  requirements:
94
93
  - - ">="
95
94
  - !ruby/object:Gem::Version
96
- version: '7.1'
95
+ version: '7.2'
97
96
  type: :development
98
97
  prerelease: false
99
98
  version_requirements: !ruby/object:Gem::Requirement
100
99
  requirements:
101
100
  - - ">="
102
101
  - !ruby/object:Gem::Version
103
- version: '7.1'
102
+ version: '7.2'
104
103
  - !ruby/object:Gem::Dependency
105
104
  name: activesupport
106
105
  requirement: !ruby/object:Gem::Requirement
107
106
  requirements:
108
107
  - - ">="
109
108
  - !ruby/object:Gem::Version
110
- version: '7.1'
109
+ version: '7.2'
111
110
  type: :development
112
111
  prerelease: false
113
112
  version_requirements: !ruby/object:Gem::Requirement
114
113
  requirements:
115
114
  - - ">="
116
115
  - !ruby/object:Gem::Version
117
- version: '7.1'
116
+ version: '7.2'
118
117
  - !ruby/object:Gem::Dependency
119
118
  name: rabbitmq_http_api_client
120
119
  requirement: !ruby/object:Gem::Requirement
@@ -343,7 +342,6 @@ licenses:
343
342
  - MIT
344
343
  metadata:
345
344
  source_code_uri: https://github.com/ruby-amqp/kicks
346
- post_install_message:
347
345
  rdoc_options: []
348
346
  require_paths:
349
347
  - lib
@@ -358,8 +356,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
358
356
  - !ruby/object:Gem::Version
359
357
  version: '0'
360
358
  requirements: []
361
- rubygems_version: 3.5.22
362
- signing_key:
359
+ rubygems_version: 3.6.2
363
360
  specification_version: 4
364
361
  summary: Fast background processing framework for Ruby and RabbitMQ
365
362
  test_files: