blob: e1ae7498670c4297ab55cc290bf46244d05ee97f [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* license agreements; and to You under the Apache License, version 2.0:
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* This file is part of the Apache Pekko project, which was derived from Akka.
*/
import com.github.sbt.junit.jupiter.sbt.Import.JupiterKeys
import net.bzzt.reproduciblebuilds.ReproducibleBuildsPlugin.reproducibleBuildsCheckResolver
import org.apache.pekko.projections.Dependencies
ThisBuild / versionScheme := Some(VersionScheme.SemVerSpec)
sourceDistName := "apache-pekko-projection"
sourceDistIncubating := false
ThisBuild / evictionErrorLevel := Level.Info
ThisBuild / resolvers += Resolver.ApacheMavenSnapshotsRepo
ThisBuild / reproducibleBuildsCheckResolver := Resolver.ApacheMavenStagingRepo
ThisBuild / javafmtFormatterCompatibleJavaVersion := 17
ThisBuild / JupiterKeys.junitJupiterVersion := "6.1.0"
ThisBuild / JupiterKeys.junitPlatformVersion := "6.1.0"
Global / excludeLintKeys ++= Set(JupiterKeys.junitJupiterVersion, JupiterKeys.junitPlatformVersion)
lazy val core =
Project(id = "core", base = file("core"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(Dependencies.core)
.settings(AutomaticModuleName.settings("pekko.projection.core"))
.settings(name := "pekko-projection-core")
.settings(Protobuf.settings)
lazy val coreTest =
Project(id = "core-test", base = file("core-test"))
.disablePlugins(MimaPlugin)
.settings(Dependencies.coreTest)
.settings(name := "pekko-projection-core-test")
.settings(publish / skip := true)
.dependsOn(core)
.dependsOn(testkit % Test)
lazy val testkit =
Project(id = "testkit", base = file("testkit"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(Dependencies.testKit)
.settings(AutomaticModuleName.settings("pekko.projection.testkit"))
.settings(name := "pekko-projection-testkit")
.dependsOn(core)
// provides offset storage backed by a JDBC table
lazy val jdbc =
Project(id = "jdbc", base = file("jdbc"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(Dependencies.jdbc)
.settings(AutomaticModuleName.settings("pekko.projection.jdbc"))
.settings(name := "pekko-projection-jdbc")
.dependsOn(core)
.dependsOn(coreTest % "test->test")
.dependsOn(testkit % Test)
lazy val jdbcIntTest =
Project(id = "jdbc-int-test", base = file("jdbc-int-test"))
.disablePlugins(MimaPlugin)
.settings(Dependencies.jdbc)
.settings(
name := "pekko-projection-jdbc-int-test",
publish / skip := true,
Test / parallelExecution := false)
.dependsOn(jdbc % "test->test")
.dependsOn(coreTest % "test->test")
.dependsOn(testkit % Test)
// provides offset storage backed by a JDBC (Slick) table
lazy val slick =
Project(id = "slick", base = file("slick"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(
// Transitive dependency `scala-reflect` to avoid `NoClassDefFoundError`.
// See: https://github.com/slick/slick/issues/2933
libraryDependencies ++=
(CrossVersion.partialVersion(scalaVersion.value) match {
case Some((2, _)) => Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value)
case _ => Nil
}))
.settings(Dependencies.slick)
.settings(AutomaticModuleName.settings("pekko.projection.slick"))
.settings(
name := "pekko-projection-slick",
versionScheme := None)
.dependsOn(jdbc)
.dependsOn(core)
.dependsOn(coreTest % "test->test")
.dependsOn(testkit % Test)
lazy val slickIntTest =
Project(id = "slick-int-test", base = file("slick-int-test"))
.disablePlugins(MimaPlugin)
.settings(Dependencies.slick)
.settings(
name := "pekko-projection-slick-int-test",
versionScheme := None,
publish / skip := true,
Test / parallelExecution := false)
.dependsOn(slick % "test->test")
.dependsOn(core)
.dependsOn(coreTest % "test->test")
.dependsOn(testkit % Test)
// provides offset storage backed by a Cassandra table
lazy val cassandra =
Project(id = "cassandra", base = file("cassandra"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(Dependencies.cassandra)
.settings(AutomaticModuleName.settings("pekko.projection.cassandra"))
.settings(name := "pekko-projection-cassandra")
.dependsOn(core)
lazy val cassandraTest =
Project(id = "cassandra-test", base = file("cassandra-test"))
.disablePlugins(MimaPlugin)
.settings(Dependencies.cassandra)
.settings(name := "pekko-projection-cassandra-test")
.settings(publish / skip := true)
.settings(Test / parallelExecution := false)
.dependsOn(core)
.dependsOn(cassandra)
.dependsOn(coreTest % "test->test")
.dependsOn(testkit % Test)
// provides source providers for pekko-persistence-query
lazy val eventsourced =
Project(id = "eventsourced", base = file("eventsourced"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(Dependencies.eventsourced)
.settings(AutomaticModuleName.settings("pekko.projection.eventsourced"))
.settings(name := "pekko-projection-eventsourced")
.dependsOn(core)
.dependsOn(testkit % Test)
// provides offset storage backed by Kafka managed offset commits
lazy val kafka =
Project(id = "kafka", base = file("kafka"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(Dependencies.kafka)
.settings(AutomaticModuleName.settings("pekko.projection.kafka"))
.settings(name := "pekko-projection-kafka")
.dependsOn(core)
.dependsOn(testkit % "test")
lazy val kafkaTest =
Project(id = "kafka-test", base = file("kafka-test"))
.disablePlugins(MimaPlugin)
.settings(Dependencies.kafkaTest)
.settings(
name := "pekko-projection-kafka-test",
publish / skip := true)
.dependsOn(kafka % "test->test")
.dependsOn(slick % "compile;test->test")
.dependsOn(testkit % "test")
// provides source providers for durable state changes
lazy val `durable-state` =
Project(id = "durable-state", base = file("durable-state"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(Dependencies.state)
.settings(AutomaticModuleName.settings("pekko.projection.durable-state"))
.settings(name := "pekko-projection-durable-state")
.dependsOn(core)
.dependsOn(testkit % Test)
// provides event producer/consumer over gRPC
lazy val grpc =
Project(id = "grpc", base = file("grpc"))
.enablePlugins(ReproducibleBuildsPlugin, PekkoGrpcPlugin)
.disablePlugins(MimaPlugin) // new in 2.0.0
.settings(Dependencies.grpc)
.settings(AutomaticModuleName.settings("pekko.projection.grpc"))
.settings(
name := "pekko-projection-grpc",
pekkoGrpcCodeGeneratorSettings += "server_power_apis")
.dependsOn(core)
.dependsOn(eventsourced)
.dependsOn(testkit % Test)
// provides offset storage backed by a R2DBC table
lazy val r2dbc =
Project(id = "r2dbc", base = file("r2dbc"))
.enablePlugins(ReproducibleBuildsPlugin)
.settings(Dependencies.r2dbc)
.settings(AutomaticModuleName.settings("pekko.projection.r2dbc"))
.settings(
name := "pekko-projection-r2dbc")
.dependsOn(core)
.dependsOn(grpc)
lazy val grpcTest =
Project(id = "grpc-test", base = file("grpc-test"))
.enablePlugins(PekkoGrpcPlugin)
.disablePlugins(MimaPlugin)
.settings(Dependencies.grpcTest)
.settings(
name := "pekko-projection-grpc-test",
publish / skip := true,
// following is needed by Agrona lib
// https://github.com/aeron-io/agrona/wiki/Change-Log#200-2024-12-17
Test / fork := true,
Test / javaOptions += "--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED")
.dependsOn(grpc % "compile;test->compile")
.dependsOn(r2dbc % Test)
.dependsOn(testkit % Test)
lazy val grpcIntTest =
Project(id = "grpc-int-test", base = file("grpc-int-test"))
.disablePlugins(MimaPlugin)
.settings(Dependencies.grpcIntTest)
.settings(
name := "pekko-projection-grpc-int-test",
publish / skip := true,
// following is needed by Agrona lib
// https://github.com/aeron-io/agrona/wiki/Change-Log#200-2024-12-17
Test / fork := true,
Test / javaOptions += "--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED")
.dependsOn(grpcTest % "test->test;test->compile")
.dependsOn(eventsourced % Test)
.dependsOn(r2dbc % Test)
.dependsOn(testkit % Test)
lazy val r2dbcIntTest =
Project(id = "r2dbc-int-test", base = file("r2dbc-int-test"))
.disablePlugins(MimaPlugin)
.settings(Dependencies.r2dbcIntTest)
.settings(
name := "pekko-projection-r2dbc-int-test",
publish / skip := true,
Test / parallelExecution := false,
// there are some compile warnings in the test code (Scala 2.13)
scalacOptions ++= {
if (scalaVersion.value.startsWith("2."))
Seq(
"-Wconf:msg=Implicit resolves to enclosing:s",
"-Wconf:msg=outer reference in this type test:s",
"-Wconf:cat=lint:s")
else Seq.empty
})
.dependsOn(core)
.dependsOn(coreTest % "test->test")
.dependsOn(r2dbc % "test->test;test->compile")
.dependsOn(eventsourced % Test)
.dependsOn(`durable-state` % Test)
.dependsOn(testkit % Test)
lazy val userProjects: Seq[ProjectReference] = List[ProjectReference](
core, jdbc, slick, cassandra, eventsourced, kafka, `durable-state`, r2dbc, grpc, testkit)
lazy val examples = project
.enablePlugins(ReproducibleBuildsPlugin)
.disablePlugins(MimaPlugin)
.settings(Dependencies.examples)
.dependsOn(slick % "test->test")
.dependsOn(jdbc % "test->test")
.dependsOn(cassandraTest % "test->test")
.dependsOn(eventsourced)
.dependsOn(`durable-state`)
.dependsOn(kafka % "test->test")
.dependsOn(testkit % Test)
.settings(publish / skip := true, scalacOptions += "-feature", javacOptions += "-parameters")
lazy val integrationExamples = Project("integration-examples", file("integration-examples"))
.enablePlugins(ReproducibleBuildsPlugin)
.disablePlugins(MimaPlugin)
.settings(Dependencies.examples)
.dependsOn(slick % "test->test")
.dependsOn(jdbc % "test->test")
.dependsOn(cassandraTest % "test->test")
.dependsOn(eventsourced)
.dependsOn(`durable-state`)
.dependsOn(kafka % "test->test")
.dependsOn(examples % "test->test")
.dependsOn(testkit % Test)
.settings(publish / skip := true,
scalacOptions += "-feature",
javacOptions += "-parameters",
Test / parallelExecution := false)
lazy val docs = project
.enablePlugins(PekkoParadoxPlugin, ParadoxPlugin, ParadoxSitePlugin, PreprocessPlugin)
.disablePlugins(MimaPlugin)
.dependsOn(core, testkit)
.settings(
name := "Apache Pekko Projections",
pekkoParadoxGithub := Some("https://github.com/apache/pekko-projection"),
publish / skip := true,
makeSite := makeSite.dependsOn(LocalRootProject / ScalaUnidoc / doc).value,
previewPath := (Paradox / siteSubdirName).value,
Global / excludeLintKeys += previewPath,
Preprocess / siteSubdirName := s"api/pekko-projection/${projectInfoVersion.value}",
Preprocess / sourceDirectory := (LocalRootProject / ScalaUnidoc / unidoc / target).value,
Paradox / siteSubdirName := s"docs/pekko-projection/${projectInfoVersion.value}",
Compile / paradoxProperties ++= Map(
"project.url" -> "https://pekko.apache.org/docs/pekko-projection/current/",
"canonical.base_url" -> "https://pekko.apache.org/docs/pekko-projection/current",
"github.base_url" -> "https://github.com/apache/pekko-projection",
"pekko.version" -> Dependencies.Versions.pekko,
"pekko.r2dbc.version" -> Dependencies.Versions.pekkoPersistenceR2dbc,
// Pekko
"extref.pekko.base_url" -> s"https://pekko.apache.org/docs/pekko/${Dependencies.PekkoVersionInDocs}/%s",
"scaladoc.pekko.base_url" -> s"https://pekko.apache.org/api/pekko/${Dependencies.PekkoVersionInDocs}/",
"javadoc.pekko.base_url" -> s"https://pekko.apache.org/japi/pekko/${Dependencies.PekkoVersionInDocs}/",
"javadoc.pekko.link_style" -> "direct",
"extref.pekko-grpc.base_url" ->
s"https://pekko.apache.org/docs/pekko-grpc/${Dependencies.PekkoGrpcVersionInDocs}/%s",
"scaladoc.org.apache.pekko.grpc.base_url" ->
s"https://pekko.apache.org/api/pekko-grpc/${Dependencies.PekkoGrpcVersionInDocs}",
"javadoc.org.apache.pekko.grpc.base_url" ->
s"https://pekko.apache.org/api/pekko-grpc/${Dependencies.PekkoGrpcVersionInDocs}",
"javadoc.org.apache.pekko.grpc.link_style" -> "direct",
"extref.pekko-persistence-r2dbc.base_url" ->
s"https://pekko.apache.org/docs/pekko-persistence-r2dbc/${Dependencies.PekkoPersistenceR2dbcVersionInDocs}/%s",
"scaladoc.org.apache.pekko.persistence.r2dbc.base_url" ->
s"https://pekko.apache.org/api/pekko-persistence-r2dbc/${Dependencies.PekkoPersistenceR2dbcVersionInDocs}",
"javadoc.org.apache.pekko.persistence.r2dbc.base_url" ->
s"https://pekko.apache.org/api/pekko-persistence-r2dbc/${Dependencies.PekkoPersistenceR2dbcVersionInDocs}",
"javadoc.org.apache.pekko.persistence.r2dbc.link_style" -> "direct",
// Java
"javadoc.base_url" -> "https://docs.oracle.com/en/java/javase/17/docs/api/java.base/",
"javadoc.link_style" -> "direct",
// Scala
"scaladoc.scala.base_url" -> s"https://www.scala-lang.org/api/${scalaBinaryVersion.value}.x/",
"scaladoc.pekko.projection.base_url" -> s"/${(Preprocess / siteSubdirName).value}/",
"javadoc.pekko.projection.base_url" -> ""),
paradoxGroups := Map("Language" -> Seq("Java", "Scala")),
paradoxRoots := List("index.html", "getting-started/event-generator-app.html"),
apidocRootPackage := "org.apache.pekko",
Global / pekkoParadoxIncubatorNotice := None,
Compile / paradoxMarkdownToHtml / sourceGenerators += Def.taskDyn {
val targetFile = (Compile / paradox / sourceManaged).value / "license-report.md"
(LocalRootProject / dumpLicenseReportAggregate).map { dir =>
IO.copy(List(dir / "pekko-projection-root-licenses.md" -> targetFile)).toList
}
}.taskValue)
lazy val billOfMaterials = Project("bill-of-materials", file("bill-of-materials"))
.enablePlugins(BillOfMaterialsPlugin)
.disablePlugins(MimaPlugin, SitePlugin)
.settings(
name := "pekko-projection-bom",
licenses := List(License.Apache2),
bomIncludeProjects := userProjects,
description := s"${description.value} (depending on Scala ${CrossVersion.binaryScalaVersion(scalaVersion.value)})")
lazy val root = Project(id = "projection", base = file("."))
.aggregate(userProjects: _*)
.aggregate(billOfMaterials, coreTest, kafkaTest, cassandraTest, grpcTest, examples, integrationExamples, docs)
.settings(
publish / skip := true,
name := "pekko-projection-root")
.enablePlugins(ScalaUnidocPlugin)
.disablePlugins(SitePlugin, MimaPlugin)
// check format and headers
addCommandAlias("checkCodeStyle", "scalafmtCheckAll; scalafmtSbtCheck; javafmtCheckAll; +headerCheckAll")
addCommandAlias("applyCodeStyle", "+headerCreateAll; scalafmtAll; scalafmtSbt; javafmtAll")