avromatic 4.0.0 → 4.1.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: 6b0efb11db848986a5f33f4d499ac919bb1e217b8e1d0b06311f485a26f0c94a
4
- data.tar.gz: 2aee989c64a77e875894146a98ebdcd8a15409ba556b86a1d4bce9c18ee977fa
3
+ metadata.gz: 7bec6621c5d35e04596185542eaa4d96d00ef67f86f24b26378c68b22ecb3b3c
4
+ data.tar.gz: 1468ebd3138c5dc63a5d18d86dab5757df5c67109867628d1161b01ef70db1f3
5
5
  SHA512:
6
- metadata.gz: a84b530d3d65135ff5520e412cb8517062dfa964bc3cff4511f81d310429d6b804f93a392c5a6add8c9f7c278207ed38e19a0117b3e17b2dfec948ffb2a10748
7
- data.tar.gz: 7a1e707977d52b68b2bcd78de6bf8db5db097c7afc32493db2d242c1733aa1b3610d53fd640e68db0d23f9192f9e6e7910793512a6001b36976e700d66ae36ee
6
+ metadata.gz: da43c835a7f56011c1ed194bba7a02e5f98a190f65a8ce025b67f8a23d9a43093e2e64f83cdaf520d847c37ecf66cfd6ed276aee7f195a9f3f2b0c248967f5bf
7
+ data.tar.gz: 920048102d5947af69eca3d4e4c357adf9eefaebbd83e8d70190d29a6fb8d30c65072c97fda65613d9ebed32e127f98d9f4952e1e91e081963e61a480a002af3
data/.github/CODEOWNERS CHANGED
@@ -1 +1 @@
1
- * @jturkel @kphelps @tjwp
1
+ * @jturkel @tjwp @salsify/infrastructure-services
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # avromatic changelog
2
2
 
3
+ ## 4.1.1
4
+ - Fix eager loading of nested models when using the Zeitwerk classloader with Rails.
5
+
6
+ ## 4.1.0
7
+ - Add support for specifying a subject for the avro schema when building an Avromatic model
8
+
3
9
  ## 4.0.0
4
10
  - Drop support for Ruby 2.6.
5
11
  - Drop support for Avro 1.9.
data/README.md CHANGED
@@ -124,7 +124,7 @@ The Avro schema can be specified by name and loaded using the schema store:
124
124
 
125
125
  ```ruby
126
126
  class MyModel
127
- include Avromatic::Model.build(schema_name :my_model)
127
+ include Avromatic::Model.build(schema_name: :my_model)
128
128
  end
129
129
 
130
130
  # Construct instances by passing in a hash of attributes
@@ -156,12 +156,20 @@ class MyModel
156
156
  end
157
157
  ```
158
158
 
159
+ A specific subject name can be associated with the schema:
160
+ ```ruby
161
+ class MyModel
162
+ include Avromatic::Model.build(schema_name: 'my_model',
163
+ schema_subject: 'my_model-value')
164
+ end
165
+ ```
166
+
159
167
  Models are generated as immutable value
160
168
  objects by default, but can optionally be defined as mutable:
161
169
 
162
170
  ```ruby
163
171
  class MyModel
164
- include Avromatic::Model.build(schema_name :my_model, mutable: true)
172
+ include Avromatic::Model.build(schema_name: :my_model, mutable: true)
165
173
  end
166
174
  ```
167
175
 
@@ -195,6 +203,16 @@ class MyTopic
195
203
  end
196
204
  ```
197
205
 
206
+ A specific subject name can be associated with both the value and key schemas:
207
+ ```ruby
208
+ class MyTopic
209
+ include Avromatic::Model.build(value_schema_name: :topic_value,
210
+ value_schema_subject: 'topic_value-value',
211
+ key_schema_name: :topic_key,
212
+ key_schema_subject: 'topic_key-value')
213
+ end
214
+ ```
215
+
198
216
  A model can also be generated as an anonymous class that can be assigned to a
199
217
  constant:
200
218
 
@@ -268,7 +286,7 @@ correct order:
268
286
  Avromatic.configure do |config|
269
287
  config.eager_load_models = [
270
288
  # reference any extended models that should be defined first
271
- MyNestedModel
289
+ 'MyNestedModel'
272
290
  ]
273
291
  end
274
292
  ```
data/avromatic.gemspec CHANGED
@@ -45,7 +45,7 @@ Gem::Specification.new do |spec|
45
45
  spec.add_development_dependency 'rake', '~> 13.0'
46
46
  spec.add_development_dependency 'rspec', '~> 3.8'
47
47
  spec.add_development_dependency 'rspec_junit_formatter'
48
- spec.add_development_dependency 'salsify_rubocop', '~> 1.1.0'
48
+ spec.add_development_dependency 'salsify_rubocop', '~> 1.27.1'
49
49
  spec.add_development_dependency 'simplecov'
50
50
  spec.add_development_dependency 'webmock'
51
51
  # For AvroSchemaRegistry::FakeServer
@@ -24,7 +24,8 @@ module Avromatic
24
24
  end
25
25
 
26
26
  module ClassMethods
27
- delegate :avro_schema, :value_avro_schema, :key_avro_schema, :mutable?, :immutable?, to: :config
27
+ delegate :avro_schema, :value_avro_schema, :key_avro_schema, :mutable?, :immutable?,
28
+ :avro_schema_subject, :value_avro_schema_subject, :key_avro_schema_subject, to: :config
28
29
 
29
30
  def value_avro_field_names
30
31
  @value_avro_field_names ||= value_avro_schema.fields.map(&:name).map(&:to_sym).freeze
@@ -68,6 +69,7 @@ module Avromatic
68
69
  end
69
70
 
70
71
  delegate :avro_schema, :value_avro_schema, :key_avro_schema,
72
+ :avro_schema_subject, :value_avro_schema_subject, :key_avro_schema_subject,
71
73
  :value_avro_field_names, :key_avro_field_names,
72
74
  :value_avro_field_references, :key_avro_field_references,
73
75
  :mutable?, :immutable?,
@@ -7,7 +7,7 @@ module Avromatic
7
7
  class Configuration
8
8
 
9
9
  attr_reader :avro_schema, :key_avro_schema, :nested_models, :mutable,
10
- :allow_optional_key_fields
10
+ :allow_optional_key_fields, :avro_schema_subject, :key_avro_schema_subject
11
11
  alias_method :mutable?, :mutable
12
12
  delegate :schema_store, to: Avromatic
13
13
 
@@ -17,24 +17,30 @@ module Avromatic
17
17
  # @param options [Hash]
18
18
  # @option options [Avro::Schema] :schema
19
19
  # @option options [String, Symbol] :schema_name
20
+ # @option options [String, Symbol] :schema_subject
20
21
  # @option options [Avro::Schema] :value_schema
21
22
  # @option options [String, Symbol] :value_schema_name
23
+ # @option options [String, Symbol] :value_schema_subject
22
24
  # @option options [Avro::Schema] :key_schema
23
25
  # @option options [String, Symbol] :key_schema_name
26
+ # @option options [String, Symbol] :key_schema_subject
24
27
  # @option options [Avromatic::ModelRegistry] :nested_models
25
28
  # @option options [Boolean] :mutable, default false
26
29
  # @option options [Boolean] :allow_optional_key_fields, default false
27
30
  def initialize(**options)
28
31
  @avro_schema = find_avro_schema(**options)
32
+ @avro_schema_subject = options[:schema_subject] || options[:value_schema_subject]
29
33
  raise ArgumentError.new('value_schema(_name) or schema(_name) must be specified') unless avro_schema
30
34
 
31
35
  @key_avro_schema = find_schema_by_option(:key_schema, **options)
36
+ @key_avro_schema_subject = options[:key_schema_subject]
32
37
  @nested_models = options[:nested_models]
33
38
  @mutable = options.fetch(:mutable, false)
34
39
  @allow_optional_key_fields = options.fetch(:allow_optional_key_fields, false)
35
40
  end
36
41
 
37
42
  alias_method :value_avro_schema, :avro_schema
43
+ alias_method :value_avro_schema_subject, :avro_schema_subject
38
44
 
39
45
  def immutable?
40
46
  !mutable?
@@ -16,7 +16,8 @@ module Avromatic
16
16
  def avro_message_value
17
17
  avro_messaging.encode(
18
18
  value_attributes_for_avro,
19
- schema_name: value_avro_schema.fullname
19
+ schema_name: value_avro_schema.fullname,
20
+ subject: value_avro_schema_subject
20
21
  )
21
22
  end
22
23
 
@@ -25,7 +26,8 @@ module Avromatic
25
26
 
26
27
  avro_messaging.encode(
27
28
  key_attributes_for_avro,
28
- schema_name: key_avro_schema.fullname
29
+ schema_name: key_avro_schema.fullname,
30
+ subject: key_avro_schema_subject
29
31
  )
30
32
  end
31
33
  end
@@ -56,15 +58,15 @@ module Avromatic
56
58
 
57
59
  module Registration
58
60
  def register_schemas!
59
- register_schema(key_avro_schema) if key_avro_schema
60
- register_schema(value_avro_schema)
61
+ register_schema(key_avro_schema, subject: key_avro_schema_subject) if key_avro_schema
62
+ register_schema(value_avro_schema, subject: value_avro_schema_subject)
61
63
  nil
62
64
  end
63
65
 
64
66
  private
65
67
 
66
- def register_schema(schema)
67
- avro_messaging.registry.register(schema.fullname, schema)
68
+ def register_schema(schema, subject: nil)
69
+ avro_messaging.registry.register(subject || schema.fullname, schema)
68
70
  end
69
71
  end
70
72
 
@@ -60,11 +60,11 @@ module Avromatic
60
60
  Avromatic::Model::Types::EnumType.new(schema.symbols)
61
61
  when :array
62
62
  value_type = create(schema: schema.items, nested_models: nested_models,
63
- use_custom_types: use_custom_types)
63
+ use_custom_types: use_custom_types)
64
64
  Avromatic::Model::Types::ArrayType.new(value_type: value_type)
65
65
  when :map
66
66
  value_type = create(schema: schema.values, nested_models: nested_models,
67
- use_custom_types: use_custom_types)
67
+ use_custom_types: use_custom_types)
68
68
  Avromatic::Model::Types::MapType.new(
69
69
  key_type: Avromatic::Model::Types::StringType.new,
70
70
  value_type: value_type
@@ -7,19 +7,8 @@ module Avromatic
7
7
  config.logger = Rails.logger
8
8
  end
9
9
 
10
- # Rails calls the to_prepare hook once during boot-up, after running
11
- # initializers. After the to_prepare call during boot-up, no code will
12
- # we reloaded, so we need to retain the contents of the nested_models
13
- # registry.
14
- #
15
- # For subsequent calls to to_prepare (in development), the nested_models
16
- # registry is cleared and repopulated by explicitly referencing the
17
- # eager_loaded_models.
18
- first_prepare = true
19
-
20
10
  Rails.configuration.to_prepare do
21
- Avromatic.prepare!(skip_clear: first_prepare)
22
- first_prepare = false
11
+ Avromatic.prepare!
23
12
  end
24
13
  end
25
14
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Avromatic
4
- VERSION = '4.0.0'
4
+ VERSION = '4.1.1'
5
5
  end
data/lib/avromatic.rb CHANGED
@@ -29,7 +29,6 @@ module Avromatic
29
29
 
30
30
  def self.configure
31
31
  yield self
32
- eager_load_models!
33
32
  end
34
33
 
35
34
  def self.build_schema_registry
@@ -66,18 +65,16 @@ module Avromatic
66
65
 
67
66
  # This method is called as a Rails to_prepare hook after the application
68
67
  # first initializes during boot-up and prior to each code reloading.
69
- # For the first call during boot-up we do not want to clear the nested_models.
70
- def self.prepare!(skip_clear: false)
71
- unless skip_clear
72
- nested_models.clear
73
- if schema_store
74
- if schema_store.respond_to?(:clear_schemas)
75
- schema_store.clear_schemas
76
- elsif schema_store.respond_to?(:clear)
77
- schema_store.clear
78
- end
68
+ def self.prepare!
69
+ nested_models.clear
70
+ if schema_store
71
+ if schema_store.respond_to?(:clear_schemas)
72
+ schema_store.clear_schemas
73
+ elsif schema_store.respond_to?(:clear)
74
+ schema_store.clear
79
75
  end
80
76
  end
77
+
81
78
  eager_load_models!
82
79
  end
83
80
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avromatic
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Salsify Engineering
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-12 00:00:00.000000000 Z
11
+ date: 2022-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -216,14 +216,14 @@ dependencies:
216
216
  requirements:
217
217
  - - "~>"
218
218
  - !ruby/object:Gem::Version
219
- version: 1.1.0
219
+ version: 1.27.1
220
220
  type: :development
221
221
  prerelease: false
222
222
  version_requirements: !ruby/object:Gem::Requirement
223
223
  requirements:
224
224
  - - "~>"
225
225
  - !ruby/object:Gem::Version
226
- version: 1.1.0
226
+ version: 1.27.1
227
227
  - !ruby/object:Gem::Dependency
228
228
  name: simplecov
229
229
  requirement: !ruby/object:Gem::Requirement
@@ -364,7 +364,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
364
364
  - !ruby/object:Gem::Version
365
365
  version: '0'
366
366
  requirements: []
367
- rubygems_version: 3.2.22
367
+ rubygems_version: 3.3.7
368
368
  signing_key:
369
369
  specification_version: 4
370
370
  summary: Generate Ruby models from Avro schemas