julianpeeters / sbt-avrohugger   2.9.0

Apache License 2.0 GitHub

sbt plugin for generating Scala sources for Apache Avro schemas and protocols.

Scala versions: 2.12
sbt plugins: 1.x

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.9.0")

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)
}
  • record can be assigned to ScalaCaseClass and ScalaCaseClassWithSchema (with schema in a companion object)
  • array can be assigned to ScalaSeq, ScalaArray, ScalaList, and ScalaVector
  • enum can be assigned to JavaEnum, ScalaCaseObjectEnum, EnumAsScalaString, and ScalaEnumeration
  • fixed can be assigned to , ScalaCaseClassWrapper and ScalaCaseClassWrapperWithSchema(with schema in a companion object)
  • union can be assigned to OptionEitherShapelessCoproduct (incompatible with Specific), OptionalShapelessCoproduct and OptionScala3UnionType (incompatible with Standard)
  • int, long, float, double can be assigned to ScalaInt, ScalaLong, ScalaFloat, ScalaDouble
  • date logical type can be assigned to JavaTimeLocalDate and JavaSqlDate
  • timestamp-millis logical type can be assigned to JavaTimeInstant and JavaSqlTimestamp
  • uuid logical type can be assigned to UUID
  • decimal can be assigned to e.g. ScalaBigDecimal(Some(BigDecimal.RoundingMode.HALF_EVEN)) and ScalaBigDecimalWithPrecision(None) (via Shapeless Tagged Types)
  • protocol can be assigned to ScalaADT and NoTypeGenerated (see Protocol Support)

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.