kafka-rest-rb 0.1.0.alpha3 → 0.1.0.alpha4

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
  SHA1:
3
- metadata.gz: 62669def0b5abd426e87fd604d686d80bb7b35cb
4
- data.tar.gz: 34b0f48d653206b00b66d323bf70907eb9a6235c
3
+ metadata.gz: 0e943787c23ecd8a91ccbe8dd0af4da7b5cc4d6d
4
+ data.tar.gz: c067af79eca968aa0400006ec11af42afc5cb868
5
5
  SHA512:
6
- metadata.gz: 1d3b74192ffd3bc11cb8493c0b1688cbcf973b20f3c572ae38a9edc1024bd334d3e4e2a32a360aeb512230f186a7cc849e23dd9a608aafc2a60686ef6d3ac043
7
- data.tar.gz: e382353163f1fe427a970051e50476713f1f794efdacfdf7e23ce8b201cac596489211f46020e1750a4e504cf74a50a81006dfd405ece307f4645fcc34ac8da5
6
+ metadata.gz: 29a226688e4184daa8fbb636c7e6e2f59631faddfacb15d3c162cd315f1c6b38bf6fe8d683ea35fc42f0af457e79dadec48341223caa4e1eb2f5cb95a4fc7eef
7
+ data.tar.gz: 0ec544e2efd18df718d9676baaeafea0773ac8c86b0f526d89e87b4f8f568c4efeaf49875f0da333148a0dcaa3fc4ec68d430623416c384ee9ed1840e31b6b07
@@ -4,19 +4,6 @@ require 'multi_json'
4
4
 
5
5
  module KafkaRest
6
6
  class Client
7
- class KafkaRestClientException < StandardError
8
- attr_reader :body, :status
9
-
10
- def initialize(resp)
11
- @body = resp.body
12
- @status = resp.status
13
-
14
- super "#{@body['message']}" +
15
- " (HTTP Status: #{@status}; " +
16
- "error code: #{@body['error_code']})"
17
- end
18
- end
19
-
20
7
  class DefaultHeaders < Faraday::Middleware
21
8
  def initialize(app = nil, default_headers = {})
22
9
  @default_headers = default_headers
@@ -50,7 +37,7 @@ module KafkaRest
50
37
  response = @app.call(env)
51
38
  response.on_complete do
52
39
  unless response.success?
53
- raise KafkaRestClientException.new(response)
40
+ raise ClientError.new(response)
54
41
  end
55
42
  end
56
43
  end
@@ -5,7 +5,8 @@ module KafkaRest
5
5
  :serialization_adapter,
6
6
  :worker_min_threads,
7
7
  :worker_max_threads,
8
- :worker_max_queue
8
+ :worker_max_queue,
9
+ :sender
9
10
 
10
11
  def initialize
11
12
  @url = 'http://localhost:8082'
@@ -14,6 +15,15 @@ module KafkaRest
14
15
  @worker_min_threads = 4
15
16
  @worker_max_threads = 4
16
17
  @worker_max_queue = nil
18
+ @sender = KafkaRest::Sender::KafkaSender
19
+ end
20
+
21
+ def sender=(_sender)
22
+ if s.respond_to?(:send!)
23
+ @sender = _sender
24
+ else
25
+ raise InvalidConfigValue.new("sender", _sender, "Sender be a child of `KafkaRest::Sender`")
26
+ end
17
27
  end
18
28
  end
19
29
 
@@ -0,0 +1,29 @@
1
+ module KafkaRest
2
+ class InvalidConfigValue < StandardError
3
+ def initialize(name, val, msg = nil)
4
+ message = "Invalid config for `#{name}`: #{val.to_s}"
5
+ message << ". #{msg}" if msg
6
+
7
+ super message
8
+ end
9
+ end
10
+
11
+ class ClientError < StandardError
12
+ attr_reader :body, :status, :error_code
13
+
14
+ def initialize(resp)
15
+ @body = resp.body
16
+ @status = resp.status
17
+ @error_code = @body['error_code']
18
+
19
+ super "#{@body['message']}" +
20
+ " (HTTP Status: #{@status}; " +
21
+ "error code: #{@status})"
22
+ end
23
+ end
24
+
25
+ class ProducerSendError < StandardError
26
+ end
27
+
28
+ class ConsumerError < StandardError; end
29
+ end
@@ -0,0 +1,27 @@
1
+ module KafkaRest
2
+ module Producer
3
+ class Message
4
+ attr_reader :topic, :payload, :format, :params
5
+
6
+ def initialize(producer, obj, opts = {})
7
+ @topic = producer.get_topic.to_s
8
+ @payload = Payload.new(producer, obj, opts).build
9
+ @format = producer.get_format.to_s
10
+ @params = build_params(producer)
11
+ end
12
+
13
+ private
14
+
15
+ # add schemas if format == 'avro'
16
+ def build_params(producer)
17
+ {}.tap do |params|
18
+ if @format == 'avro'
19
+ has_key = !producer.get_key.nil?
20
+ params[:key_schema] = producer.get_key_schema if has_key
21
+ params[:value_schema] = producer.get_value_schema
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  module KafkaRest
2
- class Sender
2
+ module Producer
3
3
  class Payload
4
4
  class AvroBuilder < Builder
5
5
  # TODO: get rid of this
@@ -1,7 +1,7 @@
1
1
  require 'base64'
2
2
 
3
3
  module KafkaRest
4
- class Sender
4
+ module Producer
5
5
  class Payload
6
6
  class BinaryBuilder < Builder
7
7
  def build
@@ -1,5 +1,5 @@
1
1
  module KafkaRest
2
- class Sender
2
+ module Producer
3
3
  class Payload
4
4
  class Builder
5
5
  def initialize(payload)
@@ -1,5 +1,5 @@
1
1
  module KafkaRest
2
- class Sender
2
+ module Producer
3
3
  class Payload
4
4
  class JsonBuilder < Builder
5
5
  def build
@@ -1,10 +1,10 @@
1
- require 'kafka_rest/sender/payload/builder'
2
- require 'kafka_rest/sender/payload/avro_builder'
3
- require 'kafka_rest/sender/payload/json_builder'
4
- require 'kafka_rest/sender/payload/binary_builder'
1
+ require 'kafka_rest/producer/payload/builder'
2
+ require 'kafka_rest/producer/payload/avro_builder'
3
+ require 'kafka_rest/producer/payload/json_builder'
4
+ require 'kafka_rest/producer/payload/binary_builder'
5
5
 
6
6
  module KafkaRest
7
- class Sender
7
+ module Producer
8
8
  class Payload
9
9
  attr_reader :klass
10
10
 
@@ -1,4 +1,5 @@
1
1
  require 'kafka_rest/dsl'
2
+ require 'kafka_rest/producer/payload'
2
3
 
3
4
  module KafkaRest
4
5
  module Producer
@@ -60,9 +61,15 @@ module KafkaRest
60
61
  end
61
62
 
62
63
  module ClassMethods
63
- def send!(obj, opts = {}, producer = nil)
64
- (producer || KafkaRest::Sender.instance)
65
- .send!(self, obj, opts)
64
+ def build_message(obj, opts = {})
65
+ Message.new(self, obj, opts = {})
66
+ end
67
+
68
+ def send!(obj, opts = {}, sender = nil)
69
+ sender = sender || KafkaRest.config.sender
70
+ message = build_message(obj, opts)
71
+
72
+ sender.send!(message)
66
73
  end
67
74
  end
68
75
  end
@@ -0,0 +1,84 @@
1
+ module KafkaRest
2
+ module Sender
3
+ class KafkaSender
4
+
5
+ @@instance = nil
6
+
7
+ class << self
8
+ def instance
9
+ @@instance ||= self.new(Client.new)
10
+ end
11
+
12
+ def send!(message)
13
+ instance.send!(message)
14
+ end
15
+ end
16
+
17
+ attr_reader :key_schema_cache, :value_schema_cache
18
+
19
+ def initialize(client, opts = {})
20
+ @lock = Mutex.new
21
+ @client = client
22
+ @key_schema_cache = {}
23
+ @value_schema_cache = {}
24
+ end
25
+
26
+ # TODO: back-off retry if offset[i].errors is a retriable error
27
+ def send!(message)
28
+ send_produce_request!(
29
+ message.topic,
30
+ message.payload,
31
+ message.format,
32
+ build_params(message)
33
+ )
34
+ end
35
+
36
+ private
37
+
38
+ # replace key and value schemas with
39
+ # their ids if those are found in cache
40
+ def build_params(message)
41
+ return message.params unless message.format == 'avro'
42
+
43
+ topic, params, format = message.topic, message.params, message.format
44
+
45
+ {}.tap do |_p|
46
+ if format == 'avro'
47
+ if key_schema = params[:key_schema]
48
+ if key_schema_id = @key_schema_cache[topic]
49
+ _p[:key_schema_id] = key_schema_id
50
+ else
51
+ _p[:key_schema] = key_schema
52
+ end
53
+ end
54
+
55
+ if value_schema_id = @value_schema_cache[topic]
56
+ _p[:value_schema_id] = value_schema_id
57
+ else
58
+ _p[:value_schema] = params[:value_schema]
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ def send_produce_request!(topic, payload, format, params)
65
+ @client.topic_produce_message(topic, payload, format, params).body.tap do |re|
66
+ # this too (line 27)
67
+ cache_schema_ids!(re, topic) if format == 'avro'
68
+ end['offsets']
69
+ end
70
+
71
+ def cache_schema_ids!(resp, topic)
72
+ @lock.synchronize do
73
+ if @key_schema_cache[topic].nil? && kid = resp['key_schema_id']
74
+ @key_schema_cache[topic] = kid
75
+ end
76
+
77
+ if @value_schema_cache[topic].nil? && vid = resp['value_schema_id']
78
+ @value_schema_cache[topic] = vid
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,13 @@
1
+ module KafkaRest
2
+ module Sender
3
+ class LogSender
4
+ def initialize(logger = nil)
5
+ @logger = logger || Logging.logger
6
+ end
7
+
8
+ def send!(msg)
9
+ @logger.info msg # todo
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ module KafkaRest
2
+ module Sender
3
+ class TestSender
4
+ attr_reader :messages
5
+
6
+ def initialize
7
+ @lock = Mutex.new
8
+ @messages = {}
9
+ end
10
+
11
+ def send!(message)
12
+ @lock.synchronize do
13
+ topic = message.topic
14
+ @messages[topic] ||= []
15
+ @messages[topic] << message
16
+ end
17
+ end
18
+
19
+ def last_for(topic)
20
+ @messages[topic].last
21
+ end
22
+
23
+ def reset!
24
+ @messages = {}
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,81 +1,13 @@
1
1
  require 'thread'
2
- require 'kafka_rest/sender/payload'
3
2
 
4
3
  module KafkaRest
5
- class Sender
6
- @@lock = Mutex.new
4
+ module Sender
5
+ require 'kafka_rest/sender/kafka_sender'
6
+ require 'kafka_rest/sender/log_sender'
7
+ require 'kafka_rest/sender/test_sender'
7
8
 
8
- class << self
9
- def instance
10
- @@lock.synchronize do
11
- @instance ||= self.new(Client.new, lock: @@lock)
12
- end
13
- end
14
- end
15
-
16
- attr_reader :key_schema_cache, :value_schema_cache
17
-
18
- # TODO: buffering???
19
- def initialize(client, opts = {})
20
- @lock = opts[:lock] || Mutex.new
21
- @client = client
22
- @key_schema_cache = {}
23
- @value_schema_cache = {}
24
- end
25
-
26
- # TODO: back-off retry if offset[i].errors is a retriable error
27
- def send!(klass, obj, opts = {})
28
- topic, payload, format, params = build_request(klass, obj, opts)
29
- send_produce_request!(topic, payload, format, params)
30
- end
31
-
32
- private
33
-
34
- def build_request(klass, obj, opts)
35
- # TODO: oooh, dirty and weird - this should not be here.
36
- # come up with something good!
37
- topic = klass.get_topic.to_s
38
- key = klass.get_key
39
- payload = Payload.new(klass, obj, opts).build
40
- format = klass.get_format.to_s
41
- params = {}.tap do |_p|
42
- if format == 'avro'
43
- unless key.nil?
44
- if kid = @key_schema_cache[topic]
45
- _p[:key_schema_id] = kid
46
- else
47
- _p[:key_schema] = klass.get_key_schema
48
- end
49
- end
50
-
51
- if vid = @value_schema_cache[topic]
52
- _p[:value_schema_id] = vid
53
- else
54
- _p[:value_schema] = klass.get_value_schema
55
- end
56
- end
57
- end
58
-
59
- [topic, payload, format, params]
60
- end
61
-
62
- def send_produce_request!(topic, payload, format, params)
63
- @client.topic_produce_message(topic, payload, format, params).body.tap do |re|
64
- # this too (line 27)
65
- cache_schema_ids!(re, topic) if format == 'avro'
66
- end['offsets']
67
- end
68
-
69
- def cache_schema_ids!(resp, topic)
70
- @lock.synchronize do
71
- if @key_schema_cache[topic].nil? && kid = resp['key_schema_id']
72
- @key_schema_cache[topic] = kid
73
- end
74
-
75
- if @value_schema_cache[topic].nil? && vid = resp['value_schema_id']
76
- @value_schema_cache[topic] = vid
77
- end
78
- end
9
+ def self.valid?(sender)
10
+ sender.respond_to? :send!
79
11
  end
80
12
  end
81
13
  end
@@ -1,3 +1,3 @@
1
1
  module KafkaRest
2
- VERSION = '0.1.0.alpha3'
2
+ VERSION = '0.1.0.alpha4'
3
3
  end
data/lib/kafka_rest.rb CHANGED
@@ -1,10 +1,14 @@
1
+ module KafkaRest; end
2
+
3
+ require 'kafka_rest/exceptions'
4
+ require 'kafka_rest/sender'
1
5
  require 'kafka_rest/config'
2
6
  require 'kafka_rest/logging'
3
7
  require 'kafka_rest/client'
4
8
  require 'kafka_rest/worker'
5
9
  require 'kafka_rest/producer'
10
+ require 'kafka_rest/producer/message'
6
11
  require 'kafka_rest/producer/serialization/adapter'
7
- require 'kafka_rest/sender'
8
12
  require 'kafka_rest/consumer'
9
13
 
10
14
  KafkaRest.configure do |c|
metadata CHANGED
@@ -1,153 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kafka-rest-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha3
4
+ version: 0.1.0.alpha4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theodore Konukhov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-18 00:00:00.000000000 Z
11
+ date: 2016-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: faraday
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
- - - ~>
17
+ - - "~>"
17
18
  - !ruby/object:Gem::Version
18
19
  version: '0.9'
19
- name: faraday
20
- prerelease: false
21
20
  type: :runtime
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.9'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: net-http-persistent
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ~>
31
+ - - "~>"
31
32
  - !ruby/object:Gem::Version
32
33
  version: '2.9'
33
- name: net-http-persistent
34
- prerelease: false
35
34
  type: :runtime
35
+ prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.9'
41
41
  - !ruby/object:Gem::Dependency
42
+ name: faraday_middleware
42
43
  requirement: !ruby/object:Gem::Requirement
43
44
  requirements:
44
- - - ~>
45
+ - - "~>"
45
46
  - !ruby/object:Gem::Version
46
47
  version: '0.10'
47
- name: faraday_middleware
48
- prerelease: false
49
48
  type: :runtime
49
+ prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.10'
55
55
  - !ruby/object:Gem::Dependency
56
+ name: concurrent-ruby
56
57
  requirement: !ruby/object:Gem::Requirement
57
58
  requirements:
58
- - - ~>
59
+ - - "~>"
59
60
  - !ruby/object:Gem::Version
60
61
  version: '1.0'
61
- name: concurrent-ruby
62
- prerelease: false
63
62
  type: :runtime
63
+ prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.0'
69
69
  - !ruby/object:Gem::Dependency
70
+ name: multi_json
70
71
  requirement: !ruby/object:Gem::Requirement
71
72
  requirements:
72
- - - ~>
73
+ - - "~>"
73
74
  - !ruby/object:Gem::Version
74
75
  version: '1.12'
75
- name: multi_json
76
- prerelease: false
77
76
  type: :runtime
77
+ prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.12'
83
83
  - !ruby/object:Gem::Dependency
84
+ name: connection_pool
84
85
  requirement: !ruby/object:Gem::Requirement
85
86
  requirements:
86
- - - ~>
87
+ - - "~>"
87
88
  - !ruby/object:Gem::Version
88
89
  version: '2.2'
89
- name: connection_pool
90
- prerelease: false
91
90
  type: :runtime
91
+ prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.2'
97
97
  - !ruby/object:Gem::Dependency
98
+ name: oj
98
99
  requirement: !ruby/object:Gem::Requirement
99
100
  requirements:
100
- - - ~>
101
+ - - ">="
101
102
  - !ruby/object:Gem::Version
102
- version: 0.3.4
103
- name: jrjackson
104
- prerelease: false
103
+ version: '2.9'
105
104
  type: :runtime
105
+ prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 0.3.4
110
+ version: '2.9'
111
111
  - !ruby/object:Gem::Dependency
112
+ name: bundler
112
113
  requirement: !ruby/object:Gem::Requirement
113
114
  requirements:
114
- - - ~>
115
+ - - "~>"
115
116
  - !ruby/object:Gem::Version
116
117
  version: '1.12'
117
- name: bundler
118
- prerelease: false
119
118
  type: :development
119
+ prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ~>
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '1.12'
125
125
  - !ruby/object:Gem::Dependency
126
+ name: rake
126
127
  requirement: !ruby/object:Gem::Requirement
127
128
  requirements:
128
- - - ~>
129
+ - - "~>"
129
130
  - !ruby/object:Gem::Version
130
131
  version: '10.0'
131
- name: rake
132
- prerelease: false
133
132
  type: :development
133
+ prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ~>
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '10.0'
139
139
  - !ruby/object:Gem::Dependency
140
+ name: rspec
140
141
  requirement: !ruby/object:Gem::Requirement
141
142
  requirements:
142
- - - ~>
143
+ - - "~>"
143
144
  - !ruby/object:Gem::Version
144
145
  version: '3.0'
145
- name: rspec
146
- prerelease: false
147
146
  type: :development
147
+ prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ~>
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '3.0'
153
153
  description: Kafka-REST client, DSLs and consumer workers for Ruby.
@@ -158,9 +158,9 @@ executables:
158
158
  extensions: []
159
159
  extra_rdoc_files: []
160
160
  files:
161
- - .gitignore
162
- - .rspec
163
- - .travis.yml
161
+ - ".gitignore"
162
+ - ".rspec"
163
+ - ".travis.yml"
164
164
  - CODE_OF_CONDUCT.md
165
165
  - Gemfile
166
166
  - LICENSE.txt
@@ -177,17 +177,22 @@ files:
177
177
  - lib/kafka_rest/config.rb
178
178
  - lib/kafka_rest/consumer.rb
179
179
  - lib/kafka_rest/dsl.rb
180
+ - lib/kafka_rest/exceptions.rb
180
181
  - lib/kafka_rest/logging.rb
181
182
  - lib/kafka_rest/producer.rb
183
+ - lib/kafka_rest/producer/message.rb
184
+ - lib/kafka_rest/producer/payload.rb
185
+ - lib/kafka_rest/producer/payload/avro_builder.rb
186
+ - lib/kafka_rest/producer/payload/binary_builder.rb
187
+ - lib/kafka_rest/producer/payload/builder.rb
188
+ - lib/kafka_rest/producer/payload/json_builder.rb
182
189
  - lib/kafka_rest/producer/serialization/active_model.rb
183
190
  - lib/kafka_rest/producer/serialization/adapter.rb
184
191
  - lib/kafka_rest/producer/serialization/noop.rb
185
192
  - lib/kafka_rest/sender.rb
186
- - lib/kafka_rest/sender/payload.rb
187
- - lib/kafka_rest/sender/payload/avro_builder.rb
188
- - lib/kafka_rest/sender/payload/binary_builder.rb
189
- - lib/kafka_rest/sender/payload/builder.rb
190
- - lib/kafka_rest/sender/payload/json_builder.rb
193
+ - lib/kafka_rest/sender/kafka_sender.rb
194
+ - lib/kafka_rest/sender/log_sender.rb
195
+ - lib/kafka_rest/sender/test_sender.rb
191
196
  - lib/kafka_rest/version.rb
192
197
  - lib/kafka_rest/worker.rb
193
198
  - lib/kafka_rest/worker/consumer_manager.rb
@@ -196,24 +201,24 @@ homepage: https://github.com/konukhov/kafka-rest-rb
196
201
  licenses:
197
202
  - MIT
198
203
  metadata: {}
199
- post_install_message:
204
+ post_install_message:
200
205
  rdoc_options: []
201
206
  require_paths:
202
207
  - lib
203
208
  required_ruby_version: !ruby/object:Gem::Requirement
204
209
  requirements:
205
- - - '>='
210
+ - - ">="
206
211
  - !ruby/object:Gem::Version
207
212
  version: '0'
208
213
  required_rubygems_version: !ruby/object:Gem::Requirement
209
214
  requirements:
210
- - - '>'
215
+ - - ">"
211
216
  - !ruby/object:Gem::Version
212
217
  version: 1.3.1
213
218
  requirements: []
214
- rubyforge_project:
215
- rubygems_version: 2.1.9
216
- signing_key:
219
+ rubyforge_project:
220
+ rubygems_version: 2.5.1
221
+ signing_key:
217
222
  specification_version: 4
218
223
  summary: Kafka-REST proxy client for Ruby on Rails.
219
224
  test_files: []