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.5.1")
NOTE: On Nexus, please set nexus proxy layout to permissive
in to resolve artifacts with a sbt-version suffixes
Usage
The following tasks and settings are automatically imported to your build:
Tasks:
Name | Description |
---|---|
avroScalaGenerate |
Compiles the Avro files into Scala case classes. |
avroScalaGenerateScavro |
(@deprecated ) Compiles the Avro files into Scala case class Scavro wrapper 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-2.13/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. |
Scavro Settings (@deprecated)
Name | Default | Description |
---|---|---|
avroScavroSourceDirectories |
Seq("src/main/avro") |
List of paths containing *.avsc , *.avdl , and/or *.avro files. |
avroScavroScalaSource |
$sourceManaged/main/compiled_avro |
Path for the generated *.scala or *.java files. |
avroScalaScavroCustomTypes |
Scavro.defaultTypes |
Customizable Type Mapping. |
avroScalaScavroCustomNamespace |
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 toScalaCaseClass
andScalaCaseClassWithSchema
(with schema in a companion object)array
can be assigned toScalaSeq
,ScalaArray
,ScalaList
, andScalaVector
enum
can be assigned toJavaEnum
,ScalaCaseObjectEnum
,EnumAsScalaString
, andScalaEnumeration
fixed
can be assigned to ,ScalaCaseClassWrapper
andScalaCaseClassWrapperWithSchema
(with schema in a companion object)union
can be assigned toOptionEitherShapelessCoproduct
andOptionalShapelessCoproduct
int
,long
,float
,double
can be assigned toScalaInt
,ScalaLong
,ScalaFloat
,ScalaDouble
date
logical type can be assigned toJavaTimeLocalDate
andJavaSqlDate
timestamp-millis
logical type can be assigned toJavaTimeInstant
andJavaSqlTimestamp
uuid
logical type can be assigned toUUID
decimal
can be assigned to e.g.ScalaBigDecimal(Some(BigDecimal.RoundingMode.HALF_EVEN))
andScalaBigDecimalWithPrecision(None)
(via Shapeless Tagged Types)protocol
can be assigned toScalaADT
andNoTypeGenerated
(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.