Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/malcolmgreaves/avro-codegen

Scala code generator for Avro schemas.
https://github.com/malcolmgreaves/avro-codegen

avro avro-schema codegen data scala serialization

Last synced: 24 days ago
JSON representation

Scala code generator for Avro schemas.

Awesome Lists containing this project

README

        

avro-codegen
============
[![Build Status](https://travis-ci.org/malcolmgreaves/avro-codegen.svg?branch=master)](https://travis-ci.org/malcolmgreaves/avro-codegen) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/fe5fab0140fc4a05ad5bcef6972b0409)](https://www.codacy.com/app/greavesmalcolm/avro-codegen?utm_source=github.com&utm_medium=referral&utm_content=malcolmgreaves/avro-codegen&utm_campaign=Badge_Grade) [![Gitter](https://badges.gitter.im/malcolmgreaves/avro-codegen.svg)](https://gitter.im/malcolmgreaves/avro-codegen?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Stories in Ready](https://badge.waffle.io/malcolmgreaves/avro-codegen.png?label=ready&title=Ready)](https://waffle.io/malcolmgreaves/avro-codegen) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.malcolmgreaves/avro-codegen-runtime_2.12/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/io.malcolmgreaves/avro-codegen-runtime_2.12)

Scala code generation from Avro schemas. Generates code similar to [ScalaPB](https://github.com/trueaccord/ScalaPB).

Notably, the generated code for data encapsulation is in the form of case classes. The data representation is completely immutable.

All generated code adheres to the `GeneratedMessageCompanion` type class. This ensures that there exists decode and encode functionality.

working code generation for types:
* enums
* records
* scalar fields (for all types except for byte arrays)
* union fields via shapeless coproducts (for unions not containing NULL)
* optional union fields via shapeless coproducts (for unions containing more than 2 types, one of which is NULL)
* optional fields (for unions containing 2 types, one of which is NULL)
* arrays
* maps
* byte arrays

features:
* generated `org.scalacheck.Gen[_]` instances for generated enums, records

not implemented:
* fixed-length fields
* Generating code from inter-dependent schemas defined in multiple files (currently only handles this case when everything is in the same file).

Subprojects
==================
* runtime: runtime dependencies
* codegen: generates `.scala` files from avro schemas. Currently hardcoded to generate `Out.scala` in sandbox from the avro schemas in the example directory.
* proptest: generates random schemas, generates scala code for the schemas, tests the generated scala code by serializing and deserializing random message instances

To Use
============

There are two ways to use this project. The first is in creating `case class` instances from Avro schemas. The second is in interacting with the generated code. In practice, it's common for a project to do a little bit of both.

For the first use case:

add this to `project/plugins.sbt`
```
addSbtPlugin("io.malcolmgreaves" % "avro-codegen-compiler" % "X.Y.Z")
```

where `X.Y.Z` is the most recent version.

Add your avro schemas to `src/main/avro` with the `.avsc` extension. Generated scala classes will be created in `target/scala-2.12/src_managed/main/generated_avro_classes/`.

For the second use case:

When using code generated by this plugin, it is necessary to include the runtime dependency (which includes lots of goodies -- notably the serialization type class `GeneratedMessage`). Therefore, include the following in your `build.sbt`

```
libraryDependencies ++= Seq("io.malcolmgreaves" %% "avro-codegen-runtime" % "X.Y.Z")
```