karafka 1.1.2 → 1.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +34 -0
  5. data/Gemfile +1 -2
  6. data/Gemfile.lock +35 -22
  7. data/README.md +4 -3
  8. data/karafka.gemspec +5 -3
  9. data/lib/karafka.rb +4 -5
  10. data/lib/karafka/app.rb +8 -15
  11. data/lib/karafka/attributes_map.rb +1 -1
  12. data/lib/karafka/backends/inline.rb +1 -2
  13. data/lib/karafka/{base_controller.rb → base_consumer.rb} +19 -11
  14. data/lib/karafka/base_responder.rb +33 -14
  15. data/lib/karafka/callbacks.rb +30 -0
  16. data/lib/karafka/callbacks/config.rb +22 -0
  17. data/lib/karafka/callbacks/dsl.rb +16 -0
  18. data/lib/karafka/cli/install.rb +2 -3
  19. data/lib/karafka/cli/server.rb +0 -1
  20. data/lib/karafka/connection/{consumer.rb → client.rb} +25 -33
  21. data/lib/karafka/connection/config_adapter.rb +14 -6
  22. data/lib/karafka/connection/delegator.rb +46 -0
  23. data/lib/karafka/connection/listener.rb +22 -13
  24. data/lib/karafka/{controllers → consumers}/callbacks.rb +9 -9
  25. data/lib/karafka/consumers/includer.rb +51 -0
  26. data/lib/karafka/consumers/responders.rb +24 -0
  27. data/lib/karafka/{controllers → consumers}/single_params.rb +3 -3
  28. data/lib/karafka/errors.rb +10 -3
  29. data/lib/karafka/fetcher.rb +30 -34
  30. data/lib/karafka/helpers/class_matcher.rb +8 -8
  31. data/lib/karafka/helpers/config_retriever.rb +2 -2
  32. data/lib/karafka/instrumentation/listener.rb +97 -0
  33. data/lib/karafka/instrumentation/logger.rb +55 -0
  34. data/lib/karafka/instrumentation/monitor.rb +62 -0
  35. data/lib/karafka/loader.rb +0 -1
  36. data/lib/karafka/params/{params.rb → dsl.rb} +69 -44
  37. data/lib/karafka/params/params_batch.rb +2 -2
  38. data/lib/karafka/patches/dry_configurable.rb +6 -2
  39. data/lib/karafka/patches/ruby_kafka.rb +10 -10
  40. data/lib/karafka/persistence/client.rb +25 -0
  41. data/lib/karafka/persistence/consumer.rb +27 -14
  42. data/lib/karafka/persistence/topic.rb +29 -0
  43. data/lib/karafka/process.rb +5 -4
  44. data/lib/karafka/responders/builder.rb +15 -14
  45. data/lib/karafka/routing/builder.rb +1 -1
  46. data/lib/karafka/routing/consumer_mapper.rb +3 -2
  47. data/lib/karafka/routing/router.rb +1 -1
  48. data/lib/karafka/routing/topic.rb +5 -5
  49. data/lib/karafka/schemas/config.rb +3 -0
  50. data/lib/karafka/schemas/consumer_group.rb +14 -2
  51. data/lib/karafka/schemas/consumer_group_topic.rb +1 -1
  52. data/lib/karafka/server.rb +33 -5
  53. data/lib/karafka/setup/config.rb +45 -21
  54. data/lib/karafka/setup/configurators/base.rb +6 -12
  55. data/lib/karafka/setup/configurators/params.rb +25 -0
  56. data/lib/karafka/setup/configurators/water_drop.rb +6 -3
  57. data/lib/karafka/setup/dsl.rb +22 -0
  58. data/lib/karafka/templates/{application_controller.rb.example → application_consumer.rb.example} +2 -3
  59. data/lib/karafka/templates/karafka.rb.example +14 -3
  60. data/lib/karafka/version.rb +1 -1
  61. metadata +58 -23
  62. data/lib/karafka/connection/processor.rb +0 -61
  63. data/lib/karafka/controllers/includer.rb +0 -51
  64. data/lib/karafka/controllers/responders.rb +0 -19
  65. data/lib/karafka/logger.rb +0 -53
  66. data/lib/karafka/monitor.rb +0 -98
  67. data/lib/karafka/persistence/controller.rb +0 -38
@@ -13,6 +13,7 @@ module Karafka
13
13
  # @see Karafka::Setup::Configurators::Base for more details about configurators api
14
14
  class Config
15
15
  extend Dry::Configurable
16
+ extend Callbacks::Config
16
17
 
17
18
  # Available settings
18
19
  # option client_id [String] kafka client_id - used to provide
@@ -21,9 +22,9 @@ module Karafka
21
22
  # What backend do we want to use to process messages
22
23
  setting :backend, :inline
23
24
  # option logger [Instance] logger that we want to use
24
- setting :logger, -> { ::Karafka::Logger.instance }
25
+ setting :logger, -> { ::Karafka::Instrumentation::Logger.instance }
25
26
  # option monitor [Instance] monitor that we will to use (defaults to Karafka::Monitor)
26
- setting :monitor, -> { ::Karafka::Monitor.instance }
27
+ setting :monitor, -> { ::Karafka::Instrumentation::Monitor.instance }
27
28
  # Mapper used to remap consumer groups ids, so in case users migrate from other tools
28
29
  # or they need to maintain their own internal consumer group naming conventions, they
29
30
  # can easily do it, replacing the default client_id + consumer name pattern concept
@@ -43,12 +44,24 @@ module Karafka
43
44
  # #params_batch will contain params received from Kafka (may be more than 1) so we can
44
45
  # process them in batches
45
46
  setting :batch_consuming, false
46
- # Should we operate in a single controller instance across multiple batches of messages,
47
- # from the same partition or should we build a new instance for each incoming batch.
48
- # Disabling that can be useful when you want to build a new controller instance for each
49
- # incoming batch. It's disabled by default, not to create more objects that needed on
50
- # each batch
47
+ # Should we operate in a single consumer instance across multiple batches of messages,
48
+ # from the same partition or should we build a new one for each incoming batch.
49
+ # Disabling that can be useful when you want to create a new consumer instance for each
50
+ # incoming batch. It's disabled by default, not to create more objects that needed
51
+ # on each batch
51
52
  setting :persistent, true
53
+ # option shutdown_timeout [Integer, nil] the number of seconds after which Karafka no
54
+ # longer wait for the consumers to stop gracefully but instead we force
55
+ # terminate everything.
56
+ # @note Keep in mind, that if your business logic
57
+ # @note If set to nil, it won't forcefully shutdown the process at all.
58
+ setting :shutdown_timeout, 60
59
+ # option params_base_class [Class] base class for params class initialization
60
+ # This can be either a Hash or a HashWithIndifferentAccess depending on your
61
+ # requirements. Note, that by using HashWithIndifferentAccess, you remove some of the
62
+ # performance in favor of convenience. This can be useful especially if you already use
63
+ # it with Rails, etc
64
+ setting :params_base_class, Hash
52
65
 
53
66
  # option kafka [Hash] - optional - kafka configuration options
54
67
  setting :kafka do
@@ -81,6 +94,9 @@ module Karafka
81
94
  # returning messages from the server; if `max_wait_time` is reached, this
82
95
  # is ignored.
83
96
  setting :min_bytes, 1
97
+ # option max_bytes [Integer] the maximum number of bytes to read before returning messages
98
+ # from each broker.
99
+ setting :max_bytes, 10_485_760
84
100
  # option max_wait_time [Integer, Float] max_wait_time is the maximum number of seconds to
85
101
  # wait before returning data from a single message fetch. By setting this high you also
86
102
  # increase the fetching throughput - and by setting it low you set a bound on latency.
@@ -109,24 +125,33 @@ module Karafka
109
125
  setting :socket_timeout, 30
110
126
 
111
127
  # SSL authentication related settings
112
- # option ca_cert [String] SSL CA certificate
128
+ # option ca_cert [String, nil] SSL CA certificate
113
129
  setting :ssl_ca_cert, nil
114
- # option ssl_ca_cert_file_path [String] SSL CA certificate file path
130
+ # option ssl_ca_cert_file_path [String, nil] SSL CA certificate file path
115
131
  setting :ssl_ca_cert_file_path, nil
116
- # option ssl_client_cert [String] SSL client certificate
132
+ # option ssl_ca_certs_from_system [Boolean] Use the CA certs from your system's default
133
+ # certificate store
134
+ setting :ssl_ca_certs_from_system, false
135
+ # option ssl_client_cert [String, nil] SSL client certificate
117
136
  setting :ssl_client_cert, nil
118
- # option ssl_client_cert_key [String] SSL client certificate password
137
+ # option ssl_client_cert_key [String, nil] SSL client certificate password
119
138
  setting :ssl_client_cert_key, nil
120
- # option sasl_gssapi_principal [String] sasl principal
139
+ # option sasl_gssapi_principal [String, nil] sasl principal
121
140
  setting :sasl_gssapi_principal, nil
122
- # option sasl_gssapi_keytab [String] sasl keytab
141
+ # option sasl_gssapi_keytab [String, nil] sasl keytab
123
142
  setting :sasl_gssapi_keytab, nil
124
143
  # option sasl_plain_authzid [String] The authorization identity to use
125
144
  setting :sasl_plain_authzid, ''
126
- # option sasl_plain_username [String] The username used to authenticate
145
+ # option sasl_plain_username [String, nil] The username used to authenticate
127
146
  setting :sasl_plain_username, nil
128
- # option sasl_plain_password [String] The password used to authenticate
147
+ # option sasl_plain_password [String, nil] The password used to authenticate
129
148
  setting :sasl_plain_password, nil
149
+ # option sasl_scram_username [String, nil] The username used to authenticate
150
+ setting :sasl_scram_username, nil
151
+ # option sasl_scram_password [String, nil] The password used to authenticate
152
+ setting :sasl_scram_password, nil
153
+ # option sasl_scram_mechanism [String, nil] Scram mechanism, either 'sha256' or 'sha512'
154
+ setting :sasl_scram_mechanism, nil
130
155
  end
131
156
 
132
157
  class << self
@@ -134,18 +159,17 @@ module Karafka
134
159
  # @yield Runs a block of code providing a config singleton instance to it
135
160
  # @yieldparam [Karafka::Setup::Config] Karafka config instance
136
161
  def setup
137
- configure do |config|
138
- yield(config)
139
- end
162
+ configure { |config| yield(config) }
140
163
  end
141
164
 
142
165
  # Everything that should be initialized after the setup
143
166
  # Components are in karafka/config directory and are all loaded one by one
144
167
  # If you want to configure a next component, please add a proper file to config dir
145
168
  def setup_components
146
- Configurators::Base.descendants.each do |klass|
147
- klass.new(config).setup
148
- end
169
+ [
170
+ Configurators::Params,
171
+ Configurators::WaterDrop
172
+ ].each { |klass| klass.setup(config) }
149
173
  end
150
174
 
151
175
  # Validate config based on ConfigurationSchema
@@ -3,10 +3,13 @@
3
3
  module Karafka
4
4
  module Setup
5
5
  # Configurators module is used to enclose all the external dependencies configurations
6
+ # upon which Karafka depents
6
7
  class Configurators
7
- # Karafka has come components that it relies on (like Sidekiq)
8
+ # Karafka has some components that it relies on (like Sidekiq)
8
9
  # We need to configure all of them only when the framework was set up.
9
10
  # Any class that descends from this one will be automatically invoked upon setup (after it)
11
+ # @note This should be used only for internal Karafka dependencies configuration
12
+ # End users configuration should go to the after_init block
10
13
  # @example Configure an Example class
11
14
  # class ExampleConfigurator < Base
12
15
  # def setup
@@ -15,18 +18,9 @@ module Karafka
15
18
  # end
16
19
  # end
17
20
  class Base
18
- extend ActiveSupport::DescendantsTracker
19
-
20
- attr_reader :config
21
-
22
- # @param config [Karafka::Config] config instance
23
- # @return [Karafka::Config::Base] configurator for a given component
24
- def initialize(config)
25
- @config = config
26
- end
27
-
21
+ # @param _config [Karafka::Config] config instance
28
22
  # This method needs to be implemented in a subclass
29
- def setup
23
+ def self.setup(_config)
30
24
  raise NotImplementedError
31
25
  end
32
26
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Karafka
4
+ module Setup
5
+ class Configurators
6
+ # Karafka::Params::Params are dynamically built based on user defined parent class
7
+ # so we cannot just require it, we need to initialize it after user is done with
8
+ # the framework configuration. This is a configurator that does exactly that.
9
+ class Params < Base
10
+ # Builds up Karafka::Params::Params class with user defined parent class
11
+ # @param config [Karafka::Setup::Config] Config we can user to setup things
12
+ def self.setup(config)
13
+ return if defined? Karafka::Params::Params
14
+
15
+ Karafka::Params.const_set(
16
+ 'Params',
17
+ Class
18
+ .new(config.params_base_class)
19
+ .tap { |klass| klass.include(Karafka::Params::Dsl) }
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -6,17 +6,20 @@ module Karafka
6
6
  # Class responsible for setting up WaterDrop configuration
7
7
  class WaterDrop < Base
8
8
  # Sets up a WaterDrop settings
9
- def setup
9
+ # @param config [Karafka::Setup::Config] Config we can user to setup things
10
+ # @note This will also inject Karafka monitor as a default monitor into WaterDrop,
11
+ # so we have the same monitor within whole Karafka framework (same with logger)
12
+ def self.setup(config)
10
13
  ::WaterDrop.setup do |water_config|
11
14
  water_config.deliver = true
12
15
 
13
- Karafka::App.config.to_h.except(:kafka).each do |k, v|
16
+ config.to_h.except(:kafka).each do |k, v|
14
17
  key_assignment = :"#{k}="
15
18
  next unless water_config.respond_to?(key_assignment)
16
19
  water_config.public_send(key_assignment, v)
17
20
  end
18
21
 
19
- Karafka::App.config.kafka.to_h.each do |k, v|
22
+ config.kafka.to_h.each do |k, v|
20
23
  key_assignment = :"#{k}="
21
24
  next unless water_config.kafka.respond_to?(key_assignment)
22
25
  water_config.kafka.public_send(key_assignment, v)
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Karafka
4
+ module Setup
5
+ # Dsl for allowing to work with the configuration from the Karafka::App
6
+ # @note Despite providing methods, everything is still persisted and fetched
7
+ # from the Karafka::Setup::Config
8
+ module Dsl
9
+ # Sets up the whole configuration
10
+ # @param [Block] block configuration block
11
+ def setup(&block)
12
+ Setup::Config.setup(&block)
13
+ initialize!
14
+ end
15
+
16
+ # @return [Karafka::Config] config instance
17
+ def config
18
+ Setup::Config.config
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Application controller from which all Karafka controllers should inherit
3
+ # Application consumer from which all Karafka consumers should inherit
4
4
  # You can rename it if it would conflict with your current code base (in case you're integrating
5
5
  # Karafka with other frameworks)
6
- class ApplicationController < Karafka::BaseController
7
- end
6
+ ApplicationConsumer = Class.new(Karafka::BaseConsumer)
@@ -21,18 +21,29 @@ class KarafkaApp < Karafka::App
21
21
  config.batch_fetching = true
22
22
  end
23
23
 
24
+ after_init do |config|
25
+ # Put here all the things you want to do after the Karafka framework
26
+ # initialization
27
+ end
28
+
29
+ # Comment out this part if you are not using instrumentation and/or you are not
30
+ # interested in logging events for certain environments. Since instrumentation
31
+ # notifications add extra boilerplate, if you want to achieve max performance,
32
+ # listen to only what you really need for given environment.
33
+ Karafka.monitor.subscribe(Karafka::Instrumentation::Listener)
34
+
24
35
  consumer_groups.draw do
25
36
  # topic :example do
26
- # controller ExampleController
37
+ # consumer ExampleConsumer
27
38
  # end
28
39
 
29
40
  # consumer_group :bigger_group do
30
41
  # topic :test do
31
- # controller TestController
42
+ # consumer TestConsumer
32
43
  # end
33
44
  #
34
45
  # topic :test2 do
35
- # controller Test2Controller
46
+ # consumer Test2Consumer
36
47
  # end
37
48
  # end
38
49
  end
@@ -3,5 +3,5 @@
3
3
  # Main module namespace
4
4
  module Karafka
5
5
  # Current Karafka version
6
- VERSION = '1.1.2'
6
+ VERSION = '1.2.0.beta1'
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: karafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-11-28 00:00:00.000000000 Z
13
+ date: 2018-02-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '5.0'
21
+ version: '4.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: '5.0'
28
+ version: '4.0'
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: dry-configurable
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -40,6 +40,34 @@ dependencies:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0.7'
43
+ - !ruby/object:Gem::Dependency
44
+ name: dry-inflector
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 0.1.1
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 0.1.1
57
+ - !ruby/object:Gem::Dependency
58
+ name: dry-monitor
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.1'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '0.1'
43
71
  - !ruby/object:Gem::Dependency
44
72
  name: dry-validation
45
73
  requirement: !ruby/object:Gem::Requirement
@@ -116,14 +144,14 @@ dependencies:
116
144
  requirements:
117
145
  - - ">="
118
146
  - !ruby/object:Gem::Version
119
- version: '0.5'
147
+ version: 0.5.3
120
148
  type: :runtime
121
149
  prerelease: false
122
150
  version_requirements: !ruby/object:Gem::Requirement
123
151
  requirements:
124
152
  - - ">="
125
153
  - !ruby/object:Gem::Version
126
- version: '0.5'
154
+ version: 0.5.3
127
155
  - !ruby/object:Gem::Dependency
128
156
  name: thor
129
157
  requirement: !ruby/object:Gem::Requirement
@@ -144,14 +172,14 @@ dependencies:
144
172
  requirements:
145
173
  - - ">="
146
174
  - !ruby/object:Gem::Version
147
- version: 1.0.1
175
+ version: 1.2.0.beta1
148
176
  type: :runtime
149
177
  prerelease: false
150
178
  version_requirements: !ruby/object:Gem::Requirement
151
179
  requirements:
152
180
  - - ">="
153
181
  - !ruby/object:Gem::Version
154
- version: 1.0.1
182
+ version: 1.2.0.beta1
155
183
  description: Framework used to simplify Apache Kafka based Ruby applications development
156
184
  email:
157
185
  - maciej@coditsu.io
@@ -182,8 +210,11 @@ files:
182
210
  - lib/karafka/app.rb
183
211
  - lib/karafka/attributes_map.rb
184
212
  - lib/karafka/backends/inline.rb
185
- - lib/karafka/base_controller.rb
213
+ - lib/karafka/base_consumer.rb
186
214
  - lib/karafka/base_responder.rb
215
+ - lib/karafka/callbacks.rb
216
+ - lib/karafka/callbacks/config.rb
217
+ - lib/karafka/callbacks/dsl.rb
187
218
  - lib/karafka/cli.rb
188
219
  - lib/karafka/cli/base.rb
189
220
  - lib/karafka/cli/console.rb
@@ -191,29 +222,31 @@ files:
191
222
  - lib/karafka/cli/info.rb
192
223
  - lib/karafka/cli/install.rb
193
224
  - lib/karafka/cli/server.rb
225
+ - lib/karafka/connection/client.rb
194
226
  - lib/karafka/connection/config_adapter.rb
195
- - lib/karafka/connection/consumer.rb
227
+ - lib/karafka/connection/delegator.rb
196
228
  - lib/karafka/connection/listener.rb
197
- - lib/karafka/connection/processor.rb
198
- - lib/karafka/controllers/callbacks.rb
199
- - lib/karafka/controllers/includer.rb
200
- - lib/karafka/controllers/responders.rb
201
- - lib/karafka/controllers/single_params.rb
229
+ - lib/karafka/consumers/callbacks.rb
230
+ - lib/karafka/consumers/includer.rb
231
+ - lib/karafka/consumers/responders.rb
232
+ - lib/karafka/consumers/single_params.rb
202
233
  - lib/karafka/errors.rb
203
234
  - lib/karafka/fetcher.rb
204
235
  - lib/karafka/helpers/class_matcher.rb
205
236
  - lib/karafka/helpers/config_retriever.rb
206
237
  - lib/karafka/helpers/multi_delegator.rb
238
+ - lib/karafka/instrumentation/listener.rb
239
+ - lib/karafka/instrumentation/logger.rb
240
+ - lib/karafka/instrumentation/monitor.rb
207
241
  - lib/karafka/loader.rb
208
- - lib/karafka/logger.rb
209
- - lib/karafka/monitor.rb
210
- - lib/karafka/params/params.rb
242
+ - lib/karafka/params/dsl.rb
211
243
  - lib/karafka/params/params_batch.rb
212
244
  - lib/karafka/parsers/json.rb
213
245
  - lib/karafka/patches/dry_configurable.rb
214
246
  - lib/karafka/patches/ruby_kafka.rb
247
+ - lib/karafka/persistence/client.rb
215
248
  - lib/karafka/persistence/consumer.rb
216
- - lib/karafka/persistence/controller.rb
249
+ - lib/karafka/persistence/topic.rb
217
250
  - lib/karafka/process.rb
218
251
  - lib/karafka/responders/builder.rb
219
252
  - lib/karafka/responders/topic.rb
@@ -232,9 +265,11 @@ files:
232
265
  - lib/karafka/server.rb
233
266
  - lib/karafka/setup/config.rb
234
267
  - lib/karafka/setup/configurators/base.rb
268
+ - lib/karafka/setup/configurators/params.rb
235
269
  - lib/karafka/setup/configurators/water_drop.rb
270
+ - lib/karafka/setup/dsl.rb
236
271
  - lib/karafka/status.rb
237
- - lib/karafka/templates/application_controller.rb.example
272
+ - lib/karafka/templates/application_consumer.rb.example
238
273
  - lib/karafka/templates/application_responder.rb.example
239
274
  - lib/karafka/templates/karafka.rb.example
240
275
  - lib/karafka/version.rb
@@ -254,12 +289,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
254
289
  version: 2.3.0
255
290
  required_rubygems_version: !ruby/object:Gem::Requirement
256
291
  requirements:
257
- - - ">="
292
+ - - ">"
258
293
  - !ruby/object:Gem::Version
259
- version: '0'
294
+ version: 1.3.1
260
295
  requirements: []
261
296
  rubyforge_project:
262
- rubygems_version: 2.6.13
297
+ rubygems_version: 2.7.3
263
298
  signing_key:
264
299
  specification_version: 4
265
300
  summary: Ruby based framework for working with Apache Kafka