build.sbt (331 lines of code) (raw):
import algebird._
import com.typesafe.tools.mima.core._
import pl.project13.scala.sbt.JmhPlugin
val algebraVersion = "2.0.0"
val bijectionVersion = "0.9.7"
val javaEwahVersion = "1.2.3"
val kindProjectorVersion = "0.13.3"
val paradiseVersion = "2.1.1"
val quasiquotesVersion = "2.1.0"
val scalaTestVersion = "3.2.18"
val scalaTestPlusVersion = "3.1.0.0-RC2"
val scalacheckVersion = "1.15.2"
val scalaCollectionCompat = "2.11.0"
val utilVersion = "21.2.0"
val sparkVersion = "2.4.8"
def scalaVersionSpecificFolders(srcBaseDir: java.io.File, scalaVersion: String) =
CrossVersion.partialVersion(scalaVersion) match {
case Some((2, y)) if y <= 12 =>
new java.io.File(s"${srcBaseDir.getPath}-2.12-") :: Nil
case Some((2, y)) if y >= 13 =>
new java.io.File(s"${srcBaseDir.getPath}-2.13+") :: Nil
case _ => Nil
}
def scalaBinaryVersion(scalaVersion: String) = scalaVersion match {
case version if version.startsWith("2.11") => "2.11"
case version if version.startsWith("2.12") => "2.12"
case version if version.startsWith("2.13") => "2.13"
case version => sys.error(s"unsupported scala version $version")
}
def isScala212x(scalaVersion: String) = scalaBinaryVersion(scalaVersion) == "2.12"
def isScala213x(scalaVersion: String) = scalaBinaryVersion(scalaVersion) == "2.13"
noPublishSettings
crossScalaVersions := Nil
val sharedSettings = Seq(
organization := "com.twitter",
scalaVersion := "2.12.18",
crossScalaVersions := Seq("2.11.12", scalaVersion.value),
Test / parallelExecution := true,
scalacOptions ++= Seq(
"-unchecked",
"-deprecation",
"-Xlint",
"-language:implicitConversions",
"-language:higherKinds",
"-language:existentials"
),
scalacOptions ++= {
VersionNumber(scalaVersion.value) match {
case v if v.matchesSemVer(SemanticSelector("<2.12")) =>
Seq("-Ywarn-unused", "-Ywarn-unused-import", "-optimize")
case v if v.matchesSemVer(SemanticSelector(">=2.12")) =>
val ops = Seq("-Ywarn-unused", "-opt:l:inline", "-opt-inline-from:com.twitter.algebird.**")
if (v.matchesSemVer(SemanticSelector("2.13.x"))) {
"-Ymacro-annotations" +: ops
} else {
ops
}
case _ =>
Nil
}
},
javacOptions ++= Seq("-target", "1.8", "-source", "1.8"),
libraryDependencies ++= Seq(
"junit" % "junit" % "4.13.2" % Test,
"com.github.sbt" % "junit-interface" % "0.13.3" % Test
),
// Publishing options:
pomIncludeRepository := { x => false },
pomExtra := (<url>https://github.com/twitter/algebird</url>
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<developers>
<developer>
<id>oscar</id>
<name>Oscar Boykin</name>
<url>http://twitter.com/posco</url>
</developer>
<developer>
<id>sritchie</id>
<name>Sam Ritchie</name>
<url>http://twitter.com/sritchie</url>
</developer>
</developers>),
Compile / unmanagedSourceDirectories ++= scalaVersionSpecificFolders(
(Compile / scalaSource).value,
scalaVersion.value
),
Test / unmanagedSourceDirectories ++= scalaVersionSpecificFolders(
(Test / scalaSource).value,
scalaVersion.value
),
Compile / unmanagedSourceDirectories ++= scalaVersionSpecificFolders(
(Compile / javaSource).value,
scalaVersion.value
)
) ++ mimaSettings
lazy val noPublishSettings = Seq(
publish / skip := true,
publish := {},
publishLocal := {},
test := {},
publishArtifact := false
)
// https://github.com/lightbend/mima/issues/388
lazy val mimaSettings = Def.settings(
mimaBinaryIssueFilters ++= Seq(
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.IdentityMonad.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.Averager.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.AveragedGroup.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.MomentsGroup.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.MomentsAggregator.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.NullGroup.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.BigIntRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.BitSetLite.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.BooleanRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.JBoolRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.DoubleRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.JDoubleRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.JShortRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.ShortRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.IntRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.JIntRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.FloatRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.JFloatRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.LongRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.JLongRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.BigDecimalRing.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.UnitGroup.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.HLLSeries.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.SparseHLL.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.DenseHLL.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.StringMonoid.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.OrValMonoid.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.AndValMonoid.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.DecayedValueMonoid.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.MinHashSignature.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.statistics.PlainCounter.*"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.statistics.AtomicCounter.*"),
ProblemFilters
.exclude[DirectMissingMethodProblem]("com.twitter.algebird.statistics.GaussianDistributionMonoid.*"),
ProblemFilters
.exclude[DirectMissingMethodProblem]("com.twitter.algebird.util.summer.CompactionSize.apply"),
ProblemFilters
.exclude[DirectMissingMethodProblem]("com.twitter.algebird.util.summer.FlushFrequency.apply"),
ProblemFilters
.exclude[DirectMissingMethodProblem]("com.twitter.algebird.util.summer.MemoryFlushPercent.apply"),
ProblemFilters
.exclude[DirectMissingMethodProblem]("com.twitter.algebird.util.summer.UpdateFrequency.apply"),
ProblemFilters
.exclude[DirectMissingMethodProblem]("com.twitter.algebird.util.summer.RollOverFrequency.apply"),
ProblemFilters
.exclude[DirectMissingMethodProblem]("com.twitter.algebird.util.summer.HeavyHittersPercent.apply"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.util.summer.BufferSize.apply"),
ProblemFilters.exclude[DirectMissingMethodProblem]("com.twitter.algebird.util.summer.Compact.apply"),
ProblemFilters.exclude[IncompatibleSignatureProblem]("com.twitter.algebird.MinHashSignature.*"),
ProblemFilters.exclude[IncompatibleSignatureProblem]("com.twitter.algebird.MinHasher.*")
)
)
/**
* This returns the previous jar we released that is compatible with the current.
*/
val noBinaryCompatCheck = Set[String]("benchmark", "caliper", "spark")
def previousVersion(subProj: String) =
Some(subProj)
.filterNot(noBinaryCompatCheck.contains)
.map(s => "com.twitter" %% ("algebird-" + s) % "0.13.7")
lazy val algebird = Project(id = "algebird", base = file("."))
.settings(sharedSettings)
.settings(noPublishSettings)
.settings(
coverageExcludedPackages := "<empty>;.*\\.benchmark\\..*",
mimaFailOnNoPrevious := false
)
.aggregate(
algebirdCore,
algebirdTest,
algebirdUtil,
algebirdBijection,
algebirdBenchmark,
algebirdGeneric,
algebirdSpark
)
def module(name: String) = {
val id = "algebird-%s".format(name)
Project(id = id, base = file(id))
.settings(sharedSettings ++ Seq(Keys.name := id, mimaPreviousArtifacts := previousVersion(name).toSet))
}
lazy val algebirdCore = module("core").settings(
crossScalaVersions += "2.13.12",
initialCommands := """
import com.twitter.algebird._
""".stripMargin('|'),
libraryDependencies ++=
Seq(
"com.googlecode.javaewah" % "JavaEWAH" % javaEwahVersion,
"org.typelevel" %% "algebra" % algebraVersion,
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
"org.scalatest" %% "scalatest" % scalaTestVersion % "test",
"org.scala-lang.modules" %% "scala-collection-compat" % scalaCollectionCompat
) ++ {
if (isScala213x(scalaVersion.value)) {
Seq()
} else {
Seq(compilerPlugin(("org.scalamacros" % "paradise" % paradiseVersion).cross(CrossVersion.full)))
}
},
addCompilerPlugin(("org.typelevel" % "kind-projector" % kindProjectorVersion).cross(CrossVersion.full)),
Compile / sourceGenerators += Def.task {
GenTupleAggregators.gen((Compile / sourceManaged).value)
}.taskValue,
// Scala 2.12's doc task was failing.
Compile / doc / sources ~= (_.filterNot(_.absolutePath.contains("javaapi"))),
Test / testOptions := Seq(Tests.Argument(TestFrameworks.JUnit, "-a"))
)
lazy val algebirdTest = module("test")
.settings(
Test / testOptions ++= Seq(Tests.Argument(TestFrameworks.ScalaCheck, "-verbosity", "4")),
crossScalaVersions += "2.13.12",
libraryDependencies ++=
Seq(
"org.scalacheck" %% "scalacheck" % scalacheckVersion,
"org.scalatest" %% "scalatest" % scalaTestVersion,
"org.scalatestplus" %% "scalatestplus-scalacheck" % scalaTestPlusVersion % "test"
) ++ {
if (isScala213x(scalaVersion.value)) {
Seq()
} else {
Seq(compilerPlugin(("org.scalamacros" % "paradise" % paradiseVersion).cross(CrossVersion.full)))
}
},
addCompilerPlugin(
("org.typelevel" % "kind-projector" % kindProjectorVersion).cross(CrossVersion.full)
)
)
.dependsOn(algebirdCore)
lazy val algebirdBenchmark = module("benchmark")
.settings(JmhPlugin.projectSettings: _*)
.settings(noPublishSettings)
.settings(
coverageExcludedPackages := "com\\.twitter\\.algebird\\.benchmark.*",
libraryDependencies ++= Seq("com.twitter" %% "bijection-core" % bijectionVersion)
)
.dependsOn(algebirdCore, algebirdUtil, algebirdTest % "test->compile")
.enablePlugins(JmhPlugin)
lazy val algebirdUtil = module("util")
.settings(
crossScalaVersions += "2.13.12",
libraryDependencies ++= Seq("com.twitter" %% "util-core" % utilVersion)
)
.dependsOn(algebirdCore, algebirdTest % "test->test")
lazy val algebirdBijection = module("bijection")
.settings(
crossScalaVersions += "2.13.12",
libraryDependencies += "com.twitter" %% "bijection-core" % bijectionVersion
)
.dependsOn(algebirdCore, algebirdTest % "test->test")
lazy val algebirdSpark = module("spark")
.settings(
libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion % "provided",
scalacOptions := scalacOptions.value
.filterNot(
_.contains("inline")
) // Disable optimizations for now: https://github.com/scala/bug/issues/11247
)
.dependsOn(algebirdCore, algebirdTest % "test->test")
lazy val algebirdGeneric = module("generic")
.settings(
crossScalaVersions += "2.13.12",
libraryDependencies ++= Seq(
"com.chuusai" %% "shapeless" % "2.3.10",
"com.github.alexarchambault" %% "scalacheck-shapeless_1.14" % "1.2.5"
) ++ {
if (isScala213x(scalaVersion.value)) {
Seq()
} else {
Seq(compilerPlugin(("org.scalamacros" % "paradise" % paradiseVersion).cross(CrossVersion.full)))
}
}
)
.dependsOn(algebirdCore, algebirdTest % "test->test")
lazy val docsMappingsAPIDir = settingKey[String]("Name of subdirectory in site target directory for api docs")
lazy val docSettings = Seq(
micrositeName := "Algebird",
micrositeDescription := "Abstract Algebra for Scala.",
micrositeAuthor := "Algebird's contributors",
micrositeHighlightTheme := "atom-one-light",
micrositeHomepage := "https://twitter.github.io/algebird",
micrositeBaseUrl := "algebird",
micrositeDocumentationUrl := "api",
micrositeGithubOwner := "twitter",
micrositeExtraMdFiles := Map(
file("CONTRIBUTING.md") -> microsites.ExtraMdFileConfig("contributing.md", "contributing")
),
micrositeGithubRepo := "algebird",
micrositePalette := Map(
"brand-primary" -> "#5B5988",
"brand-secondary" -> "#292E53",
"brand-tertiary" -> "#222749",
"gray-dark" -> "#49494B",
"gray" -> "#7B7B7E",
"gray-light" -> "#E5E5E6",
"gray-lighter" -> "#F4F3F4",
"white-color" -> "#FFFFFF"
),
micrositePushSiteWith := GHPagesPlugin,
autoAPIMappings := true,
docsMappingsAPIDir := "api",
addMappingsToSiteDir(ScalaUnidoc / packageDoc / mappings, docsMappingsAPIDir),
ghpagesNoJekyll := false,
ScalaUnidoc / unidoc / fork := true,
ScalaUnidoc / unidoc / scalacOptions ++= Seq(
"-doc-source-url",
"https://github.com/twitter/algebird/tree/develop€{FILE_PATH}.scala",
"-sourcepath",
(LocalRootProject / baseDirectory).value.getAbsolutePath,
"-diagrams"
),
makeSite / includeFilter := "*.html" | "*.css" | "*.png" | "*.jpg" | "*.gif" | "*.js" | "*.swf" | "*.yml" | "*.md"
)
// Documentation is generated for projects defined in
// `docsSourcesAndProjects`.
lazy val docs = project
.enablePlugins(MicrositesPlugin, MdocPlugin, ScalaUnidocPlugin)
.settings(moduleName := "algebird-docs")
.settings(sharedSettings)
.settings(noPublishSettings)
.settings(docSettings)
.settings(
addCompilerPlugin(("org.typelevel" % "kind-projector" % kindProjectorVersion).cross(CrossVersion.full)),
mdocIn := sourceDirectory.value / "main" / "mdoc",
ScalaUnidoc / unidoc / sources ~= (_.filterNot(_.absolutePath.contains("javaapi")))
)
.dependsOn(algebirdCore)