build.sbt (141 lines of code) (raw):
import sbt.Keys.*
import sbt.{Test, Tests}
import sbtrelease.ReleaseStateTransformations.*
import sbtversionpolicy.withsbtrelease.ReleaseVersion
// dependency versions
val contentEntityVersion = "3.0.3"
val contentAtomVersion = "4.0.4"
val storyPackageVersion = "2.2.0"
val thriftVersion = "0.15.0"
val scroogeVersion = "22.1.0" // update plugins too if this version changes
val circeVersion = "0.14.1"
val fezziwigVersion = "2.0.0"
// dependency versions (for tests only)
val scalaTestVersion = "3.0.8"
val guavaVersion = "19.0"
val diffsonVersion = "4.1.1"
// support non-production release types
val betaReleaseType = "beta"
val betaReleaseSuffix = "-beta.0"
val snapshotReleaseType = "snapshot"
val snapshotReleaseSuffix = "-SNAPSHOT"
lazy val artifactProductionSettings = Seq(
scalaVersion := "2.13.12",
// This old attempt to downgrade scrooge reserved word clashes is now insufficient... https://github.com/twitter/scrooge/issues/259#issuecomment-1900743695
Compile / scroogeDisableStrict := true,
// scrooge 21.3.0: Builds are now only supported for Scala 2.12+
// https://twitter.github.io/scrooge/changelog.html#id11
crossScalaVersions := Seq("2.12.18", scalaVersion.value),
organization := "com.gu",
licenses := Seq("Apache v2" -> url("http://www.apache.org/licenses/LICENSE-2.0.html")),
resolvers ++= Resolver.sonatypeOssRepos("public"),
Test / testOptions +=
Tests.Argument(TestFrameworks.ScalaTest, "-u", s"test-results/scala-${scalaVersion.value}", "-o")
)
/**
* Root project
*/
lazy val root = Project(id = "root", base = file("."))
.aggregate(models, json, scala)
.settings(
publish / skip := true,
releaseVersion := ReleaseVersion.fromAggregatedAssessedCompatibilityWithLatestRelease().value,
releaseProcess := Seq[ReleaseStep](
checkSnapshotDependencies,
inquireVersions,
runClean,
runTest,
setReleaseVersion,
commitReleaseVersion,
tagRelease,
setNextVersion,
commitNextVersion
)
)
/**
* Thrift models project
*/
lazy val models = Project(id = "content-api-models", base = file("models"))
.settings(artifactProductionSettings)
.disablePlugins(ScroogeSBT)
.settings(
description := "Scala models for the Guardian's Content API",
crossPaths := false,
packageDoc / publishArtifact := false,
packageSrc / publishArtifact := false,
unmanagedResources / includeFilter := "*.thrift",
Compile / unmanagedResourceDirectories += { baseDirectory.value / "src/main/thrift" }
)
/**
* Thrift generated Scala classes project
*/
lazy val scala = Project(id = "content-api-models-scala", base = file("scala"))
.dependsOn(models)
.settings(artifactProductionSettings)
.settings(
description := "Generated classes of the Scala models for the Guardian's Content API",
scalacOptions ++= Seq("-deprecation", "-unchecked"),
Compile / scroogeThriftOutputFolder := sourceManaged.value / "thrift",
Compile / scroogeThriftSourceFolder := baseDirectory.value / "../models/src/main/thrift",
Compile / scroogeThriftDependencies ++= Seq(
"story-packages-model-thrift",
"content-atom-model-thrift",
"content-entity-thrift"
),
// See: https://github.com/twitter/scrooge/issues/199
Compile / scroogeThriftSources ++= {
(Compile / scroogeUnpackDeps).value.flatMap { dir => (dir ** "*.thrift").get }
},
Compile / scroogePublishThrift := false,
libraryDependencies ++= Seq(
"org.apache.thrift" % "libthrift" % thriftVersion,
"com.twitter" %% "scrooge-core" % scroogeVersion,
"com.gu" % "story-packages-model-thrift" % storyPackageVersion,
"com.gu" % "content-atom-model-thrift" % contentAtomVersion,
"com.gu" % "content-entity-thrift" % contentEntityVersion
)
)
/**
* JSON parser project
*/
lazy val json = Project(id = "content-api-models-json", base = file("json"))
.dependsOn(scala)
.settings(artifactProductionSettings)
.settings(
description := "Json parser for the Guardian's Content API models",
libraryDependencies ++= Seq(
"com.gu" %% "fezziwig" % fezziwigVersion,
"io.circe" %% "circe-core" % circeVersion,
"io.circe" %% "circe-generic" % circeVersion,
"io.circe" %% "circe-parser" % circeVersion,
"io.circe" %% "circe-optics" % circeVersion,
"org.scalatest" %% "scalatest" % scalaTestVersion % Test,
"com.google.guava" % "guava" % guavaVersion % Test,
"org.gnieh" %% "diffson-circe" % diffsonVersion % Test
),
Compile / packageDoc / mappings := Nil
)
lazy val benchmarks = Project(id = "benchmarks", base = file("benchmarks"))
.dependsOn(json, scala)
.settings(artifactProductionSettings)
.enablePlugins(JmhPlugin)
.settings(
libraryDependencies += "com.google.guava" % "guava" % "19.0",
Jmh / javaOptions ++= Seq("-server", "-Xms4G", "-Xmx4G", "-XX:+UseG1GC", "-XX:-UseBiasedLocking"),
publishArtifact := false
)
lazy val npmPreviewReleaseTagMaybe = if (sys.env.get("RELEASE_TYPE").contains("PREVIEW_FEATURE_BRANCH")) {
Seq(scroogeTypescriptPublishTag := "preview")
} else Seq.empty
lazy val typescript = (project in file("ts"))
.enablePlugins(ScroogeTypescriptGen)
.settings(artifactProductionSettings)
.settings(npmPreviewReleaseTagMaybe)
.settings(
name := "content-api-models-typescript",
scroogeTypescriptNpmPackageName := "@guardian/content-api-models",
Compile / scroogeDefaultJavaNamespace := scroogeTypescriptNpmPackageName.value,
Test / scroogeDefaultJavaNamespace := scroogeTypescriptNpmPackageName.value,
description := "Typescript library built from the content api thrift definitions",
Compile / scroogeLanguages := Seq("typescript"),
Compile / scroogeThriftSourceFolder := baseDirectory.value / "../models/src/main/thrift",
scroogeTypescriptPackageLicense := "Apache-2.0",
Compile / scroogeThriftDependencies ++= Seq(
"content-entity-thrift",
"content-atom-model-thrift",
"story-packages-model-thrift"
),
scroogeTypescriptPackageMapping := Map(
"content-entity-thrift" -> "@guardian/content-entity-model",
"content-atom-model-thrift" -> "@guardian/content-atom-model",
"story-packages-model-thrift" -> "@guardian/story-packages-model"
),
libraryDependencies ++= Seq(
"org.apache.thrift" % "libthrift" % thriftVersion,
"com.twitter" %% "scrooge-core" % scroogeVersion,
"com.gu" % "story-packages-model-thrift" % storyPackageVersion,
"com.gu" % "content-atom-model-thrift" % contentAtomVersion,
"com.gu" % "content-entity-thrift" % contentEntityVersion
)
)