avromatic 2.2.3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +85 -0
  3. data/.rubocop.yml +3 -0
  4. data/.ruby-version +1 -1
  5. data/Appraisals +34 -22
  6. data/CHANGELOG.md +19 -0
  7. data/README.md +3 -3
  8. data/avromatic.gemspec +7 -6
  9. data/bin/console +4 -3
  10. data/gemfiles/{rails5_0.gemfile → avro1_10_rails5_2.gemfile} +3 -3
  11. data/gemfiles/avro1_10_rails6_0.gemfile +9 -0
  12. data/gemfiles/avro1_10_rails6_1.gemfile +9 -0
  13. data/gemfiles/{rails5_2.gemfile → avro1_8_rails5_2.gemfile} +0 -0
  14. data/gemfiles/{rails5_1.gemfile → avro1_9_rails5_2.gemfile} +3 -3
  15. data/gemfiles/{rails6_0.gemfile → avro1_9_rails6_0.gemfile} +1 -1
  16. data/gemfiles/{avro_patches_rails5_0.gemfile → avro1_9_rails6_1.gemfile} +3 -3
  17. data/gemfiles/avro_patches_rails5_2.gemfile +1 -1
  18. data/gemfiles/avro_patches_rails6_1.gemfile +9 -0
  19. data/lib/avromatic.rb +0 -5
  20. data/lib/avromatic/io.rb +1 -7
  21. data/lib/avromatic/io/datum_reader.rb +18 -68
  22. data/lib/avromatic/io/datum_writer.rb +5 -11
  23. data/lib/avromatic/io/union_datum.rb +25 -0
  24. data/lib/avromatic/messaging.rb +4 -2
  25. data/lib/avromatic/model/attributes.rb +28 -9
  26. data/lib/avromatic/model/configurable.rb +30 -2
  27. data/lib/avromatic/model/configuration.rb +5 -0
  28. data/lib/avromatic/model/field_helper.rb +5 -1
  29. data/lib/avromatic/model/messaging_serialization.rb +2 -1
  30. data/lib/avromatic/model/raw_serialization.rb +67 -24
  31. data/lib/avromatic/model/types/abstract_timestamp_type.rb +1 -1
  32. data/lib/avromatic/model/types/abstract_type.rb +3 -1
  33. data/lib/avromatic/model/types/array_type.rb +2 -2
  34. data/lib/avromatic/model/types/boolean_type.rb +1 -1
  35. data/lib/avromatic/model/types/custom_type.rb +1 -1
  36. data/lib/avromatic/model/types/date_type.rb +1 -1
  37. data/lib/avromatic/model/types/enum_type.rb +1 -1
  38. data/lib/avromatic/model/types/fixed_type.rb +1 -1
  39. data/lib/avromatic/model/types/float_type.rb +1 -1
  40. data/lib/avromatic/model/types/integer_type.rb +1 -1
  41. data/lib/avromatic/model/types/map_type.rb +2 -2
  42. data/lib/avromatic/model/types/null_type.rb +1 -1
  43. data/lib/avromatic/model/types/record_type.rb +4 -7
  44. data/lib/avromatic/model/types/string_type.rb +1 -1
  45. data/lib/avromatic/model/types/union_type.rb +11 -8
  46. data/lib/avromatic/model/validation.rb +2 -2
  47. data/lib/avromatic/version.rb +1 -1
  48. metadata +62 -47
  49. data/.travis.yml +0 -23
  50. data/gemfiles/avro_patches_rails5_1.gemfile +0 -9
  51. data/lib/avromatic/patches.rb +0 -18
  52. data/lib/avromatic/patches/schema_validator_patch.rb +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f00f5dcd52b577554247061ac380c96116043485fcb99aa7025d8aee8c527ee1
4
- data.tar.gz: 8dad831b8a2f4a2730ce7a9ed95bd16cb07c033d909590fcd871fff87d6b53d8
3
+ metadata.gz: a7401c0e72992925f02234f5d3d2ab8e762a36bc62aa25c631569d6f4d9918d2
4
+ data.tar.gz: f2121b2a62bf60893ea0eb143ed83a142ea069d07839fb8121d0618483b469d5
5
5
  SHA512:
6
- metadata.gz: 56dc4d773f56ce6ef5603382e56bba488dc859293e430635a76574201fda1f28b4ab7d88ee85746edc07531c911389129fb86ffb2a3002d5073fda70f0860ab9
7
- data.tar.gz: d129ef740005cc9e040b13b40caae5f8ec17ff5cdb01e386b668967d9902324dfdca63a597f290f77bf7662f3f1bbcb137df8977745ad5411a48c82d8d5cfd62
6
+ metadata.gz: 42be85747686fca4ec66d6e178f7e5aab6d9e9ab88cd4d107ed1c5de8a83017f083a510889ced33a2eb284f45865b3c32b3a9edad200011aed5b17c284f3a593
7
+ data.tar.gz: be13122bca8693d33e20d1317ae5cd88d8c1c975c08d94ed522d0330d70f202bc43d79d7f2941032bc7540ad83b2d647d3c7d29bb5b72c03a560dfedb85e62f7
@@ -0,0 +1,85 @@
1
+ version: 2.1
2
+ jobs:
3
+ lint:
4
+ docker:
5
+ - image: salsify/ruby_ci:2.5.8
6
+ working_directory: ~/avromatic
7
+ steps:
8
+ - checkout
9
+ - restore_cache:
10
+ keys:
11
+ - v2-gems-ruby-2.5.8-{{ checksum "avromatic.gemspec" }}-{{ checksum "Gemfile" }}
12
+ - v2-gems-ruby-2.5.8-
13
+ - run:
14
+ name: Install Gems
15
+ command: |
16
+ if ! bundle check --path=vendor/bundle; then
17
+ bundle install --path=vendor/bundle --jobs=4 --retry=3
18
+ bundle clean
19
+ fi
20
+ - save_cache:
21
+ key: v2-gems-ruby-2.5.8-{{ checksum "avromatic.gemspec" }}-{{ checksum "Gemfile" }}
22
+ paths:
23
+ - "vendor/bundle"
24
+ - "gemfiles/vendor/bundle"
25
+ - run:
26
+ name: Run Rubocop
27
+ command: bundle exec rubocop
28
+ test:
29
+ parameters:
30
+ gemfile:
31
+ type: string
32
+ ruby-version:
33
+ type: string
34
+ docker:
35
+ - image: salsify/ruby_ci:<< parameters.ruby-version >>
36
+ environment:
37
+ CIRCLE_TEST_REPORTS: "test-results"
38
+ BUNDLE_GEMFILE: << parameters.gemfile >>
39
+ working_directory: ~/avromatic
40
+ steps:
41
+ - checkout
42
+ - restore_cache:
43
+ keys:
44
+ - v2-gems-ruby-<< parameters.ruby-version >>-{{ checksum "avromatic.gemspec" }}-{{ checksum "<< parameters.gemfile >>" }}
45
+ - v2-gems-ruby-<< parameters.ruby-version >>-
46
+ - run:
47
+ name: Install Gems
48
+ command: |
49
+ if ! bundle check --path=vendor/bundle; then
50
+ bundle install --path=vendor/bundle --jobs=4 --retry=3
51
+ bundle clean
52
+ fi
53
+ - save_cache:
54
+ key: v2-gems-ruby-<< parameters.ruby-version >>-{{ checksum "avromatic.gemspec" }}-{{ checksum "<< parameters.gemfile >>" }}
55
+ paths:
56
+ - "vendor/bundle"
57
+ - "gemfiles/vendor/bundle"
58
+ - run:
59
+ name: Run Tests
60
+ command: |
61
+ bundle exec rspec --format RspecJunitFormatter --out $CIRCLE_TEST_REPORTS/rspec/junit.xml --format progress spec
62
+ - store_test_results:
63
+ path: "test-results"
64
+ workflows:
65
+ build:
66
+ jobs:
67
+ - lint
68
+ - test:
69
+ matrix:
70
+ parameters:
71
+ gemfile:
72
+ - "gemfiles/avro1_8_rails5_2.gemfile"
73
+ - "gemfiles/avro1_9_rails5_2.gemfile"
74
+ - "gemfiles/avro1_10_rails5_2.gemfile"
75
+ - "gemfiles/avro1_9_rails6_0.gemfile"
76
+ - "gemfiles/avro1_10_rails6_0.gemfile"
77
+ - "gemfiles/avro_patches_rails5_2.gemfile"
78
+ - "gemfiles/avro_patches_rails6_0.gemfile"
79
+ - "gemfiles/avro1_10_rails6_1.gemfile"
80
+ - "gemfiles/avro1_9_rails6_1.gemfile"
81
+ - "gemfiles/avro_patches_rails6_1.gemfile"
82
+ ruby-version:
83
+ - "2.5.8"
84
+ - "2.6.6"
85
+ - "2.7.1"
@@ -3,6 +3,9 @@ inherit_gem:
3
3
 
4
4
  AllCops:
5
5
  TargetRubyVersion: 2.4
6
+ Exclude:
7
+ - 'vendor/**/*'
8
+ - 'gemfiles/vendor/**/*'
6
9
 
7
10
  Style/MultilineBlockChain:
8
11
  Enabled: false
@@ -1 +1 @@
1
- 2.5.1
1
+ 2.5.8
data/Appraisals CHANGED
@@ -1,43 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- appraise 'rails5_0' do
3
+ appraise 'avro1_8-rails5_2' do
4
4
  gem 'avro', '1.8.2'
5
- gem 'activesupport', '~> 5.0.6'
6
- gem 'activemodel', '~> 5.0.6'
5
+ gem 'activesupport', '~> 5.2.0'
6
+ gem 'activemodel', '~> 5.2.0'
7
7
  end
8
8
 
9
- appraise 'rails5_1' do
10
- gem 'avro', '1.8.2'
11
- gem 'activesupport', '~> 5.1.4'
12
- gem 'activemodel', '~> 5.1.4'
9
+ appraise 'avro1_9-rails5_2' do
10
+ gem 'avro', '1.9.2'
11
+ gem 'activesupport', '~> 5.2.0'
12
+ gem 'activemodel', '~> 5.2.0'
13
13
  end
14
14
 
15
- appraise 'rails5_2' do
16
- gem 'avro', '1.8.2'
15
+ appraise 'avro1_10-rails5_2' do
16
+ gem 'avro', '~> 1.10.0'
17
17
  gem 'activesupport', '~> 5.2.0'
18
18
  gem 'activemodel', '~> 5.2.0'
19
19
  end
20
20
 
21
- appraise 'rails6_0' do
22
- gem 'avro', '1.9.0'
21
+ appraise 'avro1_9-rails6_0' do
22
+ gem 'avro', '1.9.2'
23
23
  gem 'activesupport', '~> 6.0.0'
24
24
  gem 'activemodel', '~> 6.0.0'
25
25
  end
26
26
 
27
- appraise 'avro-patches-rails5_0' do
28
- gem 'avro-patches'
29
- gem 'activesupport', '~> 5.0.6'
30
- gem 'activemodel', '~> 5.0.6'
31
- end
32
-
33
- appraise 'avro-patches-rails5_1' do
34
- gem 'avro-patches', '>= 0.4.1'
35
- gem 'activesupport', '~> 5.1.4'
36
- gem 'activemodel', '~> 5.1.4'
27
+ appraise 'avro1_10-rails6_0' do
28
+ gem 'avro', '~> 1.10.0'
29
+ gem 'activesupport', '~> 6.0.0'
30
+ gem 'activemodel', '~> 6.0.0'
37
31
  end
38
32
 
39
33
  appraise 'avro-patches-rails5_2' do
40
- gem 'avro-patches', '>= 0.4.1'
34
+ gem 'avro-patches', '>= 0.4.1', '< 1.0'
41
35
  gem 'activesupport', '~> 5.2.0'
42
36
  gem 'activemodel', '~> 5.2.0'
43
37
  end
@@ -47,3 +41,21 @@ appraise 'avro-patches-rails6_0' do
47
41
  gem 'activesupport', '~> 6.0.0'
48
42
  gem 'activemodel', '~> 6.0.0'
49
43
  end
44
+
45
+ appraise 'avro1_9-rails6_1' do
46
+ gem 'avro', '1.9.2'
47
+ gem 'activesupport', '~> 6.1.0'
48
+ gem 'activemodel', '~> 6.1.0'
49
+ end
50
+
51
+ appraise 'avro1_10-rails6_1' do
52
+ gem 'avro', '~> 1.10.0'
53
+ gem 'activesupport', '~> 6.1.0'
54
+ gem 'activemodel', '~> 6.1.0'
55
+ end
56
+
57
+ appraise 'avro-patches-rails6_1' do
58
+ gem 'avro-patches', '>= 1.0.0'
59
+ gem 'activesupport', '~> 6.1.0'
60
+ gem 'activemodel', '~> 6.1.0'
61
+ end
@@ -1,5 +1,24 @@
1
1
  # avromatic changelog
2
2
 
3
+ ## v2.4.0
4
+ - Ignore the `validate` argument and always validate during serialization. This
5
+ argument will be removed in Avromatic 3.0.
6
+ - Optimize model validation during serialization.
7
+ - Don't cache immutable model validation results or serialized Avro attributes if a model has mutable children.
8
+
9
+ ## v2.3.0
10
+ - Add support for Rails 6.1.
11
+ - Optimize nested model serialization.
12
+
13
+ ## v2.2.6
14
+ - Optimize memory usage when serializing models.
15
+
16
+ ## v2.2.5
17
+ - Optimize memory usage when serializing, deserializing and instantiating models.
18
+
19
+ ## v2.2.4
20
+ - Compatibility with Avro v1.10.x.
21
+
3
22
  ## v2.2.3
4
23
  - Fix bug where method `#referenced_model_classes` was declared as private instead of public.
5
24
 
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # Avromatic
2
2
 
3
- [![Build Status](https://travis-ci.org/salsify/avromatic.svg?branch=master)][travis]
3
+ [![Build Status](https://circleci.com/gh/salsify/avromatic.svg?style=svg)][circleci]
4
4
  [![Gem Version](https://badge.fury.io/rb/avromatic.svg)](https://badge.fury.io/rb/avromatic)
5
5
 
6
- [travis]: http://travis-ci.org/salsify/avromatic
6
+ [circleci]: https://circleci.com/gh/salsify/avromatic
7
7
 
8
8
  `Avromatic` generates Ruby models from [Avro](http://avro.apache.org/) schemas
9
9
  and provides utilities to encode and decode them.
@@ -142,7 +142,7 @@ instance.eql?(MyModel.new(id: 123, name: 'Tesla Model 3', enabled: true)) # => t
142
142
  instance.hash # => -1279155042741869898
143
143
 
144
144
  # Retrieve a hash of the model's attributes via to_h, to_hash or attributes
145
- instance .to_h # => {:id=>123, :name=>"Tesla Model 3", :enabled=>true}
145
+ instance.to_h # => {:id=>123, :name=>"Tesla Model 3", :enabled=>true}
146
146
  ```
147
147
 
148
148
  Or an `Avro::Schema` object can be specified directly:
@@ -22,22 +22,23 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.required_ruby_version = '>= 2.4'
24
24
 
25
- spec.add_runtime_dependency 'activemodel', '>= 5.0', '< 6.1'
26
- spec.add_runtime_dependency 'activesupport', '>= 5.0', '< 6.1'
27
- spec.add_runtime_dependency 'avro', '>= 1.7.7', '< 1.10'
25
+ spec.add_runtime_dependency 'activemodel', '>= 5.0', '< 6.2'
26
+ spec.add_runtime_dependency 'activesupport', '>= 5.0', '< 6.2'
27
+ spec.add_runtime_dependency 'avro', '>= 1.7.7', '< 1.11'
28
28
  spec.add_runtime_dependency 'avro_schema_registry-client', '>= 0.3.0'
29
29
  spec.add_runtime_dependency 'avro_turf'
30
30
  spec.add_runtime_dependency 'ice_nine'
31
31
 
32
+ spec.add_development_dependency 'appraisal'
32
33
  spec.add_development_dependency 'avro-builder', '>= 0.12.0'
33
34
  spec.add_development_dependency 'bundler', '>= 1.11'
35
+ spec.add_development_dependency 'overcommit', '0.35.0'
34
36
  spec.add_development_dependency 'rake', '~> 10.0'
35
37
  spec.add_development_dependency 'rspec', '~> 3.0'
38
+ spec.add_development_dependency 'rspec_junit_formatter'
39
+ spec.add_development_dependency 'salsify_rubocop', '~> 0.52.1.1'
36
40
  spec.add_development_dependency 'simplecov'
37
41
  spec.add_development_dependency 'webmock'
38
42
  # For AvroSchemaRegistry::FakeServer
39
- spec.add_development_dependency 'appraisal'
40
- spec.add_development_dependency 'overcommit', '0.35.0'
41
- spec.add_development_dependency 'salsify_rubocop', '~> 0.52.1.1'
42
43
  spec.add_development_dependency 'sinatra'
43
44
  end
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "avromatic"
4
+ require 'bundler/setup'
5
+ require 'avromatic'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "avromatic"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start
@@ -2,8 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "avro", "1.8.2"
6
- gem "activesupport", "~> 5.0.6"
7
- gem "activemodel", "~> 5.0.6"
5
+ gem "avro", "~> 1.10.0"
6
+ gem "activesupport", "~> 5.2.0"
7
+ gem "activemodel", "~> 5.2.0"
8
8
 
9
9
  gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "avro", "~> 1.10.0"
6
+ gem "activesupport", "~> 6.0.0"
7
+ gem "activemodel", "~> 6.0.0"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "avro", "~> 1.10.0"
6
+ gem "activesupport", "~> 6.1.0"
7
+ gem "activemodel", "~> 6.1.0"
8
+
9
+ gemspec path: "../"
@@ -2,8 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "avro", "1.8.2"
6
- gem "activesupport", "~> 5.1.4"
7
- gem "activemodel", "~> 5.1.4"
5
+ gem "avro", "1.9.2"
6
+ gem "activesupport", "~> 5.2.0"
7
+ gem "activemodel", "~> 5.2.0"
8
8
 
9
9
  gemspec path: "../"
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "avro", "1.9.0"
5
+ gem "avro", "1.9.2"
6
6
  gem "activesupport", "~> 6.0.0"
7
7
  gem "activemodel", "~> 6.0.0"
8
8
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "avro-patches"
6
- gem "activesupport", "~> 5.0.6"
7
- gem "activemodel", "~> 5.0.6"
5
+ gem "avro", "1.9.2"
6
+ gem "activesupport", "~> 6.1.0"
7
+ gem "activemodel", "~> 6.1.0"
8
8
 
9
9
  gemspec path: "../"
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "avro-patches", ">= 0.4.1"
5
+ gem "avro-patches", ">= 0.4.1", "< 1.0"
6
6
  gem "activesupport", "~> 5.2.0"
7
7
  gem "activemodel", "~> 5.2.0"
8
8
 
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "avro-patches", ">= 1.0.0"
6
+ gem "activesupport", "~> 6.1.0"
7
+ gem "activemodel", "~> 6.1.0"
8
+
9
+ gemspec path: "../"
@@ -8,7 +8,6 @@ require 'avromatic/model'
8
8
  require 'avromatic/model_registry'
9
9
  require 'avromatic/messaging'
10
10
  require 'active_support/core_ext/string/inflections'
11
- require 'avromatic/patches'
12
11
 
13
12
  module Avromatic
14
13
  class << self
@@ -33,10 +32,6 @@ module Avromatic
33
32
  eager_load_models!
34
33
  end
35
34
 
36
- def self.use_encoding_providers?
37
- use_custom_datum_writer && defined?(Avromatic::Patches::SchemaValidatorPatch)
38
- end
39
-
40
35
  def self.build_schema_registry
41
36
  raise 'Avromatic must be configured with a registry_url' unless registry_url
42
37
  if use_schema_fingerprint_lookup
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Avromatic
4
- module IO
5
- UNION_MEMBER_INDEX = '__avromatic_member_index'
6
- ENCODING_PROVIDER = '__avromatic_encoding_provider'
7
- end
8
- end
9
-
10
3
  require 'avromatic/io/datum_reader'
11
4
  require 'avromatic/io/datum_writer'
5
+ require 'avromatic/io/union_datum'
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Style/WhenThen
4
3
  module Avromatic
5
4
  module IO
6
5
  # Subclass DatumReader to include additional information about the union
@@ -8,81 +7,32 @@ module Avromatic
8
7
  # branch 'salsify-master' with the tag 'v1.9.0.3'
9
8
  class DatumReader < Avro::IO::DatumReader
10
9
 
11
- UNION_MEMBER_INDEX = Avromatic::IO::UNION_MEMBER_INDEX
12
-
13
- def read_data(writers_schema, readers_schema, decoder, initial_record = nil)
14
- # schema matching
15
- unless self.class.match_schemas(writers_schema, readers_schema)
16
- raise Avro::IO::SchemaMatchException.new(writers_schema, readers_schema)
17
- end
18
-
10
+ def read_data(writers_schema, readers_schema, decoder)
19
11
  # schema resolution: reader's schema is a union, writer's schema is not
20
- if writers_schema.type_sym != :union && readers_schema.type_sym == :union
21
- rs_index = readers_schema.schemas.find_index do |s|
22
- self.class.match_schemas(writers_schema, s)
23
- end
12
+ return super unless writers_schema.type_sym != :union && readers_schema.type_sym == :union
24
13
 
25
- optional = readers_schema.schemas.first.type_sym == :null
26
- union_info = if readers_schema.schemas.size == 2 && optional
27
- # Avromatic does not treat the union of null and 1 other type as a union
28
- {}
29
- elsif optional
30
- # Avromatic does not treat the null of an optional field as part of the union
31
- { UNION_MEMBER_INDEX => rs_index - 1 }
32
- else
33
- { UNION_MEMBER_INDEX => rs_index }
34
- end
35
-
36
- return read_data(writers_schema, readers_schema.schemas[rs_index], decoder, union_info) if rs_index
37
- raise Avro::IO::SchemaMatchException.new(writers_schema, readers_schema)
14
+ rs_index = readers_schema.schemas.find_index do |s|
15
+ self.class.match_schemas(writers_schema, s)
38
16
  end
39
17
 
40
- # function dispatch for reading data based on type of writer's schema
41
- datum = case writers_schema.type_sym
42
- when :null; decoder.read_null
43
- when :boolean; decoder.read_boolean
44
- when :string; decoder.read_string
45
- when :int; decoder.read_int
46
- when :long; decoder.read_long
47
- when :float; decoder.read_float
48
- when :double; decoder.read_double
49
- when :bytes; decoder.read_bytes
50
- when :fixed; read_fixed(writers_schema, readers_schema, decoder)
51
- when :enum; read_enum(writers_schema, readers_schema, decoder)
52
- when :array; read_array(writers_schema, readers_schema, decoder)
53
- when :map; read_map(writers_schema, readers_schema, decoder)
54
- when :union; read_union(writers_schema, readers_schema, decoder)
55
- when :record, :error, :request; read_record(writers_schema, readers_schema, decoder, initial_record || {})
56
- else
57
- raise Avro::AvroError.new("Cannot read unknown schema type: #{writers_schema.type}")
58
- end
18
+ raise Avro::IO::SchemaMatchException.new(writers_schema, readers_schema) unless rs_index
59
19
 
60
- # Allow this code to be used with an official Avro release or the
61
- # avro-patches gem that includes logical_type support.
62
- if readers_schema.respond_to?(:logical_type)
63
- readers_schema.type_adapter.decode(datum)
64
- else
65
- datum
66
- end
67
- end
20
+ datum = read_data(writers_schema, readers_schema.schemas[rs_index], decoder)
21
+ optional = readers_schema.schemas.first.type_sym == :null
68
22
 
69
- # Override to specify an initial record that may contain union index
70
- def read_record(writers_schema, readers_schema, decoder, initial_record = {})
71
- readers_fields_hash = readers_schema.fields_hash
72
- read_record = Avromatic.use_custom_datum_reader ? initial_record : {}
73
- writers_schema.fields.each do |field|
74
- readers_field = readers_fields_hash[field.name]
75
- if readers_field
76
- field_val = read_data(field.type, readers_field.type, decoder)
77
- read_record[field.name] = field_val
78
- else
79
- skip_data(field.type, decoder)
80
- end
23
+ if readers_schema.schemas.size == 2 && optional
24
+ # Avromatic does not treat the union of null and 1 other type as a union
25
+ datum
26
+ elsif datum.nil?
27
+ # Avromatic does not treat the null of an optional field as part of the union
28
+ nil
29
+ else
30
+ # Avromatic does not treat the null of an optional field as part of the union so
31
+ # adjust the member index accordingly
32
+ member_index = optional ? rs_index - 1 : rs_index
33
+ Avromatic::IO::UnionDatum.new(member_index, datum)
81
34
  end
82
-
83
- read_record
84
35
  end
85
36
  end
86
37
  end
87
38
  end
88
- # rubocop:enable Style/WhenThen