deimos-ruby 2.1.2 → 2.1.4
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 +6 -0
- data/karafka.rb +71 -1
- data/lib/deimos/schema_backends/avro_schema_coercer.rb +2 -0
- data/lib/deimos/schema_class/record.rb +2 -2
- data/lib/deimos/version.rb +1 -1
- data/lib/generators/deimos/schema_class/templates/schema_enum.rb.tt +6 -3
- data/lib/generators/deimos/schema_class_generator.rb +10 -14
- data/regenerate_test_schema_classes.rb +0 -66
- data/spec/schemas/my_namespace/my_schema.rb +1 -1
- data/spec/schemas/my_namespace/my_updated_schema.rb +2 -1
- data/spec/snapshots/consumers-no-nest.snap +95 -45
- data/spec/snapshots/consumers.snap +107 -49
- data/spec/snapshots/consumers_and_producers-no-nest.snap +90 -67
- data/spec/snapshots/consumers_and_producers.snap +102 -71
- data/spec/snapshots/consumers_circular-no-nest.snap +95 -45
- data/spec/snapshots/consumers_circular.snap +107 -49
- data/spec/snapshots/consumers_complex_types-no-nest.snap +95 -45
- data/spec/snapshots/consumers_complex_types.snap +107 -49
- data/spec/snapshots/consumers_nested-no-nest.snap +88 -38
- data/spec/snapshots/consumers_nested.snap +100 -42
- data/spec/snapshots/namespace_folders.snap +106 -73
- data/spec/snapshots/namespace_map.snap +106 -73
- data/spec/snapshots/producers_with_key-no-nest.snap +97 -60
- data/spec/snapshots/producers_with_key.snap +109 -64
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b6f32c7658a4b3cc134cc544bb0d4291b90e6424df288f4b4fcfd7fa93c630f
|
4
|
+
data.tar.gz: 2f3ebc77c9c622f5256d77448fec7c7303134519acaa1611f985002838f0278e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4654cbbe510338b52186bf6eb507c930cb932293c0018f4ca5cda83acb1b901ecc646af7adbed3ca167ea1d756b1c3a19857cc727ac7de902028718fad13b9cd
|
7
|
+
data.tar.gz: b4cc6c4f30a5c6e5d94b2c56f194ee3fc1b04467f577928f89e6550fca1d0aee2b078c6b616a68db820c132d67a985fbe444302143eed7c218cae50f91d920fd
|
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
|
+
# 2.1.4 - 2025-07-22
|
11
|
+
|
12
|
+
- Feature: Add interrogation methods (e.g. `approved?`) for schema class enums.
|
13
|
+
- Fix: Schema class generation was missing payload_key for a number of cases.
|
14
|
+
- Fix: Possible crashes when using schema classes with Avro messages.
|
15
|
+
|
10
16
|
## 2.1.2 - 2025-07-21
|
11
17
|
|
12
18
|
- Fix: Backwards-compatible fix wasn't working correctly.
|
data/karafka.rb
CHANGED
@@ -1 +1,71 @@
|
|
1
|
-
#
|
1
|
+
# Used in regenerate_test_schema_classes.rb
|
2
|
+
|
3
|
+
class MyConsumer < Deimos::Consumer
|
4
|
+
def consume(payload, metadata); end
|
5
|
+
end
|
6
|
+
|
7
|
+
require_relative "./lib/generators/deimos/schema_class_generator"
|
8
|
+
|
9
|
+
Deimos.configure do |deimos_config|
|
10
|
+
deimos_config.schema.nest_child_schemas = true
|
11
|
+
deimos_config.schema.path = "spec/schemas"
|
12
|
+
deimos_config.schema.backend = :avro_validation
|
13
|
+
deimos_config.schema.generated_class_path = './spec/schemas'
|
14
|
+
deimos_config.schema.use_full_namespace = true
|
15
|
+
deimos_config.schema.schema_namespace_map = {
|
16
|
+
'com' => 'Schemas',
|
17
|
+
'com.my-namespace.my-suborg' => %w(Schemas MyNamespace)
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
class KarafkaApp < Karafka::App
|
22
|
+
setup do
|
23
|
+
config.kafka = {
|
24
|
+
"bootstrap.servers": '127.0.0.1:9092'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
routes.draw do
|
28
|
+
topic 'MyTopic' do
|
29
|
+
consumer MyConsumer
|
30
|
+
schema 'Generated'
|
31
|
+
namespace 'com.my-namespace'
|
32
|
+
key_config({ field: :a_string })
|
33
|
+
end
|
34
|
+
|
35
|
+
topic 'MyTopic2' do
|
36
|
+
consumer MyConsumer
|
37
|
+
schema 'MySchemaWithComplexTypes'
|
38
|
+
namespace 'com.my-namespace'
|
39
|
+
key_config({ field: :test_id })
|
40
|
+
end
|
41
|
+
|
42
|
+
topic 'MyTopic3' do
|
43
|
+
consumer MyConsumer
|
44
|
+
schema 'MySchemaWithCircularReference'
|
45
|
+
namespace 'com.my-namespace'
|
46
|
+
key_config({ none: true })
|
47
|
+
end
|
48
|
+
|
49
|
+
topic 'MyTopic4' do
|
50
|
+
consumer MyConsumer
|
51
|
+
schema 'MyNestedSchema'
|
52
|
+
namespace 'com.my-namespace'
|
53
|
+
key_config({ field: :test_id })
|
54
|
+
end
|
55
|
+
|
56
|
+
topic 'MyTopic5' do
|
57
|
+
consumer MyConsumer
|
58
|
+
schema 'MyLongNamespaceSchema'
|
59
|
+
namespace 'com.my-namespace.my-suborg'
|
60
|
+
key_config({ field: :test_id })
|
61
|
+
end
|
62
|
+
|
63
|
+
topic 'MyTopic6' do
|
64
|
+
producer_class MyConsumer
|
65
|
+
schema 'MySchema'
|
66
|
+
namespace 'com.my-namespace'
|
67
|
+
key_config({ schema: 'MySchema_key' })
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -90,9 +90,9 @@ module Deimos
|
|
90
90
|
|
91
91
|
return value if value.is_a?(self)
|
92
92
|
if from_message
|
93
|
-
self.new_from_message(**value
|
93
|
+
self.new_from_message(**value&.symbolize_keys || {})
|
94
94
|
else
|
95
|
-
self.new(**value
|
95
|
+
self.new(**value&.symbolize_keys || {})
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
data/lib/deimos/version.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# Autogenerated Schema for Enum at <%= @current_schema.namespace %>.<%= @current_schema.name %>
|
2
2
|
class <%= Deimos::SchemaBackends::AvroBase.schema_classname(@current_schema) %> < Deimos::SchemaClass::Enum
|
3
|
-
# @return ['<%= @current_schema.symbols.join("', '") %>']
|
4
|
-
attr_accessor :<%= @current_schema.name.underscore %>
|
5
|
-
|
6
3
|
# @override
|
7
4
|
def symbols
|
8
5
|
%w(<%= @current_schema.symbols.join(' ') %>)
|
9
6
|
end
|
7
|
+
|
8
|
+
<% @current_schema.symbols.each do |symbol| %>
|
9
|
+
def <%= symbol.underscore %>?
|
10
|
+
@value == '<%= symbol %>'
|
11
|
+
end
|
12
|
+
<% end %>
|
10
13
|
end
|
@@ -162,26 +162,22 @@ module Deimos
|
|
162
162
|
def generate
|
163
163
|
_validate
|
164
164
|
Rails.logger.info("Generating schemas from Deimos.config to #{Deimos.config.schema.generated_class_path}")
|
165
|
-
found_schemas =
|
166
|
-
Deimos.
|
165
|
+
found_schemas = {}
|
166
|
+
Deimos.karafka_configs.each do |config|
|
167
167
|
schema_name = config.schema
|
168
|
+
next if schema_name.nil?
|
168
169
|
namespace = config.namespace || Deimos.config.producers.schema_namespace
|
169
170
|
key_schema_name = config.key_config[:schema]
|
170
|
-
found_schemas.add("#{namespace}.#{schema_name}")
|
171
|
-
found_schemas.add("#{namespace}.#{key_schema_name}") if key_schema_name
|
172
|
-
generate_classes(schema_name, namespace, config.key_config)
|
173
|
-
end
|
174
171
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
found_schemas
|
180
|
-
found_schemas.add("#{namespace}.#{key_schema_name}") if key_schema_name
|
172
|
+
# don't regenerate if the schema was already found and had a payload key
|
173
|
+
next if found_schemas["#{namespace}.#{schema_name}"].present?
|
174
|
+
|
175
|
+
found_schemas["#{namespace}.#{schema_name}"] = key_schema_name
|
176
|
+
found_schemas["#{namespace}.#{key_schema_name}"] = nil
|
181
177
|
generate_classes(schema_name, namespace, config.key_config)
|
182
178
|
end
|
183
179
|
|
184
|
-
generate_from_schema_files(found_schemas)
|
180
|
+
generate_from_schema_files(found_schemas.keys)
|
185
181
|
|
186
182
|
end
|
187
183
|
|
@@ -245,7 +241,7 @@ module Deimos
|
|
245
241
|
"record.tombstone_key = key\n record.#{key_config[:field]} = key"
|
246
242
|
elsif key_schema
|
247
243
|
field_base_type = _field_type(key_schema)
|
248
|
-
"record.tombstone_key = #{field_base_type}.initialize_from_value(key
|
244
|
+
"record.tombstone_key = #{field_base_type}.initialize_from_value(key)\n record.payload_key = key"
|
249
245
|
else
|
250
246
|
''
|
251
247
|
end
|
@@ -10,70 +10,4 @@ class DeimosApp < Rails::Application
|
|
10
10
|
end
|
11
11
|
DeimosApp.initialize!
|
12
12
|
|
13
|
-
class MyConsumer < Deimos::Consumer
|
14
|
-
def consume(payload, metadata); end
|
15
|
-
end
|
16
|
-
|
17
|
-
require_relative "./lib/generators/deimos/schema_class_generator"
|
18
|
-
|
19
|
-
Deimos.configure do |deimos_config|
|
20
|
-
deimos_config.schema.nest_child_schemas = true
|
21
|
-
deimos_config.schema.path = "spec/schemas"
|
22
|
-
deimos_config.schema.backend = :avro_validation
|
23
|
-
deimos_config.schema.generated_class_path = './spec/schemas'
|
24
|
-
deimos_config.schema.use_full_namespace = true
|
25
|
-
deimos_config.schema.schema_namespace_map = {
|
26
|
-
'com' => 'Schemas',
|
27
|
-
'com.my-namespace.my-suborg' => %w(Schemas MyNamespace)
|
28
|
-
}
|
29
|
-
|
30
|
-
consumer do
|
31
|
-
class_name 'MyConsumer'
|
32
|
-
topic 'MyTopic'
|
33
|
-
schema 'Generated'
|
34
|
-
namespace 'com.my-namespace'
|
35
|
-
key_config field: :a_string
|
36
|
-
end
|
37
|
-
|
38
|
-
consumer do
|
39
|
-
class_name 'MyConsumer'
|
40
|
-
topic 'MyTopic'
|
41
|
-
schema 'MySchemaWithComplexTypes'
|
42
|
-
namespace 'com.my-namespace'
|
43
|
-
key_config field: :test_id
|
44
|
-
end
|
45
|
-
|
46
|
-
consumer do
|
47
|
-
class_name 'MyConsumer'
|
48
|
-
topic 'MyTopic'
|
49
|
-
schema 'MySchemaWithCircularReference'
|
50
|
-
namespace 'com.my-namespace'
|
51
|
-
key_config none: true
|
52
|
-
end
|
53
|
-
|
54
|
-
consumer do
|
55
|
-
class_name 'MyConsumer'
|
56
|
-
topic 'MyTopic'
|
57
|
-
schema 'MyNestedSchema'
|
58
|
-
namespace 'com.my-namespace'
|
59
|
-
key_config field: :test_id
|
60
|
-
end
|
61
|
-
|
62
|
-
consumer do
|
63
|
-
class_name 'MyConsumer'
|
64
|
-
topic 'MyTopic'
|
65
|
-
schema 'MyLongNamespaceSchema'
|
66
|
-
namespace 'com.my-namespace.my-suborg'
|
67
|
-
key_config field: :test_id
|
68
|
-
end
|
69
|
-
|
70
|
-
producer do
|
71
|
-
class_name 'MyConsumer'
|
72
|
-
topic 'MyTopic'
|
73
|
-
schema 'MySchema'
|
74
|
-
namespace 'com.my-namespace'
|
75
|
-
key_config schema: 'MySchema_key'
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
13
|
Deimos::Generators::SchemaClassGenerator.new.generate
|
@@ -45,7 +45,7 @@ module Schemas; module MyNamespace
|
|
45
45
|
|
46
46
|
def self.tombstone(key)
|
47
47
|
record = self.allocate
|
48
|
-
record.tombstone_key = MySchemaKey.initialize_from_value(key
|
48
|
+
record.tombstone_key = MySchemaKey.initialize_from_value(key)
|
49
49
|
record.payload_key = key
|
50
50
|
record
|
51
51
|
end
|