deimos-ruby 2.1.2 → 2.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60b8a371a3669c29d7f59694bc49af057412313aeb08eebab2b88d4dbc5b6da4
4
- data.tar.gz: 9c7231954c6db7ee55ffd4d3e18351bc7470acd443555f270c589da37e054631
3
+ metadata.gz: 1875e1db2f1a907bc82f3dacb4c1a9fea9be64afb90f317a3f41bbcec5296993
4
+ data.tar.gz: 03ab989cc0eb681cd60f39a30843298588bc67519e2851a2c3665bad2d62e441
5
5
  SHA512:
6
- metadata.gz: 294627ab365d88be5f0617422a88bbd15fe81b46eae81dc663aff66174377145ccbbac218c205b5fbaf2d0dbdef31f0586e43607381423e0cd13cbb673f6913a
7
- data.tar.gz: 216b9300910d20feb4786f4798542fc32a6a1f957dc19dc50209877853424a5d13e208f08f42c38fe420c86ec73e6b620e95a8f20d8700c1a7b3713f8f54472b
6
+ metadata.gz: 709f60ba95583f9e2f9c19055d90a3bd64a6a6184913e46c0152ca95b6592ed287a39f4feceb658ebecbdd9ccc2dcac42aec4a1d009ecbccd215b3687f432356
7
+ data.tar.gz: a4e884f2b11c789c6c162f3ed3c985842603ab2a529e4091a693d0cc444a45b3aa83d572c259e0b0a89b4ac4d319780132e58d78b2de9ea2d0757b587beb1923
data/CHANGELOG.md CHANGED
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ # 2.1.3 - 2025-07-22
11
+
12
+ - Fix: Schema class generation was missing payload_key for a number of cases.
13
+ - Fix: Possible crashes when using schema classes with Avro messages.
14
+
10
15
  ## 2.1.2 - 2025-07-21
11
16
 
12
17
  - Fix: Backwards-compatible fix wasn't working correctly.
data/karafka.rb CHANGED
@@ -1 +1,71 @@
1
- # blank load file, used in regenerate_test_schema_classes.rb
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
@@ -65,6 +65,8 @@ module Deimos
65
65
  # @param val [Object]
66
66
  # @return [Object]
67
67
  def coerce_record(type, val)
68
+ return nil if val.nil?
69
+
68
70
  record = val.map do |name, value|
69
71
  field = type.fields.find { |f| f.name == name }
70
72
  coerce_type(field.type, value)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Deimos
4
- VERSION = '2.1.2'
4
+ VERSION = '2.1.3'
5
5
  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 = Set.new
166
- Deimos.config.producer_objects.each do |config|
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
- Deimos.config.consumer_objects.each do |config|
176
- schema_name = config.schema
177
- namespace = config.namespace
178
- key_schema_name = config.key_config[:schema]
179
- found_schemas.add("#{namespace}.#{schema_name}")
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, from_message: self._from_message)\n record.payload_key = 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, from_message: self._from_message)
48
+ record.tombstone_key = MySchemaKey.initialize_from_value(key)
49
49
  record.payload_key = key
50
50
  record
51
51
  end
@@ -8,7 +8,8 @@ module Schemas; module Com; module MyNamespace
8
8
 
9
9
  attr_accessor :super_int
10
10
 
11
- def initialize(test_id: nil,
11
+ def initialize(_from_message: false,
12
+ test_id: nil,
12
13
  some_int: nil)
13
14
  super
14
15
  self.super_int = some_int.nil? ? 10 : some_int * 9000
@@ -12,7 +12,8 @@ module Schemas
12
12
  attr_accessor :a_record_field
13
13
 
14
14
  # @override
15
- def initialize(a_record_field: nil)
15
+ def initialize(_from_message: false, a_record_field: nil)
16
+ @_from_message = _from_message
16
17
  super
17
18
  self.a_record_field = a_record_field
18
19
  end
@@ -89,7 +90,8 @@ module Schemas
89
90
  attr_accessor :response_id
90
91
 
91
92
  # @override
92
- def initialize(response_id: nil)
93
+ def initialize(_from_message: false, response_id: nil)
94
+ @_from_message = _from_message
93
95
  super
94
96
  self.response_id = response_id
95
97
  end
@@ -163,7 +165,7 @@ module Schemas
163
165
  end
164
166
 
165
167
  # @override
166
- def initialize(a_string: nil,
168
+ def initialize(_from_message: false, a_string: nil,
167
169
  a_int: nil,
168
170
  a_long: nil,
169
171
  a_float: nil,
@@ -175,6 +177,7 @@ module Schemas
175
177
  timestamp: nil,
176
178
  message_id: nil,
177
179
  a_record: nil)
180
+ @_from_message = _from_message
178
181
  super
179
182
  self.a_string = a_string
180
183
  self.a_int = a_int
@@ -200,13 +203,6 @@ module Schemas
200
203
  'com.my-namespace'
201
204
  end
202
205
 
203
- def self.tombstone(key)
204
- record = self.allocate
205
- record.tombstone_key = key
206
- record.a_string = key
207
- record
208
- end
209
-
210
206
  # @override
211
207
  def as_json(_opts={})
212
208
  {
@@ -242,7 +238,8 @@ module Schemas
242
238
  attr_accessor :response_id
243
239
 
244
240
  # @override
245
- def initialize(response_id: nil)
241
+ def initialize(_from_message: false, response_id: nil)
242
+ @_from_message = _from_message
246
243
  super
247
244
  self.response_id = response_id
248
245
  end
@@ -283,8 +280,9 @@ module Schemas
283
280
  attr_accessor :some_int
284
281
 
285
282
  # @override
286
- def initialize(test_id: nil,
283
+ def initialize(_from_message: false, test_id: nil,
287
284
  some_int: nil)
285
+ @_from_message = _from_message
288
286
  super
289
287
  self.test_id = test_id
290
288
  self.some_int = some_int
@@ -331,10 +329,11 @@ module Schemas
331
329
  attr_accessor :some_optional_int
332
330
 
333
331
  # @override
334
- def initialize(some_int: nil,
332
+ def initialize(_from_message: false, some_int: nil,
335
333
  some_float: nil,
336
334
  some_string: nil,
337
335
  some_optional_int: nil)
336
+ @_from_message = _from_message
338
337
  super
339
338
  self.some_int = some_int
340
339
  self.some_float = some_float
@@ -400,11 +399,12 @@ module Schemas
400
399
  end
401
400
 
402
401
  # @override
403
- def initialize(test_id: nil,
402
+ def initialize(_from_message: false, test_id: nil,
404
403
  test_float: nil,
405
404
  test_array: nil,
406
405
  some_nested_record: nil,
407
406
  some_optional_record: nil)
407
+ @_from_message = _from_message
408
408
  super
409
409
  self.test_id = test_id
410
410
  self.test_float = test_float
@@ -423,6 +423,13 @@ module Schemas
423
423
  'com.my-namespace'
424
424
  end
425
425
 
426
+ def self.tombstone(key)
427
+ record = self.allocate
428
+ record.tombstone_key = key
429
+ record.test_id = key
430
+ record
431
+ end
432
+
426
433
  # @override
427
434
  def as_json(_opts={})
428
435
  {
@@ -453,8 +460,9 @@ module Schemas
453
460
  attr_accessor :some_int
454
461
 
455
462
  # @override
456
- def initialize(test_id: nil,
463
+ def initialize(_from_message: false, test_id: nil,
457
464
  some_int: nil)
465
+ @_from_message = _from_message
458
466
  super
459
467
  self.test_id = test_id
460
468
  self.some_int = some_int
@@ -497,8 +505,9 @@ module Schemas
497
505
  attr_accessor :part_two
498
506
 
499
507
  # @override
500
- def initialize(part_one: nil,
508
+ def initialize(_from_message: false, part_one: nil,
501
509
  part_two: nil)
510
+ @_from_message = _from_message
502
511
  super
503
512
  self.part_one = part_one
504
513
  self.part_two = part_two
@@ -539,7 +548,8 @@ module Schemas
539
548
  attr_accessor :id
540
549
 
541
550
  # @override
542
- def initialize(id: nil)
551
+ def initialize(_from_message: false, id: nil)
552
+ @_from_message = _from_message
543
553
  super
544
554
  self.id = id
545
555
  end
@@ -578,7 +588,8 @@ module Schemas
578
588
  attr_accessor :test_id
579
589
 
580
590
  # @override
581
- def initialize(test_id: nil)
591
+ def initialize(_from_message: false, test_id: nil)
592
+ @_from_message = _from_message
582
593
  super
583
594
  self.test_id = test_id
584
595
  end
@@ -619,8 +630,9 @@ module Schemas
619
630
  attr_accessor :some_bool
620
631
 
621
632
  # @override
622
- def initialize(test_id: nil,
633
+ def initialize(_from_message: false, test_id: nil,
623
634
  some_bool: nil)
635
+ @_from_message = _from_message
624
636
  super
625
637
  self.test_id = test_id
626
638
  self.some_bool = some_bool
@@ -669,7 +681,8 @@ module Schemas
669
681
  end
670
682
 
671
683
  # @override
672
- def initialize(properties: {})
684
+ def initialize(_from_message: false, properties: {})
685
+ @_from_message = _from_message
673
686
  super
674
687
  self.properties = properties
675
688
  end
@@ -776,7 +789,7 @@ module Schemas
776
789
  end
777
790
 
778
791
  # @override
779
- def initialize(test_id: nil,
792
+ def initialize(_from_message: false, test_id: nil,
780
793
  test_float: nil,
781
794
  test_string_array: ["test"],
782
795
  test_int_array: [123],
@@ -789,6 +802,7 @@ module Schemas
789
802
  some_enum_array: nil,
790
803
  some_optional_enum: nil,
791
804
  some_enum_with_default: "sym6")
805
+ @_from_message = _from_message
792
806
  super
793
807
  self.test_id = test_id
794
808
  self.test_float = test_float
@@ -859,11 +873,12 @@ module Schemas
859
873
  attr_accessor :timestamp
860
874
 
861
875
  # @override
862
- def initialize(test_id: nil,
876
+ def initialize(_from_message: false, test_id: nil,
863
877
  updated_at: nil,
864
878
  some_int: nil,
865
879
  some_datetime_int: nil,
866
880
  timestamp: nil)
881
+ @_from_message = _from_message
867
882
  super
868
883
  self.test_id = test_id
869
884
  self.updated_at = updated_at
@@ -916,10 +931,11 @@ module Schemas
916
931
  attr_accessor :timestamp
917
932
 
918
933
  # @override
919
- def initialize(test_id: nil,
934
+ def initialize(_from_message: false, test_id: nil,
920
935
  some_int: nil,
921
936
  message_id: nil,
922
937
  timestamp: nil)
938
+ @_from_message = _from_message
923
939
  super
924
940
  self.test_id = test_id
925
941
  self.some_int = some_int
@@ -968,9 +984,10 @@ module Schemas
968
984
  attr_accessor :title
969
985
 
970
986
  # @override
971
- def initialize(test_id: nil,
987
+ def initialize(_from_message: false, test_id: nil,
972
988
  some_int: nil,
973
989
  title: nil)
990
+ @_from_message = _from_message
974
991
  super
975
992
  self.test_id = test_id
976
993
  self.some_int = some_int
@@ -1040,9 +1057,10 @@ module Schemas
1040
1057
  end
1041
1058
 
1042
1059
  # @override
1043
- def initialize(test_id: "",
1060
+ def initialize(_from_message: false, test_id: "",
1044
1061
  test_long: nil,
1045
1062
  test_union_type: nil)
1063
+ @_from_message = _from_message
1046
1064
  super
1047
1065
  self.test_id = test_id
1048
1066
  self.test_long = test_long
@@ -1093,11 +1111,12 @@ module Schemas
1093
1111
  attr_accessor :timestamp
1094
1112
 
1095
1113
  # @override
1096
- def initialize(id: nil,
1114
+ def initialize(_from_message: false, id: nil,
1097
1115
  test_id: nil,
1098
1116
  some_int: nil,
1099
1117
  message_id: nil,
1100
1118
  timestamp: nil)
1119
+ @_from_message = _from_message
1101
1120
  super
1102
1121
  self.id = id
1103
1122
  self.test_id = test_id
@@ -1144,7 +1163,8 @@ module Schemas
1144
1163
  attr_accessor :property
1145
1164
 
1146
1165
  # @override
1147
- def initialize(property: nil)
1166
+ def initialize(_from_message: false, property: nil)
1167
+ @_from_message = _from_message
1148
1168
  super
1149
1169
  self.property = property
1150
1170
  end
@@ -1185,8 +1205,9 @@ module Schemas
1185
1205
  attr_accessor :record1_id
1186
1206
 
1187
1207
  # @override
1188
- def initialize(record1_map: {},
1208
+ def initialize(_from_message: false, record1_map: {},
1189
1209
  record1_id: 0)
1210
+ @_from_message = _from_message
1190
1211
  super
1191
1212
  self.record1_map = record1_map
1192
1213
  self.record1_id = record1_id
@@ -1227,7 +1248,8 @@ module Schemas
1227
1248
  attr_accessor :record2_id
1228
1249
 
1229
1250
  # @override
1230
- def initialize(record2_id: "")
1251
+ def initialize(_from_message: false, record2_id: "")
1252
+ @_from_message = _from_message
1231
1253
  super
1232
1254
  self.record2_id = record2_id
1233
1255
  end
@@ -1266,7 +1288,8 @@ module Schemas
1266
1288
  attr_accessor :record3_id
1267
1289
 
1268
1290
  # @override
1269
- def initialize(record3_id: 0.0)
1291
+ def initialize(_from_message: false, record3_id: 0.0)
1292
+ @_from_message = _from_message
1270
1293
  super
1271
1294
  self.record3_id = record3_id
1272
1295
  end
@@ -1305,7 +1328,8 @@ module Schemas
1305
1328
  attr_accessor :record4_id
1306
1329
 
1307
1330
  # @override
1308
- def initialize(record4_id: 0)
1331
+ def initialize(_from_message: false, record4_id: 0)
1332
+ @_from_message = _from_message
1309
1333
  super
1310
1334
  self.record4_id = record4_id
1311
1335
  end
@@ -1344,7 +1368,8 @@ module Schemas
1344
1368
  attr_accessor :update_request_id
1345
1369
 
1346
1370
  # @override
1347
- def initialize(update_request_id: nil)
1371
+ def initialize(_from_message: false, update_request_id: nil)
1372
+ @_from_message = _from_message
1348
1373
  super
1349
1374
  self.update_request_id = update_request_id
1350
1375
  end
@@ -1383,7 +1408,8 @@ module Schemas
1383
1408
  attr_accessor :update_response_id
1384
1409
 
1385
1410
  # @override
1386
- def initialize(update_response_id: nil)
1411
+ def initialize(_from_message: false, update_response_id: nil)
1412
+ @_from_message = _from_message
1387
1413
  super
1388
1414
  self.update_response_id = update_response_id
1389
1415
  end
@@ -1438,7 +1464,7 @@ module Schemas
1438
1464
  attr_accessor :created_at
1439
1465
 
1440
1466
  # @override
1441
- def initialize(id: nil,
1467
+ def initialize(_from_message: false, id: nil,
1442
1468
  wibble_id: nil,
1443
1469
  name: nil,
1444
1470
  floop: nil,
@@ -1447,6 +1473,7 @@ module Schemas
1447
1473
  birthday_optional: nil,
1448
1474
  updated_at: nil,
1449
1475
  created_at: nil)
1476
+ @_from_message = _from_message
1450
1477
  super
1451
1478
  self.id = id
1452
1479
  self.wibble_id = wibble_id
@@ -1509,11 +1536,12 @@ module Schemas
1509
1536
  attr_accessor :created_at
1510
1537
 
1511
1538
  # @override
1512
- def initialize(id: nil,
1539
+ def initialize(_from_message: false, id: nil,
1513
1540
  widget_id: nil,
1514
1541
  name: nil,
1515
1542
  updated_at: nil,
1516
1543
  created_at: nil)
1544
+ @_from_message = _from_message
1517
1545
  super
1518
1546
  self.id = id
1519
1547
  self.widget_id = widget_id
@@ -1568,11 +1596,12 @@ module Schemas
1568
1596
  attr_accessor :created_at
1569
1597
 
1570
1598
  # @override
1571
- def initialize(id: nil,
1599
+ def initialize(_from_message: false, id: nil,
1572
1600
  widget_id: nil,
1573
1601
  model_id: nil,
1574
1602
  updated_at: nil,
1575
1603
  created_at: nil)
1604
+ @_from_message = _from_message
1576
1605
  super
1577
1606
  self.id = id
1578
1607
  self.widget_id = widget_id