spectre-rabbitmq 1.0.3 → 2.0.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/spectre/rabbitmq.rb +76 -74
  3. metadata +27 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb9a0aa9e333b3d5088a6ff5d5f963dccc78e055aac5715aa409e4fe1f4513da
4
- data.tar.gz: c7d2516a0bfa90f144dd05bc0c575cc2cbb96bd9a7d97c4230c3b3b6bd31ad78
3
+ metadata.gz: bb8f90ed30256eef897dff211ff9099b85f8c8dd54edbdb604971e9d8ce2cad8
4
+ data.tar.gz: 6d3842ddeb977dd9b606c905e62e2dfec42de213fdd69d233ec5bdfc7f1ba31e
5
5
  SHA512:
6
- metadata.gz: 3e07714fcae49f6f51604dda155e00397099d807a583c94ecbbfd6104b402f1834ef0cdea8385f39e260e432fe0d8433a77ac77510ba6c5e7013ab8791629ad8
7
- data.tar.gz: e2a0936817a5ee7dbacf97f381fcbe34c9f8db63d4bc00076e1546167970186c05225e6ce2d71a7291576c9e07b22a315bb54136ebcb38974e002bf7c8971889
6
+ metadata.gz: 81c74dacf90d7dd9599e4cc4746a0df61b0be48370b396922a912facad97cfa39d54e59ab0c6c8d596f21b282169078dcb31386ebf88727c92a7ba3fa8da272b
7
+ data.tar.gz: 7989f93e257e70507c02d895a6427ce452aed6cf01cdb27744b73105ad5ffccd212d35a4543f8d9d2bcfe00e880c16f02e31a4d3be3a8430b5e61ac81cfd8c09
@@ -1,18 +1,21 @@
1
- require 'spectre'
2
- require 'spectre/logging'
1
+ require 'logger'
3
2
  require 'ostruct'
4
3
  require 'bunny'
5
4
 
6
-
7
5
  module Spectre
8
6
  module RabbitMQ
9
- class ActionParamsBase < Spectre::DslClass
7
+ PROGNAME = 'spectre/rabbitmq'
8
+
9
+ class ActionParamsBase
10
+ include Spectre::Delegate if defined? Spectre::Delegate
11
+
10
12
  attr_reader :config
11
13
 
12
14
  def initialize config, logger
13
15
  @logger = logger
14
- @config = config.deep_clone
16
+ @config = Marshal.load(Marshal.dump(config))
15
17
  @config['routing_keys'] = []
18
+ @config['log_payload'] = true
16
19
  end
17
20
 
18
21
  def exchange name, type: 'topic', durable: false, auto_delete: false
@@ -25,7 +28,7 @@ module Spectre
25
28
  end
26
29
 
27
30
  def topic name, durable: false, auto_delete: false
28
- exchange(name, type: 'topic', durable: durable, auto_delete: auto_delete)
31
+ exchange(name, type: 'topic', durable:, auto_delete:)
29
32
  end
30
33
 
31
34
  def routing_keys *names
@@ -37,13 +40,13 @@ module Spectre
37
40
  end
38
41
 
39
42
  def no_log!
40
- @config['no_log'] = true
43
+ @config['log_payload'] = false
41
44
  end
42
45
  end
43
46
 
44
47
  class ConsumeActionParams < ActionParamsBase
45
48
  def initialize config, logger
46
- super config, logger
49
+ super
47
50
 
48
51
  @config['queue'] = {
49
52
  'name' => nil,
@@ -54,7 +57,7 @@ module Spectre
54
57
  @config['messages'] = 1
55
58
  end
56
59
 
57
- def queue name, durable: false, auto_delete: false, exclusive: false
60
+ def queue name = '', exclusive: false, durable: false, auto_delete: false
58
61
  @config['queue'] = {
59
62
  'name' => name,
60
63
  'durable' => durable,
@@ -85,11 +88,13 @@ module Spectre
85
88
  @config['reply_to'] = receiver
86
89
  end
87
90
 
88
- alias :body :payload
91
+ alias body payload
89
92
  end
90
93
 
91
- class RabbitMQAction < Spectre::DslClass
92
- attr_reader :conn, :action, :threads, :messages
94
+ class RabbitMQAction
95
+ include Spectre::Delegate if defined? Spectre::Delegate
96
+
97
+ attr_reader :conn, :threads, :messages
93
98
 
94
99
  def initialize config, logger
95
100
  @logger = logger
@@ -133,11 +138,11 @@ module Spectre
133
138
  @config['virtual_host'] = vhost
134
139
  end
135
140
 
136
- def consume &block
141
+ def consume(&)
137
142
  params = ConsumeActionParams.new(@config, @logger)
138
- params.instance_eval(&block)
143
+ params.instance_eval(&)
139
144
 
140
- connect()
145
+ connect
141
146
 
142
147
  channel = @conn.create_channel
143
148
 
@@ -147,40 +152,45 @@ module Spectre
147
152
  params.config['queue']['name'],
148
153
  durable: params.config['queue']['durable'],
149
154
  auto_delete: params.config['queue']['auto_delete'],
150
- exclusive: params.config['queue']['exclusive'],
155
+ exclusive: params.config['queue']['exclusive']
151
156
  )
152
157
 
153
- @logger.info("declare queue name=#{queue.name} durable=#{params.config['queue']['durable']} auto_delete=#{params.config['queue']['auto_delete']} exclusive=#{params.config['queue']['exclusive']}")
158
+ @logger.log(Logger::Severity::INFO,
159
+ "declare queue name=#{queue.name} " \
160
+ "durable=#{params.config['queue']['durable']} " \
161
+ "exclusive=#{params.config['queue']['exclusive']} " \
162
+ "auto_delete=#{params.config['queue']['auto_delete']}",
163
+ PROGNAME)
154
164
 
155
165
  params.config['routing_keys'].each do |routing_key|
156
- queue.bind(exchange, routing_key: routing_key)
157
- @logger.info("bind exchange=#{exchange.name} queue=#{queue.name} routing_key=#{routing_key}")
166
+ queue.bind(exchange, routing_key:)
167
+
168
+ @logger.log(
169
+ Logger::Severity::INFO,
170
+ "bind exchange=#{exchange.name} queue=#{queue.name} routing_key=#{routing_key}",
171
+ PROGNAME
172
+ )
158
173
  end
159
174
 
160
175
  consumer_thread = Thread.new do
161
- message_queue = Queue.new
162
-
163
- queue.subscribe do |_delivery_info, properties, payload|
176
+ queue.subscribe(block: true) do |delivery_info, properties, payload|
164
177
  message = OpenStruct.new
165
178
  message.payload = payload
166
179
  message.correlation_id = properties[:correlation_id]
167
180
  message.reply_to = properties[:reply_to]
168
181
  message.freeze
169
182
 
170
- message_queue << message
171
- end
172
-
173
- while @messages.count < params.config['messages']
174
- message = message_queue.pop
183
+ log_msg = "get queue=#{queue.name}" \
184
+ "\ncorrelation_id: #{message.correlation_id}" \
185
+ "\nreply_to: #{message.reply_to}"
175
186
 
176
- payload_message = message.payload
187
+ log_msg = "\n#{message.payload}" if params.config['log_payload']
177
188
 
178
- if params.config['no_log'] == true
179
- payload_message = '[...]'
180
- end
189
+ @logger.log(Logger::Severity::INFO, log_msg, PROGNAME)
181
190
 
182
- @logger.info("get queue=#{queue.name}\ncorrelation_id: #{message.correlation_id}\nreply_to: #{message.reply_to}\n#{payload_message}")
183
191
  @messages << message
192
+
193
+ delivery_info.consumer.cancel if @messages.count >= (params.config['messages'] || 1)
184
194
  end
185
195
  end
186
196
 
@@ -192,36 +202,35 @@ module Spectre
192
202
  end
193
203
  end
194
204
 
195
- def publish &block
205
+ def publish(&)
196
206
  params = PublishActionParams.new(@config, @logger)
197
- params.instance_eval(&block)
207
+ params.instance_eval(&)
198
208
 
199
- connect()
209
+ connect
200
210
 
201
211
  channel = @conn.create_channel
202
212
 
203
213
  exchange = declare_exchange(channel, params)
204
214
 
205
- routing_key = params.config['routing_keys'].nil? ? nil : params.config['routing_keys'].first
215
+ routing_key = params.config['routing_keys']&.first
206
216
 
207
217
  exchange.publish(
208
218
  params.config['payload'],
209
- routing_key: routing_key,
219
+ routing_key:,
210
220
  correlation_id: params.config['correlation_id'],
211
221
  reply_to: params.config['reply_to']
212
222
  )
213
223
 
214
- payload_message = params.config['payload']
224
+ log_msg = "publish exchange=#{params.config['exchange']['name']} " \
225
+ "routing_key=#{routing_key}"
215
226
 
216
- if params.config['no_log'] == true
217
- payload_message = '[...]'
218
- end
227
+ log_msg += "\n#{params.config['payload']}" if params.config['log_payload']
219
228
 
220
- @logger.info("publish exchange=#{params.config['exchange']['name']} routing_key=#{routing_key} payload=\"#{payload_message}\"")
229
+ @logger.log(Logger::Severity::INFO, log_msg, PROGNAME)
221
230
  end
222
231
 
223
232
  def await!
224
- @threads.each { |x| x.join }
233
+ @threads.each(&:join)
225
234
  end
226
235
 
227
236
  private
@@ -229,10 +238,10 @@ module Spectre
229
238
  def connect
230
239
  return unless @conn.nil?
231
240
 
232
- vhost = @config['virtual_host']
233
- vhost = '/' + vhost unless vhost.start_with? '/'
234
-
235
- @logger.info("connect #{@config['username']}:*****@#{@config['host']}#{vhost} ssl=#{@config['ssl']}")
241
+ @logger.log(Logger::Severity::INFO,
242
+ "connect #{@config['username']}:*****@#{@config['host']}/#{@config['virtual_host']} " \
243
+ "ssl=#{@config['ssl']}",
244
+ PROGNAME)
236
245
 
237
246
  @conn = Bunny.new(
238
247
  host: @config['host'],
@@ -252,47 +261,40 @@ module Spectre
252
261
  params.config['exchange']['type'].to_s,
253
262
  params.config['exchange']['name'],
254
263
  durable: params.config['exchange']['durable'],
255
- auto_delete: params.config['exchange']['auto_delete'],
264
+ auto_delete: params.config['exchange']['auto_delete']
256
265
  )
257
266
 
258
- @logger.info("declare exchange name=#{exchange.name} type=#{exchange.type} durable=#{params.config['exchange']['durable']} auto_delete=#{params.config['exchange']['auto_delete']}")
267
+ @logger.log(Logger::Severity::INFO,
268
+ "declare exchange name=#{exchange.name} type=#{exchange.type} " \
269
+ "durable=#{params.config['exchange']['durable']} " \
270
+ "auto_delete=#{params.config['exchange']['auto_delete']}",
271
+ PROGNAME)
259
272
 
260
273
  exchange
261
274
  end
262
275
  end
263
276
 
264
- class << self
265
- @@config = {}
277
+ class Client
278
+ include Spectre::Delegate if defined? Spectre::Delegate
266
279
 
267
- def rabbitmq name, &block
268
- if @@config.key? name
269
- config = @@config[name]
270
- else
271
- config = {
272
- 'host' => name,
273
- }
274
- end
280
+ def initialize config, logger
281
+ @config = config['rabbitmq'] || {}
282
+ @logger = logger
283
+ end
275
284
 
276
- action = RabbitMQAction.new(config, @@logger)
277
- action._evaluate(&block) if block_given?
285
+ def rabbitmq(name, &)
286
+ config = @config[name] || {'host' => name }
287
+
288
+ action = RabbitMQAction.new(config, @logger)
289
+ action.instance_eval(&) if block_given?
278
290
 
279
291
  # Wait for all consumer threads to be finished
280
- action.threads.each { |x| x.join }
292
+ action.threads.each(&:join)
281
293
 
282
294
  action.conn.close
283
295
  end
284
296
  end
285
-
286
- Spectre.register do |config|
287
- @@logger = Spectre::Logging::ModuleLogger.new(config, 'spectre/rabbitmq')
288
-
289
- if config.key? 'rabbitmq'
290
- config['rabbitmq'].each do |name, cfg|
291
- @@config[name] = cfg
292
- end
293
- end
294
- end
295
-
296
- Spectre.delegate :rabbitmq, to: self
297
297
  end
298
+
299
+ Engine.register(RabbitMQ::Client, :rabbitmq) if defined? Engine
298
300
  end
metadata CHANGED
@@ -1,43 +1,56 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spectre-rabbitmq
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Neubauer
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-09-13 00:00:00.000000000 Z
10
+ date: 2025-03-21 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: spectre-core
13
+ name: bunny
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: 1.14.3
18
+ version: '0'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: 1.14.3
25
+ version: '0'
27
26
  - !ruby/object:Gem::Dependency
28
- name: bunny
27
+ name: logger
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
- - - "~>"
30
+ - - ">="
32
31
  - !ruby/object:Gem::Version
33
- version: 2.20.3
32
+ version: '0'
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
- - - "~>"
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ostruct
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
39
52
  - !ruby/object:Gem::Version
40
- version: 2.20.3
53
+ version: '0'
41
54
  description: Adds RabbitMQ functionality to the spectre framework
42
55
  email:
43
56
  - christian.neubauer@ionos.com
@@ -48,12 +61,11 @@ files:
48
61
  - lib/spectre/rabbitmq.rb
49
62
  homepage: https://github.com/ionos-spectre/spectre-rabbitmq
50
63
  licenses:
51
- - MIT
64
+ - GPL-3.0-or-later
52
65
  metadata:
53
66
  homepage_uri: https://github.com/ionos-spectre/spectre-rabbitmq
54
67
  source_code_uri: https://github.com/ionos-spectre/spectre-rabbitmq
55
68
  changelog_uri: https://github.com/ionos-spectre/spectre-rabbitmq/blob/master/CHANGELOG.md
56
- post_install_message:
57
69
  rdoc_options: []
58
70
  require_paths:
59
71
  - lib
@@ -61,15 +73,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
61
73
  requirements:
62
74
  - - ">="
63
75
  - !ruby/object:Gem::Version
64
- version: 3.0.0
76
+ version: '3.4'
65
77
  required_rubygems_version: !ruby/object:Gem::Requirement
66
78
  requirements:
67
79
  - - ">="
68
80
  - !ruby/object:Gem::Version
69
81
  version: '0'
70
82
  requirements: []
71
- rubygems_version: 3.3.26
72
- signing_key:
83
+ rubygems_version: 3.6.6
73
84
  specification_version: 4
74
85
  summary: RabbitMQ module for spectre
75
86
  test_files: []