kicks 3.1.1 → 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: 5ccc9ea63784a73fbeddcce04080502702a7313867998bd41ef1322654a97a88
4
- data.tar.gz: f986416420a86a75817fa8ae44750543349b19d1cce5db162d68da9c7d261f8f
3
+ metadata.gz: 7899bb171d5e5399547c0b02c33753e23bc8cfaec63e614baa84cd473448a45d
4
+ data.tar.gz: 3b5b708557aae6c815a2ad23cf86115e5d39ad397cd1e52099ed2e621b26848a
5
5
  SHA512:
6
- metadata.gz: ff97a24291dde8fb237d6e54318de1dfdf53a40361dc4172ec117a93027ffc49082e5c041a46617c628073004367985cfc866be356e7592e6fd5913e57ac2a1c
7
- data.tar.gz: 819e52775f26c55fede5697467cd7154db41e5ce86f7e00eddeb260e8b1f0e922688bb241b4c71e08fb0a17f98541989fa23963867fd4cbaab6d8f7f2a20339c
6
+ metadata.gz: 57565fbb9e74e4b990f62e482293ff41cdffebb0b75875b4c654a34e4bb6ed037e2cc9305f15c1c6920e789749a484403badbc2f7aad58b811d614b0d2e51080
7
+ data.tar.gz: e6516ab5c10e167a1e94b0a80f82b68dbe330be53603d4cc7132104e0827f013c3cc930b1f3fe2ecc5f2f65a6cbf140707ccd3bd709fbae5ae0eae0747e2b8d7
data/ChangeLog.md CHANGED
@@ -1,12 +1,29 @@
1
1
  # Change Log
2
2
 
3
- ## Changes Between 3.1.0 and 3.1.1 (Nov 1, 2024)
3
+ ## Changes Between 3.2.0 and 3.3.0 (in development)
4
+
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
+
4
21
 
5
22
  ### ActiveJob Adapter Compatibility with Ruby on Rails Older Than 7.2
6
23
 
7
24
  Contributed by @dixpac.
8
25
 
9
- GitHub issue: [#19](https://github.com/ruby-amqp/kicks/pull/19)
26
+ GitHub issues: [#19](https://github.com/ruby-amqp/kicks/pull/19), [#28](https://github.com/ruby-amqp/kicks/pull/28)
10
27
 
11
28
 
12
29
  ## Changes Between 3.0.0 and 3.1.0 (Oct 20, 2024)
@@ -15,7 +32,7 @@ GitHub issue: [#19](https://github.com/ruby-amqp/kicks/pull/19)
15
32
 
16
33
  Kicks now ships with an ActiveJob adapter for Ruby on Rails.
17
34
 
18
- Contributed by @dixpac.
35
+ Contributed by dixpac.
19
36
 
20
37
  GitHub issue: [#12](https://github.com/ruby-amqp/kicks/pull/12)
21
38
 
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).
@@ -1,39 +1,37 @@
1
- if defined?(ActiveJob) && ActiveJob.version >= "7.2"
2
- module ActiveJob
3
- module QueueAdapters
4
- # Explicitly remove the implementation existing in older Rails versions'.
5
- remove_const(:SneakersAdapter) if defined?("::#{name}::SneakersAdapter")
1
+ module ActiveJob
2
+ module QueueAdapters
3
+ # Explicitly remove the implementation existing in older Rails versions'.
4
+ remove_const(:SneakersAdapter) if const_defined?(:SneakersAdapter)
6
5
 
7
- # = Sneakers adapter for Active Job
8
- #
9
- # To use Sneakers set the queue_adapter config to +:sneakers+.
10
- #
11
- # Rails.application.config.active_job.queue_adapter = :sneakers
12
- class SneakersAdapter < ::ActiveJob::QueueAdapters::AbstractAdapter
13
- def initialize
14
- @monitor = Monitor.new
15
- end
6
+ # = Sneakers adapter for Active Job
7
+ #
8
+ # To use Sneakers set the queue_adapter config to +:sneakers+.
9
+ #
10
+ # Rails.application.config.active_job.queue_adapter = :sneakers
11
+ class SneakersAdapter
12
+ def initialize
13
+ @monitor = Monitor.new
14
+ end
16
15
 
17
- def enqueue(job)
18
- @monitor.synchronize do
19
- JobWrapper.from_queue job.queue_name
20
- JobWrapper.enqueue ActiveSupport::JSON.encode(job.serialize)
21
- end
16
+ def enqueue(job)
17
+ @monitor.synchronize do
18
+ JobWrapper.from_queue job.queue_name
19
+ JobWrapper.enqueue ActiveSupport::JSON.encode(job.serialize)
22
20
  end
21
+ end
23
22
 
24
- def enqueue_at(job, timestamp)
25
- raise NotImplementedError, 'This queueing backend does not support scheduling jobs.'
26
- end
23
+ def enqueue_at(job, timestamp)
24
+ raise NotImplementedError, 'This queueing backend does not support scheduling jobs.'
25
+ end
27
26
 
28
- class JobWrapper
29
- include Sneakers::Worker
30
- from_queue 'default'
27
+ class JobWrapper
28
+ include Sneakers::Worker
29
+ from_queue 'default'
31
30
 
32
- def work(msg)
33
- job_data = ActiveSupport::JSON.decode(msg)
34
- Base.execute job_data
35
- ack!
36
- end
31
+ def work(msg)
32
+ job_data = ActiveSupport::JSON.decode(msg)
33
+ Base.execute job_data
34
+ ack!
37
35
  end
38
36
  end
39
37
  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.1"
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.1
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-11-01 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
@@ -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: