julianpeeters / sbt-avrohugger

sbt plugin for generating Scala sources for Apache Avro schemas and protocols.
Apache License 2.0
133 stars 50 forks source link
avro sbt-plugin scala

sbt-avrohugger

sbt plugin for generating Scala case classes and ADTs from Apache Avro schemas, datafiles, and protocols.

Install the plugin (compatible with sbt 1.3+)

Add the following lines to the file myproject/project/plugins.sbt in your project directory:

addSbtPlugin("com.julianpeeters" % "sbt-avrohugger" % "2.8.4")

Usage

The following tasks and settings are automatically imported to your build:

Tasks:

Name Description
avroScalaGenerate Compiles the Avro files into Scala case classes.
avroScalaGenerateSpecific Compiles the Avro files into Scala case classes implementing SpecificRecord.

Compile

Wire the tasks into compile in your build.sbt:

e.g.: Compile / sourceGenerators += (Compile / avroScalaGenerate).taskValue

By default, the plugin looks Avro files in src/main/avro and generates Scala files in $sourceManaged, e.g., target/scala-3.3.1/src_managed/main/compiled_avro/ (to choose different locations, please see Changing Settings).

Test

And/Or wire the tasks into the Test config, putting Avro files in src/test/avro:

e.g.: Test / sourceGenerators += (Test / avroScalaGenerate).taskValue

Manually

To run the tasks manually, please see Changing Settings or the sbt docs in order to ensure the compiler will be able to find the generated files.

Watch Avro Files

To enable file-watching for avro files, e.g. in ~compile, use:

e.g.: watchSources ++= ((Compile / avroSourceDirectory).value ** "*.avdl").get

Settings:

Standard Settings

Name Default Description
avroSourceDirectories Seq("src/main/avro") | List of paths containing *.avsc, *.avdl, and/or *.avro files.
avroScalaSource $sourceManaged/main/compiled_avro | Path for the generated *.scala or *.java files.
avroScalaCustomTypes Standard.defaultTypes Customizable Type Mapping.
avroScalaCustomNamespace Map.empty[String, String] Map for reassigning namespaces.

SpecificRecord Settings

Name Default Description
avroSpecificSourceDirectories Seq("src/main/avro") | Path containing *.avsc, *.avdl, and/or *.avro files.
avroSpecificScalaSource $sourceManaged/main/compiled_avro | Path for the generated *.scala or *.java files.
avroScalaSpecificCustomTypes SpecificRecord.defaultTypes Customizable Type Mapping.
avroScalaSpecificCustomNamespace Map.empty[String, String] Map for reassigning namespaces.

Changing Settings

Settings for each format's task can be extended/overridden by adding lines to your build.sbt file.

E.g., to change how classes of SpecificRecords format are generated, use:

Compile / avroSpecificSourceDirectories += (Compile / sourceDirectory).value / "myavro"

Compile / avroSpecificScalaSource := new java.io.File("myScalaSource")

Compile / avroScalaSpecificCustomNamespace := Map("my.example"->"my.overridden.ex", "test.*" -> "wildcarded")

Compile / avroScalaSpecificCustomTypes := {
  avrohugger.format.SpecificRecord.defaultTypes.copy(
    array = avrohugger.types.ScalaVector)
}

Datatypes

Supports generating case classes with arbitrary fields of the following datatypes: see avrohugger docs - supported datatypes

Testing

Please run unit tests in src/test/scala with ^ test, and integration tests in src/sbt-test with ^ scripted sbt-avrohugger/*, or, e.g. scripted sbt-avrohugger/specific.

Credits

sbt-avrohugger is based on sbt-avro originally developed by Juan Manuel Caicedo, and depends on avrohugger.

Contributors

Marius Soutier
Vince Tse
Saket
Raúl Raja Martínez
Marco Stefani
Sacha Barber
sullis
Alexandre Bertails
Alexander Khotyanov
Brennan Saeta
Jerome Wacongne
Jon Morra
Paul Snively
Diego E. Alonso Blas
Andrew Gustafson
Jonas Grabber
mcenkar
Daniel Lundin
Ryan Koval
Simonas Gelazevicius
Zach Cox
Chris Albright
Fede Fernández
natefitzgerald
Angel Sanadinov

Fork away, just make sure the tests pass before you send a pull request.

Criticism is appreciated.