sbmt-kafka_producer 3.2.3 → 3.3.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: 0f09eab62f9257e3866e80b90effed91c846d30653948ee74c54f3f1ef6a5d72
4
- data.tar.gz: d318af26889f8e7290782fd38340d24affcb49e49f829583a00dd1c6ec9e6404
3
+ metadata.gz: 1a04ccdd7308cf1a7971c783903dea73ed8fd199aa8def03ee953950f971162f
4
+ data.tar.gz: 349c6ee6e866e7d4f2d3a506e7873360d140f9fe12050fc106a9741984ebfbc4
5
5
  SHA512:
6
- metadata.gz: 24451fe6bde64c82daede5de904521718dba02235782827ac6bf063b89ffb2cbea87fe5cb37a2d1c176f073dedf06d2d6929ee7b9631a8ffd971f1985ee360f5
7
- data.tar.gz: 951cb140c2d063e50b50983ff5ed53f8030ed91fde4a1b9e3f66cc311b280a213f7c08e5b0e23d53ecd8923e3dbe2117d8a3979b7b736dd4f7e604c01efb7640
6
+ metadata.gz: 1e14803c9daf5acbe662e889a84594d059031a904987cc8c3485ce4ae0a5c8d175e479f1f1629ad5d89c3756821c6df3065688aa6787916ec6eefbd7d49b2302
7
+ data.tar.gz: 47165c0cffbd72225574c80846e108a0c3d6a7ecc267348f4adbef1f999bdbfb950cdc5edac153301ea731b224fdfc8da8f08bffb94fbd9ffa6ab738cd13af90
data/.rubocop.yml CHANGED
@@ -20,9 +20,6 @@ AllCops:
20
20
  TargetRubyVersion: 2.7
21
21
  TargetRailsVersion: 6.0
22
22
 
23
- RSpec/FilePath:
24
- Enabled: false
25
-
26
23
  RSpec/VerifiedDoubles:
27
24
  Exclude:
28
25
  - spec/**/*_spec.rb
@@ -32,3 +29,7 @@ Style/SingleLineMethods:
32
29
 
33
30
  Style/EmptyMethod:
34
31
  Enabled: false
32
+
33
+ Rails/Exit:
34
+ Exclude:
35
+ - spec/rails_helper.rb
data/CHANGELOG.md CHANGED
@@ -13,6 +13,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
13
13
 
14
14
  ### Fixed
15
15
 
16
+ ## [3.3.0] - 2025-12-05
17
+
18
+ ### Added
19
+
20
+ - Added option `middlewares` to add middleware when producing a message
21
+
16
22
  ## [3.2.3] - 2025-04-02
17
23
 
18
24
  ### Fixed
data/README.md CHANGED
@@ -153,6 +153,32 @@ outbox_items:
153
153
  kafka: # optional kafka options
154
154
  required_acks: -1
155
155
  ```
156
+ ## Middlewares
157
+
158
+ Middleware is code configured to run before/after a message is produced.
159
+
160
+ To add middleware, specify it in the configuration
161
+
162
+ ```ruby
163
+ # config/initializers/kafka_producer.rb
164
+
165
+ Sbmt::KafkaProducer.middlewares.push(
166
+ MyMiddleware
167
+ )
168
+
169
+ # path/to/middlewares
170
+
171
+ class MyMiddleware
172
+ def call(payload, options)
173
+ "Before producing"
174
+ result = yield
175
+ "After producing"
176
+
177
+ result
178
+ end
179
+ end
180
+ ```
181
+ ⚠️ note the method must return the result
156
182
 
157
183
  ## Usage
158
184
 
@@ -8,12 +8,13 @@ module Sbmt
8
8
  MSG_SUCCESS = "Message has been successfully sent to Kafka"
9
9
 
10
10
  option :client, default: -> { KafkaClientFactory.default_client }
11
+ option :middlewares, default: -> { Sbmt::KafkaProducer.middlewares }
11
12
  option :topic
12
13
 
13
14
  def sync_publish!(payload, options = {})
14
15
  report, produce_duration = around_publish do
15
16
  measure_time do
16
- client.produce_sync(payload: payload, **options.merge(topic: topic))
17
+ do_produce(:sync, payload, options.merge(topic: topic))
17
18
  end
18
19
  end
19
20
  log_success(report, produce_duration)
@@ -30,7 +31,7 @@ module Sbmt
30
31
 
31
32
  def async_publish!(payload, options = {})
32
33
  around_publish do
33
- client.produce_async(payload: payload, **options.merge(topic: topic))
34
+ do_produce(:async, payload, options.merge(topic: topic))
34
35
  end
35
36
  true
36
37
  end
@@ -45,6 +46,35 @@ module Sbmt
45
46
 
46
47
  private
47
48
 
49
+ def do_produce(type, payload, options)
50
+ call_middlewares(type, payload, options) do
51
+ if type == :sync
52
+ client.produce_sync(payload: payload, **options)
53
+ else
54
+ client.produce_async(payload: payload, **options)
55
+ end
56
+ end
57
+ end
58
+
59
+ def call_middlewares(type, payload, options)
60
+ return yield if middlewares.empty?
61
+
62
+ chain = middlewares.map { |middleware_class| middleware_class.new }
63
+
64
+ traverse_chain = proc do
65
+ if chain.empty?
66
+ yield
67
+ else
68
+ chain.shift.call(
69
+ payload,
70
+ options.deep_dup.merge(producing_type: type),
71
+ &traverse_chain
72
+ )
73
+ end
74
+ end
75
+ traverse_chain.call
76
+ end
77
+
48
78
  def logger
49
79
  ::Sbmt::KafkaProducer.logger
50
80
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sbmt
4
4
  module KafkaProducer
5
- VERSION = "3.2.3"
5
+ VERSION = "3.3.0"
6
6
  end
7
7
  end
@@ -18,6 +18,10 @@ module Sbmt
18
18
  def logger
19
19
  @logger ||= Logger.new
20
20
  end
21
+
22
+ def middlewares
23
+ @middlewares ||= []
24
+ end
21
25
  end
22
26
  class Error < StandardError; end
23
27
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sbmt-kafka_producer
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.3
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kuper Ruby-Platform Team
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2025-04-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: anyway_config
@@ -354,7 +353,6 @@ dependencies:
354
353
  version: '1.12'
355
354
  description: This gem is used for producing Kafka messages. It represents a wrapper
356
355
  over Waterdrop gem and is recommended for using as a transport with sbmt-outbox
357
- email:
358
356
  executables: []
359
357
  extensions: []
360
358
  extra_rdoc_files: []
@@ -411,7 +409,6 @@ metadata:
411
409
  source_code_uri: https://github.com/Kuper-Tech/sbmt-kafka_producer
412
410
  changelog_uri: https://github.com/Kuper-Tech/sbmt-kafka_producer/blob/master/CHANGELOG.md
413
411
  rubygems_mfa_required: 'false'
414
- post_install_message:
415
412
  rdoc_options: []
416
413
  require_paths:
417
414
  - lib
@@ -426,8 +423,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
426
423
  - !ruby/object:Gem::Version
427
424
  version: '0'
428
425
  requirements: []
429
- rubygems_version: 3.3.7
430
- signing_key:
426
+ rubygems_version: 3.6.9
431
427
  specification_version: 4
432
428
  summary: Ruby gem for producing Kafka messages
433
429
  test_files: []