deimos-ruby 1.8.2.pre.beta1 → 1.8.2.pre.beta2
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 +9 -0
- data/Gemfile.lock +1 -1
- data/README.md +31 -3
- data/docs/UPGRADING.md +128 -0
- data/lib/deimos/schema_backends/avro_schema_registry.rb +1 -1
- data/lib/deimos/utils/inline_consumer.rb +1 -1
- data/lib/deimos/utils/schema_controller_mixin.rb +5 -1
- data/lib/deimos/version.rb +1 -1
- data/spec/schemas/com/my-namespace/request/CreateTopic.avsc +11 -0
- data/spec/schemas/com/my-namespace/response/CreateTopic.avsc +11 -0
- data/spec/utils/schema_controller_mixin_spec.rb +16 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b773de54759babb229e8f3bc6b42931dab7695b7197d601ad4ae08015c0b401f
|
4
|
+
data.tar.gz: 4af1aa98ffdfc013c4cac02fa316371ad138ec0d807ed58426a7ad57d6c1e719
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 319d01a4c42c5efe72bd4959fb57548102c3f2b4305f3d94510747fd372d516ebad3e34ff74f9e6744641728efce9eb7a20f2d89c37d6bd90847253698a05238
|
7
|
+
data.tar.gz: 9e6999cca87ca448167a9e61a0bfa5914b36fd74c053f132bd02ab5200be840984546469affccfd07ce77d4d098a2096b13e42febd4ce7059ec882c436580cd8
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## UNRELEASED
|
9
9
|
|
10
|
+
## 1.8.2-beta2 - 2020-09-15
|
11
|
+
|
12
|
+
### Features :star:
|
13
|
+
|
14
|
+
- Add details on using schema backend directly in README.
|
15
|
+
- Default to the provided schema if topic is not provided when
|
16
|
+
encoding to `AvroSchemaRegistry`.
|
17
|
+
- Add mapping syntax for the `schema` call in `SchemaControllerMixin`.
|
18
|
+
|
10
19
|
## 1.8.2-beta1 - 2020-09-09
|
11
20
|
|
12
21
|
### Features :star:
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -11,6 +11,7 @@ a useful toolbox of goodies for Ruby-based Kafka development.
|
|
11
11
|
Built on Phobos and hence Ruby-Kafka.
|
12
12
|
|
13
13
|
<!--ts-->
|
14
|
+
* [Additional Documentation](#additional-documentation)
|
14
15
|
* [Installation](#installation)
|
15
16
|
* [Versioning](#versioning)
|
16
17
|
* [Configuration](#configuration)
|
@@ -29,9 +30,19 @@ Built on Phobos and hence Ruby-Kafka.
|
|
29
30
|
* [Metrics](#metrics)
|
30
31
|
* [Testing](#testing)
|
31
32
|
* [Integration Test Helpers](#integration-test-helpers)
|
33
|
+
* [Utilities](#utilities)
|
32
34
|
* [Contributing](#contributing)
|
33
35
|
<!--te-->
|
34
36
|
|
37
|
+
# Additional Documentation
|
38
|
+
|
39
|
+
Please see the following for further information not covered by this readme:
|
40
|
+
|
41
|
+
* [Architecture Design](docs/ARCHITECTURE.md)
|
42
|
+
* [Configuration Reference](docs/CONFIGURATION.md)
|
43
|
+
* [Database Backend Feature](docs/DATABASE_BACKEND.md)
|
44
|
+
* [Upgrading Deimos](docs/UPGRADING.md)
|
45
|
+
|
35
46
|
# Installation
|
36
47
|
|
37
48
|
Add this line to your application's Gemfile:
|
@@ -482,6 +493,12 @@ class WhateverController < ApplicationController
|
|
482
493
|
# will look for: my.namespace.requests.Index.avsc
|
483
494
|
# my.namespace.responses.Index.avsc
|
484
495
|
|
496
|
+
# Can use mapping to change the schema but keep the namespaces,
|
497
|
+
# i.e. use the same schema name across the two namespaces
|
498
|
+
schemas create: 'CreateTopic'
|
499
|
+
# will look for: my.namespace.requests.CreateTopic.avsc
|
500
|
+
# my.namespace.responses.CreateTopic.avsc
|
501
|
+
|
485
502
|
# If all routes use the default, you can add them all at once
|
486
503
|
schemas :index, :show, :update
|
487
504
|
|
@@ -989,13 +1006,24 @@ Deimos::Utils::InlineConsumer.get_messages_for(
|
|
989
1006
|
)
|
990
1007
|
```
|
991
1008
|
|
1009
|
+
## Utilities
|
1010
|
+
|
1011
|
+
You can use your configured schema backend directly if you want to
|
1012
|
+
encode and decode payloads outside of the context of sending messages.
|
1013
|
+
|
1014
|
+
```ruby
|
1015
|
+
backend = Deimos.schema_backend(schema: 'MySchema', namespace: 'com.my-namespace')
|
1016
|
+
encoded = backend.encode(my_payload)
|
1017
|
+
decoded = backend.decode(my_encoded_payload)
|
1018
|
+
coerced = backend.coerce(my_payload) # coerce to correct types
|
1019
|
+
backend.validate(my_payload) # throws an error if not valid
|
1020
|
+
fields = backend.schema_fields # list of fields defined in the schema
|
1021
|
+
```
|
1022
|
+
|
992
1023
|
## Contributing
|
993
1024
|
|
994
1025
|
Bug reports and pull requests are welcome on GitHub at https://github.com/flipp-oss/deimos .
|
995
1026
|
|
996
|
-
We have more information on the [internal architecture](docs/ARCHITECTURE.md) of Deimos
|
997
|
-
for contributors!
|
998
|
-
|
999
1027
|
### Linting
|
1000
1028
|
|
1001
1029
|
Deimos uses Rubocop to lint the code. Please run Rubocop on your code
|
data/docs/UPGRADING.md
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# Upgrading Deimos
|
2
|
+
|
3
|
+
## Upgrading from < 1.5.0 to >= 1.5.0
|
4
|
+
|
5
|
+
If you are using Confluent's schema registry to Avro-encode your
|
6
|
+
messages, you will need to manually include the `avro_turf` gem
|
7
|
+
in your Gemfile now.
|
8
|
+
|
9
|
+
This update changes how to interact with Deimos's schema classes.
|
10
|
+
Although these are meant to be internal, they are still "public"
|
11
|
+
and can be used by calling code.
|
12
|
+
|
13
|
+
Before 1.5.0:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
encoder = Deimos::AvroDataEncoder.new(schema: 'MySchema',
|
17
|
+
namespace: 'com.my-namespace')
|
18
|
+
encoder.encode(my_payload)
|
19
|
+
|
20
|
+
decoder = Deimos::AvroDataDecoder.new(schema: 'MySchema',
|
21
|
+
namespace: 'com.my-namespace')
|
22
|
+
decoder.decode(my_payload)
|
23
|
+
```
|
24
|
+
|
25
|
+
After 1.5.0:
|
26
|
+
```ruby
|
27
|
+
backend = Deimos.schema_backend(schema: 'MySchema', namespace: 'com.my-namespace')
|
28
|
+
backend.encode(my_payload)
|
29
|
+
backend.decode(my_payload)
|
30
|
+
```
|
31
|
+
|
32
|
+
The two classes are different and if you are using them to e.g.
|
33
|
+
inspect Avro schema fields, please look at the source code for the following:
|
34
|
+
* `Deimos::SchemaBackends::Base`
|
35
|
+
* `Deimos::SchemaBackends::AvroBase`
|
36
|
+
* `Deimos::SchemaBackends::AvroSchemaRegistry`
|
37
|
+
|
38
|
+
Deprecated `Deimos::TestHelpers.sent_messages` in favor of
|
39
|
+
`Deimos::Backends::Test.sent_messages`.
|
40
|
+
|
41
|
+
## Upgrading from < 1.4.0 to >= 1.4.0
|
42
|
+
|
43
|
+
Previously, configuration was handled as follows:
|
44
|
+
* Kafka configuration, including listeners, lived in `phobos.yml`
|
45
|
+
* Additional Deimos configuration would live in an initializer, e.g. `kafka.rb`
|
46
|
+
* Producer and consumer configuration lived in each individual producer and consumer
|
47
|
+
|
48
|
+
As of 1.4.0, all configuration is centralized in one initializer
|
49
|
+
file, using default configuration.
|
50
|
+
|
51
|
+
Before 1.4.0:
|
52
|
+
```yaml
|
53
|
+
# config/phobos.yml
|
54
|
+
logger:
|
55
|
+
file: log/phobos.log
|
56
|
+
level: debug
|
57
|
+
ruby_kafka:
|
58
|
+
level: debug
|
59
|
+
|
60
|
+
kafka:
|
61
|
+
client_id: phobos
|
62
|
+
connect_timeout: 15
|
63
|
+
socket_timeout: 15
|
64
|
+
|
65
|
+
producer:
|
66
|
+
ack_timeout: 5
|
67
|
+
required_acks: :all
|
68
|
+
...
|
69
|
+
|
70
|
+
listeners:
|
71
|
+
- handler: ConsumerTest::MyConsumer
|
72
|
+
topic: my_consume_topic
|
73
|
+
group_id: my_group_id
|
74
|
+
- handler: ConsumerTest::MyBatchConsumer
|
75
|
+
topic: my_batch_consume_topic
|
76
|
+
group_id: my_batch_group_id
|
77
|
+
delivery: inline_batch
|
78
|
+
```
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
# kafka.rb
|
82
|
+
Deimos.configure do |config|
|
83
|
+
config.reraise_consumer_errors = true
|
84
|
+
config.logger = Rails.logger
|
85
|
+
...
|
86
|
+
end
|
87
|
+
|
88
|
+
# my_consumer.rb
|
89
|
+
class ConsumerTest::MyConsumer < Deimos::Producer
|
90
|
+
namespace 'com.my-namespace'
|
91
|
+
schema 'MySchema'
|
92
|
+
topic 'MyTopic'
|
93
|
+
key_config field: :id
|
94
|
+
end
|
95
|
+
```
|
96
|
+
|
97
|
+
After 1.4.0:
|
98
|
+
```ruby
|
99
|
+
kafka.rb
|
100
|
+
Deimos.configure do
|
101
|
+
logger Rails.logger
|
102
|
+
kafka do
|
103
|
+
client_id 'phobos'
|
104
|
+
connect_timeout 15
|
105
|
+
socket_timeout 15
|
106
|
+
end
|
107
|
+
producers.ack_timeout 5
|
108
|
+
producers.required_acks :all
|
109
|
+
...
|
110
|
+
consumer do
|
111
|
+
class_name 'ConsumerTest::MyConsumer'
|
112
|
+
topic 'my_consume_topic'
|
113
|
+
group_id 'my_group_id'
|
114
|
+
namespace 'com.my-namespace'
|
115
|
+
schema 'MySchema'
|
116
|
+
topic 'MyTopic'
|
117
|
+
key_config field: :id
|
118
|
+
end
|
119
|
+
...
|
120
|
+
end
|
121
|
+
```
|
122
|
+
|
123
|
+
Note that the old configuration way *will* work if you set
|
124
|
+
`config.phobos_config_file = "config/phobos.yml"`. You will
|
125
|
+
get a number of deprecation notices, however. You can also still
|
126
|
+
set the topic, namespace, etc. on the producer/consumer class,
|
127
|
+
but it's much more convenient to centralize these configs
|
128
|
+
in one place to see what your app does.
|
@@ -15,7 +15,7 @@ module Deimos
|
|
15
15
|
|
16
16
|
# @override
|
17
17
|
def encode_payload(payload, schema: nil, topic: nil)
|
18
|
-
avro_turf_messaging.encode(payload, schema_name: schema, subject: topic)
|
18
|
+
avro_turf_messaging.encode(payload, schema_name: schema, subject: topic || schema)
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
@@ -19,7 +19,7 @@ module Deimos
|
|
19
19
|
offset = last_offset - num_messages
|
20
20
|
if offset.positive?
|
21
21
|
Deimos.config.logger.info("Seeking to #{offset}")
|
22
|
-
@consumer.seek(topic,
|
22
|
+
@consumer.seek(topic, 0, offset)
|
23
23
|
end
|
24
24
|
rescue StandardError => e
|
25
25
|
"Could not seek to offset: #{e.message}"
|
@@ -28,14 +28,18 @@ module Deimos
|
|
28
28
|
|
29
29
|
# Indicate which schemas should be assigned to actions.
|
30
30
|
# @param actions [Symbol]
|
31
|
+
# @param kwactions [String]
|
31
32
|
# @param request [String]
|
32
33
|
# @param response [String]
|
33
|
-
def schemas(*actions, request: nil, response: nil)
|
34
|
+
def schemas(*actions, request: nil, response: nil, **kwactions)
|
34
35
|
actions.each do |action|
|
35
36
|
request ||= action.to_s.titleize
|
36
37
|
response ||= action.to_s.titleize
|
37
38
|
schema_mapping[action.to_s] = { request: request, response: response }
|
38
39
|
end
|
40
|
+
kwactions.each do |key, val|
|
41
|
+
schema_mapping[key.to_s] = { request: val, response: val }
|
42
|
+
end
|
39
43
|
end
|
40
44
|
|
41
45
|
# @return [Hash<Symbol, String>]
|
data/lib/deimos/version.rb
CHANGED
@@ -17,6 +17,7 @@ RSpec.describe Deimos::Utils::SchemaControllerMixin, type: :controller do
|
|
17
17
|
request_namespace 'com.my-namespace.request'
|
18
18
|
response_namespace 'com.my-namespace.response'
|
19
19
|
schemas :index, :show
|
20
|
+
schemas create: 'CreateTopic'
|
20
21
|
schemas :update, request: 'UpdateRequest', response: 'UpdateResponse'
|
21
22
|
|
22
23
|
# :nodoc:
|
@@ -29,6 +30,11 @@ RSpec.describe Deimos::Utils::SchemaControllerMixin, type: :controller do
|
|
29
30
|
render_schema({ 'response_id' => payload[:request_id] + ' dad' })
|
30
31
|
end
|
31
32
|
|
33
|
+
# :nodoc:
|
34
|
+
def create
|
35
|
+
render_schema({ 'response_id' => payload[:request_id] + ' bro' })
|
36
|
+
end
|
37
|
+
|
32
38
|
# :nodoc:
|
33
39
|
def update
|
34
40
|
render_schema({ 'update_response_id' => payload[:update_request_id] + ' sis' })
|
@@ -65,4 +71,14 @@ RSpec.describe Deimos::Utils::SchemaControllerMixin, type: :controller do
|
|
65
71
|
expect(response_backend.decode(response.body)).to eq({ 'update_response_id' => 'hi sis' })
|
66
72
|
end
|
67
73
|
|
74
|
+
it 'should render the correct response for create' do
|
75
|
+
request_backend = Deimos.schema_backend(schema: 'CreateTopic',
|
76
|
+
namespace: 'com.my-namespace.request')
|
77
|
+
response_backend = Deimos.schema_backend(schema: 'CreateTopic',
|
78
|
+
namespace: 'com.my-namespace.response')
|
79
|
+
request.content_type = 'avro/binary'
|
80
|
+
post :create, params: { id: 1 }, body: request_backend.encode({ 'request_id' => 'hi' })
|
81
|
+
expect(response_backend.decode(response.body)).to eq({ 'response_id' => 'hi bro' })
|
82
|
+
end
|
83
|
+
|
68
84
|
end
|
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.8.2.pre.
|
4
|
+
version: 1.8.2.pre.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Orner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-09-
|
11
|
+
date: 2020-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: avro_turf
|
@@ -349,6 +349,7 @@ files:
|
|
349
349
|
- docs/CONFIGURATION.md
|
350
350
|
- docs/DATABASE_BACKEND.md
|
351
351
|
- docs/PULL_REQUEST_TEMPLATE.md
|
352
|
+
- docs/UPGRADING.md
|
352
353
|
- lib/deimos.rb
|
353
354
|
- lib/deimos/active_record_consume/batch_consumption.rb
|
354
355
|
- lib/deimos/active_record_consume/batch_slicer.rb
|
@@ -453,8 +454,10 @@ files:
|
|
453
454
|
- spec/schemas/com/my-namespace/Wibble.avsc
|
454
455
|
- spec/schemas/com/my-namespace/Widget.avsc
|
455
456
|
- spec/schemas/com/my-namespace/WidgetTheSecond.avsc
|
457
|
+
- spec/schemas/com/my-namespace/request/CreateTopic.avsc
|
456
458
|
- spec/schemas/com/my-namespace/request/Index.avsc
|
457
459
|
- spec/schemas/com/my-namespace/request/UpdateRequest.avsc
|
460
|
+
- spec/schemas/com/my-namespace/response/CreateTopic.avsc
|
458
461
|
- spec/schemas/com/my-namespace/response/Index.avsc
|
459
462
|
- spec/schemas/com/my-namespace/response/UpdateResponse.avsc
|
460
463
|
- spec/spec_helper.rb
|
@@ -487,7 +490,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
487
490
|
- !ruby/object:Gem::Version
|
488
491
|
version: 1.3.1
|
489
492
|
requirements: []
|
490
|
-
rubygems_version: 3.1.
|
493
|
+
rubygems_version: 3.1.2
|
491
494
|
signing_key:
|
492
495
|
specification_version: 4
|
493
496
|
summary: Kafka libraries for Ruby.
|
@@ -534,8 +537,10 @@ test_files:
|
|
534
537
|
- spec/schemas/com/my-namespace/Wibble.avsc
|
535
538
|
- spec/schemas/com/my-namespace/Widget.avsc
|
536
539
|
- spec/schemas/com/my-namespace/WidgetTheSecond.avsc
|
540
|
+
- spec/schemas/com/my-namespace/request/CreateTopic.avsc
|
537
541
|
- spec/schemas/com/my-namespace/request/Index.avsc
|
538
542
|
- spec/schemas/com/my-namespace/request/UpdateRequest.avsc
|
543
|
+
- spec/schemas/com/my-namespace/response/CreateTopic.avsc
|
539
544
|
- spec/schemas/com/my-namespace/response/Index.avsc
|
540
545
|
- spec/schemas/com/my-namespace/response/UpdateResponse.avsc
|
541
546
|
- spec/spec_helper.rb
|