deimos-ruby 1.12.4 → 1.12.5
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/.gemfiles/avro_turf-0.gemfile +3 -0
- data/.gemfiles/avro_turf-1.gemfile +3 -0
- data/.github/workflows/ci.yml +49 -0
- data/.gitignore +2 -1
- data/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/deimos-ruby.gemspec +1 -1
- data/docs/CONFIGURATION.md +15 -1
- data/lib/deimos/config/configuration.rb +60 -0
- data/lib/deimos/config/phobos_config.rb +24 -0
- data/lib/deimos/schema_backends/avro_schema_registry.rb +2 -0
- data/lib/deimos/version.rb +1 -1
- data/lib/generators/deimos/schema_class_generator.rb +25 -1
- data/spec/active_record_batch_consumer_spec.rb +1 -1
- data/spec/active_record_consumer_spec.rb +6 -6
- data/spec/active_record_producer_spec.rb +1 -1
- data/spec/config/configuration_spec.rb +25 -1
- data/spec/consumer_spec.rb +17 -17
- data/spec/generators/schema_class_generator_spec.rb +2 -2
- data/spec/producer_spec.rb +24 -24
- data/spec/schema_backends/avro_base_shared.rb +2 -2
- data/spec/schema_classes/my_schema_key.rb +2 -2
- data/spec/schemas/com/my-namespace/{MySchemaCompound-key.avsc → MySchemaCompound_key.avsc} +1 -1
- data/spec/schemas/com/my-namespace/{MySchema-key.avsc → MySchema_key.avsc} +1 -1
- data/spec/utils/inline_consumer_spec.rb +2 -2
- metadata +17 -9
- data/Gemfile.lock +0 -292
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9de87883c263b11abeb45f86150cadcdf35566044bf1e579d6b1d6b775020ad
|
4
|
+
data.tar.gz: 5a686f11c2d72cbd7e0cbbd3238ad82963f7128ef57096c5c676979cdd42beac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '027995a556c6d790a40e489ffad8e8eb64b927137cfce39ab09c855fbcae875376563eb4349edc1fbe111e491fc9651bed3eced08e1ab79ef9c40f1ea23da95c'
|
7
|
+
data.tar.gz: 673ff51ab95750439280f63398e86f31c5f441f6ef528ec933a54fa9f73a3211aafb09fb564f4944586eb7fe178bb6b0e8432d0e33308113af84adbedf59fe5f
|
@@ -0,0 +1,49 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
pull_request:
|
5
|
+
push:
|
6
|
+
branches: [ master ]
|
7
|
+
|
8
|
+
env:
|
9
|
+
GIT_COMMIT_SHA: ${{ github.sha }}
|
10
|
+
GIT_BRANCH: ${{ github.ref }}
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
linting:
|
14
|
+
runs-on: ubuntu-latest
|
15
|
+
env:
|
16
|
+
BUNDLE_WITH: lint
|
17
|
+
BUNDLE_WITHOUT: development:test
|
18
|
+
|
19
|
+
steps:
|
20
|
+
- uses: actions/checkout@v2
|
21
|
+
|
22
|
+
- name: Set up Ruby 2.7
|
23
|
+
uses: ruby/setup-ruby@v1
|
24
|
+
with:
|
25
|
+
ruby-version: 2.7
|
26
|
+
bundler-cache: true
|
27
|
+
|
28
|
+
- name: Rubocop
|
29
|
+
run: bundle exec rubocop --format progress
|
30
|
+
|
31
|
+
build:
|
32
|
+
runs-on: ubuntu-latest
|
33
|
+
env:
|
34
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/.gemfiles/${{ matrix.gemfile }}.gemfile
|
35
|
+
strategy:
|
36
|
+
fail-fast: false
|
37
|
+
matrix:
|
38
|
+
ruby: [ '2.6', '2.7', '3.0', '3.1' ]
|
39
|
+
gemfile: [ 'avro_turf-0', 'avro_turf-1' ]
|
40
|
+
|
41
|
+
steps:
|
42
|
+
- uses: actions/checkout@v2
|
43
|
+
- uses: ruby/setup-ruby@v1
|
44
|
+
with:
|
45
|
+
ruby-version: ${{ matrix.ruby }}
|
46
|
+
bundler-cache: true
|
47
|
+
|
48
|
+
- name: Test
|
49
|
+
run: bundle exec rspec
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## UNRELEASED
|
9
9
|
|
10
|
+
# 1.12.5 - 2022-03-09
|
11
|
+
|
12
|
+
- Allow use of new avro_turf versions where child schemas are not listed with the top level schemas
|
13
|
+
- Add support for SASL authentication with brokers
|
14
|
+
- Add support for Basic auth with Schema Registry
|
15
|
+
|
10
16
|
# 1.12.4 - 2022-01-13
|
11
17
|
|
12
18
|
- Fix bug where schema controller mixin was using the schema name to register and not the namespaced schema name
|
data/README.md
CHANGED
data/deimos-ruby.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_runtime_dependency('avro_turf', '
|
21
|
+
spec.add_runtime_dependency('avro_turf', '>= 0.11', '< 2')
|
22
22
|
spec.add_runtime_dependency('phobos', '>= 1.9', '< 3.0')
|
23
23
|
spec.add_runtime_dependency('ruby-kafka', '< 2')
|
24
24
|
spec.add_runtime_dependency('sigurd', '~> 0.0.1')
|
data/docs/CONFIGURATION.md
CHANGED
@@ -130,9 +130,21 @@ kafka.client_id|`phobos`|Identifier for this application.
|
|
130
130
|
kafka.connect_timeout|15|The socket timeout for connecting to the broker, in seconds.
|
131
131
|
kafka.socket_timeout|15|The socket timeout for reading and writing to the broker, in seconds.
|
132
132
|
kafka.ssl.enabled|false|Whether SSL is enabled on the brokers.
|
133
|
+
kafka.ssl.ca_certs_from_system|false|Use CA certs from system.
|
133
134
|
kafka.ssl.ca_cert|nil| A PEM encoded CA cert, a file path to the cert, or an Array of certs to use with an SSL connection.
|
134
135
|
kafka.ssl.client_cert|nil|A PEM encoded client cert to use with an SSL connection, or a file path to the cert.
|
135
136
|
kafka.ssl.client_cert_key|nil|A PEM encoded client cert key to use with an SSL connection.
|
137
|
+
kafka.sasl.enabled|false|Whether SASL is enabled on the brokers.
|
138
|
+
kafka.sasl.gssapi_principal|nil|A KRB5 principal.
|
139
|
+
kafka.sasl.gssapi_keytab|nil|A KRB5 keytab filepath.
|
140
|
+
kafka.sasl.plain_authzid|nil|Plain authorization ID.
|
141
|
+
kafka.sasl.plain_username|nil|Plain username.
|
142
|
+
kafka.sasl.plain_password|nil|Plain password.
|
143
|
+
kafka.sasl.scram_username|nil|SCRAM username.
|
144
|
+
kafka.sasl.scram_password|nil|SCRAM password.
|
145
|
+
kafka.sasl.scram_mechanism|nil|Scram mechanism, either "sha256" or "sha512".
|
146
|
+
kafka.sasl.enforce_ssl|nil|Whether to enforce SSL with SASL.
|
147
|
+
kafka.sasl.oauth_token_provider|nil|OAuthBearer Token Provider instance that implements method token. See {Sasl::OAuth#initialize}.
|
136
148
|
|
137
149
|
## Consumer Configuration
|
138
150
|
|
@@ -177,9 +189,11 @@ Config name|Default|Description
|
|
177
189
|
-----------|-------|-----------
|
178
190
|
schema.backend|`:mock`|Backend representing the schema encoder/decoder. You can see a full list [here](../lib/deimos/schema_backends).
|
179
191
|
schema.registry_url|`http://localhost:8081`|URL of the Confluent schema registry.
|
192
|
+
schema.user|nil|Basic auth user.
|
193
|
+
schema.password|nil|Basic auth password.
|
180
194
|
schema.path|nil|Local path to find your schemas.
|
181
195
|
schema.use_schema_classes|false|Set this to true to use generated schema classes in your application.
|
182
|
-
schema.
|
196
|
+
schema.generated_class_path|`app/lib/schema_classes`|Local path to generated schema classes.
|
183
197
|
|
184
198
|
## Database Producer Configuration
|
185
199
|
|
@@ -136,6 +136,58 @@ module Deimos
|
|
136
136
|
|
137
137
|
# Verify certificate hostname if supported (ruby >= 2.4.0)
|
138
138
|
setting :verify_hostname, true
|
139
|
+
|
140
|
+
# Use CA certs from system. This is useful to have enabled for Confluent Cloud
|
141
|
+
# @return [Boolean]
|
142
|
+
setting :ca_certs_from_system, false
|
143
|
+
end
|
144
|
+
|
145
|
+
setting :sasl do
|
146
|
+
# Whether SASL is enabled on the brokers.
|
147
|
+
# @return [Boolean]
|
148
|
+
setting :enabled
|
149
|
+
|
150
|
+
# A KRB5 principal.
|
151
|
+
# @return [String]
|
152
|
+
setting :gssapi_principal
|
153
|
+
|
154
|
+
# A KRB5 keytab filepath.
|
155
|
+
# @return [String]
|
156
|
+
setting :gssapi_keytab
|
157
|
+
|
158
|
+
# Plain authorization ID. It needs to default to '' in order for it to work.
|
159
|
+
# This is because Phobos expects it to be truthy for using plain SASL.
|
160
|
+
# @return [String]
|
161
|
+
setting :plain_authzid, ''
|
162
|
+
|
163
|
+
# Plain username.
|
164
|
+
# @return [String]
|
165
|
+
setting :plain_username
|
166
|
+
|
167
|
+
# Plain password.
|
168
|
+
# @return [String]
|
169
|
+
setting :plain_password
|
170
|
+
|
171
|
+
# SCRAM username.
|
172
|
+
# @return [String]
|
173
|
+
setting :scram_username
|
174
|
+
|
175
|
+
# SCRAM password.
|
176
|
+
# @return [String]
|
177
|
+
setting :scram_password
|
178
|
+
|
179
|
+
# Scram mechanism, either "sha256" or "sha512".
|
180
|
+
# @return [String]
|
181
|
+
setting :scram_mechanism
|
182
|
+
|
183
|
+
# Whether to enforce SSL with SASL.
|
184
|
+
# @return [Boolean]
|
185
|
+
setting :enforce_ssl
|
186
|
+
|
187
|
+
# OAuthBearer Token Provider instance that implements
|
188
|
+
# method token. See {Sasl::OAuth#initialize}.
|
189
|
+
# @return [Object]
|
190
|
+
setting :oauth_token_provider
|
139
191
|
end
|
140
192
|
end
|
141
193
|
|
@@ -272,6 +324,14 @@ module Deimos
|
|
272
324
|
# @return [String]
|
273
325
|
setting :registry_url, 'http://localhost:8081'
|
274
326
|
|
327
|
+
# Basic Auth user.
|
328
|
+
# @return [String]
|
329
|
+
setting :user
|
330
|
+
|
331
|
+
# Basic Auth password.
|
332
|
+
# @return [String]
|
333
|
+
setting :password
|
334
|
+
|
275
335
|
# Local path to look for schemas in.
|
276
336
|
# @return [String]
|
277
337
|
setting :path
|
@@ -38,6 +38,7 @@ module Deimos
|
|
38
38
|
connect_timeout: self.kafka.connect_timeout,
|
39
39
|
socket_timeout: self.kafka.socket_timeout,
|
40
40
|
ssl_verify_hostname: self.kafka.ssl.verify_hostname,
|
41
|
+
ssl_ca_certs_from_system: self.kafka.ssl.ca_certs_from_system,
|
41
42
|
seed_brokers: Array.wrap(self.kafka.seed_brokers)
|
42
43
|
},
|
43
44
|
producer: {
|
@@ -84,6 +85,26 @@ module Deimos
|
|
84
85
|
p_config[:kafka]["ssl_#{key}".to_sym] = ssl_var_contents(self.kafka.ssl.send(key))
|
85
86
|
end
|
86
87
|
end
|
88
|
+
|
89
|
+
if self.kafka.sasl.enabled
|
90
|
+
p_config[:kafka][:sasl_over_ssl] = self.kafka.sasl.enforce_ssl
|
91
|
+
%w(
|
92
|
+
gssapi_principal
|
93
|
+
gssapi_keytab
|
94
|
+
plain_authzid
|
95
|
+
plain_username
|
96
|
+
plain_password
|
97
|
+
scram_username
|
98
|
+
scram_password
|
99
|
+
scram_mechanism
|
100
|
+
oauth_token_provider
|
101
|
+
).each do |key|
|
102
|
+
value = self.kafka.sasl.send(key)
|
103
|
+
next if value.blank?
|
104
|
+
|
105
|
+
p_config[:kafka]["sasl_#{key}".to_sym] = value
|
106
|
+
end
|
107
|
+
end
|
87
108
|
p_config
|
88
109
|
end
|
89
110
|
|
@@ -102,6 +123,9 @@ module Deimos
|
|
102
123
|
if k.starts_with?('ssl')
|
103
124
|
k = k.sub('ssl_', '')
|
104
125
|
self.kafka.ssl.send("#{k}=", v)
|
126
|
+
elsif k.starts_with?('sasl')
|
127
|
+
k = (k == 'sasl_over_ssl') ? 'enforce_ssl' : k.sub('sasl_', '')
|
128
|
+
self.kafka.sasl.send("#{k}=", v)
|
105
129
|
else
|
106
130
|
self.kafka.send("#{k}=", v)
|
107
131
|
end
|
data/lib/deimos/version.rb
CHANGED
@@ -53,10 +53,34 @@ module Deimos
|
|
53
53
|
generate_class_from_schema_base(schema_base, key_schema_base: key_schema_base)
|
54
54
|
end
|
55
55
|
|
56
|
+
# @param schema [Avro::Schema::NamedSchema]
|
57
|
+
# @return [Array<Avro::Schema::NamedSchema]
|
58
|
+
def child_schemas(schema)
|
59
|
+
if schema.respond_to?(:fields)
|
60
|
+
schema.fields.map(&:type)
|
61
|
+
elsif schema.respond_to?(:values)
|
62
|
+
[schema.values]
|
63
|
+
elsif schema.respond_to?(:items)
|
64
|
+
[schema.items]
|
65
|
+
else
|
66
|
+
[]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# @param schemas [Array<Avro::Schema::NamedSchema>]
|
71
|
+
# @return [Array<Avro::Schema::NamedSchema>]
|
72
|
+
def collect_all_schemas(schemas)
|
73
|
+
schemas.dup.each do |schema|
|
74
|
+
schemas.concat(collect_all_schemas(child_schemas(schema)))
|
75
|
+
end
|
76
|
+
schemas.select { |s| s.respond_to?(:name) }.uniq
|
77
|
+
end
|
78
|
+
|
56
79
|
# @param schema_base [Deimos::SchemaBackends::Base]
|
57
80
|
# @param key_schema_base[Avro::Schema::NamedSchema]
|
58
81
|
def generate_class_from_schema_base(schema_base, key_schema_base: nil)
|
59
|
-
schemas = schema_base.schema_store.schemas.values
|
82
|
+
schemas = collect_all_schemas(schema_base.schema_store.schemas.values)
|
83
|
+
|
60
84
|
sub_schemas = schemas.reject { |s| s.name == schema_base.schema }
|
61
85
|
@sub_schema_templates = sub_schemas.map do |schema|
|
62
86
|
_generate_class_template_from_schema(schema)
|
@@ -315,7 +315,7 @@ module ActiveRecordBatchConsumerTest
|
|
315
315
|
Class.new(described_class) do
|
316
316
|
schema 'MySchema'
|
317
317
|
namespace 'com.my-namespace'
|
318
|
-
key_config schema: '
|
318
|
+
key_config schema: 'MySchemaCompound_key'
|
319
319
|
record_class Widget
|
320
320
|
compacted false
|
321
321
|
|
@@ -76,7 +76,7 @@ module ActiveRecordConsumerTest
|
|
76
76
|
updated_at: 1.day.ago.to_i,
|
77
77
|
some_datetime_int: Time.zone.now.to_i,
|
78
78
|
timestamp: 2.minutes.ago.to_s
|
79
|
-
},
|
79
|
+
}, call_original: true, key: 5)
|
80
80
|
|
81
81
|
expect(Widget.count).to eq(1)
|
82
82
|
widget = Widget.last
|
@@ -96,7 +96,7 @@ module ActiveRecordConsumerTest
|
|
96
96
|
some_int: 3,
|
97
97
|
some_datetime_int: Time.zone.now.to_i,
|
98
98
|
timestamp: 2.minutes.ago.to_s
|
99
|
-
},
|
99
|
+
}, call_original: true, key: 5)
|
100
100
|
expect(Widget.unscoped.count).to eq(1)
|
101
101
|
widget = Widget.unscoped.last
|
102
102
|
expect(widget.id).to eq(5)
|
@@ -120,7 +120,7 @@ module ActiveRecordConsumerTest
|
|
120
120
|
test_consume_message(MyCustomFetchConsumer, {
|
121
121
|
test_id: 'id1',
|
122
122
|
some_int: 3
|
123
|
-
},
|
123
|
+
}, call_original: true)
|
124
124
|
expect(widget1.reload.updated_at.in_time_zone).
|
125
125
|
to eq(Time.local(2020, 5, 6, 5, 5, 5))
|
126
126
|
travel_back
|
@@ -132,13 +132,13 @@ module ActiveRecordConsumerTest
|
|
132
132
|
test_consume_message(MyCustomFetchConsumer, {
|
133
133
|
test_id: 'id1',
|
134
134
|
some_int: 3
|
135
|
-
},
|
135
|
+
}, call_original: true)
|
136
136
|
expect(widget1.reload.some_int).to eq(3)
|
137
137
|
expect(Widget.count).to eq(1)
|
138
138
|
test_consume_message(MyCustomFetchConsumer, {
|
139
139
|
test_id: 'id2',
|
140
140
|
some_int: 4
|
141
|
-
},
|
141
|
+
}, call_original: true)
|
142
142
|
expect(Widget.count).to eq(2)
|
143
143
|
expect(Widget.find_by_test_id('id1').some_int).to eq(3)
|
144
144
|
expect(Widget.find_by_test_id('id2').some_int).to eq(4)
|
@@ -153,7 +153,7 @@ module ActiveRecordConsumerTest
|
|
153
153
|
updated_at: 1.day.ago.to_i,
|
154
154
|
some_datetime_int: Time.zone.now.to_i,
|
155
155
|
timestamp: 2.minutes.ago.to_s
|
156
|
-
},
|
156
|
+
}, call_original: true, key: 5)
|
157
157
|
expect(Widget.count).to eq(0)
|
158
158
|
end
|
159
159
|
end
|
@@ -76,7 +76,7 @@ describe Deimos::ActiveRecordProducer do
|
|
76
76
|
|
77
77
|
it 'should be able to call the record' do
|
78
78
|
widget = Widget.create!(test_id: 'abc2', some_int: 3)
|
79
|
-
MyProducerWithID.send_event(id: widget.id, test_id: 'abc2', some_int: 3)
|
79
|
+
MyProducerWithID.send_event({id: widget.id, test_id: 'abc2', some_int: 3})
|
80
80
|
expect('my-topic-with-id').to have_sent(
|
81
81
|
test_id: 'abc2',
|
82
82
|
some_int: 3,
|
@@ -70,6 +70,7 @@ describe Deimos, 'configuration' do
|
|
70
70
|
connect_timeout: 15,
|
71
71
|
socket_timeout: 15,
|
72
72
|
ssl_verify_hostname: true,
|
73
|
+
ssl_ca_certs_from_system: false,
|
73
74
|
seed_brokers: ['localhost:9092']
|
74
75
|
},
|
75
76
|
listeners: [
|
@@ -138,10 +139,22 @@ describe Deimos, 'configuration' do
|
|
138
139
|
connect_timeout 30
|
139
140
|
socket_timeout 30
|
140
141
|
ssl.enabled(true)
|
142
|
+
ssl.ca_certs_from_system(true)
|
141
143
|
ssl.ca_cert('cert')
|
142
144
|
ssl.client_cert('cert')
|
143
145
|
ssl.client_cert_key('key')
|
144
146
|
ssl.verify_hostname(false)
|
147
|
+
sasl.enabled true
|
148
|
+
sasl.gssapi_principal 'gssapi_principal'
|
149
|
+
sasl.gssapi_keytab 'gssapi_keytab'
|
150
|
+
sasl.plain_authzid 'plain_authzid'
|
151
|
+
sasl.plain_username 'plain_username'
|
152
|
+
sasl.plain_password 'plain_password'
|
153
|
+
sasl.scram_username 'scram_username'
|
154
|
+
sasl.scram_password 'scram_password'
|
155
|
+
sasl.scram_mechanism 'scram_mechanism'
|
156
|
+
sasl.enforce_ssl true
|
157
|
+
sasl.oauth_token_provider 'oauth_token_provider'
|
145
158
|
end
|
146
159
|
consumers do
|
147
160
|
session_timeout 30
|
@@ -210,11 +223,22 @@ describe Deimos, 'configuration' do
|
|
210
223
|
client_id: 'phobos2',
|
211
224
|
connect_timeout: 30,
|
212
225
|
socket_timeout: 30,
|
226
|
+
ssl_ca_certs_from_system: true,
|
213
227
|
ssl_ca_cert: 'cert',
|
214
228
|
ssl_client_cert: 'cert',
|
215
229
|
ssl_client_cert_key: 'key',
|
216
230
|
ssl_verify_hostname: false,
|
217
|
-
seed_brokers: ['my-seed-brokers']
|
231
|
+
seed_brokers: ['my-seed-brokers'],
|
232
|
+
sasl_gssapi_principal: 'gssapi_principal',
|
233
|
+
sasl_gssapi_keytab: 'gssapi_keytab',
|
234
|
+
sasl_plain_authzid: 'plain_authzid',
|
235
|
+
sasl_plain_username: 'plain_username',
|
236
|
+
sasl_plain_password: 'plain_password',
|
237
|
+
sasl_scram_username: 'scram_username',
|
238
|
+
sasl_scram_password: 'scram_password',
|
239
|
+
sasl_scram_mechanism: 'scram_mechanism',
|
240
|
+
sasl_over_ssl: true,
|
241
|
+
sasl_oauth_token_provider: 'oauth_token_provider',
|
218
242
|
},
|
219
243
|
listeners: [
|
220
244
|
{
|
data/spec/consumer_spec.rb
CHANGED
@@ -32,8 +32,8 @@ module ConsumerTest
|
|
32
32
|
|
33
33
|
it 'should consume a message' do
|
34
34
|
test_consume_message(MyConsumer,
|
35
|
-
'test_id' => 'foo',
|
36
|
-
'some_int' => 123) do |payload, _metadata|
|
35
|
+
{'test_id' => 'foo',
|
36
|
+
'some_int' => 123}) do |payload, _metadata|
|
37
37
|
expect(payload['test_id']).to eq('foo')
|
38
38
|
expect(payload['some_int']).to eq(123)
|
39
39
|
end
|
@@ -64,15 +64,15 @@ module ConsumerTest
|
|
64
64
|
|
65
65
|
it 'should consume a message on a topic' do
|
66
66
|
test_consume_message('my_consume_topic',
|
67
|
-
'test_id' => 'foo',
|
68
|
-
'some_int' => 123) do |payload, _metadata|
|
67
|
+
{'test_id' => 'foo',
|
68
|
+
'some_int' => 123}) do |payload, _metadata|
|
69
69
|
expect(payload['test_id']).to eq('foo')
|
70
70
|
expect(payload['some_int']).to eq(123)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
74
|
it 'should fail on invalid message' do
|
75
|
-
test_consume_invalid_message(MyConsumer, 'invalid' => 'key')
|
75
|
+
test_consume_invalid_message(MyConsumer, {'invalid' => 'key'})
|
76
76
|
end
|
77
77
|
|
78
78
|
it 'should fail if reraise is false but fatal_error is true' do
|
@@ -85,14 +85,14 @@ module ConsumerTest
|
|
85
85
|
config.consumers.fatal_error = proc { true }
|
86
86
|
config.consumers.reraise_errors = false
|
87
87
|
end
|
88
|
-
test_consume_invalid_message(MyConsumer, 'invalid' => 'key')
|
88
|
+
test_consume_invalid_message(MyConsumer, {'invalid' => 'key'})
|
89
89
|
end
|
90
90
|
|
91
91
|
it 'should fail on message with extra fields' do
|
92
92
|
test_consume_invalid_message(MyConsumer,
|
93
|
-
'test_id' => 'foo',
|
93
|
+
{'test_id' => 'foo',
|
94
94
|
'some_int' => 123,
|
95
|
-
'extra_field' => 'field name')
|
95
|
+
'extra_field' => 'field name'})
|
96
96
|
end
|
97
97
|
|
98
98
|
it 'should not fail when before_consume fails without reraising errors' do
|
@@ -102,7 +102,7 @@ module ConsumerTest
|
|
102
102
|
MyConsumer,
|
103
103
|
{ 'test_id' => 'foo',
|
104
104
|
'some_int' => 123 },
|
105
|
-
|
105
|
+
skip_expectation: true
|
106
106
|
) { raise 'OH NOES' }
|
107
107
|
}.not_to raise_error
|
108
108
|
end
|
@@ -113,7 +113,7 @@ module ConsumerTest
|
|
113
113
|
test_consume_message(
|
114
114
|
MyConsumer,
|
115
115
|
{ 'invalid' => 'key' },
|
116
|
-
|
116
|
+
skip_expectation: true
|
117
117
|
)
|
118
118
|
}.not_to raise_error
|
119
119
|
end
|
@@ -122,7 +122,7 @@ module ConsumerTest
|
|
122
122
|
expect {
|
123
123
|
test_consume_message(MyConsumer,
|
124
124
|
{ 'test_id' => 'foo', 'some_int' => 123 },
|
125
|
-
|
125
|
+
call_original: true)
|
126
126
|
}.to raise_error('This should not be called unless call_original is set')
|
127
127
|
end
|
128
128
|
end
|
@@ -189,10 +189,10 @@ module ConsumerTest
|
|
189
189
|
it 'should consume a message' do
|
190
190
|
expect(Deimos.config.metrics).to receive(:histogram).twice
|
191
191
|
test_consume_message('my_consume_topic',
|
192
|
-
'test_id' => 'foo',
|
192
|
+
{'test_id' => 'foo',
|
193
193
|
'some_int' => 123,
|
194
194
|
'updated_at' => Time.now.to_i,
|
195
|
-
'timestamp' => 2.minutes.ago.to_s) do |payload, _metadata|
|
195
|
+
'timestamp' => 2.minutes.ago.to_s}) do |payload, _metadata|
|
196
196
|
expect(payload['test_id']).to eq('foo')
|
197
197
|
end
|
198
198
|
end
|
@@ -200,17 +200,17 @@ module ConsumerTest
|
|
200
200
|
it 'should fail nicely when timestamp wrong format' do
|
201
201
|
expect(Deimos.config.metrics).to receive(:histogram).twice
|
202
202
|
test_consume_message('my_consume_topic',
|
203
|
-
'test_id' => 'foo',
|
203
|
+
{'test_id' => 'foo',
|
204
204
|
'some_int' => 123,
|
205
205
|
'updated_at' => Time.now.to_i,
|
206
|
-
'timestamp' => 'dffdf') do |payload, _metadata|
|
206
|
+
'timestamp' => 'dffdf'}) do |payload, _metadata|
|
207
207
|
expect(payload['test_id']).to eq('foo')
|
208
208
|
end
|
209
209
|
test_consume_message('my_consume_topic',
|
210
|
-
'test_id' => 'foo',
|
210
|
+
{'test_id' => 'foo',
|
211
211
|
'some_int' => 123,
|
212
212
|
'updated_at' => Time.now.to_i,
|
213
|
-
'timestamp' => '') do |payload, _metadata|
|
213
|
+
'timestamp' => ''}) do |payload, _metadata|
|
214
214
|
expect(payload['test_id']).to eq('foo')
|
215
215
|
end
|
216
216
|
end
|
@@ -81,7 +81,7 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
|
|
81
81
|
topic 'MyTopic'
|
82
82
|
schema 'MySchema'
|
83
83
|
namespace 'com.my-namespace'
|
84
|
-
key_config schema: '
|
84
|
+
key_config schema: 'MySchema_key'
|
85
85
|
end
|
86
86
|
end
|
87
87
|
described_class.start
|
@@ -143,7 +143,7 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
|
|
143
143
|
topic 'MyTopic'
|
144
144
|
schema 'MySchema'
|
145
145
|
namespace 'com.my-namespace'
|
146
|
-
key_config schema: '
|
146
|
+
key_config schema: 'MySchema_key'
|
147
147
|
end
|
148
148
|
|
149
149
|
producer do
|
data/spec/producer_spec.rb
CHANGED
@@ -53,7 +53,7 @@ module ProducerTest
|
|
53
53
|
schema 'MySchema'
|
54
54
|
namespace 'com.my-namespace'
|
55
55
|
topic 'my-topic2'
|
56
|
-
key_config schema: '
|
56
|
+
key_config schema: 'MySchema_key'
|
57
57
|
end
|
58
58
|
stub_const('MySchemaProducer', producer_class)
|
59
59
|
|
@@ -79,7 +79,7 @@ module ProducerTest
|
|
79
79
|
expect(event.payload[:payloads]).to eq([{ 'invalid' => 'key' }])
|
80
80
|
end
|
81
81
|
expect(MyProducer.encoder).to receive(:validate).and_raise('OH NOES')
|
82
|
-
expect { MyProducer.publish('invalid' => 'key', :payload_key => 'key') }.
|
82
|
+
expect { MyProducer.publish({'invalid' => 'key', :payload_key => 'key'}) }.
|
83
83
|
to raise_error('OH NOES')
|
84
84
|
Deimos.unsubscribe(subscriber)
|
85
85
|
end
|
@@ -294,7 +294,7 @@ module ProducerTest
|
|
294
294
|
|
295
295
|
it 'should properly encode and coerce values with a nested record' do
|
296
296
|
expect(MyNestedSchemaProducer.encoder).to receive(:encode_key).with('test_id', 'foo', topic: 'my-topic-key')
|
297
|
-
MyNestedSchemaProducer.publish(
|
297
|
+
MyNestedSchemaProducer.publish({
|
298
298
|
'test_id' => 'foo',
|
299
299
|
'test_float' => BigDecimal('123.456'),
|
300
300
|
'test_array' => ['1'],
|
@@ -305,7 +305,7 @@ module ProducerTest
|
|
305
305
|
'some_optional_int' => nil
|
306
306
|
},
|
307
307
|
'some_optional_record' => nil
|
308
|
-
|
308
|
+
})
|
309
309
|
expect(MyNestedSchemaProducer.topic).to have_sent(
|
310
310
|
'test_id' => 'foo',
|
311
311
|
'test_float' => 123.456,
|
@@ -504,23 +504,23 @@ module ProducerTest
|
|
504
504
|
it 'should disable globally' do
|
505
505
|
Deimos.disable_producers do
|
506
506
|
Deimos.disable_producers do # test nested
|
507
|
-
MyProducer.publish(
|
507
|
+
MyProducer.publish({
|
508
508
|
'test_id' => 'foo',
|
509
509
|
'some_int' => 123,
|
510
510
|
:payload_key => '123'
|
511
|
-
|
512
|
-
MyProducerWithID.publish(
|
511
|
+
})
|
512
|
+
MyProducerWithID.publish({
|
513
513
|
'test_id' => 'foo', 'some_int' => 123
|
514
|
-
|
514
|
+
})
|
515
515
|
expect('my-topic').not_to have_sent(anything)
|
516
516
|
expect(Deimos).to be_producers_disabled
|
517
517
|
expect(Deimos).to be_producers_disabled([MyProducer])
|
518
518
|
end
|
519
519
|
end
|
520
520
|
|
521
|
-
MyProducerWithID.publish(
|
521
|
+
MyProducerWithID.publish({
|
522
522
|
'test_id' => 'foo', 'some_int' => 123, :payload_key => 123
|
523
|
-
|
523
|
+
})
|
524
524
|
expect('my-topic').
|
525
525
|
to have_sent('test_id' => 'foo', 'some_int' => 123,
|
526
526
|
'message_id' => anything, 'timestamp' => anything)
|
@@ -531,15 +531,15 @@ module ProducerTest
|
|
531
531
|
it 'should disable a single producer' do
|
532
532
|
Deimos.disable_producers(MyProducer) do # test nested
|
533
533
|
Deimos.disable_producers(MyProducer) do
|
534
|
-
MySchemaProducer.publish(
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
MyProducer.publish(
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
534
|
+
MySchemaProducer.publish({
|
535
|
+
'test_id' => 'foo', 'some_int' => 123,
|
536
|
+
:payload_key => { 'test_id' => 'foo_key' }
|
537
|
+
})
|
538
|
+
MyProducer.publish({
|
539
|
+
'test_id' => 'foo',
|
540
|
+
'some_int' => 123,
|
541
|
+
:payload_key => '123'
|
542
|
+
})
|
543
543
|
expect('my-topic').not_to have_sent(anything)
|
544
544
|
expect('my-topic2').to have_sent('test_id' => 'foo', 'some_int' => 123)
|
545
545
|
expect(Deimos).not_to be_producers_disabled
|
@@ -550,11 +550,11 @@ module ProducerTest
|
|
550
550
|
expect(Deimos).not_to be_producers_disabled
|
551
551
|
expect(Deimos).not_to be_producers_disabled(MyProducer)
|
552
552
|
expect(Deimos).not_to be_producers_disabled(MySchemaProducer)
|
553
|
-
MyProducer.publish(
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
553
|
+
MyProducer.publish({
|
554
|
+
'test_id' => 'foo',
|
555
|
+
'some_int' => 123,
|
556
|
+
:payload_key => '123'
|
557
|
+
})
|
558
558
|
expect('my-topic').
|
559
559
|
to have_sent('test_id' => 'foo', 'some_int' => 123)
|
560
560
|
end
|
@@ -87,13 +87,13 @@ RSpec.shared_examples_for('an Avro backend') do
|
|
87
87
|
describe('#validate') do
|
88
88
|
it 'should pass valid schemas' do
|
89
89
|
expect {
|
90
|
-
backend.validate({ 'test_id' => 'hi', 'some_int' => 4 },
|
90
|
+
backend.validate({ 'test_id' => 'hi', 'some_int' => 4 }, schema: 'MySchema')
|
91
91
|
}.not_to raise_error
|
92
92
|
end
|
93
93
|
|
94
94
|
it 'should fail invalid schemas' do
|
95
95
|
expect {
|
96
|
-
backend.validate({ 'test_id2' => 'hi', 'some_int' => 4 },
|
96
|
+
backend.validate({ 'test_id2' => 'hi', 'some_int' => 4 }, schema: 'MySchema')
|
97
97
|
}.to raise_error(Avro::SchemaValidator::ValidationError)
|
98
98
|
end
|
99
99
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# This file is autogenerated by Deimos, Do NOT modify
|
4
4
|
module Schemas
|
5
5
|
### Primary Schema Class ###
|
6
|
-
# Autogenerated Schema for Record at com.my-namespace.
|
6
|
+
# Autogenerated Schema for Record at com.my-namespace.MySchema_key
|
7
7
|
class MySchemaKey < Deimos::SchemaClass::Record
|
8
8
|
### Attribute Accessors ###
|
9
9
|
# @param value [String]
|
@@ -17,7 +17,7 @@ module Schemas
|
|
17
17
|
|
18
18
|
# @override
|
19
19
|
def schema
|
20
|
-
'
|
20
|
+
'MySchema_key'
|
21
21
|
end
|
22
22
|
|
23
23
|
# @override
|
@@ -17,14 +17,14 @@ describe Deimos::Utils::SeekListener do
|
|
17
17
|
it 'should seek offset' do
|
18
18
|
allow(consumer).to receive(:seek)
|
19
19
|
expect(consumer).to receive(:seek).once
|
20
|
-
seek_listener = described_class.new(
|
20
|
+
seek_listener = described_class.new(handler: handler, group_id: 999, topic: 'test_topic')
|
21
21
|
seek_listener.start_listener
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'should retry on errors when seeking offset' do
|
25
25
|
allow(consumer).to receive(:seek).and_raise(StandardError)
|
26
26
|
expect(consumer).to receive(:seek).twice
|
27
|
-
seek_listener = described_class.new(
|
27
|
+
seek_listener = described_class.new(handler: handler, group_id: 999, topic: 'test_topic')
|
28
28
|
seek_listener.start_listener
|
29
29
|
end
|
30
30
|
end
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deimos-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.12.
|
4
|
+
version: 1.12.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Orner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: avro_turf
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0.11'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0.11'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: phobos
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -347,6 +353,9 @@ extensions: []
|
|
347
353
|
extra_rdoc_files: []
|
348
354
|
files:
|
349
355
|
- ".circleci/config.yml"
|
356
|
+
- ".gemfiles/avro_turf-0.gemfile"
|
357
|
+
- ".gemfiles/avro_turf-1.gemfile"
|
358
|
+
- ".github/workflows/ci.yml"
|
350
359
|
- ".gitignore"
|
351
360
|
- ".gitmodules"
|
352
361
|
- ".rspec"
|
@@ -357,7 +366,6 @@ files:
|
|
357
366
|
- CODE_OF_CONDUCT.md
|
358
367
|
- Dockerfile
|
359
368
|
- Gemfile
|
360
|
-
- Gemfile.lock
|
361
369
|
- Guardfile
|
362
370
|
- LICENSE.md
|
363
371
|
- README.md
|
@@ -477,14 +485,14 @@ files:
|
|
477
485
|
- spec/schema_classes/my_schema_with_complex_types.rb
|
478
486
|
- spec/schemas/com/my-namespace/Generated.avsc
|
479
487
|
- spec/schemas/com/my-namespace/MyNestedSchema.avsc
|
480
|
-
- spec/schemas/com/my-namespace/MySchema-key.avsc
|
481
488
|
- spec/schemas/com/my-namespace/MySchema.avsc
|
482
|
-
- spec/schemas/com/my-namespace/
|
489
|
+
- spec/schemas/com/my-namespace/MySchemaCompound_key.avsc
|
483
490
|
- spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
|
484
491
|
- spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
|
485
492
|
- spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
|
486
493
|
- spec/schemas/com/my-namespace/MySchemaWithId.avsc
|
487
494
|
- spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
|
495
|
+
- spec/schemas/com/my-namespace/MySchema_key.avsc
|
488
496
|
- spec/schemas/com/my-namespace/Wibble.avsc
|
489
497
|
- spec/schemas/com/my-namespace/Widget.avsc
|
490
498
|
- spec/schemas/com/my-namespace/WidgetTheSecond.avsc
|
@@ -568,14 +576,14 @@ test_files:
|
|
568
576
|
- spec/schema_classes/my_schema_with_complex_types.rb
|
569
577
|
- spec/schemas/com/my-namespace/Generated.avsc
|
570
578
|
- spec/schemas/com/my-namespace/MyNestedSchema.avsc
|
571
|
-
- spec/schemas/com/my-namespace/MySchema-key.avsc
|
572
579
|
- spec/schemas/com/my-namespace/MySchema.avsc
|
573
|
-
- spec/schemas/com/my-namespace/
|
580
|
+
- spec/schemas/com/my-namespace/MySchemaCompound_key.avsc
|
574
581
|
- spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
|
575
582
|
- spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
|
576
583
|
- spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
|
577
584
|
- spec/schemas/com/my-namespace/MySchemaWithId.avsc
|
578
585
|
- spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
|
586
|
+
- spec/schemas/com/my-namespace/MySchema_key.avsc
|
579
587
|
- spec/schemas/com/my-namespace/Wibble.avsc
|
580
588
|
- spec/schemas/com/my-namespace/Widget.avsc
|
581
589
|
- spec/schemas/com/my-namespace/WidgetTheSecond.avsc
|
data/Gemfile.lock
DELETED
@@ -1,292 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
deimos-ruby (1.12.3)
|
5
|
-
avro_turf (~> 0.11)
|
6
|
-
fig_tree (~> 0.0.2)
|
7
|
-
phobos (>= 1.9, < 3.0)
|
8
|
-
ruby-kafka (< 2)
|
9
|
-
sigurd (~> 0.0.1)
|
10
|
-
|
11
|
-
GEM
|
12
|
-
remote: https://rubygems.org/
|
13
|
-
specs:
|
14
|
-
actioncable (6.1.3)
|
15
|
-
actionpack (= 6.1.3)
|
16
|
-
activesupport (= 6.1.3)
|
17
|
-
nio4r (~> 2.0)
|
18
|
-
websocket-driver (>= 0.6.1)
|
19
|
-
actionmailbox (6.1.3)
|
20
|
-
actionpack (= 6.1.3)
|
21
|
-
activejob (= 6.1.3)
|
22
|
-
activerecord (= 6.1.3)
|
23
|
-
activestorage (= 6.1.3)
|
24
|
-
activesupport (= 6.1.3)
|
25
|
-
mail (>= 2.7.1)
|
26
|
-
actionmailer (6.1.3)
|
27
|
-
actionpack (= 6.1.3)
|
28
|
-
actionview (= 6.1.3)
|
29
|
-
activejob (= 6.1.3)
|
30
|
-
activesupport (= 6.1.3)
|
31
|
-
mail (~> 2.5, >= 2.5.4)
|
32
|
-
rails-dom-testing (~> 2.0)
|
33
|
-
actionpack (6.1.3)
|
34
|
-
actionview (= 6.1.3)
|
35
|
-
activesupport (= 6.1.3)
|
36
|
-
rack (~> 2.0, >= 2.0.9)
|
37
|
-
rack-test (>= 0.6.3)
|
38
|
-
rails-dom-testing (~> 2.0)
|
39
|
-
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
40
|
-
actiontext (6.1.3)
|
41
|
-
actionpack (= 6.1.3)
|
42
|
-
activerecord (= 6.1.3)
|
43
|
-
activestorage (= 6.1.3)
|
44
|
-
activesupport (= 6.1.3)
|
45
|
-
nokogiri (>= 1.8.5)
|
46
|
-
actionview (6.1.3)
|
47
|
-
activesupport (= 6.1.3)
|
48
|
-
builder (~> 3.1)
|
49
|
-
erubi (~> 1.4)
|
50
|
-
rails-dom-testing (~> 2.0)
|
51
|
-
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
52
|
-
activejob (6.1.3)
|
53
|
-
activesupport (= 6.1.3)
|
54
|
-
globalid (>= 0.3.6)
|
55
|
-
activemodel (6.1.3)
|
56
|
-
activesupport (= 6.1.3)
|
57
|
-
activerecord (6.1.3)
|
58
|
-
activemodel (= 6.1.3)
|
59
|
-
activesupport (= 6.1.3)
|
60
|
-
activerecord-import (1.0.8)
|
61
|
-
activerecord (>= 3.2)
|
62
|
-
activestorage (6.1.3)
|
63
|
-
actionpack (= 6.1.3)
|
64
|
-
activejob (= 6.1.3)
|
65
|
-
activerecord (= 6.1.3)
|
66
|
-
activesupport (= 6.1.3)
|
67
|
-
marcel (~> 0.3.1)
|
68
|
-
mimemagic (~> 0.3.2)
|
69
|
-
activesupport (6.1.3)
|
70
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
71
|
-
i18n (>= 1.6, < 2)
|
72
|
-
minitest (>= 5.1)
|
73
|
-
tzinfo (~> 2.0)
|
74
|
-
zeitwerk (~> 2.3)
|
75
|
-
ast (2.4.2)
|
76
|
-
avro (1.9.2)
|
77
|
-
multi_json
|
78
|
-
avro_turf (0.11.0)
|
79
|
-
avro (>= 1.7.7, < 1.10)
|
80
|
-
excon (~> 0.45)
|
81
|
-
builder (3.2.4)
|
82
|
-
coderay (1.1.3)
|
83
|
-
concurrent-ruby (1.1.8)
|
84
|
-
concurrent-ruby-ext (1.1.8)
|
85
|
-
concurrent-ruby (= 1.1.8)
|
86
|
-
crass (1.0.6)
|
87
|
-
database_cleaner (1.99.0)
|
88
|
-
ddtrace (0.46.0)
|
89
|
-
msgpack
|
90
|
-
diff-lcs (1.4.4)
|
91
|
-
digest-crc (0.6.4)
|
92
|
-
rake (>= 12.0.0, < 14.0.0)
|
93
|
-
dogstatsd-ruby (4.8.3)
|
94
|
-
erubi (1.10.0)
|
95
|
-
excon (0.89.0)
|
96
|
-
exponential-backoff (0.0.4)
|
97
|
-
ffi (1.15.0)
|
98
|
-
fig_tree (0.0.2)
|
99
|
-
activesupport (>= 3.0.0)
|
100
|
-
formatador (0.2.5)
|
101
|
-
globalid (0.4.2)
|
102
|
-
activesupport (>= 4.2.0)
|
103
|
-
guard (2.16.2)
|
104
|
-
formatador (>= 0.2.4)
|
105
|
-
listen (>= 2.7, < 4.0)
|
106
|
-
lumberjack (>= 1.0.12, < 2.0)
|
107
|
-
nenv (~> 0.1)
|
108
|
-
notiffany (~> 0.0)
|
109
|
-
pry (>= 0.9.12)
|
110
|
-
shellany (~> 0.0)
|
111
|
-
thor (>= 0.18.1)
|
112
|
-
guard-compat (1.2.1)
|
113
|
-
guard-rspec (4.7.3)
|
114
|
-
guard (~> 2.1)
|
115
|
-
guard-compat (~> 1.1)
|
116
|
-
rspec (>= 2.99.0, < 4.0)
|
117
|
-
guard-rubocop (1.4.0)
|
118
|
-
guard (~> 2.0)
|
119
|
-
rubocop (< 2.0)
|
120
|
-
i18n (1.8.9)
|
121
|
-
concurrent-ruby (~> 1.0)
|
122
|
-
listen (3.4.1)
|
123
|
-
rb-fsevent (~> 0.10, >= 0.10.3)
|
124
|
-
rb-inotify (~> 0.9, >= 0.9.10)
|
125
|
-
little-plugger (1.1.4)
|
126
|
-
logging (2.3.0)
|
127
|
-
little-plugger (~> 1.1)
|
128
|
-
multi_json (~> 1.14)
|
129
|
-
loofah (2.9.0)
|
130
|
-
crass (~> 1.0.2)
|
131
|
-
nokogiri (>= 1.5.9)
|
132
|
-
lumberjack (1.2.8)
|
133
|
-
mail (2.7.1)
|
134
|
-
mini_mime (>= 0.1.1)
|
135
|
-
marcel (0.3.3)
|
136
|
-
mimemagic (~> 0.3.2)
|
137
|
-
method_source (1.0.0)
|
138
|
-
mimemagic (0.3.10)
|
139
|
-
nokogiri (~> 1)
|
140
|
-
rake
|
141
|
-
mini_mime (1.0.2)
|
142
|
-
mini_portile2 (2.5.1)
|
143
|
-
minitest (5.14.4)
|
144
|
-
msgpack (1.4.2)
|
145
|
-
multi_json (1.15.0)
|
146
|
-
mysql2 (0.5.3)
|
147
|
-
nenv (0.3.0)
|
148
|
-
nio4r (2.5.7)
|
149
|
-
nokogiri (1.11.5)
|
150
|
-
mini_portile2 (~> 2.5.0)
|
151
|
-
racc (~> 1.4)
|
152
|
-
notiffany (0.1.3)
|
153
|
-
nenv (~> 0.1)
|
154
|
-
shellany (~> 0.0)
|
155
|
-
parallel (1.20.1)
|
156
|
-
parser (3.0.1.1)
|
157
|
-
ast (~> 2.4.1)
|
158
|
-
pg (1.2.3)
|
159
|
-
phobos (2.1.0)
|
160
|
-
activesupport (>= 3.0.0)
|
161
|
-
concurrent-ruby (>= 1.0.2)
|
162
|
-
concurrent-ruby-ext (>= 1.0.2)
|
163
|
-
exponential-backoff
|
164
|
-
logging
|
165
|
-
ruby-kafka
|
166
|
-
thor
|
167
|
-
pry (0.14.0)
|
168
|
-
coderay (~> 1.1)
|
169
|
-
method_source (~> 1.0)
|
170
|
-
racc (1.5.2)
|
171
|
-
rack (2.2.3)
|
172
|
-
rack-test (1.1.0)
|
173
|
-
rack (>= 1.0, < 3)
|
174
|
-
rails (6.1.3)
|
175
|
-
actioncable (= 6.1.3)
|
176
|
-
actionmailbox (= 6.1.3)
|
177
|
-
actionmailer (= 6.1.3)
|
178
|
-
actionpack (= 6.1.3)
|
179
|
-
actiontext (= 6.1.3)
|
180
|
-
actionview (= 6.1.3)
|
181
|
-
activejob (= 6.1.3)
|
182
|
-
activemodel (= 6.1.3)
|
183
|
-
activerecord (= 6.1.3)
|
184
|
-
activestorage (= 6.1.3)
|
185
|
-
activesupport (= 6.1.3)
|
186
|
-
bundler (>= 1.15.0)
|
187
|
-
railties (= 6.1.3)
|
188
|
-
sprockets-rails (>= 2.0.0)
|
189
|
-
rails-dom-testing (2.0.3)
|
190
|
-
activesupport (>= 4.2.0)
|
191
|
-
nokogiri (>= 1.6)
|
192
|
-
rails-html-sanitizer (1.3.0)
|
193
|
-
loofah (~> 2.3)
|
194
|
-
railties (6.1.3)
|
195
|
-
actionpack (= 6.1.3)
|
196
|
-
activesupport (= 6.1.3)
|
197
|
-
method_source
|
198
|
-
rake (>= 0.8.7)
|
199
|
-
thor (~> 1.0)
|
200
|
-
rainbow (3.0.0)
|
201
|
-
rake (13.0.3)
|
202
|
-
rb-fsevent (0.10.4)
|
203
|
-
rb-inotify (0.10.1)
|
204
|
-
ffi (~> 1.0)
|
205
|
-
regexp_parser (2.1.1)
|
206
|
-
rexml (3.2.5)
|
207
|
-
rspec (3.10.0)
|
208
|
-
rspec-core (~> 3.10.0)
|
209
|
-
rspec-expectations (~> 3.10.0)
|
210
|
-
rspec-mocks (~> 3.10.0)
|
211
|
-
rspec-core (3.10.1)
|
212
|
-
rspec-support (~> 3.10.0)
|
213
|
-
rspec-expectations (3.10.1)
|
214
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
215
|
-
rspec-support (~> 3.10.0)
|
216
|
-
rspec-mocks (3.10.2)
|
217
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
218
|
-
rspec-support (~> 3.10.0)
|
219
|
-
rspec-rails (4.1.1)
|
220
|
-
actionpack (>= 4.2)
|
221
|
-
activesupport (>= 4.2)
|
222
|
-
railties (>= 4.2)
|
223
|
-
rspec-core (~> 3.10)
|
224
|
-
rspec-expectations (~> 3.10)
|
225
|
-
rspec-mocks (~> 3.10)
|
226
|
-
rspec-support (~> 3.10)
|
227
|
-
rspec-support (3.10.2)
|
228
|
-
rspec_junit_formatter (0.4.1)
|
229
|
-
rspec-core (>= 2, < 4, != 2.12.0)
|
230
|
-
rubocop (0.89.0)
|
231
|
-
parallel (~> 1.10)
|
232
|
-
parser (>= 2.7.1.1)
|
233
|
-
rainbow (>= 2.2.2, < 4.0)
|
234
|
-
regexp_parser (>= 1.7)
|
235
|
-
rexml
|
236
|
-
rubocop-ast (>= 0.1.0, < 1.0)
|
237
|
-
ruby-progressbar (~> 1.7)
|
238
|
-
unicode-display_width (>= 1.4.0, < 2.0)
|
239
|
-
rubocop-ast (0.8.0)
|
240
|
-
parser (>= 2.7.1.5)
|
241
|
-
rubocop-rspec (1.42.0)
|
242
|
-
rubocop (>= 0.87.0)
|
243
|
-
ruby-kafka (1.4.0)
|
244
|
-
digest-crc
|
245
|
-
ruby-progressbar (1.11.0)
|
246
|
-
shellany (0.0.1)
|
247
|
-
sigurd (0.0.3)
|
248
|
-
concurrent-ruby (~> 1)
|
249
|
-
exponential-backoff
|
250
|
-
sprockets (4.0.2)
|
251
|
-
concurrent-ruby (~> 1.0)
|
252
|
-
rack (> 1, < 3)
|
253
|
-
sprockets-rails (3.2.2)
|
254
|
-
actionpack (>= 4.0)
|
255
|
-
activesupport (>= 4.0)
|
256
|
-
sprockets (>= 3.0.0)
|
257
|
-
sqlite3 (1.4.2)
|
258
|
-
thor (1.1.0)
|
259
|
-
tzinfo (2.0.4)
|
260
|
-
concurrent-ruby (~> 1.0)
|
261
|
-
unicode-display_width (1.7.0)
|
262
|
-
websocket-driver (0.7.3)
|
263
|
-
websocket-extensions (>= 0.1.0)
|
264
|
-
websocket-extensions (0.1.5)
|
265
|
-
zeitwerk (2.4.2)
|
266
|
-
|
267
|
-
PLATFORMS
|
268
|
-
ruby
|
269
|
-
|
270
|
-
DEPENDENCIES
|
271
|
-
activerecord-import
|
272
|
-
avro (~> 1.9)
|
273
|
-
database_cleaner (~> 1.7)
|
274
|
-
ddtrace (~> 0.11)
|
275
|
-
deimos-ruby!
|
276
|
-
dogstatsd-ruby (~> 4.2)
|
277
|
-
guard (~> 2)
|
278
|
-
guard-rspec (~> 4)
|
279
|
-
guard-rubocop (~> 1)
|
280
|
-
mysql2 (~> 0.5)
|
281
|
-
pg (~> 1.1)
|
282
|
-
rails (~> 6)
|
283
|
-
rake (~> 13)
|
284
|
-
rspec (~> 3)
|
285
|
-
rspec-rails (~> 4)
|
286
|
-
rspec_junit_formatter (~> 0.3)
|
287
|
-
rubocop (= 0.89.0)
|
288
|
-
rubocop-rspec (= 1.42.0)
|
289
|
-
sqlite3 (~> 1.3)
|
290
|
-
|
291
|
-
BUNDLED WITH
|
292
|
-
2.2.17
|