deimos-ruby 1.8.0.pre.beta2 → 1.8.1.pre.beta5
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/.rubocop.yml +8 -4
- data/CHANGELOG.md +40 -0
- data/Gemfile.lock +101 -73
- data/README.md +78 -2
- data/deimos-ruby.gemspec +2 -2
- data/lib/deimos.rb +4 -3
- data/lib/deimos/active_record_consume/batch_consumption.rb +7 -2
- data/lib/deimos/active_record_consume/message_consumption.rb +8 -1
- data/lib/deimos/instrumentation.rb +10 -5
- data/lib/deimos/kafka_topic_info.rb +21 -2
- data/lib/deimos/schema_backends/avro_base.rb +33 -1
- data/lib/deimos/schema_backends/avro_schema_coercer.rb +30 -9
- data/lib/deimos/schema_backends/base.rb +21 -2
- data/lib/deimos/utils/db_producer.rb +57 -19
- data/lib/deimos/utils/schema_controller_mixin.rb +111 -0
- data/lib/deimos/version.rb +1 -1
- data/lib/generators/deimos/active_record/templates/migration.rb.tt +28 -0
- data/lib/generators/deimos/active_record/templates/model.rb.tt +5 -0
- data/lib/generators/deimos/active_record_generator.rb +79 -0
- data/lib/generators/deimos/db_backend/templates/migration +1 -0
- data/lib/generators/deimos/db_backend/templates/rails3_migration +1 -0
- data/spec/generators/active_record_generator_spec.rb +56 -0
- data/spec/kafka_listener_spec.rb +55 -0
- data/spec/kafka_topic_info_spec.rb +39 -16
- data/spec/producer_spec.rb +36 -0
- data/spec/schemas/com/my-namespace/Generated.avsc +71 -0
- data/spec/schemas/com/my-namespace/MyNestedSchema.avsc +62 -0
- data/spec/schemas/com/my-namespace/request/Index.avsc +11 -0
- data/spec/schemas/com/my-namespace/request/UpdateRequest.avsc +11 -0
- data/spec/schemas/com/my-namespace/response/Index.avsc +11 -0
- data/spec/schemas/com/my-namespace/response/UpdateResponse.avsc +11 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/utils/db_producer_spec.rb +84 -10
- data/spec/utils/schema_controller_mixin_spec.rb +68 -0
- metadata +40 -24
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 516d09f0dc29c3388d1885c67d7faf3c2f240eede7278ad1ac76dfa46727e4e7
|
|
4
|
+
data.tar.gz: c9fcf141d5dfca3de041d82079f773c53b6a2f663fe7a8b3aa5fbee28964fb19
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f4b5feee05510a8e6c9d85c9af85aff48f01c43419b5e5600a853d60a62d4b06f8430bb91b11047f6fd2579f23a89e8b9cbafe41a40ed84f7448a54b47115587
|
|
7
|
+
data.tar.gz: e4c1a0b181f4e5289f995056338b78cab4a8da3cb50863e70ba9f78e8526e470a52a035eaa3a34a0261b1ad14dbff41d2e25a3ffff5e75218408e31aa94a9ed0
|
data/.rubocop.yml
CHANGED
|
@@ -5,6 +5,7 @@ AllCops:
|
|
|
5
5
|
Exclude:
|
|
6
6
|
- lib/deimos/monkey_patches/*.rb
|
|
7
7
|
- vendor/**/*
|
|
8
|
+
- Guardfile
|
|
8
9
|
NewCops: enable
|
|
9
10
|
|
|
10
11
|
# class Plumbus
|
|
@@ -36,7 +37,7 @@ Layout/EmptyLinesAroundBlockBody:
|
|
|
36
37
|
Enabled: false
|
|
37
38
|
|
|
38
39
|
Layout/LineLength:
|
|
39
|
-
Max:
|
|
40
|
+
Max: 120
|
|
40
41
|
Severity: refactor
|
|
41
42
|
Exclude:
|
|
42
43
|
- 'spec/**/*'
|
|
@@ -77,13 +78,14 @@ Lint/UnusedMethodArgument:
|
|
|
77
78
|
|
|
78
79
|
Metrics/AbcSize:
|
|
79
80
|
Severity: refactor
|
|
80
|
-
Max:
|
|
81
|
+
Max: 25
|
|
81
82
|
|
|
82
83
|
Metrics/BlockLength:
|
|
83
|
-
|
|
84
|
+
Enabled: false
|
|
84
85
|
|
|
85
86
|
Metrics/ClassLength:
|
|
86
87
|
Severity: refactor
|
|
88
|
+
Max: 500
|
|
87
89
|
|
|
88
90
|
Metrics/CyclomaticComplexity:
|
|
89
91
|
Severity: refactor
|
|
@@ -91,10 +93,11 @@ Metrics/CyclomaticComplexity:
|
|
|
91
93
|
|
|
92
94
|
Metrics/MethodLength:
|
|
93
95
|
Severity: refactor
|
|
94
|
-
Max:
|
|
96
|
+
Max: 50
|
|
95
97
|
|
|
96
98
|
Metrics/ModuleLength:
|
|
97
99
|
Severity: refactor
|
|
100
|
+
Max: 200
|
|
98
101
|
|
|
99
102
|
Metrics/ParameterLists:
|
|
100
103
|
Max: 5
|
|
@@ -102,6 +105,7 @@ Metrics/ParameterLists:
|
|
|
102
105
|
|
|
103
106
|
Metrics/PerceivedComplexity:
|
|
104
107
|
Severity: refactor
|
|
108
|
+
Max: 10
|
|
105
109
|
|
|
106
110
|
# Use alias_method instead of alias
|
|
107
111
|
Style/Alias:
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,45 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## UNRELEASED
|
|
9
9
|
|
|
10
|
+
## 1.8.1-beta5 - 2020-08-13
|
|
11
|
+
|
|
12
|
+
### Fixes :wrench:
|
|
13
|
+
- Fix regression bug which introduces backwards incompatibility
|
|
14
|
+
with ActiveRecordProducer's `record_attributes` method.
|
|
15
|
+
|
|
16
|
+
## 1.8.1-beta4 - 2020-08-12
|
|
17
|
+
|
|
18
|
+
### Fixes :wrench:
|
|
19
|
+
- Fix regression bug where arrays were not being encoded
|
|
20
|
+
|
|
21
|
+
## 1.8.1-beta3 - 2020-08-05
|
|
22
|
+
|
|
23
|
+
### Fixes :wrench:
|
|
24
|
+
- Simplify decoding messages and handle producer not found
|
|
25
|
+
- Consolidate types in sub-records recursively
|
|
26
|
+
(fixes [#72](https://github.com/flipp-oss/deimos/issues/72))
|
|
27
|
+
|
|
28
|
+
## 1.8.1-beta2 - 2020-07-28
|
|
29
|
+
|
|
30
|
+
### Features :star:
|
|
31
|
+
- Add `SchemaControllerMixin` to encode and decode schema-encoded
|
|
32
|
+
payloads in Rails controllers.
|
|
33
|
+
|
|
34
|
+
## 1.8.1-beta1 - 2020-07-22
|
|
35
|
+
|
|
36
|
+
### Fixes :wrench:
|
|
37
|
+
- Retry deleting messages without resending the batch if the
|
|
38
|
+
delete fails (fixes [#34](https://github.com/flipp-oss/deimos/issues/34))
|
|
39
|
+
- Delete messages in batches rather than all at once to
|
|
40
|
+
cut down on the chance of a deadlock.
|
|
41
|
+
|
|
42
|
+
### Features :star:
|
|
43
|
+
- Add `last_processed_at` to `kafka_topic_info` to ensure
|
|
44
|
+
that wait metrics are accurate in cases where records
|
|
45
|
+
get created with an old `created_at` time (e.g. for
|
|
46
|
+
long-running transactions).
|
|
47
|
+
- Add generator for ActiveRecord models and migrations (fixes [#6](https://github.com/flipp-oss/deimos/issues/6))
|
|
48
|
+
|
|
10
49
|
## 1.8.0-beta2 - 2020-07-08
|
|
11
50
|
|
|
12
51
|
### Fixes :wrench:
|
|
@@ -20,6 +59,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
20
59
|
- Added `ActiveRecordConsumer` batch mode
|
|
21
60
|
|
|
22
61
|
### Fixes :wrench:
|
|
62
|
+
- Fixes `send_produce_error` to decode `failed_messages` with built-in decoder.
|
|
23
63
|
- Lag calculation can be incorrect if no messages are being consumed.
|
|
24
64
|
- Fixed bug where printing messages on a MessageSizeTooLarge
|
|
25
65
|
error didn't work.
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
deimos-ruby (1.8.
|
|
4
|
+
deimos-ruby (1.8.1.pre.beta4)
|
|
5
5
|
avro_turf (~> 0.11)
|
|
6
6
|
phobos (~> 1.9)
|
|
7
7
|
ruby-kafka (~> 0.7)
|
|
@@ -10,72 +10,86 @@ PATH
|
|
|
10
10
|
GEM
|
|
11
11
|
remote: https://rubygems.org/
|
|
12
12
|
specs:
|
|
13
|
-
actioncable (
|
|
14
|
-
actionpack (=
|
|
13
|
+
actioncable (6.0.3.2)
|
|
14
|
+
actionpack (= 6.0.3.2)
|
|
15
15
|
nio4r (~> 2.0)
|
|
16
16
|
websocket-driver (>= 0.6.1)
|
|
17
|
-
|
|
18
|
-
actionpack (=
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
actionmailbox (6.0.3.2)
|
|
18
|
+
actionpack (= 6.0.3.2)
|
|
19
|
+
activejob (= 6.0.3.2)
|
|
20
|
+
activerecord (= 6.0.3.2)
|
|
21
|
+
activestorage (= 6.0.3.2)
|
|
22
|
+
activesupport (= 6.0.3.2)
|
|
23
|
+
mail (>= 2.7.1)
|
|
24
|
+
actionmailer (6.0.3.2)
|
|
25
|
+
actionpack (= 6.0.3.2)
|
|
26
|
+
actionview (= 6.0.3.2)
|
|
27
|
+
activejob (= 6.0.3.2)
|
|
21
28
|
mail (~> 2.5, >= 2.5.4)
|
|
22
29
|
rails-dom-testing (~> 2.0)
|
|
23
|
-
actionpack (
|
|
24
|
-
actionview (=
|
|
25
|
-
activesupport (=
|
|
30
|
+
actionpack (6.0.3.2)
|
|
31
|
+
actionview (= 6.0.3.2)
|
|
32
|
+
activesupport (= 6.0.3.2)
|
|
26
33
|
rack (~> 2.0, >= 2.0.8)
|
|
27
34
|
rack-test (>= 0.6.3)
|
|
28
35
|
rails-dom-testing (~> 2.0)
|
|
29
|
-
rails-html-sanitizer (~> 1.0, >= 1.0
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
|
37
|
+
actiontext (6.0.3.2)
|
|
38
|
+
actionpack (= 6.0.3.2)
|
|
39
|
+
activerecord (= 6.0.3.2)
|
|
40
|
+
activestorage (= 6.0.3.2)
|
|
41
|
+
activesupport (= 6.0.3.2)
|
|
42
|
+
nokogiri (>= 1.8.5)
|
|
43
|
+
actionview (6.0.3.2)
|
|
44
|
+
activesupport (= 6.0.3.2)
|
|
32
45
|
builder (~> 3.1)
|
|
33
46
|
erubi (~> 1.4)
|
|
34
47
|
rails-dom-testing (~> 2.0)
|
|
35
|
-
rails-html-sanitizer (~> 1.
|
|
36
|
-
activejob (
|
|
37
|
-
activesupport (=
|
|
48
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
|
49
|
+
activejob (6.0.3.2)
|
|
50
|
+
activesupport (= 6.0.3.2)
|
|
38
51
|
globalid (>= 0.3.6)
|
|
39
|
-
activemodel (
|
|
40
|
-
activesupport (=
|
|
41
|
-
activerecord (
|
|
42
|
-
activemodel (=
|
|
43
|
-
activesupport (=
|
|
44
|
-
|
|
45
|
-
activerecord-import (1.0.4)
|
|
52
|
+
activemodel (6.0.3.2)
|
|
53
|
+
activesupport (= 6.0.3.2)
|
|
54
|
+
activerecord (6.0.3.2)
|
|
55
|
+
activemodel (= 6.0.3.2)
|
|
56
|
+
activesupport (= 6.0.3.2)
|
|
57
|
+
activerecord-import (1.0.5)
|
|
46
58
|
activerecord (>= 3.2)
|
|
47
|
-
activestorage (
|
|
48
|
-
actionpack (=
|
|
49
|
-
|
|
59
|
+
activestorage (6.0.3.2)
|
|
60
|
+
actionpack (= 6.0.3.2)
|
|
61
|
+
activejob (= 6.0.3.2)
|
|
62
|
+
activerecord (= 6.0.3.2)
|
|
50
63
|
marcel (~> 0.3.1)
|
|
51
|
-
activesupport (
|
|
64
|
+
activesupport (6.0.3.2)
|
|
52
65
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
53
66
|
i18n (>= 0.7, < 2)
|
|
54
67
|
minitest (~> 5.1)
|
|
55
68
|
tzinfo (~> 1.1)
|
|
56
|
-
|
|
57
|
-
ast (2.4.
|
|
69
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
|
70
|
+
ast (2.4.1)
|
|
58
71
|
avro (1.9.2)
|
|
59
72
|
multi_json
|
|
60
73
|
avro_turf (0.11.0)
|
|
61
74
|
avro (>= 1.7.7, < 1.10)
|
|
62
75
|
excon (~> 0.45)
|
|
63
76
|
builder (3.2.4)
|
|
64
|
-
coderay (1.1.
|
|
77
|
+
coderay (1.1.3)
|
|
65
78
|
concurrent-ruby (1.1.6)
|
|
66
79
|
concurrent-ruby-ext (1.1.6)
|
|
67
80
|
concurrent-ruby (= 1.1.6)
|
|
68
81
|
crass (1.0.6)
|
|
69
82
|
database_cleaner (1.8.5)
|
|
70
|
-
ddtrace (0.
|
|
83
|
+
ddtrace (0.37.0)
|
|
71
84
|
msgpack
|
|
72
|
-
diff-lcs (1.
|
|
73
|
-
digest-crc (0.
|
|
74
|
-
|
|
85
|
+
diff-lcs (1.4.4)
|
|
86
|
+
digest-crc (0.6.1)
|
|
87
|
+
rake (~> 13.0)
|
|
88
|
+
dogstatsd-ruby (4.8.1)
|
|
75
89
|
erubi (1.9.0)
|
|
76
|
-
excon (0.
|
|
90
|
+
excon (0.76.0)
|
|
77
91
|
exponential-backoff (0.0.4)
|
|
78
|
-
ffi (1.
|
|
92
|
+
ffi (1.13.1)
|
|
79
93
|
formatador (0.2.5)
|
|
80
94
|
globalid (0.4.2)
|
|
81
95
|
activesupport (>= 4.2.0)
|
|
@@ -96,20 +110,19 @@ GEM
|
|
|
96
110
|
guard-rubocop (1.3.0)
|
|
97
111
|
guard (~> 2.0)
|
|
98
112
|
rubocop (~> 0.20)
|
|
99
|
-
i18n (1.8.
|
|
113
|
+
i18n (1.8.4)
|
|
100
114
|
concurrent-ruby (~> 1.0)
|
|
101
|
-
jaro_winkler (1.5.4)
|
|
102
115
|
listen (3.2.1)
|
|
103
116
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
|
104
117
|
rb-inotify (~> 0.9, >= 0.9.10)
|
|
105
118
|
little-plugger (1.1.4)
|
|
106
|
-
logging (2.
|
|
119
|
+
logging (2.3.0)
|
|
107
120
|
little-plugger (~> 1.1)
|
|
108
|
-
multi_json (~> 1.
|
|
109
|
-
loofah (2.
|
|
121
|
+
multi_json (~> 1.14)
|
|
122
|
+
loofah (2.6.0)
|
|
110
123
|
crass (~> 1.0.2)
|
|
111
124
|
nokogiri (>= 1.5.9)
|
|
112
|
-
lumberjack (1.2.
|
|
125
|
+
lumberjack (1.2.6)
|
|
113
126
|
mail (2.7.1)
|
|
114
127
|
mini_mime (>= 0.1.1)
|
|
115
128
|
marcel (0.3.3)
|
|
@@ -118,20 +131,20 @@ GEM
|
|
|
118
131
|
mimemagic (0.3.5)
|
|
119
132
|
mini_mime (1.0.2)
|
|
120
133
|
mini_portile2 (2.4.0)
|
|
121
|
-
minitest (5.14.
|
|
134
|
+
minitest (5.14.1)
|
|
122
135
|
msgpack (1.3.3)
|
|
123
|
-
multi_json (1.
|
|
136
|
+
multi_json (1.15.0)
|
|
124
137
|
mysql2 (0.5.3)
|
|
125
138
|
nenv (0.3.0)
|
|
126
139
|
nio4r (2.5.2)
|
|
127
|
-
nokogiri (1.10.
|
|
140
|
+
nokogiri (1.10.10)
|
|
128
141
|
mini_portile2 (~> 2.4.0)
|
|
129
142
|
notiffany (0.1.3)
|
|
130
143
|
nenv (~> 0.1)
|
|
131
144
|
shellany (~> 0.0)
|
|
132
|
-
parallel (1.19.
|
|
133
|
-
parser (2.7.1.
|
|
134
|
-
ast (~> 2.4.
|
|
145
|
+
parallel (1.19.2)
|
|
146
|
+
parser (2.7.1.4)
|
|
147
|
+
ast (~> 2.4.1)
|
|
135
148
|
pg (1.2.3)
|
|
136
149
|
phobos (1.9.0)
|
|
137
150
|
activesupport (>= 3.0.0)
|
|
@@ -147,35 +160,38 @@ GEM
|
|
|
147
160
|
rack (2.2.3)
|
|
148
161
|
rack-test (1.1.0)
|
|
149
162
|
rack (>= 1.0, < 3)
|
|
150
|
-
rails (
|
|
151
|
-
actioncable (=
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
163
|
+
rails (6.0.3.2)
|
|
164
|
+
actioncable (= 6.0.3.2)
|
|
165
|
+
actionmailbox (= 6.0.3.2)
|
|
166
|
+
actionmailer (= 6.0.3.2)
|
|
167
|
+
actionpack (= 6.0.3.2)
|
|
168
|
+
actiontext (= 6.0.3.2)
|
|
169
|
+
actionview (= 6.0.3.2)
|
|
170
|
+
activejob (= 6.0.3.2)
|
|
171
|
+
activemodel (= 6.0.3.2)
|
|
172
|
+
activerecord (= 6.0.3.2)
|
|
173
|
+
activestorage (= 6.0.3.2)
|
|
174
|
+
activesupport (= 6.0.3.2)
|
|
160
175
|
bundler (>= 1.3.0)
|
|
161
|
-
railties (=
|
|
176
|
+
railties (= 6.0.3.2)
|
|
162
177
|
sprockets-rails (>= 2.0.0)
|
|
163
178
|
rails-dom-testing (2.0.3)
|
|
164
179
|
activesupport (>= 4.2.0)
|
|
165
180
|
nokogiri (>= 1.6)
|
|
166
181
|
rails-html-sanitizer (1.3.0)
|
|
167
182
|
loofah (~> 2.3)
|
|
168
|
-
railties (
|
|
169
|
-
actionpack (=
|
|
170
|
-
activesupport (=
|
|
183
|
+
railties (6.0.3.2)
|
|
184
|
+
actionpack (= 6.0.3.2)
|
|
185
|
+
activesupport (= 6.0.3.2)
|
|
171
186
|
method_source
|
|
172
187
|
rake (>= 0.8.7)
|
|
173
|
-
thor (>= 0.
|
|
188
|
+
thor (>= 0.20.3, < 2.0)
|
|
174
189
|
rainbow (3.0.0)
|
|
175
190
|
rake (13.0.1)
|
|
176
191
|
rb-fsevent (0.10.4)
|
|
177
192
|
rb-inotify (0.10.1)
|
|
178
193
|
ffi (~> 1.0)
|
|
194
|
+
regexp_parser (1.7.1)
|
|
179
195
|
rexml (3.2.4)
|
|
180
196
|
rspec (3.9.0)
|
|
181
197
|
rspec-core (~> 3.9.0)
|
|
@@ -183,25 +199,36 @@ GEM
|
|
|
183
199
|
rspec-mocks (~> 3.9.0)
|
|
184
200
|
rspec-core (3.9.2)
|
|
185
201
|
rspec-support (~> 3.9.3)
|
|
186
|
-
rspec-expectations (3.9.
|
|
202
|
+
rspec-expectations (3.9.2)
|
|
187
203
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
188
204
|
rspec-support (~> 3.9.0)
|
|
189
205
|
rspec-mocks (3.9.1)
|
|
190
206
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
191
207
|
rspec-support (~> 3.9.0)
|
|
208
|
+
rspec-rails (4.0.1)
|
|
209
|
+
actionpack (>= 4.2)
|
|
210
|
+
activesupport (>= 4.2)
|
|
211
|
+
railties (>= 4.2)
|
|
212
|
+
rspec-core (~> 3.9)
|
|
213
|
+
rspec-expectations (~> 3.9)
|
|
214
|
+
rspec-mocks (~> 3.9)
|
|
215
|
+
rspec-support (~> 3.9)
|
|
192
216
|
rspec-support (3.9.3)
|
|
193
217
|
rspec_junit_formatter (0.4.1)
|
|
194
218
|
rspec-core (>= 2, < 4, != 2.12.0)
|
|
195
|
-
rubocop (0.
|
|
196
|
-
jaro_winkler (~> 1.5.1)
|
|
219
|
+
rubocop (0.88.0)
|
|
197
220
|
parallel (~> 1.10)
|
|
198
|
-
parser (>= 2.7.
|
|
221
|
+
parser (>= 2.7.1.1)
|
|
199
222
|
rainbow (>= 2.2.2, < 4.0)
|
|
223
|
+
regexp_parser (>= 1.7)
|
|
200
224
|
rexml
|
|
225
|
+
rubocop-ast (>= 0.1.0, < 1.0)
|
|
201
226
|
ruby-progressbar (~> 1.7)
|
|
202
227
|
unicode-display_width (>= 1.4.0, < 2.0)
|
|
203
|
-
rubocop-
|
|
204
|
-
|
|
228
|
+
rubocop-ast (0.2.0)
|
|
229
|
+
parser (>= 2.7.0.1)
|
|
230
|
+
rubocop-rspec (1.42.0)
|
|
231
|
+
rubocop (>= 0.87.0)
|
|
205
232
|
ruby-kafka (0.7.10)
|
|
206
233
|
digest-crc
|
|
207
234
|
ruby-progressbar (1.10.1)
|
|
@@ -209,7 +236,7 @@ GEM
|
|
|
209
236
|
sigurd (0.0.1)
|
|
210
237
|
concurrent-ruby (~> 1)
|
|
211
238
|
exponential-backoff
|
|
212
|
-
sprockets (4.0.
|
|
239
|
+
sprockets (4.0.2)
|
|
213
240
|
concurrent-ruby (~> 1.0)
|
|
214
241
|
rack (> 1, < 3)
|
|
215
242
|
sprockets-rails (3.2.1)
|
|
@@ -222,15 +249,15 @@ GEM
|
|
|
222
249
|
tzinfo (1.2.7)
|
|
223
250
|
thread_safe (~> 0.1)
|
|
224
251
|
unicode-display_width (1.7.0)
|
|
225
|
-
websocket-driver (0.7.
|
|
252
|
+
websocket-driver (0.7.3)
|
|
226
253
|
websocket-extensions (>= 0.1.0)
|
|
227
254
|
websocket-extensions (0.1.5)
|
|
255
|
+
zeitwerk (2.4.0)
|
|
228
256
|
|
|
229
257
|
PLATFORMS
|
|
230
258
|
ruby
|
|
231
259
|
|
|
232
260
|
DEPENDENCIES
|
|
233
|
-
activerecord (~> 5.2)
|
|
234
261
|
activerecord-import
|
|
235
262
|
avro (~> 1.9)
|
|
236
263
|
database_cleaner (~> 1.7)
|
|
@@ -242,9 +269,10 @@ DEPENDENCIES
|
|
|
242
269
|
guard-rubocop (~> 1)
|
|
243
270
|
mysql2 (~> 0.5)
|
|
244
271
|
pg (~> 1.1)
|
|
245
|
-
rails (~>
|
|
272
|
+
rails (~> 6)
|
|
246
273
|
rake (~> 13)
|
|
247
274
|
rspec (~> 3)
|
|
275
|
+
rspec-rails (~> 4)
|
|
248
276
|
rspec_junit_formatter (~> 0.3)
|
|
249
277
|
rubocop (~> 0.72)
|
|
250
278
|
rubocop-rspec (~> 1.27)
|
data/README.md
CHANGED
|
@@ -22,6 +22,7 @@ Built on Phobos and hence Ruby-Kafka.
|
|
|
22
22
|
* [Kafka Message Keys](#kafka-message-keys)
|
|
23
23
|
* [Consumers](#consumers)
|
|
24
24
|
* [Rails Integration](#rails-integration)
|
|
25
|
+
* [Controller Mixin](#controller-mixin)
|
|
25
26
|
* [Database Backend](#database-backend)
|
|
26
27
|
* [Database Poller](#database-poller)
|
|
27
28
|
* [Running Consumers](#running-consumers)
|
|
@@ -447,6 +448,58 @@ class Widget < ActiveRecord::Base
|
|
|
447
448
|
end
|
|
448
449
|
```
|
|
449
450
|
|
|
451
|
+
### Controller Mixin
|
|
452
|
+
|
|
453
|
+
Deimos comes with a mixin for `ActionController` which automatically encodes and decodes schema
|
|
454
|
+
payloads. There are some advantages to encoding your data in e.g. Avro rather than straight JSON,
|
|
455
|
+
particularly if your service is talking to another backend service rather than the front-end
|
|
456
|
+
browser:
|
|
457
|
+
|
|
458
|
+
* It enforces a contract between services. Solutions like [OpenAPI](https://swagger.io/specification/)
|
|
459
|
+
do this as well, but in order for the client to know the contract, usually some kind of code
|
|
460
|
+
generation has to happen. Using schemas ensures both sides know the contract without having to change code.
|
|
461
|
+
In addition, OpenAPI is now a huge and confusing format, and using simpler schema formats
|
|
462
|
+
can be beneficial.
|
|
463
|
+
* Using Avro or Protobuf ensures both forwards and backwards compatibility,
|
|
464
|
+
which reduces the need for versioning since both sides can simply ignore fields they aren't aware
|
|
465
|
+
of.
|
|
466
|
+
* Encoding and decoding using Avro or Protobuf is generally faster than straight JSON, and
|
|
467
|
+
results in smaller payloads and therefore less network traffic.
|
|
468
|
+
|
|
469
|
+
To use the mixin, add the following to your `WhateverController`:
|
|
470
|
+
|
|
471
|
+
```ruby
|
|
472
|
+
class WhateverController < ApplicationController
|
|
473
|
+
include Deimos::Utils::SchemaControllerMixin
|
|
474
|
+
|
|
475
|
+
request_namespace 'my.namespace.requests'
|
|
476
|
+
response_namespace 'my.namespace.responses'
|
|
477
|
+
|
|
478
|
+
# Add a "schemas" line for all routes that should encode/decode schemas.
|
|
479
|
+
# Default is to match the schema name to the route name.
|
|
480
|
+
schemas :index
|
|
481
|
+
# will look for: my.namespace.requests.Index.avsc
|
|
482
|
+
# my.namespace.responses.Index.avsc
|
|
483
|
+
|
|
484
|
+
# If all routes use the default, you can add them all at once
|
|
485
|
+
schemas :index, :show, :update
|
|
486
|
+
|
|
487
|
+
# Different schemas can be specified as well
|
|
488
|
+
schemas :index, :show, request: 'IndexRequest', response: 'IndexResponse'
|
|
489
|
+
|
|
490
|
+
# To access the encoded data, use the `payload` helper method, and to render it back,
|
|
491
|
+
# use the `render_schema` method.
|
|
492
|
+
|
|
493
|
+
def index
|
|
494
|
+
response = { 'response_id' => payload['request_id'] + 'hi mom' }
|
|
495
|
+
render_schema(response)
|
|
496
|
+
end
|
|
497
|
+
end
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
To make use of this feature, your requests and responses need to have the correct content type.
|
|
501
|
+
For Avro content, this is the `avro/binary` content type.
|
|
502
|
+
|
|
450
503
|
# Database Backend
|
|
451
504
|
|
|
452
505
|
Deimos provides a way to allow Kafka messages to be created inside a
|
|
@@ -546,7 +599,7 @@ class MyConsumer < Deimos::ActiveRecordConsumer
|
|
|
546
599
|
|
|
547
600
|
# Optional override to change the attributes of the record before they
|
|
548
601
|
# are saved.
|
|
549
|
-
def record_attributes(payload)
|
|
602
|
+
def record_attributes(payload, key)
|
|
550
603
|
super.merge(:some_field => 'some_value')
|
|
551
604
|
end
|
|
552
605
|
|
|
@@ -557,6 +610,29 @@ class MyConsumer < Deimos::ActiveRecordConsumer
|
|
|
557
610
|
end
|
|
558
611
|
```
|
|
559
612
|
|
|
613
|
+
#### Generating Tables and Models
|
|
614
|
+
|
|
615
|
+
Deimos provides a generator that takes an existing schema and generates a
|
|
616
|
+
database table based on its fields. By default, any complex sub-types (such as
|
|
617
|
+
records or arrays) are turned into JSON (if supported) or string columns.
|
|
618
|
+
|
|
619
|
+
Before running this migration, you must first copy the schema into your repo
|
|
620
|
+
in the correct path (in the example above, you would need to have a file
|
|
621
|
+
`{SCHEMA_ROOT}/com/my-namespace/MySchema.avsc`).
|
|
622
|
+
|
|
623
|
+
To generate a model and migration, run the following:
|
|
624
|
+
|
|
625
|
+
rails g deimos:active_record TABLE_NAME FULL_SCHEMA_NAME
|
|
626
|
+
|
|
627
|
+
Example:
|
|
628
|
+
|
|
629
|
+
rails g deimos:active_record my_table com.my-namespace.MySchema
|
|
630
|
+
|
|
631
|
+
...would generate:
|
|
632
|
+
|
|
633
|
+
db/migrate/1234_create_my_table.rb
|
|
634
|
+
app/models/my_table.rb
|
|
635
|
+
|
|
560
636
|
#### Batch Consumers
|
|
561
637
|
|
|
562
638
|
Deimos also provides a batch consumption mode for `ActiveRecordConsumer` which
|
|
@@ -604,7 +680,7 @@ class MyConsumer < Deimos::ActiveRecordConsumer
|
|
|
604
680
|
|
|
605
681
|
# Optional override to change the attributes of the record before they
|
|
606
682
|
# are saved.
|
|
607
|
-
def record_attributes(payload)
|
|
683
|
+
def record_attributes(payload, key)
|
|
608
684
|
super.merge(:some_field => 'some_value')
|
|
609
685
|
end
|
|
610
686
|
end
|