deimos-ruby 1.13.0 → 1.13.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c57c2700b01b998f358cb4e96ee6e6b2c1c8c32936d741b2371182a6017f7adc
4
- data.tar.gz: 440bf25b629ba34da51cd1c0a1b443858bcd4ca270fed800b6e277c050b0741f
3
+ metadata.gz: 2fe5f643562c8cebecd6991d31222c3809115cee282b2f8fcef0e36b1b19f972
4
+ data.tar.gz: a9de46de1265d73a7d94e94f24c43a0c210687b93f4862a7a2fefee73c40fb89
5
5
  SHA512:
6
- metadata.gz: 05df77f7f8890959ea91817a7497c11348d3b68f349462275a1ffb133a1c8194d9ee2282ac3dbe14a389bd09f16f059c88b467c05fb959c1a334b7c3789ade92
7
- data.tar.gz: bc8b8c832a7399a6c60a4a0ac71582aff4ff324d5a2c9bb2a73241bb64de3a958d09208e1c127d36e8b3c47077857224ec853aaea769ef00aaef88dc6e6cf0e9
6
+ metadata.gz: 0365bcefe9cd82d91bf9f5eb587f6f72725f0ef981336722571465e8308d615b69fabc7516755761ebdad473ba1b8e0027e1546a81076d1bdf5c9c8cfe5e9d0f
7
+ data.tar.gz: 5e4f15b372217ac878b9c82ab606c90e16a0a370947956bef2b6aae5ffa4ac8c4739ff74e10d7bf442c29968ee0bba0135624d7be2966d51b85d8c777f2e2573
data/CHANGELOG.md CHANGED
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ # 1.13.1 - 2022-04-06
11
+
12
+ - Fix circular reference schema generation
13
+
10
14
  # 1.13.0 - 2022-03-30
11
15
 
12
16
  - Pass the Deimos logger to `AvroTurf::Messaging` for consistent logging
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Deimos
4
- VERSION = '1.13.0'
4
+ VERSION = '1.13.1'
5
5
  end
@@ -63,7 +63,7 @@ module Deimos
63
63
  elsif schema.respond_to?(:items)
64
64
  [schema.items]
65
65
  elsif schema.respond_to?(:schemas)
66
- schema.schemas
66
+ schema.schemas.reject { |s| s.class == Avro::Schema::PrimitiveSchema }
67
67
  else
68
68
  []
69
69
  end
@@ -73,14 +73,19 @@ module Deimos
73
73
  # @return [Array<Avro::Schema::NamedSchema>]
74
74
  def collect_all_schemas(schemas)
75
75
  schemas.dup.each do |schema|
76
+ next if @discovered_schemas.include?(schema)
77
+
78
+ @discovered_schemas << schema
76
79
  schemas.concat(collect_all_schemas(child_schemas(schema)))
77
80
  end
81
+
78
82
  schemas.select { |s| s.respond_to?(:name) }.uniq
79
83
  end
80
84
 
81
85
  # @param schema_base [Deimos::SchemaBackends::Base]
82
86
  # @param key_schema_base[Avro::Schema::NamedSchema]
83
87
  def generate_class_from_schema_base(schema_base, key_schema_base: nil)
88
+ @discovered_schemas = Set.new
84
89
  schemas = collect_all_schemas(schema_base.schema_store.schemas.values)
85
90
 
86
91
  sub_schemas = schemas.reject { |s| s.name == schema_base.schema }
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ # For testing the generated class.
4
+ RSpec.describe Schemas::MySchemaWithCircularReference do
5
+ let(:payload_hash) do
6
+ {
7
+ properties: {
8
+ a_boolean: {
9
+ property: true
10
+ },
11
+ an_integer: {
12
+ property: 1
13
+ },
14
+ a_float: {
15
+ property: 4.5
16
+ },
17
+ a_string: {
18
+ property: 'string'
19
+ },
20
+ an_array: {
21
+ property: [1, 2, 3]
22
+ },
23
+ an_hash: {
24
+ property: {
25
+ a_key: 'a_value'
26
+ }
27
+ }
28
+ }
29
+ }
30
+ end
31
+
32
+ describe 'class initialization' do
33
+ it 'should initialize the class from keyword arguments' do
34
+ klass = described_class.new(properties: payload_hash[:properties])
35
+ expect(klass).to be_instance_of(described_class)
36
+ end
37
+
38
+ it 'should initialize the class from a hash with symbols as keys' do
39
+ klass = described_class.new(**payload_hash)
40
+ expect(klass).to be_instance_of(described_class)
41
+ end
42
+
43
+ it 'should initialize the class when missing attributes' do
44
+ payload_hash.delete(:properties)
45
+ klass = described_class.new(**payload_hash)
46
+ expect(klass).to be_instance_of(described_class)
47
+ end
48
+
49
+ end
50
+
51
+ describe 'base class methods' do
52
+ let(:klass) do
53
+ described_class.new(**payload_hash)
54
+ end
55
+
56
+ it 'should return the name of the schema and namespace' do
57
+ expect(klass.schema).to eq('MySchemaWithCircularReference')
58
+ expect(klass.namespace).to eq('com.my-namespace')
59
+ expect(klass.full_schema).to eq('com.my-namespace.MySchemaWithCircularReference')
60
+ end
61
+
62
+ it 'should return a json version of the payload' do
63
+ described_class.new(**payload_hash)
64
+ payload_h = {
65
+ 'properties' => {
66
+ 'a_boolean' => {
67
+ 'property' => true
68
+ },
69
+ 'an_integer' => {
70
+ 'property' => 1
71
+ },
72
+ 'a_float' => {
73
+ 'property' => 4.5
74
+ },
75
+ 'a_string' => {
76
+ 'property' => 'string'
77
+ },
78
+ 'an_array' => {
79
+ 'property' => [1, 2, 3]
80
+ },
81
+ 'an_hash' => {
82
+ 'property' => {
83
+ 'a_key' => 'a_value'
84
+ }
85
+ }
86
+ }
87
+ }
88
+
89
+ expect(klass.as_json).to eq(payload_h)
90
+ end
91
+
92
+ it 'should return a JSON string of the payload' do
93
+ s = '{"properties":{"a_boolean":{"property":true},"an_integer":{"property":1},"a_float":{"property":4.5},"a_string":{"property":"string"},"an_array":{"property":[1,2,3]},"an_hash":{"property":{"a_key":"a_value"}}}}'
94
+ expect(klass.to_json).to eq(s)
95
+ end
96
+ end
97
+ end
@@ -73,6 +73,32 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
73
73
  end
74
74
  end
75
75
 
76
+ context 'with a Consumers Schema with a circular reference' do
77
+ before(:each) do
78
+ Deimos.configure do
79
+ consumer do
80
+ class_name 'ConsumerTest::MyConsumer'
81
+ topic 'MyTopic'
82
+ schema 'MySchemaWithCircularReference'
83
+ namespace 'com.my-namespace'
84
+ key_config field: :a_string
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(1)
92
+ end
93
+
94
+ it 'should generate a schema class for my_schema_with_circular_reference' do
95
+ generated_path = files.select { |f| f =~ /my_schema_with_circular_reference/ }.first
96
+ expected_path = expected_files.select { |f| f =~ /my_schema_with_circular_reference/ }.first
97
+
98
+ expect(File.read(generated_path)).to eq(File.read(expected_path))
99
+ end
100
+ end
101
+
76
102
  context 'with a Producers Schema and a Key' do
77
103
  before(:each) do
78
104
  Deimos.configure do
@@ -0,0 +1,74 @@
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 Record at com.my-namespace.Property
7
+ class Property < Deimos::SchemaClass::Record
8
+ ### Attribute Accessors ###
9
+ # @param value [Boolean, Integer, Integer, Float, Float, String, Array<Property>, Hash<String, Property>]
10
+ attr_accessor :property
11
+
12
+ # @override
13
+ def initialize(property: nil)
14
+ super
15
+ self.property = property
16
+ end
17
+
18
+ # @override
19
+ def schema
20
+ 'Property'
21
+ end
22
+
23
+ # @override
24
+ def namespace
25
+ 'com.my-namespace'
26
+ end
27
+
28
+ # @override
29
+ def to_h
30
+ {
31
+ 'property' => @property
32
+ }
33
+ end
34
+ end
35
+
36
+ ### Primary Schema Class ###
37
+ # Autogenerated Schema for Record at com.my-namespace.MySchemaWithCircularReference
38
+ class MySchemaWithCircularReference < Deimos::SchemaClass::Record
39
+ ### Attribute Readers ###
40
+ # @return [Hash<String, Property>]
41
+ attr_reader :properties
42
+
43
+ ### Attribute Writers ###
44
+ # @param values [Hash<String, Property>]
45
+ def properties=(values)
46
+ @properties = values.transform_values do |value|
47
+ Property.initialize_from_value(value)
48
+ end
49
+ end
50
+
51
+ # @override
52
+ def initialize(properties: {})
53
+ super
54
+ self.properties = properties
55
+ end
56
+
57
+ # @override
58
+ def schema
59
+ 'MySchemaWithCircularReference'
60
+ end
61
+
62
+ # @override
63
+ def namespace
64
+ 'com.my-namespace'
65
+ end
66
+
67
+ # @override
68
+ def to_h
69
+ {
70
+ 'properties' => @properties.transform_values { |v| v&.to_h }
71
+ }
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,39 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "MySchemaWithCircularReference",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "default": {},
8
+ "name": "properties",
9
+ "type": {
10
+ "type": "map",
11
+ "values": {
12
+ "fields": [
13
+ {
14
+ "name": "property",
15
+ "type": [
16
+ "boolean",
17
+ "int",
18
+ "long",
19
+ "float",
20
+ "double",
21
+ "string",
22
+ {
23
+ "items": "Property",
24
+ "type": "array"
25
+ },
26
+ {
27
+ "type": "map",
28
+ "values": "Property"
29
+ }
30
+ ]
31
+ }
32
+ ],
33
+ "name": "Property",
34
+ "type": "record"
35
+ }
36
+ }
37
+ }
38
+ ]
39
+ }
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.13.0
4
+ version: 1.13.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Orner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-30 00:00:00.000000000 Z
11
+ date: 2022-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro_turf
@@ -463,6 +463,7 @@ files:
463
463
  - spec/consumer_spec.rb
464
464
  - spec/deimos_spec.rb
465
465
  - spec/generators/active_record_generator_spec.rb
466
+ - spec/generators/schema_class/my_schema_with_circular_reference_spec.rb
466
467
  - spec/generators/schema_class/my_schema_with_complex_types_spec.rb
467
468
  - spec/generators/schema_class_generator_spec.rb
468
469
  - spec/handlers/my_batch_consumer.rb
@@ -484,12 +485,14 @@ files:
484
485
  - spec/schema_classes/my_nested_schema.rb
485
486
  - spec/schema_classes/my_schema.rb
486
487
  - spec/schema_classes/my_schema_key.rb
488
+ - spec/schema_classes/my_schema_with_circular_reference.rb
487
489
  - spec/schema_classes/my_schema_with_complex_types.rb
488
490
  - spec/schemas/com/my-namespace/Generated.avsc
489
491
  - spec/schemas/com/my-namespace/MyNestedSchema.avsc
490
492
  - spec/schemas/com/my-namespace/MySchema.avsc
491
493
  - spec/schemas/com/my-namespace/MySchemaCompound_key.avsc
492
494
  - spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
495
+ - spec/schemas/com/my-namespace/MySchemaWithCircularReference.avsc
493
496
  - spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
494
497
  - spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
495
498
  - spec/schemas/com/my-namespace/MySchemaWithId.avsc
@@ -554,6 +557,7 @@ test_files:
554
557
  - spec/consumer_spec.rb
555
558
  - spec/deimos_spec.rb
556
559
  - spec/generators/active_record_generator_spec.rb
560
+ - spec/generators/schema_class/my_schema_with_circular_reference_spec.rb
557
561
  - spec/generators/schema_class/my_schema_with_complex_types_spec.rb
558
562
  - spec/generators/schema_class_generator_spec.rb
559
563
  - spec/handlers/my_batch_consumer.rb
@@ -575,12 +579,14 @@ test_files:
575
579
  - spec/schema_classes/my_nested_schema.rb
576
580
  - spec/schema_classes/my_schema.rb
577
581
  - spec/schema_classes/my_schema_key.rb
582
+ - spec/schema_classes/my_schema_with_circular_reference.rb
578
583
  - spec/schema_classes/my_schema_with_complex_types.rb
579
584
  - spec/schemas/com/my-namespace/Generated.avsc
580
585
  - spec/schemas/com/my-namespace/MyNestedSchema.avsc
581
586
  - spec/schemas/com/my-namespace/MySchema.avsc
582
587
  - spec/schemas/com/my-namespace/MySchemaCompound_key.avsc
583
588
  - spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
589
+ - spec/schemas/com/my-namespace/MySchemaWithCircularReference.avsc
584
590
  - spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
585
591
  - spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
586
592
  - spec/schemas/com/my-namespace/MySchemaWithId.avsc