sbt plugin for generating Scala case classes and ADTs from Apache Avro schemas, datafiles, and protocols.
Add the following lines to the file myproject/project/plugins.sbt
in your
project directory:
addSbtPlugin("com.julianpeeters" % "sbt-avrohugger" % "2.8.4")
The following tasks and settings are automatically imported to your build:
Name | Description |
---|---|
avroScalaGenerate |
Compiles the Avro files into Scala case classes. |
avroScalaGenerateSpecific |
Compiles the Avro files into Scala case classes implementing SpecificRecord . |
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).
And/Or wire the tasks into the Test
config, putting Avro files in src/test/avro
:
e.g.: Test / sourceGenerators += (Test / avroScalaGenerate).taskValue
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.
To enable file-watching for avro files, e.g. in ~compile
, use:
e.g.: watchSources ++= ((Compile / avroSourceDirectory).value ** "*.avdl").get
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. |
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
and OptionalShapelessCoproduct
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)Supports generating case classes with arbitrary fields of the following datatypes: see avrohugger docs - supported datatypes
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
.
sbt-avrohugger
is based on sbt-avro originally developed by Juan Manuel Caicedo, and depends on avrohugger.