kicks 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: