deimos-ruby 1.7.0.pre.beta1 → 1.8.0.pre.beta1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +8 -2
- data/README.md +69 -15
- data/deimos-ruby.gemspec +2 -0
- data/docs/ARCHITECTURE.md +144 -0
- data/docs/CONFIGURATION.md +4 -0
- data/lib/deimos.rb +6 -6
- data/lib/deimos/active_record_consume/batch_consumption.rb +159 -0
- data/lib/deimos/active_record_consume/batch_slicer.rb +27 -0
- data/lib/deimos/active_record_consume/message_consumption.rb +58 -0
- data/lib/deimos/active_record_consume/schema_model_converter.rb +52 -0
- data/lib/deimos/active_record_consumer.rb +33 -75
- data/lib/deimos/batch_consumer.rb +2 -142
- data/lib/deimos/config/configuration.rb +8 -10
- data/lib/deimos/consume/batch_consumption.rb +148 -0
- data/lib/deimos/consume/message_consumption.rb +93 -0
- data/lib/deimos/consumer.rb +79 -72
- data/lib/deimos/kafka_message.rb +1 -1
- data/lib/deimos/message.rb +6 -1
- data/lib/deimos/utils/db_poller.rb +6 -6
- data/lib/deimos/utils/db_producer.rb +6 -2
- data/lib/deimos/utils/deadlock_retry.rb +68 -0
- data/lib/deimos/utils/lag_reporter.rb +19 -26
- data/lib/deimos/version.rb +1 -1
- data/spec/active_record_batch_consumer_spec.rb +481 -0
- data/spec/active_record_consume/batch_slicer_spec.rb +42 -0
- data/spec/active_record_consume/schema_model_converter_spec.rb +105 -0
- data/spec/active_record_consumer_spec.rb +3 -11
- data/spec/batch_consumer_spec.rb +23 -7
- data/spec/config/configuration_spec.rb +4 -0
- data/spec/consumer_spec.rb +6 -6
- data/spec/deimos_spec.rb +57 -49
- data/spec/handlers/my_batch_consumer.rb +6 -1
- data/spec/handlers/my_consumer.rb +6 -1
- data/spec/message_spec.rb +19 -0
- data/spec/schemas/com/my-namespace/MySchemaCompound-key.avsc +18 -0
- data/spec/schemas/com/my-namespace/Wibble.avsc +43 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/utils/db_poller_spec.rb +2 -2
- data/spec/utils/deadlock_retry_spec.rb +74 -0
- data/spec/utils/lag_reporter_spec.rb +29 -22
- metadata +57 -16
- data/lib/deimos/base_consumer.rb +0 -100
- data/lib/deimos/utils/executor.rb +0 -124
- data/lib/deimos/utils/platform_schema_validation.rb +0 -0
- data/lib/deimos/utils/signal_handler.rb +0 -68
- data/spec/utils/executor_spec.rb +0 -53
- data/spec/utils/signal_handler_spec.rb +0 -16
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe(Deimos::Message) do
|
|
4
|
+
it 'should detect tombstones' do
|
|
5
|
+
expect(described_class.new(nil, nil, key: 'key1')).
|
|
6
|
+
to be_tombstone
|
|
7
|
+
expect(described_class.new({ v: 'val1' }, nil, key: 'key1')).
|
|
8
|
+
not_to be_tombstone
|
|
9
|
+
expect(described_class.new({ v: '' }, nil, key: 'key1')).
|
|
10
|
+
not_to be_tombstone
|
|
11
|
+
expect(described_class.new({ v: 'val1' }, nil, key: nil)).
|
|
12
|
+
not_to be_tombstone
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'can support complex keys/values' do
|
|
16
|
+
expect { described_class.new({ a: 1, b: 2 }, nil, key: { c: 3, d: 4 }) }.
|
|
17
|
+
not_to raise_exception
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"namespace": "com.my-namespace",
|
|
3
|
+
"name": "MySchemaCompound-key",
|
|
4
|
+
"type": "record",
|
|
5
|
+
"doc": "Test schema",
|
|
6
|
+
"fields": [
|
|
7
|
+
{
|
|
8
|
+
"name": "part_one",
|
|
9
|
+
"type": "string",
|
|
10
|
+
"doc": "test string one"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "part_two",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"doc": "test string two"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"namespace": "com.my-namespace",
|
|
3
|
+
"name": "Wibble",
|
|
4
|
+
"type": "record",
|
|
5
|
+
"fields": [
|
|
6
|
+
{
|
|
7
|
+
"name": "id",
|
|
8
|
+
"type": "long"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "wibble_id",
|
|
12
|
+
"type": "long"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"name": "name",
|
|
16
|
+
"type": "string"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "floop",
|
|
20
|
+
"type": "string"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "birthday_int",
|
|
24
|
+
"type": "int"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "birthday_long",
|
|
28
|
+
"type": "long"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"name": "birthday_optional",
|
|
32
|
+
"type": ["null", "int"]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "updated_at",
|
|
36
|
+
"type": "long"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "created_at",
|
|
40
|
+
"type": "long"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
data/spec/spec_helper.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
$LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
|
|
4
4
|
require 'active_record'
|
|
5
|
+
require 'database_cleaner'
|
|
5
6
|
require 'deimos'
|
|
6
7
|
require 'deimos/metrics/mock'
|
|
7
8
|
require 'deimos/tracing/mock'
|
|
@@ -147,6 +148,9 @@ RSpec.configure do |config|
|
|
|
147
148
|
# true by default for RSpec 4.0
|
|
148
149
|
config.shared_context_metadata_behavior = :apply_to_host_groups
|
|
149
150
|
|
|
151
|
+
config.filter_run(focus: true)
|
|
152
|
+
config.run_all_when_everything_filtered = true
|
|
153
|
+
|
|
150
154
|
config.before(:all) do
|
|
151
155
|
Time.zone = 'Eastern Time (US & Canada)'
|
|
152
156
|
ActiveRecord::Base.logger = Logger.new('/dev/null')
|
|
@@ -159,6 +163,9 @@ RSpec.configure do |config|
|
|
|
159
163
|
config.include ActiveSupport::Testing::TimeHelpers
|
|
160
164
|
config.before(:suite) do
|
|
161
165
|
setup_db(DbConfigs::DB_OPTIONS.last)
|
|
166
|
+
|
|
167
|
+
DatabaseCleaner.strategy = :transaction
|
|
168
|
+
DatabaseCleaner.clean_with(:truncation)
|
|
162
169
|
end
|
|
163
170
|
|
|
164
171
|
config.mock_with(:rspec) do |mocks|
|
|
@@ -179,6 +186,16 @@ RSpec.configure do |config|
|
|
|
179
186
|
deimos_config.schema.backend = :avro_validation
|
|
180
187
|
end
|
|
181
188
|
end
|
|
189
|
+
|
|
190
|
+
config.around(:each) do |example|
|
|
191
|
+
use_cleaner = !example.metadata[:integration]
|
|
192
|
+
|
|
193
|
+
DatabaseCleaner.start if use_cleaner
|
|
194
|
+
|
|
195
|
+
example.run
|
|
196
|
+
|
|
197
|
+
DatabaseCleaner.clean if use_cleaner
|
|
198
|
+
end
|
|
182
199
|
end
|
|
183
200
|
|
|
184
201
|
RSpec.shared_context('with widgets') do
|
|
@@ -48,8 +48,8 @@ each_db_config(Deimos::Utils::DbPoller) do
|
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
allow(Deimos::Utils::DbPoller).to receive(:new)
|
|
51
|
-
signal_double = instance_double(
|
|
52
|
-
allow(
|
|
51
|
+
signal_double = instance_double(Sigurd::SignalHandler, run!: nil)
|
|
52
|
+
allow(Sigurd::SignalHandler).to receive(:new).and_return(signal_double)
|
|
53
53
|
described_class.start!
|
|
54
54
|
expect(Deimos::Utils::DbPoller).to have_received(:new).twice
|
|
55
55
|
expect(Deimos::Utils::DbPoller).to have_received(:new).
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe Deimos::Utils::DeadlockRetry do
|
|
4
|
+
include_context 'with widgets'
|
|
5
|
+
|
|
6
|
+
before(:each) do
|
|
7
|
+
allow(described_class).to receive(:sleep)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe 'deadlock handling' do
|
|
11
|
+
let(:batch) { [{ key: 1, payload: { test_id: 'abc', some_int: 3 } }] }
|
|
12
|
+
|
|
13
|
+
it 'should retry deadlocks 3 times' do
|
|
14
|
+
# Should receive original attempt + 2 retries
|
|
15
|
+
expect(Widget).
|
|
16
|
+
to receive(:create).
|
|
17
|
+
and_raise(ActiveRecord::Deadlocked.new('Lock wait timeout exceeded')).
|
|
18
|
+
exactly(3).times
|
|
19
|
+
|
|
20
|
+
# After 3 tries, should let it bubble up
|
|
21
|
+
expect {
|
|
22
|
+
described_class.wrap do
|
|
23
|
+
Widget.create(test_id: 'abc')
|
|
24
|
+
end
|
|
25
|
+
}.to raise_error(ActiveRecord::Deadlocked)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should stop retrying deadlocks after success' do
|
|
29
|
+
allow(Widget).
|
|
30
|
+
to receive(:create).
|
|
31
|
+
with(hash_including(test_id: 'first')).
|
|
32
|
+
and_call_original
|
|
33
|
+
|
|
34
|
+
# Fail on first attempt, succeed on second
|
|
35
|
+
expect(Widget).
|
|
36
|
+
to receive(:create).
|
|
37
|
+
with(hash_including(test_id: 'second')).
|
|
38
|
+
and_raise(ActiveRecord::Deadlocked.new('Deadlock found when trying to get lock')).
|
|
39
|
+
once.
|
|
40
|
+
ordered
|
|
41
|
+
|
|
42
|
+
expect(Widget).
|
|
43
|
+
to receive(:create).
|
|
44
|
+
with(hash_including(test_id: 'second')).
|
|
45
|
+
once.
|
|
46
|
+
ordered.
|
|
47
|
+
and_call_original
|
|
48
|
+
|
|
49
|
+
# Should not raise anything
|
|
50
|
+
described_class.wrap do
|
|
51
|
+
Widget.create(test_id: 'first')
|
|
52
|
+
Widget.create(test_id: 'second')
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
expect(Widget.all).to match_array([
|
|
56
|
+
have_attributes(test_id: 'first'),
|
|
57
|
+
have_attributes(test_id: 'second')
|
|
58
|
+
])
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it 'should not retry non-deadlock exceptions' do
|
|
62
|
+
expect(Widget).
|
|
63
|
+
to receive(:create).
|
|
64
|
+
and_raise(ActiveRecord::StatementInvalid.new('Oops!!')).
|
|
65
|
+
once
|
|
66
|
+
|
|
67
|
+
expect {
|
|
68
|
+
described_class.wrap do
|
|
69
|
+
Widget.create(test_id: 'abc')
|
|
70
|
+
end
|
|
71
|
+
}.to raise_error(ActiveRecord::StatementInvalid, 'Oops!!')
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
describe Deimos::Utils::LagReporter do
|
|
4
4
|
|
|
5
|
+
let(:kafka_client) { instance_double(Kafka::Client) }
|
|
6
|
+
let(:partition1_tags) { %w(consumer_group:group1 partition:1 topic:my-topic) }
|
|
7
|
+
let(:partition2_tags) { %w(consumer_group:group1 partition:2 topic:my-topic) }
|
|
8
|
+
|
|
5
9
|
before(:each) do
|
|
6
|
-
kafka_client = instance_double(Kafka::Client)
|
|
7
10
|
allow(kafka_client).to receive(:last_offset_for).and_return(100)
|
|
8
11
|
allow(Phobos).to receive(:create_kafka_client).and_return(kafka_client)
|
|
9
12
|
Deimos.configure { |c| c.consumers.report_lag = true }
|
|
@@ -20,38 +23,22 @@ describe Deimos::Utils::LagReporter do
|
|
|
20
23
|
'heartbeat.consumer.kafka',
|
|
21
24
|
group_id: 'group1', topic_partitions: { 'my-topic': [1] }
|
|
22
25
|
)
|
|
23
|
-
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
it 'should report lag' do
|
|
27
29
|
expect(Deimos.config.metrics).to receive(:gauge).ordered.twice.
|
|
28
|
-
with('consumer_lag', 95,
|
|
29
|
-
tags: %w(
|
|
30
|
-
consumer_group:group1
|
|
31
|
-
partition:1
|
|
32
|
-
topic:my-topic
|
|
33
|
-
))
|
|
30
|
+
with('consumer_lag', 95, tags: partition1_tags)
|
|
34
31
|
expect(Deimos.config.metrics).to receive(:gauge).ordered.once.
|
|
35
|
-
with('consumer_lag', 80,
|
|
36
|
-
tags: %w(
|
|
37
|
-
consumer_group:group1
|
|
38
|
-
partition:2
|
|
39
|
-
topic:my-topic
|
|
40
|
-
))
|
|
32
|
+
with('consumer_lag', 80, tags: partition2_tags)
|
|
41
33
|
expect(Deimos.config.metrics).to receive(:gauge).ordered.once.
|
|
42
|
-
with('consumer_lag', 0,
|
|
43
|
-
tags: %w(
|
|
44
|
-
consumer_group:group1
|
|
45
|
-
partition:2
|
|
46
|
-
topic:my-topic
|
|
47
|
-
))
|
|
34
|
+
with('consumer_lag', 0, tags: partition2_tags)
|
|
48
35
|
ActiveSupport::Notifications.instrument(
|
|
49
36
|
'seek.consumer.kafka',
|
|
50
37
|
offset: 5, topic: 'my-topic', group_id: 'group1', partition: 1
|
|
51
38
|
)
|
|
52
39
|
ActiveSupport::Notifications.instrument(
|
|
53
40
|
'start_process_message.consumer.kafka',
|
|
54
|
-
|
|
41
|
+
offset: 20, topic: 'my-topic', group_id: 'group1', partition: 2
|
|
55
42
|
)
|
|
56
43
|
ActiveSupport::Notifications.instrument(
|
|
57
44
|
'heartbeat.consumer.kafka',
|
|
@@ -59,8 +46,28 @@ describe Deimos::Utils::LagReporter do
|
|
|
59
46
|
)
|
|
60
47
|
ActiveSupport::Notifications.instrument(
|
|
61
48
|
'start_process_batch.consumer.kafka',
|
|
62
|
-
|
|
49
|
+
last_offset: 100, topic: 'my-topic', group_id: 'group1', partition: 2
|
|
50
|
+
)
|
|
51
|
+
ActiveSupport::Notifications.instrument(
|
|
52
|
+
'heartbeat.consumer.kafka',
|
|
53
|
+
group_id: 'group1', topic_partitions: { 'my-topic': [1, 2] }
|
|
54
|
+
)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'should update lag after heartbeat' do
|
|
58
|
+
expect(Deimos.config.metrics).to receive(:gauge).ordered.once.
|
|
59
|
+
with('consumer_lag', 94, tags: partition2_tags)
|
|
60
|
+
expect(Deimos.config.metrics).to receive(:gauge).ordered.once.
|
|
61
|
+
with('consumer_lag', 95, tags: partition2_tags)
|
|
62
|
+
ActiveSupport::Notifications.instrument(
|
|
63
|
+
'seek.consumer.kafka',
|
|
64
|
+
offset: 6, topic: 'my-topic', group_id: 'group1', partition: 2
|
|
65
|
+
)
|
|
66
|
+
ActiveSupport::Notifications.instrument(
|
|
67
|
+
'heartbeat.consumer.kafka',
|
|
68
|
+
group_id: 'group1', topic_partitions: { 'my-topic': [1, 2] }
|
|
63
69
|
)
|
|
70
|
+
allow(kafka_client).to receive(:last_offset_for).and_return(101)
|
|
64
71
|
ActiveSupport::Notifications.instrument(
|
|
65
72
|
'heartbeat.consumer.kafka',
|
|
66
73
|
group_id: 'group1', topic_partitions: { 'my-topic': [1, 2] }
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: deimos-ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.8.0.pre.beta1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Orner
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-07-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: avro_turf
|
|
@@ -52,6 +52,20 @@ dependencies:
|
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '0.7'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: sigurd
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - '='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 0.0.1
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - '='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 0.0.1
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
70
|
name: activerecord
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -94,6 +108,20 @@ dependencies:
|
|
|
94
108
|
- - "~>"
|
|
95
109
|
- !ruby/object:Gem::Version
|
|
96
110
|
version: '1.9'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: database_cleaner
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - "~>"
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '1.7'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - "~>"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '1.7'
|
|
97
125
|
- !ruby/object:Gem::Dependency
|
|
98
126
|
name: ddtrace
|
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -296,7 +324,7 @@ dependencies:
|
|
|
296
324
|
- - "~>"
|
|
297
325
|
- !ruby/object:Gem::Version
|
|
298
326
|
version: '1.3'
|
|
299
|
-
description:
|
|
327
|
+
description:
|
|
300
328
|
email:
|
|
301
329
|
- daniel.orner@wishabi.com
|
|
302
330
|
executables:
|
|
@@ -323,10 +351,15 @@ files:
|
|
|
323
351
|
- bin/deimos
|
|
324
352
|
- deimos-ruby.gemspec
|
|
325
353
|
- docker-compose.yml
|
|
354
|
+
- docs/ARCHITECTURE.md
|
|
326
355
|
- docs/CONFIGURATION.md
|
|
327
356
|
- docs/DATABASE_BACKEND.md
|
|
328
357
|
- docs/PULL_REQUEST_TEMPLATE.md
|
|
329
358
|
- lib/deimos.rb
|
|
359
|
+
- lib/deimos/active_record_consume/batch_consumption.rb
|
|
360
|
+
- lib/deimos/active_record_consume/batch_slicer.rb
|
|
361
|
+
- lib/deimos/active_record_consume/message_consumption.rb
|
|
362
|
+
- lib/deimos/active_record_consume/schema_model_converter.rb
|
|
330
363
|
- lib/deimos/active_record_consumer.rb
|
|
331
364
|
- lib/deimos/active_record_producer.rb
|
|
332
365
|
- lib/deimos/backends/base.rb
|
|
@@ -334,11 +367,12 @@ files:
|
|
|
334
367
|
- lib/deimos/backends/kafka.rb
|
|
335
368
|
- lib/deimos/backends/kafka_async.rb
|
|
336
369
|
- lib/deimos/backends/test.rb
|
|
337
|
-
- lib/deimos/base_consumer.rb
|
|
338
370
|
- lib/deimos/batch_consumer.rb
|
|
339
371
|
- lib/deimos/config/configurable.rb
|
|
340
372
|
- lib/deimos/config/configuration.rb
|
|
341
373
|
- lib/deimos/config/phobos_config.rb
|
|
374
|
+
- lib/deimos/consume/batch_consumption.rb
|
|
375
|
+
- lib/deimos/consume/message_consumption.rb
|
|
342
376
|
- lib/deimos/consumer.rb
|
|
343
377
|
- lib/deimos/instrumentation.rb
|
|
344
378
|
- lib/deimos/kafka_message.rb
|
|
@@ -368,11 +402,9 @@ files:
|
|
|
368
402
|
- lib/deimos/tracing/provider.rb
|
|
369
403
|
- lib/deimos/utils/db_poller.rb
|
|
370
404
|
- lib/deimos/utils/db_producer.rb
|
|
371
|
-
- lib/deimos/utils/
|
|
405
|
+
- lib/deimos/utils/deadlock_retry.rb
|
|
372
406
|
- lib/deimos/utils/inline_consumer.rb
|
|
373
407
|
- lib/deimos/utils/lag_reporter.rb
|
|
374
|
-
- lib/deimos/utils/platform_schema_validation.rb
|
|
375
|
-
- lib/deimos/utils/signal_handler.rb
|
|
376
408
|
- lib/deimos/version.rb
|
|
377
409
|
- lib/generators/deimos/db_backend/templates/migration
|
|
378
410
|
- lib/generators/deimos/db_backend/templates/rails3_migration
|
|
@@ -381,6 +413,9 @@ files:
|
|
|
381
413
|
- lib/generators/deimos/db_poller/templates/rails3_migration
|
|
382
414
|
- lib/generators/deimos/db_poller_generator.rb
|
|
383
415
|
- lib/tasks/deimos.rake
|
|
416
|
+
- spec/active_record_batch_consumer_spec.rb
|
|
417
|
+
- spec/active_record_consume/batch_slicer_spec.rb
|
|
418
|
+
- spec/active_record_consume/schema_model_converter_spec.rb
|
|
384
419
|
- spec/active_record_consumer_spec.rb
|
|
385
420
|
- spec/active_record_producer_spec.rb
|
|
386
421
|
- spec/backends/base_spec.rb
|
|
@@ -396,6 +431,7 @@ files:
|
|
|
396
431
|
- spec/handlers/my_consumer.rb
|
|
397
432
|
- spec/kafka_source_spec.rb
|
|
398
433
|
- spec/kafka_topic_info_spec.rb
|
|
434
|
+
- spec/message_spec.rb
|
|
399
435
|
- spec/phobos.bad_db.yml
|
|
400
436
|
- spec/phobos.yml
|
|
401
437
|
- spec/producer_spec.rb
|
|
@@ -407,19 +443,20 @@ files:
|
|
|
407
443
|
- spec/schema_backends/base_spec.rb
|
|
408
444
|
- spec/schemas/com/my-namespace/MySchema-key.avsc
|
|
409
445
|
- spec/schemas/com/my-namespace/MySchema.avsc
|
|
446
|
+
- spec/schemas/com/my-namespace/MySchemaCompound-key.avsc
|
|
410
447
|
- spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
|
|
411
448
|
- spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
|
|
412
449
|
- spec/schemas/com/my-namespace/MySchemaWithId.avsc
|
|
413
450
|
- spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
|
|
451
|
+
- spec/schemas/com/my-namespace/Wibble.avsc
|
|
414
452
|
- spec/schemas/com/my-namespace/Widget.avsc
|
|
415
453
|
- spec/schemas/com/my-namespace/WidgetTheSecond.avsc
|
|
416
454
|
- spec/spec_helper.rb
|
|
417
455
|
- spec/utils/db_poller_spec.rb
|
|
418
456
|
- spec/utils/db_producer_spec.rb
|
|
419
|
-
- spec/utils/
|
|
457
|
+
- spec/utils/deadlock_retry_spec.rb
|
|
420
458
|
- spec/utils/lag_reporter_spec.rb
|
|
421
459
|
- spec/utils/platform_schema_validation_spec.rb
|
|
422
|
-
- spec/utils/signal_handler_spec.rb
|
|
423
460
|
- support/deimos-solo.png
|
|
424
461
|
- support/deimos-with-name-next.png
|
|
425
462
|
- support/deimos-with-name.png
|
|
@@ -428,7 +465,7 @@ homepage: ''
|
|
|
428
465
|
licenses:
|
|
429
466
|
- Apache-2.0
|
|
430
467
|
metadata: {}
|
|
431
|
-
post_install_message:
|
|
468
|
+
post_install_message:
|
|
432
469
|
rdoc_options: []
|
|
433
470
|
require_paths:
|
|
434
471
|
- lib
|
|
@@ -443,12 +480,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
443
480
|
- !ruby/object:Gem::Version
|
|
444
481
|
version: 1.3.1
|
|
445
482
|
requirements: []
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
signing_key:
|
|
483
|
+
rubygems_version: 3.1.3
|
|
484
|
+
signing_key:
|
|
449
485
|
specification_version: 4
|
|
450
486
|
summary: Kafka libraries for Ruby.
|
|
451
487
|
test_files:
|
|
488
|
+
- spec/active_record_batch_consumer_spec.rb
|
|
489
|
+
- spec/active_record_consume/batch_slicer_spec.rb
|
|
490
|
+
- spec/active_record_consume/schema_model_converter_spec.rb
|
|
452
491
|
- spec/active_record_consumer_spec.rb
|
|
453
492
|
- spec/active_record_producer_spec.rb
|
|
454
493
|
- spec/backends/base_spec.rb
|
|
@@ -464,6 +503,7 @@ test_files:
|
|
|
464
503
|
- spec/handlers/my_consumer.rb
|
|
465
504
|
- spec/kafka_source_spec.rb
|
|
466
505
|
- spec/kafka_topic_info_spec.rb
|
|
506
|
+
- spec/message_spec.rb
|
|
467
507
|
- spec/phobos.bad_db.yml
|
|
468
508
|
- spec/phobos.yml
|
|
469
509
|
- spec/producer_spec.rb
|
|
@@ -475,16 +515,17 @@ test_files:
|
|
|
475
515
|
- spec/schema_backends/base_spec.rb
|
|
476
516
|
- spec/schemas/com/my-namespace/MySchema-key.avsc
|
|
477
517
|
- spec/schemas/com/my-namespace/MySchema.avsc
|
|
518
|
+
- spec/schemas/com/my-namespace/MySchemaCompound-key.avsc
|
|
478
519
|
- spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
|
|
479
520
|
- spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
|
|
480
521
|
- spec/schemas/com/my-namespace/MySchemaWithId.avsc
|
|
481
522
|
- spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
|
|
523
|
+
- spec/schemas/com/my-namespace/Wibble.avsc
|
|
482
524
|
- spec/schemas/com/my-namespace/Widget.avsc
|
|
483
525
|
- spec/schemas/com/my-namespace/WidgetTheSecond.avsc
|
|
484
526
|
- spec/spec_helper.rb
|
|
485
527
|
- spec/utils/db_poller_spec.rb
|
|
486
528
|
- spec/utils/db_producer_spec.rb
|
|
487
|
-
- spec/utils/
|
|
529
|
+
- spec/utils/deadlock_retry_spec.rb
|
|
488
530
|
- spec/utils/lag_reporter_spec.rb
|
|
489
531
|
- spec/utils/platform_schema_validation_spec.rb
|
|
490
|
-
- spec/utils/signal_handler_spec.rb
|