deimos-ruby 1.10.2 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Gemfile.lock +8 -8
  4. data/README.md +150 -16
  5. data/deimos-ruby.gemspec +1 -1
  6. data/docs/CONFIGURATION.md +4 -0
  7. data/lib/deimos/active_record_consume/batch_consumption.rb +1 -1
  8. data/lib/deimos/active_record_consume/message_consumption.rb +4 -3
  9. data/lib/deimos/active_record_consumer.rb +2 -2
  10. data/lib/deimos/active_record_producer.rb +3 -0
  11. data/lib/deimos/config/configuration.rb +29 -0
  12. data/lib/deimos/consume/batch_consumption.rb +2 -2
  13. data/lib/deimos/consume/message_consumption.rb +2 -2
  14. data/lib/deimos/consumer.rb +10 -0
  15. data/lib/deimos/producer.rb +4 -3
  16. data/lib/deimos/schema_backends/avro_base.rb +64 -1
  17. data/lib/deimos/schema_backends/avro_schema_registry.rb +1 -1
  18. data/lib/deimos/schema_backends/base.rb +18 -2
  19. data/lib/deimos/schema_class/base.rb +67 -0
  20. data/lib/deimos/schema_class/enum.rb +24 -0
  21. data/lib/deimos/schema_class/record.rb +59 -0
  22. data/lib/deimos/shared_config.rb +5 -0
  23. data/lib/deimos/test_helpers.rb +70 -17
  24. data/lib/deimos/utils/schema_class.rb +29 -0
  25. data/lib/deimos/version.rb +1 -1
  26. data/lib/deimos.rb +3 -0
  27. data/lib/generators/deimos/schema_class/templates/schema_class.rb.tt +15 -0
  28. data/lib/generators/deimos/schema_class/templates/schema_enum.rb.tt +21 -0
  29. data/lib/generators/deimos/schema_class/templates/schema_record.rb.tt +65 -0
  30. data/lib/generators/deimos/schema_class_generator.rb +247 -0
  31. data/lib/tasks/deimos.rake +8 -0
  32. data/spec/active_record_batch_consumer_spec.rb +120 -110
  33. data/spec/active_record_consumer_spec.rb +97 -88
  34. data/spec/active_record_producer_spec.rb +38 -27
  35. data/spec/batch_consumer_spec.rb +37 -28
  36. data/spec/config/configuration_spec.rb +10 -3
  37. data/spec/consumer_spec.rb +94 -83
  38. data/spec/generators/active_record_generator_spec.rb +1 -0
  39. data/spec/generators/schema_class/my_schema_with_complex_types_spec.rb +206 -0
  40. data/spec/generators/schema_class_generator_spec.rb +186 -0
  41. data/spec/producer_spec.rb +110 -0
  42. data/spec/schema_classes/generated.rb +156 -0
  43. data/spec/schema_classes/my_nested_schema.rb +114 -0
  44. data/spec/schema_classes/my_schema.rb +53 -0
  45. data/spec/schema_classes/my_schema_key.rb +35 -0
  46. data/spec/schema_classes/my_schema_with_complex_types.rb +172 -0
  47. data/spec/schemas/com/my-namespace/Generated.avsc +6 -0
  48. data/spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc +95 -0
  49. data/spec/spec_helper.rb +6 -1
  50. metadata +28 -4
@@ -0,0 +1,206 @@
1
+ # frozen_string_literal: true
2
+
3
+ # For testing the generated class.
4
+ RSpec.describe Schemas::MySchemaWithComplexTypes do
5
+ let(:payload_hash) do
6
+ {
7
+ test_id: 'test id',
8
+ test_float: 1.2,
9
+ test_string_array: %w(abc def),
10
+ test_int_array: [123, 456],
11
+ some_integer_map: { 'int_1' => 1, 'int_2' => 2 },
12
+ some_record: Schemas::ARecord.new(a_record_field: 'field 1'),
13
+ some_optional_record: Schemas::ARecord.new(a_record_field: 'field 2'),
14
+ some_record_array: [Schemas::ARecord.new(a_record_field: 'field 3'),
15
+ Schemas::ARecord.new(a_record_field: 'field 4')],
16
+ some_record_map: {
17
+ 'record_1' => Schemas::ARecord.new(a_record_field: 'field 5'),
18
+ 'record_2' => Schemas::ARecord.new(a_record_field: 'field 6')
19
+ },
20
+ some_enum_array: [Schemas::AnEnum.new('sym1'),
21
+ Schemas::AnEnum.new('sym2')]
22
+ }
23
+ end
24
+
25
+ describe 'class initialization' do
26
+
27
+ it 'should initialize the class from keyword arguments' do
28
+ klass = described_class.new(
29
+ test_id: payload_hash[:test_id],
30
+ test_float: payload_hash[:test_float],
31
+ test_string_array: payload_hash[:test_string_array],
32
+ some_record: payload_hash[:some_record],
33
+ some_optional_record: payload_hash[:some_optional_record],
34
+ some_record_array: payload_hash[:some_record_array],
35
+ some_record_map: payload_hash[:some_record_map],
36
+ some_enum_array: payload_hash[:some_enum_array]
37
+ )
38
+ expect(klass).to be_instance_of(described_class)
39
+ end
40
+
41
+ it 'should initialize the class from a hash with symbols as keys' do
42
+ klass = described_class.new(**payload_hash)
43
+ expect(klass).to be_instance_of(described_class)
44
+ end
45
+
46
+ it 'should initialize the class when missing attributes' do
47
+ payload_hash.delete(:test_id)
48
+ klass = described_class.new(**payload_hash)
49
+ expect(klass).to be_instance_of(described_class)
50
+ end
51
+
52
+ end
53
+
54
+ describe 'base class methods' do
55
+ let(:klass) do
56
+ described_class.new(**payload_hash)
57
+ end
58
+
59
+ let(:schema_fields) do
60
+ %w(test_id test_float test_int_array test_optional_int test_string_array some_integer_map some_record some_optional_record some_record_array some_record_map some_enum_array)
61
+ end
62
+
63
+ it 'should return the name of the schema and namespace' do
64
+ expect(klass.schema).to eq('MySchemaWithComplexTypes')
65
+ expect(klass.namespace).to eq('com.my-namespace')
66
+ expect(klass.full_schema).to eq('com.my-namespace.MySchemaWithComplexTypes')
67
+ end
68
+
69
+ it 'should return an array of all fields in the schema' do
70
+ expect(klass.schema_fields).to match_array(schema_fields)
71
+ end
72
+
73
+ it 'should return a json version of the payload' do
74
+ described_class.new(**payload_hash)
75
+ payload_h = {
76
+ 'test_id' => 'test id',
77
+ 'test_float' => 1.2,
78
+ 'test_string_array' => %w(abc def),
79
+ 'test_int_array' => [123, 456],
80
+ 'test_optional_int' => 123,
81
+ 'some_integer_map' => { 'int_1' => 1, 'int_2' => 2 },
82
+ 'some_record' => { 'a_record_field' => 'field 1' },
83
+ 'some_optional_record' => { 'a_record_field' => 'field 2' },
84
+ 'some_record_array' => [
85
+ { 'a_record_field' => 'field 3' },
86
+ { 'a_record_field' => 'field 4' }
87
+ ],
88
+ 'some_record_map' => {
89
+ 'record_1' => { 'a_record_field' => 'field 5' },
90
+ 'record_2' => { 'a_record_field' => 'field 6' }
91
+ },
92
+ 'some_enum_array' => %w(sym1 sym2)
93
+ }
94
+
95
+ expect(klass.as_json).to eq(payload_h)
96
+ end
97
+
98
+ it 'should return a JSON string of the payload' do
99
+ s = '{"test_id":"test id","test_float":1.2,"test_string_array":["abc","def"],"test_int_array":[123,456],"test_optional_int":123,"some_integer_map":{"int_1":1,"int_2":2},"some_record":{"a_record_field":"field 1"},"some_optional_record":{"a_record_field":"field 2"},"some_record_array":[{"a_record_field":"field 3"},{"a_record_field":"field 4"}],"some_record_map":{"record_1":{"a_record_field":"field 5"},"record_2":{"a_record_field":"field 6"}},"some_enum_array":["sym1","sym2"]}'
100
+ expect(klass.to_json).to eq(s)
101
+ end
102
+ end
103
+
104
+ describe 'defaults' do
105
+ it 'should set an_optional_int if it is not provided' do
106
+ payload_hash.delete(:an_optional_int)
107
+ klass = described_class.new(**payload_hash)
108
+ expect(klass.test_optional_int).to eq(123)
109
+ end
110
+
111
+ it 'should set some_record if it is not provided' do
112
+ payload_hash.delete(:some_record)
113
+ klass = described_class.new(**payload_hash)
114
+ expect(klass.some_record).to eq(Schemas::ARecord.new(a_record_field: 'Test String'))
115
+ end
116
+
117
+ it 'should set some_record to nil' do
118
+ klass = described_class.new(**payload_hash.merge(some_record: nil))
119
+ expect(klass.some_record).to be_nil
120
+ end
121
+ end
122
+
123
+ describe 'getters and setters' do
124
+ let(:klass) do
125
+ described_class.new(**payload_hash)
126
+ end
127
+
128
+ context 'when getting attributes' do
129
+ it 'should get of values of primitive types' do
130
+ expect(klass.test_id).to eq('test id')
131
+ expect(klass.test_float).to eq(1.2)
132
+ expect(klass.test_string_array).to eq(%w(abc def))
133
+ end
134
+
135
+ it 'should get the value of some_record_array' do
136
+ some_record_array = klass.some_record_array
137
+ expect(some_record_array.first).to be_instance_of(Schemas::ARecord)
138
+ expect(some_record_array.first.a_record_field).to eq('field 3')
139
+ end
140
+
141
+ it 'should get the value of some_record_map' do
142
+ some_record_map = klass.some_record_map
143
+ expect(some_record_map['record_1']).to be_instance_of(Schemas::ARecord)
144
+ expect(some_record_map['record_1'].a_record_field).to eq('field 5')
145
+ end
146
+
147
+ it 'should get the value of some_enum_array' do
148
+ some_enum_array = klass.some_enum_array
149
+ expect(some_enum_array.first).to be_instance_of(Schemas::AnEnum)
150
+ expect(some_enum_array.first.an_enum).to eq('sym1')
151
+ end
152
+
153
+ it 'should get the value of some_record' do
154
+ record = klass.some_record
155
+ expect(record).to be_instance_of(Schemas::ARecord)
156
+ expect(record.a_record_field).to eq('field 1')
157
+ expect(record.to_h).to eq({ 'a_record_field' => 'field 1' })
158
+ end
159
+
160
+ it 'should support Hash-style element access of values' do
161
+ expect(klass['test_id']).to eq('test id')
162
+ expect(klass['test_float']).to eq(1.2)
163
+ expect(klass['test_string_array']).to eq(%w(abc def))
164
+ end
165
+ end
166
+
167
+ context 'when setting attributes' do
168
+ it 'should modify the value of test_id' do
169
+ expect(klass.test_id).to eq('test id')
170
+
171
+ klass.test_id = 'something different'
172
+ expect(klass.test_id).to eq('something different')
173
+ end
174
+
175
+ it 'should modify the value of some_optional_record' do
176
+ expect(klass.some_optional_record).to eq(Schemas::ARecord.new(a_record_field: 'field 2'))
177
+ klass.some_optional_record = Schemas::ARecord.new(a_record_field: 'new field')
178
+
179
+ expect(klass.some_optional_record).to eq(Schemas::ARecord.new(a_record_field: 'new field'))
180
+ expect(klass.some_optional_record.as_json).to eq({ 'a_record_field' => 'new field' })
181
+ end
182
+
183
+ it 'should accept a hash object inner records' do
184
+ klass.some_optional_record = { a_record_field: 'new field' }
185
+ expect(klass.some_optional_record).to eq(Schemas::ARecord.new(a_record_field: 'new field'))
186
+ expect(klass.some_optional_record.as_json).to eq({ 'a_record_field' => 'new field' })
187
+ end
188
+
189
+ it 'should modify the value of some_enum_array' do
190
+ klass.some_enum_array.first.an_enum = 'new_sym'
191
+ expect(klass.some_enum_array.first).to eq(Schemas::AnEnum.new('new_sym'))
192
+
193
+ klass.some_enum_array.second.an_enum = Schemas::AnEnum.new('other_sym')
194
+ expect(klass.some_enum_array.second.an_enum).to eq('other_sym')
195
+ end
196
+
197
+ it 'should modify the value of some_record_map' do
198
+ klass.some_record_map['record_1'].a_record_field = 'new field'
199
+ expect(klass.some_record_map['record_1']).to eq(Schemas::ARecord.new(a_record_field: 'new field'))
200
+
201
+ klass.some_record_map['record_2'] = Schemas::ARecord.new(a_record_field: 'other field')
202
+ expect(klass.some_record_map['record_2']).to eq(Schemas::ARecord.new(a_record_field: 'other field'))
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,186 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/deimos/schema_class_generator'
4
+ require 'fileutils'
5
+
6
+ RSpec.describe Deimos::Generators::SchemaClassGenerator do
7
+ let(:schema_class_path) { 'app/lib/schema_classes/com/my-namespace' }
8
+ let(:expected_files) { Dir['spec/schema_classes/*.rb'] }
9
+ let(:files) { Dir["#{schema_class_path}/*.rb"] }
10
+
11
+ before(:each) do
12
+ Deimos.config.reset!
13
+ Deimos.configure do
14
+ schema.path 'spec/schemas/'
15
+ schema.generated_class_path 'app/lib/schema_classes'
16
+ schema.backend :avro_local
17
+ end
18
+ end
19
+
20
+ after(:each) do
21
+ FileUtils.rm_rf(schema_class_path) if File.exist?(schema_class_path)
22
+ end
23
+
24
+ context 'with a Consumers Schema' do
25
+ before(:each) do
26
+ Deimos.configure do
27
+ consumer do
28
+ class_name 'ConsumerTest::MyConsumer'
29
+ topic 'MyTopic'
30
+ schema 'Generated'
31
+ namespace 'com.my-namespace'
32
+ key_config field: :a_string
33
+ end
34
+ end
35
+ described_class.start
36
+ end
37
+
38
+ it 'should generate the correct number of classes' do
39
+ expect(files.length).to eq(1)
40
+ end
41
+
42
+ it 'should generate a schema class for generated' do
43
+ generated_path = files.select { |f| f =~ /generated/ }.first
44
+ expected_path = expected_files.select { |f| f =~ /generated/ }.first
45
+
46
+ expect(File.read(generated_path)).to eq(File.read(expected_path))
47
+ end
48
+ end
49
+
50
+ context 'with a Consumers Schema with Complex types' do
51
+ before(:each) do
52
+ Deimos.configure do
53
+ consumer do
54
+ class_name 'ConsumerTest::MyConsumer'
55
+ topic 'MyTopic'
56
+ schema 'MySchemaWithComplexTypes'
57
+ namespace 'com.my-namespace'
58
+ key_config field: :a_string
59
+ end
60
+ end
61
+ described_class.start
62
+ end
63
+
64
+ it 'should generate the correct number of classes' do
65
+ expect(files.length).to eq(1)
66
+ end
67
+
68
+ it 'should generate a schema class for my_schema_with_complex_types' do
69
+ generated_path = files.select { |f| f =~ /my_schema_with_complex_types/ }.first
70
+ expected_path = expected_files.select { |f| f =~ /my_schema_with_complex_types/ }.first
71
+
72
+ expect(File.read(generated_path)).to eq(File.read(expected_path))
73
+ end
74
+ end
75
+
76
+ context 'with a Producers Schema and a Key' do
77
+ before(:each) do
78
+ Deimos.configure do
79
+ producer do
80
+ class_name 'ConsumerTest::MyConsumer'
81
+ topic 'MyTopic'
82
+ schema 'MySchema'
83
+ namespace 'com.my-namespace'
84
+ key_config schema: 'MySchema-key'
85
+ end
86
+ end
87
+ described_class.start
88
+ end
89
+
90
+ it 'should generate the correct number of classes' do
91
+ expect(files.length).to eq(2)
92
+ end
93
+
94
+ %w(my_schema my_schema_key).each do |klass|
95
+ it "should generate a schema class for #{klass}" do
96
+ generated_path = files.select { |f| f =~ /#{klass}\.rb/ }.first
97
+ expected_path = expected_files.select { |f| f =~ /#{klass}\.rb/ }.first
98
+
99
+ expect(File.read(generated_path)).to eq(File.read(expected_path))
100
+ end
101
+ end
102
+ end
103
+
104
+ context 'with a Consumers Nested Schema' do
105
+ before(:each) do
106
+ Deimos.configure do
107
+ consumer do
108
+ class_name 'ConsumerTest::MyConsumer'
109
+ topic 'MyTopic'
110
+ schema 'MyNestedSchema'
111
+ namespace 'com.my-namespace'
112
+ key_config field: :test_id
113
+ end
114
+ end
115
+ described_class.start
116
+ end
117
+
118
+ it 'should generate the correct number of classes' do
119
+ expect(files.length).to eq(1)
120
+ end
121
+
122
+ it 'should generate a schema class for my_nested_schema' do
123
+ generated_path = files.select { |f| f =~ /my_nested_schema/ }.first
124
+ expected_path = expected_files.select { |f| f =~ /my_nested_schema/ }.first
125
+
126
+ expect(File.read(generated_path)).to eq(File.read(expected_path))
127
+ end
128
+ end
129
+
130
+ context 'with a mix of Consumer and Producer Schemas' do
131
+ before(:each) do
132
+ Deimos.configure do
133
+ consumer do
134
+ class_name 'ConsumerTest::MyConsumer'
135
+ topic 'MyTopic'
136
+ schema 'Generated'
137
+ namespace 'com.my-namespace'
138
+ key_config field: :a_string
139
+ end
140
+
141
+ producer do
142
+ class_name 'ConsumerTest::MyConsumer'
143
+ topic 'MyTopic'
144
+ schema 'MySchema'
145
+ namespace 'com.my-namespace'
146
+ key_config schema: 'MySchema-key'
147
+ end
148
+
149
+ producer do
150
+ class_name 'ConsumerTest::MyConsumer'
151
+ topic 'MyTopic'
152
+ schema 'MyNestedSchema'
153
+ namespace 'com.my-namespace'
154
+ key_config field: :test_id
155
+ end
156
+ end
157
+ described_class.start
158
+ end
159
+
160
+ it 'should generate the correct number of classes' do
161
+ expect(files.length).to eq(4)
162
+ end
163
+
164
+ %w(generated my_schema my_schema_key my_nested_schema).each do |klass|
165
+ it "should generate a schema class for #{klass}" do
166
+ generated_path = files.select { |f| f =~ /#{klass}\.rb/ }.first
167
+ expected_path = expected_files.select { |f| f =~ /#{klass}\.rb/ }.first
168
+
169
+ expect(File.read(generated_path)).to eq(File.read(expected_path))
170
+ end
171
+ end
172
+ end
173
+
174
+ context 'with non-avro schema backends' do
175
+ before(:each) do
176
+ Deimos.config.schema.backend :mock
177
+ end
178
+
179
+ it 'should fail to start schema class generation' do
180
+ expect {
181
+ described_class.start
182
+ }.to raise_error(message='Schema Class Generation requires an Avro-based Schema Backend')
183
+ end
184
+ end
185
+
186
+ end
@@ -390,6 +390,116 @@ module ProducerTest
390
390
  }, '456', '4561')
391
391
  end
392
392
 
393
+ context 'with Schema Class payloads' do
394
+ it 'should fail on invalid message with error handler' do
395
+ subscriber = Deimos.subscribe('produce') do |event|
396
+ expect(event.payload[:payloads]).to eq([{ 'invalid' => 'key' }])
397
+ end
398
+ expect(MyProducer.encoder).to receive(:validate).and_raise('OH NOES')
399
+ expect {
400
+ MyProducer.publish(Schemas::MySchema.new(test_id: 'foo', some_int: 'invalid'))
401
+ }.to raise_error('OH NOES')
402
+ Deimos.unsubscribe(subscriber)
403
+ end
404
+
405
+ it 'should produce a message' do
406
+ expect(described_class).to receive(:produce_batch).once.with(
407
+ Deimos::Backends::Test,
408
+ [
409
+ Deimos::Message.new({ 'test_id' => 'foo', 'some_int' => 123 },
410
+ MyProducer,
411
+ topic: 'my-topic',
412
+ partition_key: 'foo',
413
+ key: 'foo'),
414
+ Deimos::Message.new({ 'test_id' => 'bar', 'some_int' => 124 },
415
+ MyProducer,
416
+ topic: 'my-topic',
417
+ partition_key: 'bar',
418
+ key: 'bar')
419
+ ]
420
+ ).and_call_original
421
+
422
+ MyProducer.publish_list(
423
+ [Schemas::MySchema.new(test_id: 'foo', some_int: 123),
424
+ Schemas::MySchema.new(test_id: 'bar', some_int: 124)]
425
+ )
426
+ expect('my-topic').to have_sent('test_id' => 'foo', 'some_int' => 123)
427
+ expect('your-topic').not_to have_sent('test_id' => 'foo', 'some_int' => 123)
428
+ expect('my-topic').not_to have_sent('test_id' => 'foo2', 'some_int' => 123)
429
+ end
430
+
431
+ it 'should not publish if publish disabled' do
432
+ expect(described_class).not_to receive(:produce_batch)
433
+ Deimos.configure { |c| c.producers.disabled = true }
434
+ MyProducer.publish_list(
435
+ [Schemas::MySchema.new(test_id: 'foo', some_int: 123),
436
+ Schemas::MySchema.new(test_id: 'bar', some_int: 124)]
437
+ )
438
+ expect(MyProducer.topic).not_to have_sent(anything)
439
+ end
440
+
441
+ it 'should encode the key' do
442
+ Deimos.configure { |c| c.producers.topic_prefix = nil }
443
+ expect(MyProducer.encoder).to receive(:encode_key).with('test_id', 'foo', topic: 'my-topic-key')
444
+ expect(MyProducer.encoder).to receive(:encode_key).with('test_id', 'bar', topic: 'my-topic-key')
445
+ expect(MyProducer.encoder).to receive(:encode).with({
446
+ 'test_id' => 'foo',
447
+ 'some_int' => 123
448
+ }, { topic: 'my-topic-value' })
449
+ expect(MyProducer.encoder).to receive(:encode).with({
450
+ 'test_id' => 'bar',
451
+ 'some_int' => 124
452
+ }, { topic: 'my-topic-value' })
453
+
454
+ MyProducer.publish_list(
455
+ [Schemas::MySchema.new(test_id: 'foo', some_int: 123),
456
+ Schemas::MySchema.new(test_id: 'bar', some_int: 124)]
457
+ )
458
+ end
459
+
460
+ it 'should encode with a schema' do
461
+ expect(MySchemaProducer.key_encoder).to receive(:encode).with({ 'test_id' => 'foo_key' },
462
+ { topic: 'my-topic2-key' })
463
+ expect(MySchemaProducer.key_encoder).to receive(:encode).with({ 'test_id' => 'bar_key' },
464
+ { topic: 'my-topic2-key' })
465
+
466
+ MySchemaProducer.publish_list(
467
+ [Schemas::MySchema.new(test_id: 'foo', some_int: 123, payload_key: { 'test_id' => 'foo_key' }),
468
+ Schemas::MySchema.new(test_id: 'bar', some_int: 124, payload_key: { 'test_id' => 'bar_key' })]
469
+ )
470
+ end
471
+
472
+ it 'should properly encode and coerce values with a nested record' do
473
+ expect(MyNestedSchemaProducer.encoder).to receive(:encode_key).with('test_id', 'foo', topic: 'my-topic-key')
474
+ MyNestedSchemaProducer.publish(
475
+ Schemas::MyNestedSchema.new(
476
+ test_id: 'foo',
477
+ test_float: BigDecimal('123.456'),
478
+ test_array: ['1'],
479
+ some_nested_record: Schemas::MyNestedRecord.new(
480
+ some_int: 123,
481
+ some_float: BigDecimal('456.789'),
482
+ some_string: '123',
483
+ some_optional_int: nil
484
+ ),
485
+ some_optional_record: nil
486
+ )
487
+ )
488
+ expect(MyNestedSchemaProducer.topic).to have_sent(
489
+ 'test_id' => 'foo',
490
+ 'test_float' => 123.456,
491
+ 'test_array' => ['1'],
492
+ 'some_nested_record' => {
493
+ 'some_int' => 123,
494
+ 'some_float' => 456.789,
495
+ 'some_string' => '123',
496
+ 'some_optional_int' => nil
497
+ },
498
+ 'some_optional_record' => nil
499
+ )
500
+ end
501
+ end
502
+
393
503
  describe 'disabling' do
394
504
  it 'should disable globally' do
395
505
  Deimos.disable_producers do
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file is autogenerated by Deimos, Do NOT modify
4
+ module Schemas
5
+ ### Secondary Schema Classes ###
6
+ # Autogenerated Schema for Enum at com.my-namespace.AnEnum
7
+ class AnEnum < Deimos::SchemaClass::Enum
8
+ # @return ['sym1', 'sym2']
9
+ attr_accessor :an_enum
10
+
11
+ # :nodoc:
12
+ def initialize(an_enum)
13
+ super
14
+ self.an_enum = an_enum
15
+ end
16
+
17
+ # @override
18
+ def symbols
19
+ %w(sym1 sym2)
20
+ end
21
+
22
+ # @override
23
+ def to_h
24
+ @an_enum
25
+ end
26
+ end
27
+
28
+ # Autogenerated Schema for Record at com.my-namespace.ARecord
29
+ class ARecord < Deimos::SchemaClass::Record
30
+ ### Attribute Accessors ###
31
+ # @param value [String]
32
+ attr_accessor :a_record_field
33
+
34
+ # @override
35
+ def initialize(a_record_field: nil)
36
+ super
37
+ self.a_record_field = a_record_field
38
+ end
39
+
40
+ # @override
41
+ def schema
42
+ 'ARecord'
43
+ end
44
+
45
+ # @override
46
+ def namespace
47
+ 'com.my-namespace'
48
+ end
49
+
50
+ # @override
51
+ def to_h
52
+ {
53
+ 'a_record_field' => @a_record_field
54
+ }
55
+ end
56
+ end
57
+
58
+ ### Primary Schema Class ###
59
+ # Autogenerated Schema for Record at com.my-namespace.Generated
60
+ class Generated < Deimos::SchemaClass::Record
61
+ ### Attribute Readers ###
62
+ # @return [AnEnum]
63
+ attr_reader :an_enum
64
+ # @return [ARecord]
65
+ attr_reader :a_record
66
+
67
+ ### Attribute Accessors ###
68
+ # @param value [String]
69
+ attr_accessor :a_string
70
+ # @param value [Integer]
71
+ attr_accessor :a_int
72
+ # @param value [Integer]
73
+ attr_accessor :a_long
74
+ # @param value [Float]
75
+ attr_accessor :a_float
76
+ # @param value [Float]
77
+ attr_accessor :a_double
78
+ # @param value [nil, Integer]
79
+ attr_accessor :an_optional_int
80
+ # @param values [Array<Integer>]
81
+ attr_accessor :an_array
82
+ # @param values [Hash<String, String>]
83
+ attr_accessor :a_map
84
+ # @param value [String]
85
+ attr_accessor :timestamp
86
+ # @param value [String]
87
+ attr_accessor :message_id
88
+
89
+ ### Attribute Writers ###
90
+ # @param value [AnEnum]
91
+ def an_enum=(value)
92
+ @an_enum = AnEnum.initialize_from_value(value)
93
+ end
94
+
95
+ # @param value [ARecord]
96
+ def a_record=(value)
97
+ @a_record = ARecord.initialize_from_value(value)
98
+ end
99
+
100
+ # @override
101
+ def initialize(a_string: nil,
102
+ a_int: nil,
103
+ a_long: nil,
104
+ a_float: nil,
105
+ a_double: nil,
106
+ an_optional_int: nil,
107
+ an_enum: nil,
108
+ an_array: nil,
109
+ a_map: nil,
110
+ timestamp: nil,
111
+ message_id: nil,
112
+ a_record: nil)
113
+ super
114
+ self.a_string = a_string
115
+ self.a_int = a_int
116
+ self.a_long = a_long
117
+ self.a_float = a_float
118
+ self.a_double = a_double
119
+ self.an_optional_int = an_optional_int
120
+ self.an_enum = an_enum
121
+ self.an_array = an_array
122
+ self.a_map = a_map
123
+ self.timestamp = timestamp
124
+ self.message_id = message_id
125
+ self.a_record = a_record
126
+ end
127
+
128
+ # @override
129
+ def schema
130
+ 'Generated'
131
+ end
132
+
133
+ # @override
134
+ def namespace
135
+ 'com.my-namespace'
136
+ end
137
+
138
+ # @override
139
+ def to_h
140
+ {
141
+ 'a_string' => @a_string,
142
+ 'a_int' => @a_int,
143
+ 'a_long' => @a_long,
144
+ 'a_float' => @a_float,
145
+ 'a_double' => @a_double,
146
+ 'an_optional_int' => @an_optional_int,
147
+ 'an_enum' => @an_enum&.to_h,
148
+ 'an_array' => @an_array,
149
+ 'a_map' => @a_map,
150
+ 'timestamp' => @timestamp,
151
+ 'message_id' => @message_id,
152
+ 'a_record' => @a_record&.to_h
153
+ }
154
+ end
155
+ end
156
+ end