Coder Social home page Coder Social logo

kokolanako / avro-compatibility Goto Github PK

View Code? Open in Web Editor NEW

This project forked from expediagroup/avro-compatibility

0.0 0.0 0.0 59 KB

A user friendly API for checking for and reporting on Avro schema incompatibilities.

License: Apache License 2.0

Java 100.00%

avro-compatibility's Introduction

Avro compatibility

A user friendly API for checking for and reporting on Avro schema incompatibilities.

Start using

You can obtain avro-compatibility from Maven Central:

Maven Central GitHub license

Overview

Although Avro is excellent at determining the compatibility of schemas, it is not very good at reporting the nature and the location of any schema incompatibilities it finds. Rather than supplement or modify any existing Avro APIs (which are already overloaded), avro-compatibility introduces an entirely distinct API that leverages these new features.

Features

Incompatibility type detection

Detects specific incompatibility conditions (via AVRO-1933):

  • Type name mismatch.
  • Fixed type size mismatch.
  • Missing enum symbols.
  • Missing field default values.
  • Type mismatches.
  • Missing union type branches.

Incompatibility location detection

Describes the location in the schema where incompatibilities occur using JSON Pointer (via AVRO-2003). Examples (source schema not shown):

  • field type incompatibility: /fields/0/type
  • missing union branch: /fields/1/type/2
  • missing enum symbol: /fields/2/type/symbols
  • array element type incompatibility: /fields/3/type/items
  • fixed size type incompatibility: /fields/5/type/size
  • missing default from field: /fields/3

Descriptive messages

Provides user friendly incompatibility messages such as:

Compatibility type 'CAN_READ' does not hold between schemas, incompatibilities: ['MISSING_UNION_BRANCH: reader union lacking writer type: INT' at '/fields/0/type/2'].
Compatibility type 'CAN_READ' does not hold between one or more schemas because: Schema[1] has incompatibilities: ['READER_FIELD_MISSING_DEFAULT_VALUE: f2' at '/fields/1]'.

Usage

Checking compatibility

With a fluent API:

// 'Backwards'
Compatibility.checkThat(schema2).canRead(schema1);
// 'Backwards, latest of chronology'
Compatibility.checkThat(schema1).canRead().latestOf(schema3, schema2);
// 'Forwards, transitive'
Compatibility.checkThat(schema1).canBeReadBy().all(schema2, schema3);

Alternatively use predefined compatibility checkers:

Compatibility.Mode.CAN_READ_LATEST
  .check(schema1, Collections.singletonList(schema3, schema2));
Compatibility.Mode.MUTUAL_READ_WITH_ALL
  .check(schema1, Arrays.asList(schema3, schema2));

Compatibility check results

Interrogate the results programmatically with CompatibilityCheckResult and ChronologyCompatibilityCheckResult or simply throw an exception or get a message:

Compatibility.checkThat(schema2).canRead(schema1).throwIfIncompatible();
System.out.println(
  Compatibility.checkThat(schema2).canRead(schema1).asMessage()
);

Notes

  • The compatibility/evolution rule implementation used by the library supports aliases; the implementation accessed via org.apache.avro.SchemaValidatorBuilder does not. Exercise care if migrating from one to the other. Note that this isn't something that we've introduced, Avro just happens to contain two implementations of said rules that unfortunately have subtle differences in behaviour.

Prior art

This project is based on the SchemaCompatibility class from the Avro project. Tests are based on the AvroCompatibilityTest suite from the Confluent/schema-registry project.

Credits

Legal

This project is available under the Apache 2.0 License. See NOTICE for further information.

Copyright 2017 Expedia Inc.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.