avro-patches 0.1.0 → 0.2.0
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 +3 -0
- data/lib/avro-patches/schema_validator/schema_validator.rb +22 -15
- data/lib/avro-patches/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4501694b4e822ab5d2f9b08cd4d2406474b7efa6
|
4
|
+
data.tar.gz: 7cb86acf0bb9cb38486d59263904e1eac8eb4be7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d2aa4dc274fef6e4727ac3d3842c984223b0ab8ab2fdaed522490d4a4a28d15ae636fb7844aea8f5ff20f0983e698c9d8aec42c3e7e3ba7b2b08e9e1a692761
|
7
|
+
data.tar.gz: 03b0e275a36bfbf88e18638661bbc59bcad4a423a6767743a5560c9b2092e8a25a829128c941d8bb3b79693926b478361d78b47826e3b37939e0a94a7f2c172c
|
data/CHANGELOG.md
CHANGED
@@ -20,7 +20,8 @@ module Avro
|
|
20
20
|
PATH_SEPARATOR = '.'.freeze
|
21
21
|
INT_RANGE = Schema::INT_MIN_VALUE..Schema::INT_MAX_VALUE
|
22
22
|
LONG_RANGE = Schema::LONG_MIN_VALUE..Schema::LONG_MAX_VALUE
|
23
|
-
COMPLEX_TYPES = [:array, :error, :map, :record, :request]
|
23
|
+
COMPLEX_TYPES = [:array, :error, :map, :record, :request].freeze
|
24
|
+
BOOLEAN_VALUES = [true, false].freeze
|
24
25
|
|
25
26
|
class Result
|
26
27
|
attr_reader :errors
|
@@ -76,7 +77,7 @@ module Avro
|
|
76
77
|
when :null
|
77
78
|
fail TypeMismatchError unless datum.nil?
|
78
79
|
when :boolean
|
79
|
-
fail TypeMismatchError unless
|
80
|
+
fail TypeMismatchError unless BOOLEAN_VALUES.include?(datum)
|
80
81
|
when :string, :bytes
|
81
82
|
fail TypeMismatchError unless datum.is_a?(String)
|
82
83
|
when :int
|
@@ -86,17 +87,15 @@ module Avro
|
|
86
87
|
fail TypeMismatchError unless datum.is_a?(Integer)
|
87
88
|
result.add_error(path, "out of bound value #{datum}") unless LONG_RANGE.cover?(datum)
|
88
89
|
when :float, :double
|
89
|
-
fail TypeMismatchError unless
|
90
|
+
fail TypeMismatchError unless datum.is_a?(Float) || datum.is_a?(Integer)
|
90
91
|
when :fixed
|
91
92
|
if datum.is_a? String
|
92
|
-
|
93
|
-
result.add_error(path, message) unless datum.bytesize == expected_schema.size
|
93
|
+
result.add_error(path, fixed_string_message(expected_schema.size, datum)) unless datum.bytesize == expected_schema.size
|
94
94
|
else
|
95
95
|
result.add_error(path, "expected fixed with size #{expected_schema.size}, got #{actual_value_message(datum)}")
|
96
96
|
end
|
97
97
|
when :enum
|
98
|
-
|
99
|
-
result.add_error(path, message) unless expected_schema.symbols.include?(datum)
|
98
|
+
result.add_error(path, enum_message(expected_schema.symbols, datum)) unless expected_schema.symbols.include?(datum)
|
100
99
|
when :array
|
101
100
|
validate_array(expected_schema, datum, path, result)
|
102
101
|
when :map
|
@@ -116,6 +115,14 @@ module Avro
|
|
116
115
|
result.add_error(path, "expected type #{expected_schema.type_sym}, got #{actual_value_message(datum)}")
|
117
116
|
end
|
118
117
|
|
118
|
+
def fixed_string_message(size, datum)
|
119
|
+
"expected fixed with size #{size}, got \"#{datum}\" with size #{datum.size}"
|
120
|
+
end
|
121
|
+
|
122
|
+
def enum_message(symbols, datum)
|
123
|
+
"expected enum with values #{symbols}, got #{actual_value_message(datum)}"
|
124
|
+
end
|
125
|
+
|
119
126
|
def validate_array(expected_schema, datum, path, result)
|
120
127
|
fail TypeMismatchError unless datum.is_a?(Array)
|
121
128
|
datum.each_with_index do |d, i|
|
@@ -138,9 +145,10 @@ module Avro
|
|
138
145
|
validate_recursive(expected_schema.schemas.first, datum, path, result)
|
139
146
|
return
|
140
147
|
end
|
141
|
-
|
142
|
-
|
143
|
-
return
|
148
|
+
failures = []
|
149
|
+
compatible_type = first_compatible_type(datum, expected_schema, path, failures)
|
150
|
+
return unless compatible_type.nil?
|
151
|
+
|
144
152
|
complex_type_failed = failures.detect { |r| COMPLEX_TYPES.include?(r[:type]) }
|
145
153
|
if complex_type_failed
|
146
154
|
complex_type_failed[:result].errors.each { |error| result << error }
|
@@ -150,11 +158,12 @@ module Avro
|
|
150
158
|
end
|
151
159
|
end
|
152
160
|
|
153
|
-
def
|
154
|
-
expected_schema.schemas.
|
161
|
+
def first_compatible_type(datum, expected_schema, path, failures)
|
162
|
+
expected_schema.schemas.find do |schema|
|
155
163
|
result = Result.new
|
156
164
|
validate_recursive(schema, datum, path, result)
|
157
|
-
{ type: schema.type_sym, result: result }
|
165
|
+
failures << { type: schema.type_sym, result: result } if result.failure?
|
166
|
+
!result.failure?
|
158
167
|
end
|
159
168
|
end
|
160
169
|
|
@@ -162,8 +171,6 @@ module Avro
|
|
162
171
|
"#{path}#{PATH_SEPARATOR}#{sub_key}".squeeze(PATH_SEPARATOR)
|
163
172
|
end
|
164
173
|
|
165
|
-
private
|
166
|
-
|
167
174
|
def actual_value_message(value)
|
168
175
|
avro_type = if value.is_a?(Integer)
|
169
176
|
ruby_integer_to_avro_type(value)
|
data/lib/avro-patches/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: avro-patches
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Salsify, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05
|
11
|
+
date: 2017-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|