manageiq-messaging 0.1.1 → 0.1.6

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
- SHA1:
3
- metadata.gz: 24d7b7196e5413465ff914e77ca504f91e96dc16
4
- data.tar.gz: 808545abce4d4629cdcd32a565ba63800005f331
2
+ SHA256:
3
+ metadata.gz: 31a6d45fedb5996e9ab5a270aeacd53a1683871abbb60294ae1aee500d35b972
4
+ data.tar.gz: a530afba35d2d6ff1f754d8d263c46b1b042322743d8b24effd0f81fab30e2c8
5
5
  SHA512:
6
- metadata.gz: 05346bab1741de40e0a6d5fdf2abf6e87c0ad059b220671f5b62f91e917e984e8b97dc86281afa4a647818c08bea98ea59656b93f2062128a88c25fce255fb58
7
- data.tar.gz: 7ea84ea24c5199330a78bc6169637c94a1cae7e270aae06986aff43c12d20df24db35060288fcd0149591281ece366654342c7ec8cd8d78448c606802d4b312b
6
+ metadata.gz: 59ac72471bd2324d150874c34f35eb26b31dd2175f45ae6eb10073047e50417aa37d66604326367b45dac685b1c69a84f94dcf679bad2fcb08349bc447573f17
7
+ data.tar.gz: '0497bacb543ed6e4cbf4b44fa6db86e35c59fff88e1338a259361d06a18df7438f8a494d23ca775df3b0f97344eac6e4c4738e4c12a7b7c49c8d188ac18c4c69'
@@ -34,6 +34,7 @@ engines:
34
34
  rubocop:
35
35
  enabled: true
36
36
  config: '.rubocop_cc.yml'
37
+ channel: 'rubocop-0-69'
37
38
  prepare:
38
39
  fetch:
39
40
  - url: "https://raw.githubusercontent.com/ManageIQ/guides/master/.rubocop_base.yml"
@@ -1,9 +1,8 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.2.6
5
4
  - 2.3.1
6
- - 2.4.2
5
+ - 2.4.5
7
6
  before_install: gem install bundler -v 1.13.0
8
7
  after_script: bundle exec codeclimate-test-reporter
9
8
  sudo: false
data/CHANGES CHANGED
@@ -5,3 +5,15 @@
5
5
  * By default upon receiving a message or an event, it is automatically acknowledged. But
6
6
  the subscriber can decide to turn off the auto ack feature and ack it in the callback block.
7
7
 
8
+ = 0.1.2 - 11-Dec-2018
9
+ * Allow to set max_bytes to each_batch when subscribe to a Kafka topic.
10
+
11
+ = 0.1.4 - 3-Apr-2019
12
+ * Add an #ack method to a ReceivedMessage to simplify manual acknowledgements
13
+ * Allow caller to provide a session_timeout to kafka consumers, default of 30sec
14
+
15
+ = 0.1.5 - 6-Jun-2019
16
+ * Allow caller to provide extra headers to the message
17
+
18
+ = 0.1.6 - 6-July-2020
19
+ * Rescue message body decoding errors. Re-raise errors raised by users code of processing received messages.
data/README.md CHANGED
@@ -1,10 +1,9 @@
1
1
  # ManageIQ Messaging Client
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/manageiq-messaging.svg)](http://badge.fury.io/rb/manageiq-messaging)
4
- [![Build Status](https://travis-ci.org/ManageIQ/manageiq-messaging.svg)](https://travis-ci.org/ManageIQ/manageiq-messaging)
4
+ [![Build Status](https://travis-ci.com/ManageIQ/manageiq-messaging.svg)](https://travis-ci.com/ManageIQ/manageiq-messaging)
5
5
  [![Code Climate](https://codeclimate.com/github/ManageIQ/manageiq-messaging.svg)](https://codeclimate.com/github/ManageIQ/manageiq-messaging)
6
6
  [![Test Coverage](https://codeclimate.com/github/ManageIQ/manageiq-messaging/badges/coverage.svg)](https://codeclimate.com/github/ManageIQ/manageiq-messaging/coverage)
7
- [![Dependency Status](https://gemnasium.com/ManageIQ/manageiq-messaging.svg)](https://gemnasium.com/ManageIQ/manageiq-messaging)
8
7
  [![Security](https://hakiri.io/github/ManageIQ/manageiq-messaging/master.svg)](https://hakiri.io/github/ManageIQ/manageiq-messaging/master)
9
8
 
10
9
  Client library for ManageIQ components to exchange messages through its internal message bus.
@@ -83,7 +82,7 @@ This is the one-to-one publish/subscribe pattern. Multiple subscribers can subsc
83
82
  client.subscribe_messages(:service => 'ems_operation', :affinity => 'ems_amazon1', :auto_ack => false) do |messages|
84
83
  messages.each do |msg|
85
84
  # do stuff with msg.message and msg.payload
86
- client.ack(msg.ack_ref)
85
+ msg.ack
87
86
  end
88
87
  end
89
88
 
@@ -156,6 +155,24 @@ This is the one-to-many publish/subscribe pattern. Multiple subscribers can subs
156
155
 
157
156
  By default, events are delivered to live subscribers only. Some messaging systems support persistence with options.
158
157
 
158
+ ### Add your own headers to a message (Queue or Topic)
159
+
160
+ If you want you can add in your own headers to the send message
161
+
162
+ ```
163
+ client.publish_topic(
164
+ :service => 'provider_events',
165
+ :event => 'powered_on',
166
+ :headers => {:request_id => "12345"},
167
+ :payload => {:ems_ref => 'uid987'}
168
+
169
+ )
170
+
171
+ client.subscribe_topic(:service => 'provider_events', :persist_ref => 'automate_1') do |msg|
172
+ puts "Received event #{msg.message} with request-id: #{msg.headers['request_id']}"
173
+ end
174
+ ```
175
+
159
176
  ## Development
160
177
 
161
178
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -26,7 +26,7 @@ class ProducerConsumer < Common
26
26
  client.subscribe_messages(:service => 'ems_operation', :affinity => 'ems_amazon1', :auto_ack => false) do |messages|
27
27
  messages.each do |msg|
28
28
  do_stuff(msg)
29
- client.ack(msg.ack_ref)
29
+ msg.ack
30
30
  end
31
31
  end
32
32
  sleep(5)
@@ -58,6 +58,7 @@ module ManageIQ
58
58
  # * :message (e.g. method name or message type)
59
59
  # * :payload (message body, a string or an user object that can be serialized)
60
60
  # * :sender (optional, identify the sender)
61
+ # * :headers (optional, additional headers to add to the message)
61
62
  # Other options are underlying messaging system specific.
62
63
  #
63
64
  # Optionally a call back block can be provided to wait on the consumer to send
@@ -106,9 +107,9 @@ module ManageIQ
106
107
  # msg.sender
107
108
  # msg.message
108
109
  # msg.payload
109
- # msg.ack_ref #used to ack the message
110
+ # msg.ack_ref
110
111
  #
111
- # client.ack(msg.ack_ref) # needed only when options[:auto_ack] is false
112
+ # msg.ack # needed only when options[:auto_ack] is false
112
113
  # # process the message
113
114
  # end
114
115
  # end
@@ -122,7 +123,7 @@ module ManageIQ
122
123
  # message is proccessed. Any un-acked message will be redelivered to next subscriber
123
124
  # AFTER the current subscriber disconnects normally or abnormally (e.g. crashed).
124
125
  #
125
- # To ack a message call +ack+(+msg.ack_ref+)
126
+ # To ack a message call +msg.ack+
126
127
  def subscribe_messages(options, &block)
127
128
  raise "A block is required" unless block_given?
128
129
  assert_options(options, [:service])
@@ -164,6 +165,7 @@ module ManageIQ
164
165
  # * :event (event name)
165
166
  # * :payload (message body, a string or an user object that can be serialized)
166
167
  # * :sender (optional, identify the sender)
168
+ # * :headers (optional, additional headers to add to the message)
167
169
  # Other options are underlying messaging system specific.
168
170
  #
169
171
  def publish_topic(options)
@@ -189,9 +191,9 @@ module ManageIQ
189
191
  # msg.sender
190
192
  # msg.message
191
193
  # msg.payload
192
- # msg.ack_ref #used to ack the message
194
+ # msg.ack_ref
193
195
  #
194
- # client.ack(msg.ack_ref) # needed only when options[:auto_ack] is false
196
+ # msg.ack # needed only when options[:auto_ack] is false
195
197
  # # process the message
196
198
  # end
197
199
  #
@@ -204,7 +206,7 @@ module ManageIQ
204
206
  # message is proccessed. Any un-acked message will be redelivered to next subscriber
205
207
  # AFTER the current subscriber disconnects normally or abnormally (e.g. crashed).
206
208
  #
207
- # To ack a message call +ack+(+msg.ack_ref+)
209
+ # To ack a message call +msg.ack+
208
210
  def subscribe_topic(options, &block)
209
211
  raise "A block is required" unless block_given?
210
212
  assert_options(options, [:service])
@@ -26,6 +26,10 @@ module ManageIQ
26
26
  else
27
27
  raw_body
28
28
  end
29
+ rescue => e # JSON or YAML parsing error
30
+ logger.error("Error decoding message body: #{e.message}")
31
+ logger.error(e.backtrace.join("\n"))
32
+ raw_body
29
33
  end
30
34
 
31
35
  def payload_log(payload)
@@ -26,6 +26,11 @@ module ManageIQ
26
26
  #
27
27
  # Kafka specific +subscribe_topic+ options:
28
28
  # * :persist_ref (Used as Kafka group_id)
29
+ # * :session_timeout (Max time in seconds allowed to process a message, default is 30)
30
+ #
31
+ # Kafka specific +subscribe_messages+ options:
32
+ # * :max_bytes (Max batch size to read, default is 10Mb)
33
+ # * :session_timeout (Max time in seconds allowed to process a message, default is 30)
29
34
  #
30
35
  # Without +:persist_ref+ every topic subscriber receives a copy of each message
31
36
  # only when they are active. If multiple topic subscribers join with the same
@@ -5,7 +5,7 @@ module ManageIQ
5
5
  require 'manageiq/messaging/common'
6
6
  include ManageIQ::Messaging::Common
7
7
 
8
- GROUP_FOR_QUEUE_MESSAGES = 'manageiq_messaging_queue_group'.freeze
8
+ GROUP_FOR_QUEUE_MESSAGES = 'manageiq_messaging_queue_group_'.freeze
9
9
 
10
10
  private
11
11
 
@@ -13,17 +13,27 @@ module ManageIQ
13
13
  @producer ||= kafka_client.producer
14
14
  end
15
15
 
16
- def topic_consumer(persist_ref)
16
+ def topic_consumer(persist_ref, session_timeout = nil)
17
17
  # persist_ref enables consumer to receive messages sent when consumer is temporarily offline
18
18
  # it also enables consumers to do load balancing when multiple consumers join the with the same ref.
19
19
  @topic_consumer.try(:stop) unless @persist_ref == persist_ref
20
20
  @persist_ref = persist_ref
21
- @topic_consumer ||= kafka_client.consumer(:group_id => persist_ref)
21
+
22
+ consumer_opts = {:group_id => persist_ref}
23
+ consumer_opts[:session_timeout] = session_timeout if session_timeout.present?
24
+
25
+ @topic_consumer ||= kafka_client.consumer(consumer_opts)
22
26
  end
23
27
 
24
- def queue_consumer
28
+ def queue_consumer(topic, session_timeout = nil)
25
29
  # all queue consumers join the same group so that each message can be processed by one and only one consumer
26
- @queue_consumer ||= kafka_client.consumer(:group_id => GROUP_FOR_QUEUE_MESSAGES)
30
+ @queue_consumer.try(:stop) unless @queue_topic == topic
31
+ @queue_topic = topic
32
+
33
+ consumer_opts = {:group_id => GROUP_FOR_QUEUE_MESSAGES + topic}
34
+ consumer_opts[:session_timeout] = session_timeout if session_timeout.present?
35
+
36
+ @queue_consumer ||= kafka_client.consumer(consumer_opts)
27
37
  end
28
38
 
29
39
  trap("TERM") do
@@ -43,6 +53,7 @@ module ManageIQ
43
53
  body, kafka_opts = for_publish(options)
44
54
  kafka_opts[:headers][:message_type] = options[:message] if options[:message]
45
55
  kafka_opts[:headers][:class_name] = options[:class_name] if options[:class_name]
56
+ kafka_opts[:headers].merge!(options[:headers].except(*message_header_keys)) if options.key?(:headers)
46
57
 
47
58
  [body, kafka_opts]
48
59
  end
@@ -50,13 +61,15 @@ module ManageIQ
50
61
  def topic_for_publish(options)
51
62
  body, kafka_opts = for_publish(options)
52
63
  kafka_opts[:headers][:event_type] = options[:event] if options[:event]
64
+ kafka_opts[:headers].merge!(options[:headers].except(*event_header_keys)) if options.key?(:headers)
53
65
 
54
66
  [body, kafka_opts]
55
67
  end
56
68
 
57
69
  def for_publish(options)
58
- kafka_opts = {:topic => address(options), :headers => {}}
59
- kafka_opts[:partition_key] = options[:group_name] if options[:group_name]
70
+ kafka_opts = {:topic => address(options)}
71
+ kafka_opts[:partition_key] = options[:group_name] if options[:group_name]
72
+ kafka_opts[:headers] = {}
60
73
  kafka_opts[:headers][:sender] = options[:sender] if options[:sender]
61
74
 
62
75
  body = options[:payload] || ''
@@ -75,26 +88,39 @@ module ManageIQ
75
88
  def process_queue_message(queue, message)
76
89
  payload = decode_body(message.headers, message.value)
77
90
  sender, message_type, class_name = parse_message_headers(message.headers)
91
+ client_headers = message.headers.except(*message_header_keys)
92
+
78
93
  logger.info("Message received: queue(#{queue}), message(#{payload_log(payload)}), sender(#{sender}), type(#{message_type})")
79
- [sender, message_type, class_name, payload]
94
+ [sender, message_type, class_name, payload, client_headers]
80
95
  end
81
96
 
82
97
  def process_topic_message(topic, message)
83
98
  begin
84
99
  payload = decode_body(message.headers, message.value)
85
100
  sender, event_type = parse_event_headers(message.headers)
101
+ client_headers = message.headers.except(*event_header_keys)
102
+
86
103
  logger.info("Event received: topic(#{topic}), event(#{payload_log(payload)}), sender(#{sender}), type(#{event_type})")
87
- yield ManageIQ::Messaging::ReceivedMessage.new(sender, event_type, payload, message)
104
+ yield ManageIQ::Messaging::ReceivedMessage.new(sender, event_type, payload, client_headers, message, self)
88
105
  logger.info("Event processed")
89
106
  rescue StandardError => e
90
107
  logger.error("Event processing error: #{e.message}")
91
108
  logger.error(e.backtrace.join("\n"))
109
+ raise
92
110
  end
93
111
  end
94
112
 
113
+ def message_header_keys
114
+ ['sender', 'message_type', 'class_name']
115
+ end
116
+
95
117
  def parse_message_headers(headers)
96
118
  return [nil, nil, nil] unless headers.kind_of?(Hash)
97
- headers.values_at('sender', 'message_type', 'class_name')
119
+ headers.values_at(*message_header_keys)
120
+ end
121
+
122
+ def event_header_keys
123
+ ['sender', 'event_type']
98
124
  end
99
125
 
100
126
  def parse_event_headers(headers)
@@ -16,21 +16,27 @@ module ManageIQ
16
16
 
17
17
  def subscribe_messages_impl(options)
18
18
  topic = address(options)
19
+ session_timeout = options[:session_timeout]
19
20
 
20
- consumer = queue_consumer
21
+ batch_options = {}
22
+ batch_options[:automatically_mark_as_processed] = auto_ack?(options)
23
+ batch_options[:max_bytes] = options[:max_bytes] if options.key?(:max_bytes)
24
+
25
+ consumer = queue_consumer(topic, session_timeout)
21
26
  consumer.subscribe(topic)
22
- consumer.each_batch(:automatically_mark_as_processed => auto_ack?(options)) do |batch|
27
+ consumer.each_batch(batch_options) do |batch|
23
28
  logger.info("Batch message received: queue(#{topic})")
24
29
  begin
25
30
  messages = batch.messages.collect do |message|
26
31
  sender, message_type, _class_name, payload = process_queue_message(topic, message)
27
- ManageIQ::Messaging::ReceivedMessage.new(sender, message_type, payload, message)
32
+ ManageIQ::Messaging::ReceivedMessage.new(sender, message_type, payload, headers, message, self)
28
33
  end
29
34
 
30
35
  yield messages
31
36
  rescue StandardError => e
32
37
  logger.error("Event processing error: #{e.message}")
33
38
  logger.error(e.backtrace.join("\n"))
39
+ raise
34
40
  end
35
41
  logger.info("Batch message processed")
36
42
  end
@@ -10,10 +10,11 @@ module ManageIQ
10
10
 
11
11
  def subscribe_topic_impl(options, &block)
12
12
  topic = address(options)
13
- persist_ref = options[:persist_ref]
13
+ persist_ref = options[:persist_ref]
14
+ session_timeout = options[:session_timeout]
14
15
 
15
16
  if persist_ref
16
- consumer = topic_consumer(persist_ref)
17
+ consumer = topic_consumer(persist_ref, session_timeout)
17
18
  consumer.subscribe(topic, :start_from_beginning => false)
18
19
  consumer.each_message(:automatically_mark_as_processed => auto_ack?(options)) do |message|
19
20
  process_topic_message(topic, message, &block)
@@ -1,10 +1,14 @@
1
1
  module ManageIQ
2
2
  module Messaging
3
3
  class ReceivedMessage
4
- attr_accessor :sender, :message, :payload, :ack_ref
4
+ attr_accessor :sender, :message, :payload, :headers, :ack_ref, :client
5
5
 
6
- def initialize(sender, message, payload, ack_ref)
7
- @sender, @message, @payload, @ack_ref = sender, message, payload, ack_ref
6
+ def initialize(sender, message, payload, headers, ack_ref, client)
7
+ @sender, @message, @payload, @headers, @ack_ref, @client = sender, message, payload, headers, ack_ref, client
8
+ end
9
+
10
+ def ack
11
+ client.ack(ack_ref)
8
12
  end
9
13
  end
10
14
  end
@@ -17,6 +17,8 @@ module ManageIQ
17
17
  address = "queue/#{options[:service]}.#{affinity}"
18
18
 
19
19
  headers = {:"destination-type" => 'ANYCAST', :persistent => true}
20
+ headers.merge!(options[:headers].except(*internal_header_keys)) if options.key?(:headers)
21
+
20
22
  headers[:expires] = options[:expires_on].to_i * 1000 if options[:expires_on]
21
23
  headers[:AMQ_SCHEDULED_TIME] = options[:deliver_on].to_i * 1000 if options[:deliver_on]
22
24
  headers[:priority] = options[:priority] if options[:priority]
@@ -38,6 +40,8 @@ module ManageIQ
38
40
  address = "topic/#{options[:service]}"
39
41
 
40
42
  headers = {:"destination-type" => 'MULTICAST', :persistent => true}
43
+ headers.merge!(options[:headers].except(*internal_header_keys)) if options.key?(:headers)
44
+
41
45
  headers[:expires] = options[:expires_on].to_i * 1000 if options[:expires_on]
42
46
  headers[:AMQ_SCHEDULED_TIME] = options[:deliver_on].to_i * 1000 if options[:deliver_on]
43
47
  headers[:priority] = options[:priority] if options[:priority]
@@ -63,6 +67,10 @@ module ManageIQ
63
67
  raw_publish(address, result || '', response_headers.merge(:correlation_id => correlation_ref))
64
68
  end
65
69
 
70
+ def internal_header_keys
71
+ [:"destination-type", :persistent, :expires, :AMQ_SCHEDULED_TIME, :priority, :_AMQ_GROUP_ID]
72
+ end
73
+
66
74
  def receive_response(service, correlation_ref)
67
75
  response_options = {
68
76
  :service => "#{service}.response",
@@ -33,9 +33,15 @@ module ManageIQ
33
33
  sender = msg.headers['sender']
34
34
  message_type = msg.headers['message_type']
35
35
  message_body = decode_body(msg.headers, msg.body)
36
+ client_headers = msg.headers.except(*internal_header_keys)
37
+
36
38
  logger.info("Message received: queue(#{queue_name}), msg(#{payload_log(message_body)}), headers(#{msg.headers})")
37
39
 
38
- result = yield [ManageIQ::Messaging::ReceivedMessage.new(sender, message_type, message_body, msg)]
40
+ messages = [
41
+ ManageIQ::Messaging::ReceivedMessage.new(sender, message_type, message_body, client_headers, msg, self)
42
+ ]
43
+
44
+ result = yield messages
39
45
  logger.info("Message processed")
40
46
 
41
47
  correlation_ref = msg.headers['correlation_id']
@@ -46,6 +52,7 @@ module ManageIQ
46
52
  rescue => e
47
53
  logger.error("Message processing error: #{e.message}")
48
54
  logger.error(e.backtrace.join("\n"))
55
+ raise
49
56
  end
50
57
  end
51
58
  end
@@ -21,13 +21,16 @@ module ManageIQ
21
21
 
22
22
  sender = event.headers['sender']
23
23
  event_type = event.headers['event_type']
24
+ client_headers = event.headers.except(*internal_header_keys)
25
+
24
26
  event_body = decode_body(event.headers, event.body)
25
27
  logger.info("Event received: queue(#{queue_name}), event(#{event_body}), headers(#{event.headers})")
26
- yield ManageIQ::Messaging::ReceivedMessage.new(sender, event_type, event_body, event)
28
+ yield ManageIQ::Messaging::ReceivedMessage.new(sender, event_type, event_body, client_headers, event, self)
27
29
  logger.info("Event processed")
28
30
  rescue => e
29
31
  logger.error("Event processing error: #{e.message}")
30
32
  logger.error(e.backtrace.join("\n"))
33
+ raise
31
34
  end
32
35
  end
33
36
  end
@@ -1,5 +1,5 @@
1
1
  module ManageIQ
2
2
  module Messaging
3
- VERSION = "0.1.1"
3
+ VERSION = "0.1.6"
4
4
  end
5
5
  end
@@ -20,14 +20,15 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
22
 
23
- spec.add_dependency 'activesupport', '>= 4.2.2'
24
- spec.add_dependency 'ruby-kafka', '~> 0.7.0'
23
+ spec.add_dependency 'activesupport', '~> 5.2.4.3'
24
+ spec.add_dependency 'ruby-kafka', '~> 1.0'
25
25
  spec.add_dependency 'stomp', '~> 1.4.4'
26
26
 
27
- spec.add_development_dependency "bundler", "~> 1.13"
27
+ spec.add_development_dependency "bundler"
28
28
  spec.add_development_dependency "codeclimate-test-reporter", "~> 1.0.0"
29
- spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rake", ">= 12.3.3"
30
30
  spec.add_development_dependency "rspec", "~> 3.0"
31
31
  spec.add_development_dependency "rubocop"
32
+ spec.add_development_dependency "rubocop-performance"
32
33
  spec.add_development_dependency "simplecov"
33
34
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manageiq-messaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - ManageIQ Authors
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-20 00:00:00.000000000 Z
11
+ date: 2020-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.2
19
+ version: 5.2.4.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 4.2.2
26
+ version: 5.2.4.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ruby-kafka
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.7.0
33
+ version: '1.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.7.0
40
+ version: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: stomp
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.13'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1.13'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: codeclimate-test-reporter
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '10.0'
89
+ version: 12.3.3
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '10.0'
96
+ version: 12.3.3
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rspec
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-performance
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: simplecov
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -201,8 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
215
  - !ruby/object:Gem::Version
202
216
  version: '0'
203
217
  requirements: []
204
- rubyforge_project:
205
- rubygems_version: 2.5.1
218
+ rubygems_version: 3.1.2
206
219
  signing_key:
207
220
  specification_version: 4
208
221
  summary: Client library for ManageIQ components to exchange messages through its internal