avromatic 2.0.0 → 2.0.1
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 +4 -4
- data/CHANGELOG.md +6 -1
- data/README.md +2 -2
- data/lib/avromatic/model/attributes.rb +17 -24
- data/lib/avromatic/model/builder.rb +9 -11
- data/lib/avromatic/model/field_helper.rb +5 -0
- data/lib/avromatic/model/types/timestamp_micros_type.rb +1 -1
- data/lib/avromatic/model/types/timestamp_millis_type.rb +1 -1
- data/lib/avromatic/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 281093ac30d6f1f5bf7fa5949466ce74b2223968db553e15e473e09c81fc574d
|
4
|
+
data.tar.gz: 0a89d649b7b86d8a1cc55dba25af9dfdab2f7789f2c4daa996b0dab6ba7fd210
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e13e24a119085b1bf8e6f31d83cda3a8d99092026006601a48d21c29516eefb511d1cccaa3080f346bb91b91397433787638b13ee8e2980286b8c06cf0300d07
|
7
|
+
data.tar.gz: 8151877e50ab9e2ca498ea52f990c3fce6e5a87a31972c09cea6bbe1c5654265f52e2a7c5dd577d934b0fdd1b8adf7eee1123481333714c4dedef42afd5d83e4
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# avromatic changelog
|
2
2
|
|
3
|
-
## v2.0.
|
3
|
+
## v2.0.1
|
4
|
+
- Allow generated model attribute accessors to be overridden. This was a regression in Avromatic 2.0.0.
|
5
|
+
- Ensure that timestamp-millis are coerced when the number of microseconds is divisible by 1,000 but the
|
6
|
+
number of nanoseconds is not divisible by 1,000,000.
|
7
|
+
|
8
|
+
## v2.0.0
|
4
9
|
- Remove [virtus](https://github.com/solnic/virtus) dependency resulting in a 3x performance improvement in model instantation and 1.4x - 2.0x performance improvement in Avro serialization and Avromatic code simplification.
|
5
10
|
- Raise `Avromatic::Model::CoercionError` when attribute values can't be coerced to the target type in model constructors and attribute setters. Previously coercion errors weren't detected until Avro serialization or an explicit call to `valid?`.
|
6
11
|
- Prevent model instances from being constructed with unknown attributes. Previously unknown attributes were ignored.
|
data/README.md
CHANGED
@@ -8,8 +8,8 @@
|
|
8
8
|
`Avromatic` generates Ruby models from [Avro](http://avro.apache.org/) schemas
|
9
9
|
and provides utilities to encode and decode them.
|
10
10
|
|
11
|
-
**This README reflects
|
12
|
-
[1-0-stable](https://github.com/salsify/avromatic/blob/1-0-stable/README.md) branch for
|
11
|
+
**This README reflects Avromatic 2.0. Please see the
|
12
|
+
[1-0-stable](https://github.com/salsify/avromatic/blob/1-0-stable/README.md) branch for Avromatic 1.0.**
|
13
13
|
|
14
14
|
## Installation
|
15
15
|
|
@@ -21,7 +21,7 @@ module Avromatic
|
|
21
21
|
end
|
22
22
|
|
23
23
|
class AttributeDefinition
|
24
|
-
attr_reader :name, :type, :field, :default, :owner
|
24
|
+
attr_reader :name, :setter_name, :type, :field, :default, :owner
|
25
25
|
delegate :serialize, to: :type
|
26
26
|
|
27
27
|
def initialize(owner:, field:, type:)
|
@@ -29,6 +29,7 @@ module Avromatic
|
|
29
29
|
@field = field
|
30
30
|
@type = type
|
31
31
|
@name = field.name.to_sym
|
32
|
+
@setter_name = "#{field.name}=".to_sym
|
32
33
|
@default = if field.default == :no_default
|
33
34
|
nil
|
34
35
|
elsif field.default.duplicable?
|
@@ -77,13 +78,13 @@ module Avromatic
|
|
77
78
|
if data.include?(attribute_name)
|
78
79
|
valid_keys << attribute_name
|
79
80
|
value = data.fetch(attribute_name)
|
80
|
-
|
81
|
+
send(attribute_definition.setter_name, value)
|
81
82
|
elsif data.include?(attribute_name.to_s)
|
82
83
|
valid_keys << attribute_name
|
83
84
|
value = data[attribute_name.to_s]
|
84
|
-
|
85
|
+
send(attribute_definition.setter_name, value)
|
85
86
|
elsif !attributes.include?(attribute_name)
|
86
|
-
|
87
|
+
send(attribute_definition.setter_name, attribute_definition.default)
|
87
88
|
end
|
88
89
|
end
|
89
90
|
|
@@ -111,7 +112,7 @@ module Avromatic
|
|
111
112
|
end
|
112
113
|
|
113
114
|
module ClassMethods
|
114
|
-
def add_avro_fields
|
115
|
+
def add_avro_fields(generated_methods_module)
|
115
116
|
# models are registered in Avromatic.nested_models at this point to
|
116
117
|
# ensure that they are available as fields for recursive models.
|
117
118
|
register!
|
@@ -119,13 +120,13 @@ module Avromatic
|
|
119
120
|
if key_avro_schema
|
120
121
|
check_for_field_conflicts!
|
121
122
|
begin
|
122
|
-
define_avro_attributes(key_avro_schema,
|
123
|
+
define_avro_attributes(key_avro_schema, generated_methods_module,
|
123
124
|
allow_optional: config.allow_optional_key_fields)
|
124
125
|
rescue OptionalFieldError => ex
|
125
126
|
raise "Optional field '#{ex.field.name}' not allowed in key schema."
|
126
127
|
end
|
127
128
|
end
|
128
|
-
define_avro_attributes(avro_schema)
|
129
|
+
define_avro_attributes(avro_schema, generated_methods_module)
|
129
130
|
end
|
130
131
|
|
131
132
|
private
|
@@ -151,7 +152,7 @@ module Avromatic
|
|
151
152
|
value_avro_fields_by_name[name].to_avro
|
152
153
|
end
|
153
154
|
|
154
|
-
def define_avro_attributes(schema, allow_optional: true)
|
155
|
+
def define_avro_attributes(schema, generated_methods_module, allow_optional: true)
|
155
156
|
if schema.type_sym != :record
|
156
157
|
raise "Unsupported schema type '#{schema.type_sym}', only 'record' schemas are supported."
|
157
158
|
end
|
@@ -163,33 +164,25 @@ module Avromatic
|
|
163
164
|
attribute_definition = AttributeDefinition.new(
|
164
165
|
owner: self,
|
165
166
|
field: field,
|
166
|
-
type:
|
167
|
+
type: Avromatic::Model::Types::TypeFactory.create(schema: field.type, nested_models: nested_models)
|
167
168
|
)
|
168
169
|
attribute_definitions[symbolized_field_name] = attribute_definition
|
169
170
|
|
170
|
-
|
171
|
-
define_method
|
171
|
+
# Add all generated methods to a module so they can be overridden
|
172
|
+
generated_methods_module.send(:define_method, field.name) { _attributes[symbolized_field_name] }
|
173
|
+
generated_methods_module.send(:define_method, "#{field.name}?") { !!_attributes[symbolized_field_name] } if FieldHelper.boolean?(field)
|
172
174
|
|
173
|
-
define_method
|
175
|
+
generated_methods_module.send(:define_method, "#{field.name}=") do |value|
|
174
176
|
_attributes[symbolized_field_name] = attribute_definitions[symbolized_field_name].coerce(value)
|
175
177
|
end
|
176
178
|
|
177
179
|
unless config.mutable # rubocop:disable Style/Next
|
178
|
-
private
|
179
|
-
|
180
|
-
|
180
|
+
generated_methods_module.send(:private, "#{field.name}=")
|
181
|
+
generated_methods_module.send(:define_method, :clone) { self }
|
182
|
+
generated_methods_module.send(:define_method, :dup) { self }
|
181
183
|
end
|
182
184
|
end
|
183
185
|
end
|
184
|
-
|
185
|
-
def boolean?(field)
|
186
|
-
field.type.type_sym == :boolean ||
|
187
|
-
(FieldHelper.optional?(field) && field.type.schemas.last.type_sym == :boolean)
|
188
|
-
end
|
189
|
-
|
190
|
-
def create_type(field)
|
191
|
-
Avromatic::Model::Types::TypeFactory.create(schema: field.type, nested_models: nested_models)
|
192
|
-
end
|
193
186
|
end
|
194
187
|
|
195
188
|
end
|
@@ -22,7 +22,7 @@ module Avromatic
|
|
22
22
|
attr_reader :mod, :config
|
23
23
|
|
24
24
|
# For options see Avromatic::Model.build
|
25
|
-
def self.model(**options)
|
25
|
+
def self.model(**options, &block)
|
26
26
|
Class.new do
|
27
27
|
include Avromatic::Model::Builder.new(**options).mod
|
28
28
|
|
@@ -30,6 +30,8 @@ module Avromatic
|
|
30
30
|
def self.name
|
31
31
|
super || (@name ||= config.avro_schema.name.classify)
|
32
32
|
end
|
33
|
+
|
34
|
+
class_eval(&block) if block
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
@@ -55,18 +57,14 @@ module Avromatic
|
|
55
57
|
private
|
56
58
|
|
57
59
|
def define_included_method
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
local_mod = mod
|
61
|
+
local_builder = self
|
62
|
+
mod.define_singleton_method(:included) do |model_class|
|
63
|
+
model_class.include(*local_builder.inclusions)
|
64
|
+
model_class.config = local_builder.config
|
65
|
+
model_class.add_avro_fields(local_mod)
|
64
66
|
end
|
65
67
|
end
|
66
|
-
|
67
|
-
def with_builder
|
68
|
-
yield(self)
|
69
|
-
end
|
70
68
|
end
|
71
69
|
end
|
72
70
|
end
|
data/lib/avromatic/version.rb
CHANGED
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: 2.0.
|
4
|
+
version: 2.0.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: 2018-10-
|
11
|
+
date: 2018-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|