racecar 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +56 -0
- data/CHANGELOG.md +9 -1
- data/Gemfile +2 -0
- data/Rakefile +2 -0
- data/docker-compose.yml +32 -0
- data/examples/batch_consumer.rb +2 -0
- data/examples/cat_consumer.rb +2 -0
- data/examples/producing_consumer.rb +2 -0
- data/exe/racecar +37 -14
- data/lib/ensure_hash_compact.rb +2 -0
- data/lib/generators/racecar/consumer_generator.rb +2 -0
- data/lib/generators/racecar/install_generator.rb +2 -0
- data/lib/racecar.rb +3 -0
- data/lib/racecar/cli.rb +13 -20
- data/lib/racecar/config.rb +4 -2
- data/lib/racecar/consumer.rb +3 -1
- data/lib/racecar/consumer_set.rb +2 -0
- data/lib/racecar/ctl.rb +2 -0
- data/lib/racecar/daemon.rb +2 -0
- data/lib/racecar/datadog.rb +2 -0
- data/lib/racecar/instrumenter.rb +4 -0
- data/lib/racecar/message.rb +2 -0
- data/lib/racecar/null_instrumenter.rb +2 -0
- data/lib/racecar/pause.rb +8 -4
- data/lib/racecar/rails_config_file_loader.rb +2 -0
- data/lib/racecar/runner.rb +9 -5
- data/lib/racecar/version.rb +3 -1
- data/racecar.gemspec +2 -1
- metadata +24 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90dddff7c52ef8440ab154be364aacd71f687e7121eaa3456e6b580c3717c294
|
4
|
+
data.tar.gz: '092eb0699d0e60537840cd0114497003ee32e18d611a5b386d430fdfeabd7e03'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd4d053961a7f228aeda34bb01e758f9caa6356cf4fb7a3e773c14b9976c19ab30587ce23a010e31b115f30d85999bb38c120e0313b99b43cc744b71f273fb3c
|
7
|
+
data.tar.gz: d0d1865ef2c7adcf94e1bf9c551d7bcdc02a223ee50fbfe4e7293b89629ca7853c55c5cfe144ce879c8aa28c3b8939dcd87fc01c54d441369cfe3c4a186643f3
|
@@ -0,0 +1,56 @@
|
|
1
|
+
version: 2.1
|
2
|
+
orbs:
|
3
|
+
ruby: circleci/ruby@0.1.2
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
docker:
|
8
|
+
- image: circleci/ruby:2.6.3-stretch-node
|
9
|
+
executor: ruby/default
|
10
|
+
steps:
|
11
|
+
- checkout
|
12
|
+
- run:
|
13
|
+
name: Which bundler?
|
14
|
+
command: bundle -v
|
15
|
+
- ruby/bundle-install
|
16
|
+
- run: bundle exec rspec --exclude-pattern='spec/integration/*_spec.rb'
|
17
|
+
integration-tests:
|
18
|
+
docker:
|
19
|
+
- image: circleci/ruby:2.6.3-stretch-node
|
20
|
+
- image: wurstmeister/zookeeper
|
21
|
+
- image: wurstmeister/kafka:2.11-2.0.0
|
22
|
+
environment:
|
23
|
+
KAFKA_ADVERTISED_HOST_NAME: localhost
|
24
|
+
KAFKA_ADVERTISED_PORT: 9092
|
25
|
+
KAFKA_PORT: 9092
|
26
|
+
KAFKA_ZOOKEEPER_CONNECT: localhost:2181
|
27
|
+
KAFKA_DELETE_TOPIC_ENABLE: true
|
28
|
+
- image: wurstmeister/kafka:2.11-2.0.0
|
29
|
+
environment:
|
30
|
+
KAFKA_ADVERTISED_HOST_NAME: localhost
|
31
|
+
KAFKA_ADVERTISED_PORT: 9093
|
32
|
+
KAFKA_PORT: 9093
|
33
|
+
KAFKA_ZOOKEEPER_CONNECT: localhost:2181
|
34
|
+
KAFKA_DELETE_TOPIC_ENABLE: true
|
35
|
+
- image: wurstmeister/kafka:2.11-2.0.0
|
36
|
+
environment:
|
37
|
+
KAFKA_ADVERTISED_HOST_NAME: localhost
|
38
|
+
KAFKA_ADVERTISED_PORT: 9094
|
39
|
+
KAFKA_PORT: 9094
|
40
|
+
KAFKA_ZOOKEEPER_CONNECT: localhost:2181
|
41
|
+
KAFKA_DELETE_TOPIC_ENABLE: true
|
42
|
+
executor: ruby/default
|
43
|
+
steps:
|
44
|
+
- checkout
|
45
|
+
- run:
|
46
|
+
name: Which bundler?
|
47
|
+
command: bundle -v
|
48
|
+
- ruby/bundle-install
|
49
|
+
- run: bundle exec rspec --pattern='spec/integration/*_spec.rb'
|
50
|
+
|
51
|
+
workflows:
|
52
|
+
version: 2
|
53
|
+
test:
|
54
|
+
jobs:
|
55
|
+
- build
|
56
|
+
- integration-tests
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Unreleased
|
4
|
+
|
5
|
+
## racecar v2.1.0
|
6
|
+
|
7
|
+
* Bump rdkafka to 0.8.0 (#191)
|
8
|
+
|
3
9
|
## racecar v2.0.0
|
4
10
|
|
5
|
-
* Replace `ruby-kafka` with `rdkafka-ruby` as the low-level library underneath Racecar.
|
11
|
+
* Replace `ruby-kafka` with `rdkafka-ruby` as the low-level library underneath Racecar (#91).
|
6
12
|
* Fix `max_wait_time` usage (#179).
|
7
13
|
* Removed config option `sasl_over_ssl`.
|
8
14
|
* [Racecar::Consumer] Do not pause consuming partitions on exception.
|
@@ -26,6 +32,8 @@
|
|
26
32
|
* [Instrumentation] if processors define a `statistics_callback`, it will be called once every second for every subscription or producer connection. The first argument will be a Hash, for contents see [librdkafka STATISTICS.md](https://github.com/edenhill/librdkafka/blob/master/STATISTICS.md).
|
27
33
|
* Add current directory to `$LOAD_PATH` only when `--require` option is used (#117).
|
28
34
|
* Remove manual heartbeat support, see [Long-running message processing section in README](README.md#long-running-message-processing).
|
35
|
+
* Rescue exceptions--then log and pass to `on_error`--at the outermost level of `exe/racecar`, so that exceptions raised outside `Cli.run` are not silently discarded (#186).
|
36
|
+
* When exceptions with a `cause` are logged, recursively log the `cause` detail, separated by `--- Caused by: ---\n`.
|
29
37
|
|
30
38
|
## racecar v1.0.0
|
31
39
|
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/docker-compose.yml
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
version: '2'
|
2
|
+
services:
|
3
|
+
zookeeper:
|
4
|
+
image: confluentinc/cp-zookeeper:5.5.1
|
5
|
+
hostname: zookeeper
|
6
|
+
container_name: zookeeper
|
7
|
+
ports:
|
8
|
+
- "2181:2181"
|
9
|
+
environment:
|
10
|
+
ZOOKEEPER_CLIENT_PORT: 2181
|
11
|
+
ZOOKEEPER_TICK_TIME: 2000
|
12
|
+
|
13
|
+
broker:
|
14
|
+
image: confluentinc/cp-kafka:5.5.1
|
15
|
+
hostname: broker
|
16
|
+
container_name: broker
|
17
|
+
depends_on:
|
18
|
+
- zookeeper
|
19
|
+
ports:
|
20
|
+
- "29092:29092"
|
21
|
+
- "9092:9092"
|
22
|
+
- "9101:9101"
|
23
|
+
environment:
|
24
|
+
KAFKA_BROKER_ID: 1
|
25
|
+
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
|
26
|
+
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
|
27
|
+
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092
|
28
|
+
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
|
29
|
+
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
|
30
|
+
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
|
31
|
+
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
|
32
|
+
KAFKA_JMX_PORT: 9101
|
data/examples/batch_consumer.rb
CHANGED
data/examples/cat_consumer.rb
CHANGED
data/exe/racecar
CHANGED
@@ -3,19 +3,42 @@
|
|
3
3
|
require "racecar"
|
4
4
|
require "racecar/cli"
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
module Racecar
|
7
|
+
class << self
|
8
|
+
def start(argv)
|
9
|
+
Cli.main(argv)
|
10
|
+
rescue SignalException => e
|
11
|
+
# We might receive SIGTERM before our signal handler is installed.
|
12
|
+
if Signal.signame(e.signo) == "TERM"
|
13
|
+
exit(0)
|
14
|
+
else
|
15
|
+
raise
|
16
|
+
end
|
17
|
+
rescue SystemExit
|
18
|
+
raise
|
19
|
+
rescue Exception => e
|
20
|
+
$stderr.puts "=> Crashed: #{exception_with_causes(e)}\n#{e.backtrace.join("\n")}"
|
21
|
+
|
22
|
+
Racecar.config.error_handler.call(e)
|
23
|
+
|
24
|
+
exit(1)
|
25
|
+
else
|
26
|
+
exit(0)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def exception_with_causes(e)
|
32
|
+
result = +"#{e.class}: #{e}"
|
33
|
+
if e.cause
|
34
|
+
result << "\n"
|
35
|
+
result << "--- Caused by: ---\n"
|
36
|
+
result << exception_with_causes(e.cause)
|
37
|
+
end
|
38
|
+
result
|
39
|
+
end
|
14
40
|
end
|
15
|
-
rescue
|
16
|
-
# Exceptions are printed to STDERR and sent to the error handler
|
17
|
-
# in `Racecar::Cli#run`, so we don't need to do anything here.
|
18
|
-
exit(1)
|
19
|
-
else
|
20
|
-
exit(0)
|
21
41
|
end
|
42
|
+
|
43
|
+
# Start your engines!
|
44
|
+
Racecar.start(ARGV)
|
data/lib/ensure_hash_compact.rb
CHANGED
data/lib/racecar.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "logger"
|
2
4
|
|
3
5
|
require "racecar/instrumenter"
|
@@ -6,6 +8,7 @@ require "racecar/consumer"
|
|
6
8
|
require "racecar/consumer_set"
|
7
9
|
require "racecar/runner"
|
8
10
|
require "racecar/config"
|
11
|
+
require "racecar/version"
|
9
12
|
require "ensure_hash_compact"
|
10
13
|
|
11
14
|
module Racecar
|
data/lib/racecar/cli.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "optparse"
|
2
4
|
require "logger"
|
3
5
|
require "fileutils"
|
@@ -6,8 +8,10 @@ require "racecar/daemon"
|
|
6
8
|
|
7
9
|
module Racecar
|
8
10
|
class Cli
|
9
|
-
|
10
|
-
|
11
|
+
class << self
|
12
|
+
def main(args)
|
13
|
+
new(args).run
|
14
|
+
end
|
11
15
|
end
|
12
16
|
|
13
17
|
def initialize(args)
|
@@ -16,10 +20,6 @@ module Racecar
|
|
16
20
|
@consumer_name = args.first or raise Racecar::Error, "no consumer specified"
|
17
21
|
end
|
18
22
|
|
19
|
-
def config
|
20
|
-
Racecar.config
|
21
|
-
end
|
22
|
-
|
23
23
|
def run
|
24
24
|
$stderr.puts "=> Starting Racecar consumer #{consumer_name}..."
|
25
25
|
|
@@ -61,18 +61,16 @@ module Racecar
|
|
61
61
|
processor = consumer_class.new
|
62
62
|
|
63
63
|
Racecar.run(processor)
|
64
|
-
rescue => e
|
65
|
-
$stderr.puts "=> Crashed: #{e.class}: #{e}\n#{e.backtrace.join("\n")}"
|
66
|
-
|
67
|
-
config.error_handler.call(e)
|
68
|
-
|
69
|
-
raise
|
70
64
|
end
|
71
65
|
|
72
66
|
private
|
73
67
|
|
74
68
|
attr_reader :consumer_name
|
75
69
|
|
70
|
+
def config
|
71
|
+
Racecar.config
|
72
|
+
end
|
73
|
+
|
76
74
|
def daemonize!
|
77
75
|
daemon = Daemon.new(File.expand_path(config.pidfile))
|
78
76
|
|
@@ -102,12 +100,7 @@ module Racecar
|
|
102
100
|
opts.on("-r", "--require STRING", "Require a library before starting the consumer") do |lib|
|
103
101
|
$LOAD_PATH.unshift(Dir.pwd) unless load_path_modified
|
104
102
|
load_path_modified = true
|
105
|
-
|
106
|
-
require lib
|
107
|
-
rescue => e
|
108
|
-
$stderr.puts "=> #{lib} failed to load: #{e.message}"
|
109
|
-
exit
|
110
|
-
end
|
103
|
+
require lib
|
111
104
|
end
|
112
105
|
|
113
106
|
opts.on("-l", "--log STRING", "Log to the specified file") do |logfile|
|
@@ -115,13 +108,13 @@ module Racecar
|
|
115
108
|
end
|
116
109
|
|
117
110
|
Racecar::Config.variables.each do |variable|
|
118
|
-
opt_name = "
|
111
|
+
opt_name = +"--#{variable.name.to_s.gsub('_', '-')}"
|
119
112
|
opt_name << " #{variable.type.upcase}" unless variable.boolean?
|
120
113
|
|
121
114
|
desc = variable.description || "N/A"
|
122
115
|
|
123
116
|
if variable.default
|
124
|
-
desc
|
117
|
+
desc += " (default: #{variable.default.inspect})"
|
125
118
|
end
|
126
119
|
|
127
120
|
opts.on(opt_name, desc) do |value|
|
data/lib/racecar/config.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "king_konf"
|
2
4
|
|
3
5
|
module Racecar
|
@@ -196,8 +198,8 @@ module Racecar
|
|
196
198
|
group_id_prefix,
|
197
199
|
|
198
200
|
# MyFunnyConsumer => my-funny-consumer
|
199
|
-
consumer_class.name.gsub(/[a-z][A-Z]/) {|str| str[0]
|
200
|
-
].compact.join
|
201
|
+
consumer_class.name.gsub(/[a-z][A-Z]/) { |str| "#{str[0]}-#{str[1]}" }.downcase,
|
202
|
+
].compact.join
|
201
203
|
|
202
204
|
self.subscriptions = consumer_class.subscriptions
|
203
205
|
self.max_wait_time = consumer_class.max_wait_time || self.max_wait_time
|
data/lib/racecar/consumer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Racecar
|
2
4
|
class Consumer
|
3
5
|
Subscription = Struct.new(:topic, :start_from_beginning, :max_bytes_per_partition, :additional_config)
|
@@ -54,7 +56,7 @@ module Racecar
|
|
54
56
|
protected
|
55
57
|
|
56
58
|
# https://github.com/appsignal/rdkafka-ruby#producing-messages
|
57
|
-
def produce(payload, topic:, key
|
59
|
+
def produce(payload, topic:, key: nil, partition_key: nil, headers: nil, create_time: nil)
|
58
60
|
@delivery_handles ||= []
|
59
61
|
message_size = payload.respond_to?(:bytesize) ? payload.bytesize : 0
|
60
62
|
instrumentation_payload = {
|
data/lib/racecar/consumer_set.rb
CHANGED
data/lib/racecar/ctl.rb
CHANGED
data/lib/racecar/daemon.rb
CHANGED
data/lib/racecar/datadog.rb
CHANGED
data/lib/racecar/instrumenter.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Racecar
|
2
4
|
##
|
3
5
|
# Common API for instrumentation to standardize
|
@@ -11,6 +13,8 @@ module Racecar
|
|
11
13
|
@default_payload = default_payload
|
12
14
|
|
13
15
|
@backend = if defined?(ActiveSupport::Notifications)
|
16
|
+
# ActiveSupport needs `concurrent-ruby` but doesn't `require` it.
|
17
|
+
require 'concurrent/utility/monotonic_time'
|
14
18
|
ActiveSupport::Notifications
|
15
19
|
else
|
16
20
|
NullInstrumenter
|
data/lib/racecar/message.rb
CHANGED
data/lib/racecar/pause.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Racecar
|
2
4
|
class Pause
|
5
|
+
attr_reader :pauses_count
|
6
|
+
|
3
7
|
def initialize(timeout: nil, max_timeout: nil, exponential_backoff: false)
|
4
8
|
@started_at = nil
|
5
|
-
@
|
9
|
+
@pauses_count = 0
|
6
10
|
@timeout = timeout
|
7
11
|
@max_timeout = max_timeout
|
8
12
|
@exponential_backoff = exponential_backoff
|
@@ -11,7 +15,7 @@ module Racecar
|
|
11
15
|
def pause!
|
12
16
|
@started_at = Time.now
|
13
17
|
@ends_at = @started_at + backoff_interval unless @timeout.nil?
|
14
|
-
@
|
18
|
+
@pauses_count += 1
|
15
19
|
end
|
16
20
|
|
17
21
|
def resume!
|
@@ -38,13 +42,13 @@ module Racecar
|
|
38
42
|
end
|
39
43
|
|
40
44
|
def reset!
|
41
|
-
@
|
45
|
+
@pauses_count = 0
|
42
46
|
end
|
43
47
|
|
44
48
|
def backoff_interval
|
45
49
|
return Float::INFINITY if @timeout.nil?
|
46
50
|
|
47
|
-
backoff_factor = @exponential_backoff ? 2**@
|
51
|
+
backoff_factor = @exponential_backoff ? 2**@pauses_count : 1
|
48
52
|
timeout = backoff_factor * @timeout
|
49
53
|
|
50
54
|
timeout = @max_timeout if @max_timeout && timeout > @max_timeout
|
data/lib/racecar/runner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "rdkafka"
|
2
4
|
require "racecar/pause"
|
3
5
|
require "racecar/message"
|
@@ -166,7 +168,7 @@ module Racecar
|
|
166
168
|
}
|
167
169
|
|
168
170
|
@instrumenter.instrument("start_process_message", instrumentation_payload)
|
169
|
-
with_pause(message.topic, message.partition, message.offset..message.offset) do
|
171
|
+
with_pause(message.topic, message.partition, message.offset..message.offset) do |pause|
|
170
172
|
begin
|
171
173
|
@instrumenter.instrument("process_message", instrumentation_payload) do
|
172
174
|
processor.process(Racecar::Message.new(message))
|
@@ -174,6 +176,7 @@ module Racecar
|
|
174
176
|
consumer.store_offset(message)
|
175
177
|
end
|
176
178
|
rescue => e
|
179
|
+
instrumentation_payload[:retries_count] = pause.pauses_count
|
177
180
|
config.error_handler.call(e, instrumentation_payload)
|
178
181
|
raise e
|
179
182
|
end
|
@@ -194,12 +197,13 @@ module Racecar
|
|
194
197
|
|
195
198
|
@instrumenter.instrument("start_process_batch", instrumentation_payload)
|
196
199
|
@instrumenter.instrument("process_batch", instrumentation_payload) do
|
197
|
-
with_pause(first.topic, first.partition, first.offset..last.offset) do
|
200
|
+
with_pause(first.topic, first.partition, first.offset..last.offset) do |pause|
|
198
201
|
begin
|
199
202
|
processor.process_batch(messages.map {|message| Racecar::Message.new(message) })
|
200
203
|
processor.deliver!
|
201
204
|
consumer.store_offset(messages.last)
|
202
205
|
rescue => e
|
206
|
+
instrumentation_payload[:retries_count] = pause.pauses_count
|
203
207
|
config.error_handler.call(e, instrumentation_payload)
|
204
208
|
raise e
|
205
209
|
end
|
@@ -208,17 +212,17 @@ module Racecar
|
|
208
212
|
end
|
209
213
|
|
210
214
|
def with_pause(topic, partition, offsets)
|
211
|
-
|
215
|
+
pause = pauses[topic][partition]
|
216
|
+
return yield pause if config.pause_timeout == 0
|
212
217
|
|
213
218
|
begin
|
214
|
-
yield
|
219
|
+
yield pause
|
215
220
|
# We've successfully processed a batch from the partition, so we can clear the pause.
|
216
221
|
pauses[topic][partition].reset!
|
217
222
|
rescue => e
|
218
223
|
desc = "#{topic}/#{partition}"
|
219
224
|
logger.error "Failed to process #{desc} at #{offsets}: #{e}"
|
220
225
|
|
221
|
-
pause = pauses[topic][partition]
|
222
226
|
logger.warn "Pausing partition #{desc} for #{pause.backoff_interval} seconds"
|
223
227
|
consumer.pause(topic, partition, offsets.first)
|
224
228
|
pause.pause!
|
data/lib/racecar/version.rb
CHANGED
data/racecar.gemspec
CHANGED
@@ -21,9 +21,10 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
23
|
spec.add_runtime_dependency "king_konf", "~> 0.3.7"
|
24
|
-
spec.add_runtime_dependency "rdkafka", "~> 0.8.0
|
24
|
+
spec.add_runtime_dependency "rdkafka", "~> 0.8.0"
|
25
25
|
|
26
26
|
spec.add_development_dependency "bundler", [">= 1.13", "< 3"]
|
27
|
+
spec.add_development_dependency "pry"
|
27
28
|
spec.add_development_dependency "rake", "> 10.0"
|
28
29
|
spec.add_development_dependency "rspec", "~> 3.0"
|
29
30
|
spec.add_development_dependency "timecop"
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: racecar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Schierbeck
|
8
8
|
- Benjamin Quorning
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-09-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: king_konf
|
@@ -31,14 +31,14 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 0.8.0
|
34
|
+
version: 0.8.0
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: 0.8.0
|
41
|
+
version: 0.8.0
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: bundler
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,6 +59,20 @@ dependencies:
|
|
59
59
|
- - "<"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '3'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
62
76
|
- !ruby/object:Gem::Dependency
|
63
77
|
name: rake
|
64
78
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,7 +155,7 @@ dependencies:
|
|
141
155
|
- - "<"
|
142
156
|
- !ruby/object:Gem::Version
|
143
157
|
version: '6.1'
|
144
|
-
description:
|
158
|
+
description:
|
145
159
|
email:
|
146
160
|
- dschierbeck@zendesk.com
|
147
161
|
- bquorning@zendesk.com
|
@@ -151,6 +165,7 @@ executables:
|
|
151
165
|
extensions: []
|
152
166
|
extra_rdoc_files: []
|
153
167
|
files:
|
168
|
+
- ".circleci/config.yml"
|
154
169
|
- ".github/workflows/rspec.yml"
|
155
170
|
- ".gitignore"
|
156
171
|
- ".rspec"
|
@@ -162,6 +177,7 @@ files:
|
|
162
177
|
- Rakefile
|
163
178
|
- bin/console
|
164
179
|
- bin/setup
|
180
|
+
- docker-compose.yml
|
165
181
|
- examples/batch_consumer.rb
|
166
182
|
- examples/cat_consumer.rb
|
167
183
|
- examples/producing_consumer.rb
|
@@ -192,7 +208,7 @@ homepage: https://github.com/zendesk/racecar
|
|
192
208
|
licenses:
|
193
209
|
- Apache License Version 2.0
|
194
210
|
metadata: {}
|
195
|
-
post_install_message:
|
211
|
+
post_install_message:
|
196
212
|
rdoc_options: []
|
197
213
|
require_paths:
|
198
214
|
- lib
|
@@ -208,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
224
|
version: '0'
|
209
225
|
requirements: []
|
210
226
|
rubygems_version: 3.1.2
|
211
|
-
signing_key:
|
227
|
+
signing_key:
|
212
228
|
specification_version: 4
|
213
229
|
summary: A framework for running Kafka consumers
|
214
230
|
test_files: []
|