avromatic 0.31.0 → 0.32.0.rc0

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: c4f5da9c86e42f15db6a7792ba18ce8360beacdd08201dfa82c2a4917661e119
4
- data.tar.gz: 30728c18e220c5e3514d825b8353241a075738a9d0b7bf093cb196c8b938597a
3
+ metadata.gz: 0017af435f0fc21a76680f24432fc7068f27a9a048b24e748784153c179efccd
4
+ data.tar.gz: 29095ba588695b75be4faabbd7c0e51e42f0738fb8d5224f33802f451f072f8a
5
5
  SHA512:
6
- metadata.gz: 59ff7e8a760ab10a9a72f0af55f91aa66ee72c8a00824e760857f8f6fb5322ba3f06e34f7ea7ec7b1e12f075a0b4a25eb9d43018b2458c3789b5d20f6344314a
7
- data.tar.gz: 339f7c10dc3605909f4cf097d773e2fde6b3581b5ee7c028e5a6b0d6f615d0c3b6cfd8dda57db02399251578447317aa35a3154a3a4dda6bf5867d6d0800439e
6
+ metadata.gz: 375f90d488350a0a74b07a20ccb6c42cd8f613a2390d7d889702e37ce4a830f1972244cc69d1de6b29b77d29a387e4af55ebeb6a993648bd5daa63dde3a92048
7
+ data.tar.gz: 4de0b09cb599d89362fbda7f26f0cc3d3cc01ea5ffd0b2faa71b4d4c4f17476fac31d5beb120a21513c6ebc2f087d82aa639c0289fcd18cd45fcc1194d0208be
data/CHANGELOG.md CHANGED
@@ -1,7 +1,12 @@
1
1
  # avromatic changelog
2
2
 
3
+ ## v0.32.0 (unreleased)
4
+ - Improve partial assignment using a hash for records outside of unions.
5
+ - Prevent invalid types from being assigned to primitives in unions.
6
+ - Add validation that primitive attributes have the expected type.
7
+
3
8
  ## v0.31.0
4
- = Add support for Rails 5.2.
9
+ - Add support for Rails 5.2.
5
10
 
6
11
  ## v0.30.0
7
12
  - Add `Avromatic::Model::MessageDecoder#model` method to return the Avromatic
@@ -0,0 +1,7 @@
1
+ class AllowedTypeValidator < ActiveModel::EachValidator
2
+ def validate_each(record, name, value)
3
+ if options[:in].find { |klass| value.is_a?(klass) }.nil?
4
+ record.errors[name] << "does not have the expected type #{options[:in]}"
5
+ end
6
+ end
7
+ end
@@ -12,10 +12,9 @@ module Avromatic
12
12
  primitive Avromatic::Model::Attributes
13
13
 
14
14
  def coerce(value)
15
- return value if value.nil? || value_coerced?(value)
15
+ return value if value.nil? || value.is_a?(primitive)
16
16
 
17
- coerced = primitive.new(value)
18
- coerced if coerced.valid?
17
+ primitive.new(value)
19
18
  end
20
19
 
21
20
  def value_coerced?(value)
@@ -47,7 +47,12 @@ module Avromatic
47
47
 
48
48
  def safe_coerce(member_attribute, input)
49
49
  coerced = member_attribute.coerce(input)
50
- coerced unless coerced.is_a?(Avromatic::Model::Attributes) && coerced.invalid?
50
+
51
+ if coerced.is_a?(Avromatic::Model::Attributes)
52
+ coerced if coerced.valid?
53
+ elsif member_attribute.coerced?(coerced)
54
+ coerced
55
+ end
51
56
  rescue
52
57
  nil
53
58
  end
@@ -1,5 +1,7 @@
1
1
  require 'active_support/core_ext/object/duplicable'
2
+ require 'active_support/time'
2
3
  require 'ice_nine/core_ext/object'
4
+ require 'avromatic/model/allowed_type_validator'
3
5
 
4
6
  module Avromatic
5
7
  module Model
@@ -83,12 +85,12 @@ module Avromatic
83
85
  field_class,
84
86
  avro_field_options(field, field_class))
85
87
 
86
- add_validation(field)
88
+ add_validation(field, field_class)
87
89
  add_serializer(field, field_class)
88
90
  end
89
91
  end
90
92
 
91
- def add_validation(field)
93
+ def add_validation(field, field_class)
92
94
  case field.type.type_sym
93
95
  when :enum
94
96
  validates(field.name,
@@ -97,11 +99,25 @@ module Avromatic
97
99
  validates(field.name, length: { is: field.type.size })
98
100
  when :record, :array, :map, :union
99
101
  validate_complex(field.name)
102
+ else
103
+ add_type_validation(field.name, field_class)
100
104
  end
101
105
 
102
106
  add_required_validation(field)
103
107
  end
104
108
 
109
+ def add_type_validation(name, field_class)
110
+ allowed_types = if field_class == Axiom::Types::Boolean
111
+ [TrueClass, FalseClass]
112
+ elsif field_class < Avromatic::Model::Attribute::AbstractTimestamp
113
+ [Time]
114
+ else
115
+ [field_class]
116
+ end
117
+
118
+ validates(name, allowed_type: allowed_types, allow_blank: true)
119
+ end
120
+
105
121
  def add_required_validation(field)
106
122
  if required?(field) && field.default == :no_default
107
123
  case field.type.type_sym
@@ -1,3 +1,3 @@
1
1
  module Avromatic
2
- VERSION = '0.31.0'.freeze
2
+ VERSION = '0.32.0.rc0'.freeze
3
3
  end
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: 0.31.0
4
+ version: 0.32.0.rc0
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-06-20 00:00:00.000000000 Z
11
+ date: 2018-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro
@@ -283,6 +283,7 @@ files:
283
283
  - lib/avromatic/io/datum_writer.rb
284
284
  - lib/avromatic/messaging.rb
285
285
  - lib/avromatic/model.rb
286
+ - lib/avromatic/model/allowed_type_validator.rb
286
287
  - lib/avromatic/model/allowed_writer_methods_memoization.rb
287
288
  - lib/avromatic/model/attribute/abstract_timestamp.rb
288
289
  - lib/avromatic/model/attribute/record.rb
@@ -327,9 +328,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
327
328
  version: '0'
328
329
  required_rubygems_version: !ruby/object:Gem::Requirement
329
330
  requirements:
330
- - - ">="
331
+ - - ">"
331
332
  - !ruby/object:Gem::Version
332
- version: '0'
333
+ version: 1.3.1
333
334
  requirements: []
334
335
  rubyforge_project:
335
336
  rubygems_version: 2.7.6