deimos-ruby 1.13.3 → 1.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/README.md +6 -0
  4. data/deimos-ruby.gemspec +1 -0
  5. data/lib/deimos/config/configuration.rb +4 -0
  6. data/lib/deimos/schema_backends/avro_base.rb +1 -1
  7. data/lib/deimos/version.rb +1 -1
  8. data/lib/generators/deimos/schema_class/templates/schema_class.rb.tt +0 -7
  9. data/lib/generators/deimos/schema_class/templates/schema_record.rb.tt +10 -1
  10. data/lib/generators/deimos/schema_class_generator.rb +19 -7
  11. data/spec/generators/active_record_generator_spec.rb +4 -2
  12. data/spec/generators/schema_class/my_schema_with_complex_types_spec.rb +37 -24
  13. data/spec/generators/schema_class_generator_spec.rb +93 -55
  14. data/spec/producer_spec.rb +1 -1
  15. data/spec/schemas/generated.rb +159 -0
  16. data/spec/schemas/my_nested_schema.rb +117 -0
  17. data/spec/{schema_classes → schemas}/my_schema.rb +1 -0
  18. data/spec/{schema_classes → schemas}/my_schema_key.rb +1 -0
  19. data/spec/schemas/my_schema_with_circular_reference.rb +77 -0
  20. data/spec/schemas/my_schema_with_complex_type.rb +239 -0
  21. data/spec/{schema_classes/generated.rb → snapshots/consumers-no-nest.snap} +20 -1
  22. data/spec/snapshots/consumers.snap +161 -0
  23. data/spec/snapshots/consumers_and_producers-no-nest.snap +397 -0
  24. data/spec/snapshots/consumers_and_producers.snap +377 -0
  25. data/spec/{schema_classes/my_schema_with_circular_reference.rb → snapshots/consumers_circular-no-nest.snap} +37 -26
  26. data/spec/snapshots/consumers_circular.snap +79 -0
  27. data/spec/{schema_classes/my_schema_with_complex_types.rb → snapshots/consumers_complex_types-no-nest.snap} +57 -22
  28. data/spec/snapshots/consumers_complex_types.snap +241 -0
  29. data/spec/{schema_classes/my_nested_schema.rb → snapshots/consumers_nested-no-nest.snap} +12 -1
  30. data/spec/snapshots/consumers_nested.snap +119 -0
  31. data/spec/snapshots/producers_with_key-no-nest.snap +95 -0
  32. data/spec/snapshots/producers_with_key.snap +95 -0
  33. data/spec/spec_helper.rb +4 -1
  34. metadata +52 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 59719a901339d9ebf5806a71e960fc68a7e75a1a217e6003215a42db04edb261
4
- data.tar.gz: f9e8f274825a78298779061cf279b563d7ec40948e34ceff4458a51f51dea6b2
3
+ metadata.gz: c810f924fa9af51458b4c30e0d6b9101e05094713b3550190f60d7e088119cf0
4
+ data.tar.gz: 027e3362abf78a4f60cd2613956b8920e537a28f34fcd3c02f94d48648b85b5b
5
5
  SHA512:
6
- metadata.gz: 62489d41c135b8141b45cf2a3b71717fc41bed0a22b26cfadd5ad22635d1f3a4ca770f7321cf5205159dd0a1f879ea6a9628623b3c5c3d9205a533d179ba7b52
7
- data.tar.gz: 689f66152efe31e6b65c0eea5db5471c2a927708ca2bdcad9a859b32b85ecf1f789efefbee71059d9351c2b7a332b90be093330fd3e5be375d3c0a92b44c7837
6
+ metadata.gz: 8b2a64227cf35a8e86f7ad1b142f25bfce7d1c0e9c5e0bded07f6058b811609f4a315c3f48903a672093a1084c0a7c395198e4524d629b9610995a2629959550
7
+ data.tar.gz: 80ad055761417ad27f5be9c7a6fd2ffdeaed5b3e2aaf7b0d6b6956d4567f60f4f0d7f7dda9e24640ef67d5e3636f7c9ef0b176de342ceb254840b41ce2639ce0
data/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ # 1.14.0 - 2022-05-16
11
+
12
+ - **Breaking Change**: Nest sub-schemas by default into their parent schemas when generating classes.
13
+ - Add the `nest_child_schemas` option to essentially bring back the previous behavior in terms of code use (the actual classes will be separated out into different files).
14
+
15
+ # 1.13.3 - 2022-05-10
16
+
10
17
  - Some cleanup on the active_record generator
11
18
  - Fix crash with `test_consume_message` when using schema classes
12
19
  - Add `[]=` and `merge` methods on the base schema class
data/README.md CHANGED
@@ -818,6 +818,12 @@ Add the following configurations to start using generated schema classes in your
818
818
  Additionally, you can enable or disable the usage of schema classes for a particular consumer or producer with the
819
819
  `use_schema_classes` config. See [Configuration](./docs/CONFIGURATION.md#defining-producers).
820
820
 
821
+ Note that if you have a schema in your repo but have not configured a producer or consumer, the generator will **not** generate a schema class for it. This is because you need to supply the `key_config` for the generator to know how to handle the schema key.
822
+
823
+ One additional configuration option indicates whether nested records should be generated as top-level classes or would remain nested inside the generated class for its parent schema. The default is to nest them, as a flattened structure can have one sub-schema clobber another sub-schema defined in a different top-level schema.
824
+
825
+ config.schema.nest_child_schemas = false # Flatten all classes into one directory
826
+
821
827
  ### Consumer
822
828
 
823
829
  The consumer interface uses the `decode_message` method to turn JSON hash into the Schemas
data/deimos-ruby.gemspec CHANGED
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency('rspec', '~> 3')
40
40
  spec.add_development_dependency('rspec_junit_formatter', '~>0.3')
41
41
  spec.add_development_dependency('rspec-rails', '~> 4')
42
+ spec.add_development_dependency('rspec-snapshot', '~> 2.0')
42
43
  spec.add_development_dependency('rubocop', '0.89.0')
43
44
  spec.add_development_dependency('rubocop-rspec', '1.42.0')
44
45
  spec.add_development_dependency('sqlite3', '~> 1.3')
@@ -343,6 +343,10 @@ module Deimos
343
343
  # Set to true to use the generated schema classes in your application
344
344
  # @return [Boolean]
345
345
  setting :use_schema_classes, false
346
+
347
+ # Set to false to generate child schemas as their own files.
348
+ # @return [Boolean]
349
+ setting :nest_child_schemas, true
346
350
  end
347
351
 
348
352
  # The configured metrics provider.
@@ -96,7 +96,7 @@ module Deimos
96
96
  # @param schema [Avro::Schema::NamedSchema] A named schema
97
97
  # @return [String]
98
98
  def self.schema_classname(schema)
99
- schema.name.underscore.camelize
99
+ schema.name.underscore.camelize.singularize
100
100
  end
101
101
 
102
102
  # Converts Avro::Schema::NamedSchema's to String form for generated YARD docs.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Deimos
4
- VERSION = '1.13.3'
4
+ VERSION = '1.14.0'
5
5
  end
@@ -2,13 +2,6 @@
2
2
 
3
3
  # This file is autogenerated by Deimos, Do NOT modify
4
4
  module Schemas
5
- <% if @sub_schema_templates.present? && @sub_schema_templates.any? -%>
6
- ### Secondary Schema Classes ###
7
- <% end -%>
8
- <%- @sub_schema_templates.each do |schema_template| -%>
9
- <%=- schema_template %>
10
-
11
- <%- end -%>
12
5
  ### Primary Schema Class ###
13
6
  <%=- @main_class_definition -%>
14
7
 
@@ -1,6 +1,15 @@
1
1
  # Autogenerated Schema for Record at <%= @current_schema.namespace %>.<%= @current_schema.name %>
2
2
  class <%= Deimos::SchemaBackends::AvroBase.schema_classname(@current_schema) %> < Deimos::SchemaClass::Record
3
- <%- if @field_assignments.select{ |h| h[:is_schema_class] }.any? -%>
3
+ <% if @sub_schema_templates.present? -%>
4
+
5
+ ### Secondary Schema Classes ###
6
+ <%- @sub_schema_templates.each do |schema_template| -%>
7
+ <%=- schema_template.gsub(/^/, " ") %>
8
+
9
+ <%- end -%>
10
+ <% end -%>
11
+
12
+ <%- if @field_assignments.select{ |h| h[:is_schema_class] }.any? -%>
4
13
  ### Attribute Readers ###
5
14
  <%- @field_assignments.select{ |h| h[:is_schema_class] }.each do |method_definition| -%>
6
15
  # @return [<%= method_definition[:deimos_type] %>]
@@ -86,20 +86,32 @@ module Deimos
86
86
  # @param key_schema_base[Avro::Schema::NamedSchema]
87
87
  def generate_class_from_schema_base(schema_base, key_schema_base: nil)
88
88
  @discovered_schemas = Set.new
89
+ @sub_schema_templates = []
89
90
  schemas = collect_all_schemas(schema_base.schema_store.schemas.values)
90
91
 
92
+ main_schema = schemas.find { |s| s.name == schema_base.schema }
91
93
  sub_schemas = schemas.reject { |s| s.name == schema_base.schema }.sort_by(&:name)
92
- @sub_schema_templates = sub_schemas.map do |schema|
93
- _generate_class_template_from_schema(schema)
94
+ if Deimos.config.schema.nest_child_schemas
95
+ @sub_schema_templates = sub_schemas.map do |schema|
96
+ _generate_class_template_from_schema(schema)
97
+ end
98
+ write_file(main_schema, key_schema_base)
99
+ else
100
+ write_file(main_schema, key_schema_base)
101
+ sub_schemas.each do |schema|
102
+ write_file(schema, nil)
103
+ end
94
104
  end
105
+ end
95
106
 
96
- main_schema = schemas.find { |s| s.name == schema_base.schema }
97
- class_template = _generate_class_template_from_schema(main_schema, key_schema_base)
107
+ # @param schema [Avro::Schema::NamedSchema]
108
+ # @param key_schema_base [Avro::Schema::NamedSchema, nil]
109
+ def write_file(schema, key_schema_base)
110
+ class_template = _generate_class_template_from_schema(schema, key_schema_base)
98
111
  @main_class_definition = class_template
99
112
 
100
- file_prefix = main_schema.name.underscore
101
- namespace_path = main_schema.namespace.tr('.', '/')
102
- filename = "#{Deimos.config.schema.generated_class_path}/#{namespace_path}/#{file_prefix}.rb"
113
+ file_prefix = schema.name.underscore.singularize
114
+ filename = "#{Deimos.config.schema.generated_class_path}/#{file_prefix}.rb"
103
115
  template(SCHEMA_CLASS_FILE, filename, force: true)
104
116
  end
105
117
 
@@ -33,9 +33,11 @@ RSpec.describe Deimos::Generators::ActiveRecordGenerator do
33
33
  t.json :an_array
34
34
  t.json :a_map
35
35
  t.json :a_record
36
+
37
+ t.timestamps
38
+
39
+ # TODO add indexes as necessary
36
40
  end
37
-
38
- # TODO add indexes as necessary
39
41
  end
40
42
 
41
43
  def down
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # For testing the generated class.
4
- RSpec.describe Schemas::MySchemaWithComplexTypes do
4
+ RSpec.describe Schemas::MySchemaWithComplexType do
5
5
  let(:payload_hash) do
6
6
  {
7
7
  test_id: 'test id',
@@ -9,16 +9,16 @@ RSpec.describe Schemas::MySchemaWithComplexTypes do
9
9
  test_string_array: %w(abc def),
10
10
  test_int_array: [123, 456],
11
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')],
12
+ some_record: Schemas::MySchemaWithComplexType::ARecord.new(a_record_field: 'field 1'),
13
+ some_optional_record: Schemas::MySchemaWithComplexType::ARecord.new(a_record_field: 'field 2'),
14
+ some_record_array: [Schemas::MySchemaWithComplexType::ARecord.new(a_record_field: 'field 3'),
15
+ Schemas::MySchemaWithComplexType::ARecord.new(a_record_field: 'field 4')],
16
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')
17
+ 'record_1' => Schemas::MySchemaWithComplexType::ARecord.new(a_record_field: 'field 5'),
18
+ 'record_2' => Schemas::MySchemaWithComplexType::ARecord.new(a_record_field: 'field 6')
19
19
  },
20
- some_enum_array: [Schemas::AnEnum.new('sym1'),
21
- Schemas::AnEnum.new('sym2')]
20
+ some_enum_array: [Schemas::MySchemaWithComplexType::AnEnum.new('sym1'),
21
+ Schemas::MySchemaWithComplexType::AnEnum.new('sym2')]
22
22
  }
23
23
  end
24
24
 
@@ -57,7 +57,9 @@ RSpec.describe Schemas::MySchemaWithComplexTypes do
57
57
  end
58
58
 
59
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 some_optional_enum some_enum_with_default)
60
+ %w(test_id test_float test_int_array test_optional_int test_string_array some_integer_map
61
+ some_record some_optional_record some_record_array some_record_map some_enum_array
62
+ some_optional_enum some_enum_with_default)
61
63
  end
62
64
 
63
65
  it 'should return the name of the schema and namespace' do
@@ -113,7 +115,8 @@ RSpec.describe Schemas::MySchemaWithComplexTypes do
113
115
  it 'should set some_record if it is not provided' do
114
116
  payload_hash.delete(:some_record)
115
117
  klass = described_class.new(**payload_hash)
116
- expect(klass.some_record).to eq(Schemas::ARecord.new(a_record_field: 'Test String'))
118
+ expect(klass.some_record).
119
+ to eq(Schemas::MySchemaWithComplexType::ARecord.new(a_record_field: 'Test String'))
117
120
  end
118
121
 
119
122
  it 'should set some_record to nil' do
@@ -136,25 +139,26 @@ RSpec.describe Schemas::MySchemaWithComplexTypes do
136
139
 
137
140
  it 'should get the value of some_record_array' do
138
141
  some_record_array = klass.some_record_array
139
- expect(some_record_array.first).to be_instance_of(Schemas::ARecord)
142
+ expect(some_record_array.first).to be_instance_of(Schemas::MySchemaWithComplexType::ARecord)
140
143
  expect(some_record_array.first.a_record_field).to eq('field 3')
141
144
  end
142
145
 
143
146
  it 'should get the value of some_record_map' do
144
147
  some_record_map = klass.some_record_map
145
- expect(some_record_map['record_1']).to be_instance_of(Schemas::ARecord)
148
+ expect(some_record_map['record_1']).
149
+ to be_instance_of(Schemas::MySchemaWithComplexType::ARecord)
146
150
  expect(some_record_map['record_1'].a_record_field).to eq('field 5')
147
151
  end
148
152
 
149
153
  it 'should get the value of some_enum_array' do
150
154
  some_enum_array = klass.some_enum_array
151
- expect(some_enum_array.first).to be_instance_of(Schemas::AnEnum)
155
+ expect(some_enum_array.first).to be_instance_of(Schemas::MySchemaWithComplexType::AnEnum)
152
156
  expect(some_enum_array.first.an_enum).to eq('sym1')
153
157
  end
154
158
 
155
159
  it 'should get the value of some_record' do
156
160
  record = klass.some_record
157
- expect(record).to be_instance_of(Schemas::ARecord)
161
+ expect(record).to be_instance_of(Schemas::MySchemaWithComplexType::ARecord)
158
162
  expect(record.a_record_field).to eq('field 1')
159
163
  expect(record.to_h).to eq({ 'a_record_field' => 'field 1' })
160
164
  end
@@ -175,33 +179,42 @@ RSpec.describe Schemas::MySchemaWithComplexTypes do
175
179
  end
176
180
 
177
181
  it 'should modify the value of some_optional_record' do
178
- expect(klass.some_optional_record).to eq(Schemas::ARecord.new(a_record_field: 'field 2'))
179
- klass.some_optional_record = Schemas::ARecord.new(a_record_field: 'new field')
182
+ expect(klass.some_optional_record).
183
+ to eq(Schemas::MySchemaWithComplexType::ARecord.new(a_record_field: 'field 2'))
184
+ klass.some_optional_record = Schemas::MySchemaWithComplexType::ARecord.
185
+ new(a_record_field: 'new field')
180
186
 
181
- expect(klass.some_optional_record).to eq(Schemas::ARecord.new(a_record_field: 'new field'))
187
+ expect(klass.some_optional_record).to eq(Schemas::MySchemaWithComplexType::ARecord.
188
+ new(a_record_field: 'new field'))
182
189
  expect(klass.some_optional_record.as_json).to eq({ 'a_record_field' => 'new field' })
183
190
  end
184
191
 
185
192
  it 'should accept a hash object inner records' do
186
193
  klass.some_optional_record = { a_record_field: 'new field' }
187
- expect(klass.some_optional_record).to eq(Schemas::ARecord.new(a_record_field: 'new field'))
194
+ expect(klass.some_optional_record).to eq(Schemas::MySchemaWithComplexType::ARecord.
195
+ new(a_record_field: 'new field'))
188
196
  expect(klass.some_optional_record.as_json).to eq({ 'a_record_field' => 'new field' })
189
197
  end
190
198
 
191
199
  it 'should modify the value of some_enum_array' do
192
200
  klass.some_enum_array.first.an_enum = 'new_sym'
193
- expect(klass.some_enum_array.first).to eq(Schemas::AnEnum.new('new_sym'))
201
+ expect(klass.some_enum_array.first).
202
+ to eq(Schemas::MySchemaWithComplexType::AnEnum.new('new_sym'))
194
203
 
195
- klass.some_enum_array.second.an_enum = Schemas::AnEnum.new('other_sym')
204
+ klass.some_enum_array.second.an_enum = Schemas::MySchemaWithComplexType::AnEnum.
205
+ new('other_sym')
196
206
  expect(klass.some_enum_array.second.an_enum).to eq('other_sym')
197
207
  end
198
208
 
199
209
  it 'should modify the value of some_record_map' do
200
210
  klass.some_record_map['record_1'].a_record_field = 'new field'
201
- expect(klass.some_record_map['record_1']).to eq(Schemas::ARecord.new(a_record_field: 'new field'))
211
+ expect(klass.some_record_map['record_1']).to eq(Schemas::MySchemaWithComplexType::ARecord.
212
+ new(a_record_field: 'new field'))
202
213
 
203
- klass.some_record_map['record_2'] = Schemas::ARecord.new(a_record_field: 'other field')
204
- expect(klass.some_record_map['record_2']).to eq(Schemas::ARecord.new(a_record_field: 'other field'))
214
+ klass.some_record_map['record_2'] = Schemas::MySchemaWithComplexType::ARecord.
215
+ new(a_record_field: 'other field')
216
+ expect(klass.some_record_map['record_2']).to eq(Schemas::MySchemaWithComplexType::ARecord.
217
+ new(a_record_field: 'other field'))
205
218
  end
206
219
  end
207
220
  end
@@ -3,22 +3,27 @@
3
3
  require 'generators/deimos/schema_class_generator'
4
4
  require 'fileutils'
5
5
 
6
+ class MultiFileSerializer
7
+ def dump(value)
8
+ value.keys.sort.map { |k| "#{k}:\n#{value[k]}\n" }.join("\n")
9
+ end
10
+ end
11
+
6
12
  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"] }
13
+ let(:schema_class_path) { 'spec/app/lib/schema_classes' }
14
+ let(:files) { Dir["#{schema_class_path}/*.rb"].map { |f| [f, File.read(f)]}.to_h }
10
15
 
11
16
  before(:each) do
12
17
  Deimos.config.reset!
13
18
  Deimos.configure do
14
19
  schema.path 'spec/schemas/'
15
- schema.generated_class_path 'app/lib/schema_classes'
20
+ schema.generated_class_path 'spec/app/lib/schema_classes'
16
21
  schema.backend :avro_local
17
22
  end
18
23
  end
19
24
 
20
25
  after(:each) do
21
- FileUtils.rm_rf(schema_class_path) if File.exist?(schema_class_path)
26
+ FileUtils.rm_rf('spec/app') if File.exist?('spec/app')
22
27
  end
23
28
 
24
29
  context 'with a Consumers Schema' do
@@ -32,19 +37,26 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
32
37
  key_config field: :a_string
33
38
  end
34
39
  end
35
- described_class.start
36
40
  end
37
41
 
38
- it 'should generate the correct number of classes' do
39
- expect(files.length).to eq(1)
42
+ context 'nested true' do
43
+ it 'should generate the correct classes' do
44
+ Deimos.with_config('schema.nest_child_schemas' => true) do
45
+ described_class.start
46
+ expect(files).to match_snapshot('consumers', snapshot_serializer: MultiFileSerializer)
47
+ end
48
+ end
40
49
  end
41
50
 
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))
51
+ context 'nested false' do
52
+ it 'should generate the correct classes' do
53
+ Deimos.with_config('schema.nest_child_schemas' => false) do
54
+ described_class.start
55
+ expect(files).to match_snapshot('consumers-no-nest', snapshot_serializer: MultiFileSerializer)
56
+ end
57
+ end
47
58
  end
59
+
48
60
  end
49
61
 
50
62
  context 'with a Consumers Schema with Complex types' do
@@ -58,18 +70,24 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
58
70
  key_config field: :a_string
59
71
  end
60
72
  end
61
- described_class.start
62
73
  end
63
74
 
64
- it 'should generate the correct number of classes' do
65
- expect(files.length).to eq(1)
75
+ context 'nested true' do
76
+ it 'should generate the correct classes' do
77
+ Deimos.with_config('schema.nest_child_schemas' => true) do
78
+ described_class.start
79
+ expect(files).to match_snapshot('consumers_complex_types', snapshot_serializer: MultiFileSerializer)
80
+ end
81
+ end
66
82
  end
67
83
 
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))
84
+ context 'nested false' do
85
+ it 'should generate the correct classes' do
86
+ Deimos.with_config('schema.nest_child_schemas' => false) do
87
+ described_class.start
88
+ expect(files).to match_snapshot('consumers_complex_types-no-nest', snapshot_serializer: MultiFileSerializer)
89
+ end
90
+ end
73
91
  end
74
92
  end
75
93
 
@@ -84,18 +102,24 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
84
102
  key_config field: :a_string
85
103
  end
86
104
  end
87
- described_class.start
88
105
  end
89
106
 
90
- it 'should generate the correct number of classes' do
91
- expect(files.length).to eq(1)
107
+ context 'nested true' do
108
+ it 'should generate the correct classes' do
109
+ Deimos.with_config('schema.nest_child_schemas' => true) do
110
+ described_class.start
111
+ expect(files).to match_snapshot('consumers_circular', snapshot_serializer: MultiFileSerializer)
112
+ end
113
+ end
92
114
  end
93
115
 
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))
116
+ context 'nested false' do
117
+ it 'should generate the correct classes' do
118
+ Deimos.with_config('schema.nest_child_schemas' => false) do
119
+ described_class.start
120
+ expect(files).to match_snapshot('consumers_circular-no-nest', snapshot_serializer: MultiFileSerializer)
121
+ end
122
+ end
99
123
  end
100
124
  end
101
125
 
@@ -110,19 +134,23 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
110
134
  key_config schema: 'MySchema_key'
111
135
  end
112
136
  end
113
- described_class.start
114
137
  end
115
138
 
116
- it 'should generate the correct number of classes' do
117
- expect(files.length).to eq(2)
139
+ context 'nested true' do
140
+ it 'should generate the correct classes' do
141
+ Deimos.with_config('schema.nest_child_schemas' => true) do
142
+ described_class.start
143
+ expect(files).to match_snapshot('producers_with_key', snapshot_serializer: MultiFileSerializer)
144
+ end
145
+ end
118
146
  end
119
147
 
120
- %w(my_schema my_schema_key).each do |klass|
121
- it "should generate a schema class for #{klass}" do
122
- generated_path = files.select { |f| f =~ /#{klass}\.rb/ }.first
123
- expected_path = expected_files.select { |f| f =~ /#{klass}\.rb/ }.first
124
-
125
- expect(File.read(generated_path)).to eq(File.read(expected_path))
148
+ context 'nested false' do
149
+ it 'should generate the correct classes' do
150
+ Deimos.with_config('schema.nest_child_schemas' => false) do
151
+ described_class.start
152
+ expect(files).to match_snapshot('producers_with_key-no-nest', snapshot_serializer: MultiFileSerializer)
153
+ end
126
154
  end
127
155
  end
128
156
  end
@@ -138,18 +166,24 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
138
166
  key_config field: :test_id
139
167
  end
140
168
  end
141
- described_class.start
142
169
  end
143
170
 
144
- it 'should generate the correct number of classes' do
145
- expect(files.length).to eq(1)
171
+ context 'nested true' do
172
+ it 'should generate the correct classes' do
173
+ Deimos.with_config('schema.nest_child_schemas' => true) do
174
+ described_class.start
175
+ expect(files).to match_snapshot('consumers_nested', snapshot_serializer: MultiFileSerializer)
176
+ end
177
+ end
146
178
  end
147
179
 
148
- it 'should generate a schema class for my_nested_schema' do
149
- generated_path = files.select { |f| f =~ /my_nested_schema/ }.first
150
- expected_path = expected_files.select { |f| f =~ /my_nested_schema/ }.first
151
-
152
- expect(File.read(generated_path)).to eq(File.read(expected_path))
180
+ context 'nested false' do
181
+ it 'should generate the correct classes' do
182
+ Deimos.with_config('schema.nest_child_schemas' => false) do
183
+ described_class.start
184
+ expect(files).to match_snapshot('consumers_nested-no-nest', snapshot_serializer: MultiFileSerializer)
185
+ end
186
+ end
153
187
  end
154
188
  end
155
189
 
@@ -180,19 +214,23 @@ RSpec.describe Deimos::Generators::SchemaClassGenerator do
180
214
  key_config field: :test_id
181
215
  end
182
216
  end
183
- described_class.start
184
217
  end
185
218
 
186
- it 'should generate the correct number of classes' do
187
- expect(files.length).to eq(4)
219
+ context 'nested true' do
220
+ it 'should generate the correct classes' do
221
+ Deimos.with_config('schema.nest_child_schemas' => true) do
222
+ described_class.start
223
+ expect(files).to match_snapshot('consumers_and_producers', snapshot_serializer: MultiFileSerializer)
224
+ end
225
+ end
188
226
  end
189
227
 
190
- %w(generated my_schema my_schema_key my_nested_schema).each do |klass|
191
- it "should generate a schema class for #{klass}" do
192
- generated_path = files.select { |f| f =~ /#{klass}\.rb/ }.first
193
- expected_path = expected_files.select { |f| f =~ /#{klass}\.rb/ }.first
194
-
195
- expect(File.read(generated_path)).to eq(File.read(expected_path))
228
+ context 'nested false' do
229
+ it 'should generate the correct classes' do
230
+ Deimos.with_config('schema.nest_child_schemas' => false) do
231
+ described_class.start
232
+ expect(files).to match_snapshot('consumers_and_producers-no-nest', snapshot_serializer: MultiFileSerializer)
233
+ end
196
234
  end
197
235
  end
198
236
  end
@@ -476,7 +476,7 @@ module ProducerTest
476
476
  test_id: 'foo',
477
477
  test_float: BigDecimal('123.456'),
478
478
  test_array: ['1'],
479
- some_nested_record: Schemas::MyNestedRecord.new(
479
+ some_nested_record: Schemas::MyNestedSchema::MyNestedRecord.new(
480
480
  some_int: 123,
481
481
  some_float: BigDecimal('456.789'),
482
482
  some_string: '123',