deimos-ruby 1.12.3 → 1.12.6
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 +15 -0
- data/README.md +3 -3
- data/bin/console +15 -0
- data/deimos-ruby.gemspec +1 -1
- data/docs/CONFIGURATION.md +15 -1
- data/lib/deimos/config/configuration.rb +62 -2
- data/lib/deimos/config/phobos_config.rb +24 -0
- data/lib/deimos/metrics/datadog.rb +1 -1
- data/lib/deimos/schema_backends/avro_schema_registry.rb +2 -0
- data/lib/deimos/utils/schema_controller_mixin.rb +1 -1
- 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 +19 -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: 945958ca7b49192f533a47eac766f4ca463d7ed85702b2c85b41fc22d8aaeef1
|
|
4
|
+
data.tar.gz: 8e7a6bf75f733d1903810a85e6ccf0185a868d8dbc07a1544d210bb160135417
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 220de8bc9a38b50affdc56e0f25c6a185ffc1646cf39de21478b6906fc1fcf3bf20c197d4105132ecc7cae004e75498299ebc104fcb8d46f530fe8a67ac92883
|
|
7
|
+
data.tar.gz: fd89136dea1f76acb4de3bda22ee06e1d5ef88dc827a2690b588d2e84284584041818bbb257b71db99212586005a4b6818f89e8f627dc727e2eb8ba1b144c94f
|
|
@@ -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,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## UNRELEASED
|
|
9
9
|
|
|
10
|
+
# 1.12.6 - 2022-03-14
|
|
11
|
+
|
|
12
|
+
- Fix NameError when using Datadog Metrics
|
|
13
|
+
- Fix unwanted STDOUT output when loading the main `Deimos` module
|
|
14
|
+
|
|
15
|
+
# 1.12.5 - 2022-03-09
|
|
16
|
+
|
|
17
|
+
- Allow use of new avro_turf versions where child schemas are not listed with the top level schemas
|
|
18
|
+
- Add support for SASL authentication with brokers
|
|
19
|
+
- Add support for Basic auth with Schema Registry
|
|
20
|
+
|
|
21
|
+
# 1.12.4 - 2022-01-13
|
|
22
|
+
|
|
23
|
+
- Fix bug where schema controller mixin was using the schema name to register and not the namespaced schema name
|
|
24
|
+
|
|
10
25
|
# 1.12.3 - 2021-12-13
|
|
11
26
|
|
|
12
27
|
- Fix bug with previous release
|
data/README.md
CHANGED
|
@@ -259,7 +259,7 @@ like this:
|
|
|
259
259
|
```javascript
|
|
260
260
|
{
|
|
261
261
|
"namespace": "com.my-namespace",
|
|
262
|
-
"name": "
|
|
262
|
+
"name": "MySchema_key",
|
|
263
263
|
"type": "record",
|
|
264
264
|
"doc": "Key for com.my-namespace.MySchema",
|
|
265
265
|
"fields": [
|
|
@@ -934,8 +934,8 @@ The following metrics are reported:
|
|
|
934
934
|
|
|
935
935
|
### Configuring Metrics Providers
|
|
936
936
|
|
|
937
|
-
See the `metrics` field under [Configuration](
|
|
938
|
-
View all available Metrics Providers [here](lib/deimos/metrics
|
|
937
|
+
See the `metrics` field under [Configuration](#configuration).
|
|
938
|
+
View all available Metrics Providers [here](lib/deimos/metrics)
|
|
939
939
|
|
|
940
940
|
### Custom Metrics Providers
|
|
941
941
|
|
data/bin/console
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require 'bundler/setup'
|
|
5
|
+
require 'deimos'
|
|
6
|
+
|
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
|
9
|
+
|
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
11
|
+
# require "pry"
|
|
12
|
+
# Pry.start
|
|
13
|
+
|
|
14
|
+
require 'irb'
|
|
15
|
+
IRB.start(__FILE__)
|
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
|
|
@@ -287,11 +347,11 @@ module Deimos
|
|
|
287
347
|
|
|
288
348
|
# The configured metrics provider.
|
|
289
349
|
# @return [Metrics::Provider]
|
|
290
|
-
setting :metrics, Metrics::Mock.new
|
|
350
|
+
setting :metrics, default_proc: proc { Metrics::Mock.new }
|
|
291
351
|
|
|
292
352
|
# The configured tracing / APM provider.
|
|
293
353
|
# @return [Tracing::Provider]
|
|
294
|
-
setting :tracer, Tracing::Mock.new
|
|
354
|
+
setting :tracer, default_proc: proc { Tracing::Mock.new }
|
|
295
355
|
|
|
296
356
|
setting :db_producer do
|
|
297
357
|
|
|
@@ -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
|
|
@@ -13,7 +13,7 @@ module Deimos
|
|
|
13
13
|
raise 'Metrics config must specify namespace' if config[:namespace].nil?
|
|
14
14
|
|
|
15
15
|
logger.info("DatadogMetricsProvider configured with: #{config}")
|
|
16
|
-
@client = Datadog::Statsd.new(
|
|
16
|
+
@client = ::Datadog::Statsd.new(
|
|
17
17
|
config[:host_ip],
|
|
18
18
|
config[:host_port]
|
|
19
19
|
)
|
|
@@ -106,7 +106,7 @@ module Deimos
|
|
|
106
106
|
def render_schema(payload, schema: nil, namespace: nil)
|
|
107
107
|
namespace, schema = parse_namespace(:response) if !schema && !namespace
|
|
108
108
|
encoder = Deimos.schema_backend(schema: schema, namespace: namespace)
|
|
109
|
-
encoded = encoder.encode(payload)
|
|
109
|
+
encoded = encoder.encode(payload, topic: "#{namespace}.#{schema}")
|
|
110
110
|
response.headers['Content-Type'] = encoder.class.content_type
|
|
111
111
|
send_data(encoded)
|
|
112
112
|
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.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Orner
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-03-14 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
|
|
@@ -342,11 +348,15 @@ description:
|
|
|
342
348
|
email:
|
|
343
349
|
- daniel.orner@wishabi.com
|
|
344
350
|
executables:
|
|
351
|
+
- console
|
|
345
352
|
- deimos
|
|
346
353
|
extensions: []
|
|
347
354
|
extra_rdoc_files: []
|
|
348
355
|
files:
|
|
349
356
|
- ".circleci/config.yml"
|
|
357
|
+
- ".gemfiles/avro_turf-0.gemfile"
|
|
358
|
+
- ".gemfiles/avro_turf-1.gemfile"
|
|
359
|
+
- ".github/workflows/ci.yml"
|
|
350
360
|
- ".gitignore"
|
|
351
361
|
- ".gitmodules"
|
|
352
362
|
- ".rspec"
|
|
@@ -357,11 +367,11 @@ files:
|
|
|
357
367
|
- CODE_OF_CONDUCT.md
|
|
358
368
|
- Dockerfile
|
|
359
369
|
- Gemfile
|
|
360
|
-
- Gemfile.lock
|
|
361
370
|
- Guardfile
|
|
362
371
|
- LICENSE.md
|
|
363
372
|
- README.md
|
|
364
373
|
- Rakefile
|
|
374
|
+
- bin/console
|
|
365
375
|
- bin/deimos
|
|
366
376
|
- deimos-ruby.gemspec
|
|
367
377
|
- docker-compose.yml
|
|
@@ -477,14 +487,14 @@ files:
|
|
|
477
487
|
- spec/schema_classes/my_schema_with_complex_types.rb
|
|
478
488
|
- spec/schemas/com/my-namespace/Generated.avsc
|
|
479
489
|
- spec/schemas/com/my-namespace/MyNestedSchema.avsc
|
|
480
|
-
- spec/schemas/com/my-namespace/MySchema-key.avsc
|
|
481
490
|
- spec/schemas/com/my-namespace/MySchema.avsc
|
|
482
|
-
- spec/schemas/com/my-namespace/
|
|
491
|
+
- spec/schemas/com/my-namespace/MySchemaCompound_key.avsc
|
|
483
492
|
- spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
|
|
484
493
|
- spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
|
|
485
494
|
- spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
|
|
486
495
|
- spec/schemas/com/my-namespace/MySchemaWithId.avsc
|
|
487
496
|
- spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
|
|
497
|
+
- spec/schemas/com/my-namespace/MySchema_key.avsc
|
|
488
498
|
- spec/schemas/com/my-namespace/Wibble.avsc
|
|
489
499
|
- spec/schemas/com/my-namespace/Widget.avsc
|
|
490
500
|
- spec/schemas/com/my-namespace/WidgetTheSecond.avsc
|
|
@@ -568,14 +578,14 @@ test_files:
|
|
|
568
578
|
- spec/schema_classes/my_schema_with_complex_types.rb
|
|
569
579
|
- spec/schemas/com/my-namespace/Generated.avsc
|
|
570
580
|
- spec/schemas/com/my-namespace/MyNestedSchema.avsc
|
|
571
|
-
- spec/schemas/com/my-namespace/MySchema-key.avsc
|
|
572
581
|
- spec/schemas/com/my-namespace/MySchema.avsc
|
|
573
|
-
- spec/schemas/com/my-namespace/
|
|
582
|
+
- spec/schemas/com/my-namespace/MySchemaCompound_key.avsc
|
|
574
583
|
- spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
|
|
575
584
|
- spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
|
|
576
585
|
- spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
|
|
577
586
|
- spec/schemas/com/my-namespace/MySchemaWithId.avsc
|
|
578
587
|
- spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
|
|
588
|
+
- spec/schemas/com/my-namespace/MySchema_key.avsc
|
|
579
589
|
- spec/schemas/com/my-namespace/Wibble.avsc
|
|
580
590
|
- spec/schemas/com/my-namespace/Widget.avsc
|
|
581
591
|
- 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.0)
|
|
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.85.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
|