build.sbt (780 lines of code) (raw):

/* * Copyright 2019 Spotify AB * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import sbt._ import sbt.util.CacheImplicits._ import sbtprotoc.ProtocPlugin.ProtobufConfig import com.github.sbt.git.SbtGit.GitKeys.gitRemoteRepo import com.typesafe.tools.mima.core._ val magnoliaScala2Version = "1.1.10" val magnoliaScala3Version = "1.3.8" val algebirdVersion = "0.13.10" val avroVersion = Option(sys.props("avro.version")).getOrElse("1.11.3") val beamVersion = "2.61.0" val bigqueryVersion = "v2-rev20241013-2.0.0" val bigtableVersion = "2.51.1" val catsVersion = "2.12.0" val datastoreVersion = "2.25.2" val guavaVersion = "33.4.0-jre" val hadoopVersion = "3.4.1" val jacksonVersion = "2.18.2" val jodaTimeVersion = "2.13.0" val munitVersion = "1.0.4" val munitScalacheckVersion = "1.0.0" val neo4jDriverVersion = "4.4.19" val paigesVersion = "0.4.4" val parquetVersion = "1.15.0" val protobufVersion = "3.25.5" val refinedVersion = "0.11.3" val scalaCollectionCompatVersion = "2.12.0" val scalacheckVersion = "1.18.1" val shapelessVersion = "2.3.12" val slf4jVersion = "2.0.16" val tensorflowMetadataVersion = "1.16.1" val tensorflowVersion = "0.5.0" // project ThisBuild / tlBaseVersion := "0.7" ThisBuild / organization := "com.spotify" ThisBuild / organizationName := "Spotify AB" ThisBuild / startYear := Some(2016) ThisBuild / licenses := Seq(License.Apache2) ThisBuild / sonatypeCredentialHost := Sonatype.sonatypeLegacy ThisBuild / developers := List( Developer( id = "sinisa_lyh", name = "Neville Li", email = "neville.lyh@gmail.com", url = url("https://twitter.com/sinisa_lyh") ), Developer( id = "andrewsmartin", name = "Andrew Martin", email = "andrewsmartin.mg@gmail.com", url = url("https://twitter.com/andrew_martin92") ), Developer( id = "daikeshi", name = "Keshi Dai", email = "keshi.dai@gmail.com", url = url("https://twitter.com/daikeshi") ), Developer( id = "clairemcginty", name = "Claire McGinty", email = "clairem@spotify.com", url = url("http://github.com/clairemcginty") ), Developer( id = "anne-decusatis", name = "Anne DeCusatis", email = "anned@spotify.com", url = url("http://twitter.com/precisememory") ), Developer( id = "stormy-ua", name = "Kirill Panarin", email = "kirill.panarin@gmail.com", url = url("https://twitter.com/panarin_kirill") ), Developer( id = "syodage", name = "Shameera Rathnayaka Yodage", email = "shameerayodage@gmail.com", url = url("https://twitter.com/syodage") ), Developer( id = "shnapz", name = "Andrew Kabas", email = "akabas@spotify.com", url = url("https://github.com/shnapz") ) ) // scala versions val scala3 = "3.3.4" val scala213 = "2.13.15" val scala212 = "2.12.20" val scalaDefault = scala213 val scala3Projects = List( "shared", "test" ) // github actions val java17 = JavaSpec.corretto("17") val java11 = JavaSpec.corretto("11") val javaDefault = java17 val condIsScala3 = "matrix.scala == '3'" val condNotScala3 = s"!($condIsScala3)" val condIsMain = "github.ref == 'refs/heads/main'" val condIsTag = "startsWith(github.ref, 'refs/tags/v')" ThisBuild / scalaVersion := scalaDefault ThisBuild / crossScalaVersions := Seq(scala3, scala213, scala212) ThisBuild / githubWorkflowTargetBranches := Seq("main") ThisBuild / githubWorkflowJavaVersions := Seq(java17, java11) ThisBuild / tlJdkRelease := Some(8) ThisBuild / tlFatalWarnings := true ThisBuild / tlCiHeaderCheck := true ThisBuild / tlCiScalafmtCheck := true ThisBuild / tlCiDocCheck := true ThisBuild / tlCiMimaBinaryIssueCheck := true ThisBuild / githubWorkflowBuild ~= { steps: Seq[WorkflowStep] => steps.flatMap { case s if s.name.contains("Test") => Seq( s.withCond(Some(condNotScala3)), WorkflowStep.Sbt( scala3Projects.map(p => s"$p/test"), name = Some("Test"), cond = Some(condIsScala3) ) ) case s => if ( s.name.contains("Check binary compatibility") || s.name.contains("Generate API documentation") ) { Seq(s.withCond(Some(condNotScala3))) } else { Seq(s) } } } ThisBuild / githubWorkflowAddedJobs ++= Seq( WorkflowJob( "coverage", "Test coverage", WorkflowStep.CheckoutFull :: WorkflowStep.SetupJava(List(javaDefault)) ::: List( WorkflowStep.Sbt( List("coverage", "test", "coverageAggregate"), name = Some("Test coverage") ), WorkflowStep.Use( UseRef.Public("codecov", "codecov-action", "v5"), Map("token" -> "${{ secrets.CODECOV_TOKEN }}"), name = Some("Upload coverage report") ) ), scalas = List(CrossVersion.binaryScalaVersion(scalaDefault)), javas = List(javaDefault) ), WorkflowJob( "avro-legacy", "Test with legacy avro", WorkflowStep.CheckoutFull :: WorkflowStep.SetupJava(List(javaDefault)) ::: List( WorkflowStep.Sbt( List("avro/test"), env = Map("JAVA_OPTS" -> "-Davro.version=1.8.2"), name = Some("Test") ) ), scalas = List(CrossVersion.binaryScalaVersion(scalaDefault)), javas = List(javaDefault) ), WorkflowJob( "site", "Generate Site", WorkflowStep.CheckoutFull :: WorkflowStep.SetupJava(List(javaDefault)) ::: List( WorkflowStep.Sbt( List("site/makeSite"), name = Some("Generate site") ), WorkflowStep.Use( UseRef.Public("peaceiris", "actions-gh-pages", "v3.9.3"), params = Map( "github_token" -> "${{ secrets.GITHUB_TOKEN }}", "publish_dir" -> { val path = (ThisBuild / baseDirectory).value.toPath.toAbsolutePath .relativize((site / makeSite / target).value.toPath) // os-independent path rendering ... (0 until path.getNameCount).map(path.getName).mkString("/") }, "keep_files" -> "true" ), name = Some("Publish site"), cond = Some(condIsTag) ) ), scalas = List(CrossVersion.binaryScalaVersion(scalaDefault)), javas = List(javaDefault) ) ) // mima ThisBuild / mimaBinaryIssueFilters ++= Seq( // genFunnelMacro should not be available to users ProblemFilters.exclude[DirectMissingMethodProblem]("magnolify.guava.auto.package.genFunnelMacro"), // incorrectly named implicit ProblemFilters.exclude[DirectMissingMethodProblem]( "magnolify.parquet.logical.package#micros.pfTimestampMillis" ), // incorrectly named implicit ProblemFilters.exclude[DirectMissingMethodProblem]( "magnolify.parquet.logical.package#micros.pfLocalDateTimeMillis" ), // incorrectly named implicit ProblemFilters.exclude[DirectMissingMethodProblem]( "magnolify.parquet.logical.package#nanos.pfTimestampMillis" ), // incorrectly named implicit ProblemFilters.exclude[DirectMissingMethodProblem]( "magnolify.parquet.logical.package#nanos.pfLocalDateTimeMillis" ) ) ThisBuild / tlVersionIntroduced := Map("3" -> "0.8.0") // protobuf val protocJavaSourceManaged = settingKey[File]("Default directory for java sources generated by protoc.") ThisBuild / PB.protocVersion := protobufVersion lazy val scopedProtobufSettings = Def.settings( PB.targets := Seq( PB.gens.java(protobufVersion) -> Defaults.configSrcSub(protocJavaSourceManaged).value ), managedSourceDirectories ++= PB.targets.value.map(_.outputPath) ) lazy val protobufSettings = Seq( protocJavaSourceManaged := sourceManaged.value / "compiled_proto", PB.additionalDependencies := Seq( "com.google.protobuf" % "protobuf-java" % protobufVersion % Provided, "com.google.protobuf" % "protobuf-java" % protobufVersion % Test ) ) ++ Seq(Compile, Test).flatMap(c => inConfig(c)(scopedProtobufSettings)) lazy val currentYear = java.time.LocalDate.now().getYear lazy val keepExistingHeader = HeaderCommentStyle.cStyleBlockComment.copy(commentCreator = (text: String, existingText: Option[String]) => existingText .getOrElse(HeaderCommentStyle.cStyleBlockComment.commentCreator(text)) .trim() ) val commonSettings = Seq( // So far most projects do no support scala 3 crossScalaVersions := Seq(scala213, scala212), // skip scala 3 publishing until ready publish / skip := (publish / skip).value || (scalaVersion.value == scala3), scalaVersion := scalaDefault, scalacOptions ++= (CrossVersion.partialVersion(scalaVersion.value) match { case Some((3, _)) => Seq( // required by magnolia for accessing default values "-Yretain-trees", // tolerate some nested macro expansion "-Xmax-inlines", "64" ) case Some((2, 13)) => Seq( "-Wmacros:after", // silence warnings "-Wconf:cat=unused-imports&origin=scala\\.collection\\.compat\\..*:s" + ",cat=unused-imports&origin=magnolify\\.shims\\..*:s" + ",cat=unused-imports&origin=magnolify\\.scalacheck\\.MoreCollectionsBuildable\\..*:s" ) case Some((2, 12)) => Seq( "-Ywarn-macros:after", // silence warnings "-Wconf:cat=unused-params:s" ) case _ => Seq.empty }), headerLicense := Some(HeaderLicense.ALv2(currentYear.toString, organizationName.value)), headerMappings ++= Map( HeaderFileType.scala -> keepExistingHeader, HeaderFileType.java -> keepExistingHeader ), libraryDependencies ++= Seq( "org.scala-lang.modules" %% "scala-collection-compat" % scalaCollectionCompatVersion, "joda-time" % "joda-time" % jodaTimeVersion % Provided, "org.slf4j" % "slf4j-simple" % slf4jVersion % Test ) ++ (CrossVersion.partialVersion(scalaVersion.value) match { case Some((3, _)) => Seq( "com.softwaremill.magnolia1_3" %% "magnolia" % magnoliaScala3Version ) case Some((2, _)) => Seq( "com.softwaremill.magnolia1_2" %% "magnolia" % magnoliaScala2Version, "com.chuusai" %% "shapeless" % shapelessVersion, "org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided ) case _ => throw new Exception("Unsupported scala version") }), Test / fork := true, Test / javaOptions ++= Seq( "-Dorg.slf4j.simpleLogger.defaultLogLevel=info", "-Dorg.slf4j.simpleLogger.logFile=target/magnolify.log" ) ) lazy val root = tlCrossRootProject .enablePlugins(NoPublishPlugin) .settings( name := "magnolify", description := "A collection of Magnolia add-on modules" ) .aggregate( avro, beam, bigquery, bigtable, bom, cats, datastore, guava, parquet, protobuf, refined, scalacheck, shared, tensorflow, neo4j, test, tools ) lazy val bom = project .in(file("bom")) .enablePlugins(BillOfMaterialsPlugin) .disablePlugins(TypelevelSettingsPlugin) .settings( // Just one BOM including all cross Scala versions crossVersion := CrossVersion.disabled, // Create BOM in the first run crossScalaVersions := Seq(scalaDefault), moduleName := "magnolify-bom", bomIncludeProjects := Seq( avro, bigquery, bigtable, cats, datastore, guava, parquet, protobuf, refined, scalacheck, shared, tensorflow, neo4j, tools ), // pom project. No ABI tlMimaPreviousVersions := Set.empty ) lazy val shared = project .in(file("shared")) .settings( commonSettings, crossScalaVersions := Seq(scala3, scala213, scala212), moduleName := "magnolify-shared", description := "Shared code for Magnolify", libraryDependencies += "org.scalacheck" %% "scalacheck" % scalacheckVersion % Test ) // shared code for unit tests lazy val test = project .in(file("test")) .enablePlugins(NoPublishPlugin) .dependsOn(shared) .settings(commonSettings) .settings( crossScalaVersions := Seq(scala3, scala213, scala212), libraryDependencies ++= Seq( "org.scalameta" %% "munit" % munitVersion % Test, "org.scalameta" %% "munit-scalacheck" % munitScalacheckVersion % Test, "org.typelevel" %% "cats-core" % catsVersion % Test ), Test / scalacOptions := { val opts = (Test / scalacOptions).value // silence warning. // cat & origin are not valid categories and filter yet CrossVersion.partialVersion(scalaVersion.value) match { case Some((3, _)) => opts.filter(_ != "-Wunused:imports") case _ => opts } } ) lazy val scalacheck = project .in(file("scalacheck")) .dependsOn( shared % "compile,test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-scalacheck", description := "Magnolia add-on for ScalaCheck", libraryDependencies += "org.scalacheck" %% "scalacheck" % scalacheckVersion % Provided ) lazy val cats = project .in(file("cats")) .dependsOn( shared, scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-cats", description := "Magnolia add-on for Cats", libraryDependencies ++= Seq( "org.typelevel" %% "cats-core" % catsVersion % Provided, "com.twitter" %% "algebird-core" % algebirdVersion % Test, "org.typelevel" %% "cats-laws" % catsVersion % Test ) ) lazy val guava = project .in(file("guava")) .dependsOn( shared, scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-guava", description := "Magnolia add-on for Guava", libraryDependencies ++= Seq( "com.google.guava" % "guava" % guavaVersion % Provided ) ) lazy val refined = project .in(file("refined")) .dependsOn( avro % Provided, bigquery % Provided, bigtable % Provided, datastore % Provided, guava % "provided,test->test", protobuf % "provided,test->test", tensorflow % Provided, test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-refined", description := "Magnolia add-on for Refined", libraryDependencies ++= Seq( "com.google.guava" % "guava" % guavaVersion % Provided, "eu.timepit" %% "refined" % refinedVersion % Provided, "com.google.api.grpc" % "proto-google-cloud-bigtable-v2" % bigtableVersion % Test, "com.google.apis" % "google-api-services-bigquery" % bigqueryVersion % Test, "com.google.cloud.datastore" % "datastore-v1-proto-client" % datastoreVersion % Test, "org.apache.avro" % "avro" % avroVersion % Test, "org.scalameta" %% "munit" % munitVersion % Test, "org.tensorflow" % "tensorflow-core-api" % tensorflowVersion % Test ) ) lazy val avro = project .in(file("avro")) .dependsOn( shared, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-avro", description := "Magnolia add-on for Apache Avro", libraryDependencies ++= Seq( "org.apache.avro" % "avro" % avroVersion % Provided, "com.fasterxml.jackson.core" % "jackson-databind" % jacksonVersion % Test ) ) lazy val beam = project .in(file("beam")) .dependsOn( shared, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, protobufSettings, moduleName := "magnolify-beam", description := "Magnolia add-on for Apache Beam", libraryDependencies ++= Seq( "org.apache.beam" % "beam-sdks-java-core" % beamVersion % Provided, "com.google.protobuf" % "protobuf-java" % protobufVersion % Provided ), // TODO remove this line after release tlMimaPreviousVersions := Set.empty ) lazy val bigquery = project .in(file("bigquery")) .dependsOn( shared, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-bigquery", description := "Magnolia add-on for Google Cloud BigQuery", libraryDependencies ++= Seq( "com.google.apis" % "google-api-services-bigquery" % bigqueryVersion % Provided, "com.fasterxml.jackson.core" % "jackson-databind" % jacksonVersion % Test ) ) lazy val bigtable: Project = project .in(file("bigtable")) .dependsOn( shared, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-bigtable", description := "Magnolia add-on for Google Cloud Bigtable", libraryDependencies ++= Seq( "com.google.api.grpc" % "proto-google-cloud-bigtable-v2" % bigtableVersion % Provided ) ) lazy val datastore = project .in(file("datastore")) .dependsOn( shared, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-datastore", description := "Magnolia add-on for Google Cloud Datastore", libraryDependencies ++= Seq( "com.google.cloud.datastore" % "datastore-v1-proto-client" % datastoreVersion % Provided ) ) lazy val parquet = project .in(file("parquet")) .dependsOn( shared, avro % Test, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-parquet", description := "Magnolia add-on for Apache Parquet", libraryDependencies ++= Seq( "org.apache.hadoop" % "hadoop-client" % hadoopVersion % Provided, "org.apache.parquet" % "parquet-avro" % parquetVersion % Provided, "org.apache.parquet" % "parquet-hadoop" % parquetVersion % Provided ), dependencyOverrides ++= Seq( "org.apache.avro" % "avro" % avroVersion % Provided, "org.apache.avro" % "avro" % avroVersion % Test ), apiMappings := { def findJar(organization: String, name: String): File = update.value.select { module: ModuleID => module.organization == organization && module.name == name }.head Map( findJar("org.apache.parquet", "parquet-column") -> url( s"https://www.javadoc.io/doc/org.apache.parquet/parquet-column/$parquetVersion/" ) ) } ) lazy val protobuf = project .in(file("protobuf")) .dependsOn( shared, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, protobufSettings, moduleName := "magnolify-protobuf", description := "Magnolia add-on for Google Protocol Buffer" ) val tensorflowMetadataSourcesDir = settingKey[File]("Directory containing TensorFlow metadata proto files") val tensorflowMetadata = taskKey[Seq[File]]("Retrieve TensorFlow metadata proto files") lazy val tensorflow = project .in(file("tensorflow")) .dependsOn( shared, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, protobufSettings, moduleName := "magnolify-tensorflow", description := "Magnolia add-on for TensorFlow", libraryDependencies ++= Seq( "com.google.protobuf" % "protobuf-java" % protobufVersion % ProtobufConfig, "org.tensorflow" % "tensorflow-core-api" % tensorflowVersion % Provided ), // remove compilation warnings for generated java files javacOptions ~= { _.filterNot(_ == "-Xlint:all") }, // tensorflow metadata protos are not packaged into a jar. Manually extract them as external Compile / tensorflowMetadataSourcesDir := target.value / s"metadata-$tensorflowMetadataVersion", Compile / PB.protoSources += target.value / s"metadata-$tensorflowMetadataVersion", Compile / tensorflowMetadata := { def work(tensorFlowMetadataVersion: String) = { val tfMetadata = url( s"https://github.com/tensorflow/metadata/archive/refs/tags/v$tensorFlowMetadataVersion.zip" ) IO.unzipURL(tfMetadata, target.value, "*.proto").toSeq } val cacheStoreFactory = streams.value.cacheStoreFactory val root = (Compile / tensorflowMetadataSourcesDir).value val tracker = Tracked.inputChanged(cacheStoreFactory.make("input")) { (versionChanged, version: String) => val cached = Tracked.outputChanged(cacheStoreFactory.make("output")) { (outputChanged: Boolean, files: Seq[HashFileInfo]) => if (versionChanged || outputChanged) work(version) else files.map(_.file) } cached(() => (root ** "*.proto").get().map(FileInfo.hash(_))) } tracker(tensorflowMetadataVersion) }, Compile / PB.unpackDependencies := { val protoFiles = (Compile / tensorflowMetadata).value val root = (Compile / tensorflowMetadataSourcesDir).value val metadataDep = ProtocPlugin.UnpackedDependency(protoFiles, Seq.empty) val deps = (Compile / PB.unpackDependencies).value new ProtocPlugin.UnpackedDependencies(deps.mappedFiles ++ Map(root -> metadataDep)) }, Compile / packageBin / mappings ~= { _.filterNot { case (_, n) => n.startsWith("org/tensorflow") } }, // Something messes with Compile/packageSrc/mappings and adds protobuf managed sources // Force back to original value from sbt inConfig(Compile)(Defaults.packageTaskSettings(packageSrc, Defaults.packageSrcMappings)), inConfig(Compile)(Defaults.packageTaskSettings(packageDoc, Defaults.packageDocMappings)), Compile / doc / scalacOptions ++= Seq("-skip-packages", "org.tensorflow") ) lazy val neo4j = project .in(file("neo4j")) .dependsOn( shared, cats % "test->test", scalacheck % "test->test", test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-neo4j", description := "Magnolia add-on for Neo4j", libraryDependencies ++= Seq( "org.neo4j.driver" % "neo4j-java-driver" % neo4jDriverVersion % Provided ) ) lazy val tools = project .in(file("tools")) .dependsOn( shared, avro % Test, bigquery % Test, parquet % Test, test % "test->test" ) .settings( commonSettings, moduleName := "magnolify-tools", description := "Magnolia add-on for code generation", libraryDependencies ++= Seq( "com.google.apis" % "google-api-services-bigquery" % bigqueryVersion, "org.apache.avro" % "avro" % avroVersion % Provided, "org.apache.parquet" % "parquet-hadoop" % parquetVersion, "org.typelevel" %% "paiges-core" % paigesVersion ) ) lazy val jmh: Project = project .in(file("jmh")) .enablePlugins(JmhPlugin) .dependsOn( avro % Test, bigquery % Test, bigtable % Test, cats % Test, datastore % Test, guava % Test, parquet % Test, protobuf % "test->test", scalacheck % Test, tensorflow % Test, test % "test->test" ) .settings( commonSettings, crossScalaVersions := Seq(scalaDefault), Jmh / classDirectory := (Test / classDirectory).value, Jmh / dependencyClasspath := (Test / dependencyClasspath).value, // rewire tasks, so that 'jmh:run' automatically invokes 'jmh:compile' // (otherwise a clean 'jmh:run' would fail) Jmh / compile := (Jmh / compile).dependsOn(Test / compile).value, Jmh / run := (Jmh / run).dependsOn(Jmh / compile).evaluated, libraryDependencies ++= Seq( "com.google.api.grpc" % "proto-google-cloud-bigtable-v2" % bigtableVersion % Test, "com.google.apis" % "google-api-services-bigquery" % bigqueryVersion % Test, "com.google.cloud.datastore" % "datastore-v1-proto-client" % datastoreVersion % Test, "org.apache.avro" % "avro" % avroVersion % Test, "org.tensorflow" % "tensorflow-core-api" % tensorflowVersion % Test, "joda-time" % "joda-time" % jodaTimeVersion % Test, "org.apache.parquet" % "parquet-avro" % parquetVersion % Test, "org.apache.parquet" % "parquet-column" % parquetVersion % Test, "org.apache.parquet" % "parquet-hadoop" % parquetVersion % Test, "org.apache.hadoop" % "hadoop-common" % hadoopVersion % Test, "org.apache.hadoop" % "hadoop-mapreduce-client-core" % hadoopVersion % Test ) ) // ======================================================================= // Site settings // ======================================================================= lazy val site = project .in(file("site")) .enablePlugins( NoPublishPlugin, ParadoxSitePlugin, ParadoxMaterialThemePlugin, GhpagesPlugin, SiteScaladocPlugin, MdocPlugin ) .dependsOn( avro % "compile->compile,provided", beam % "compile->compile,provided", bigquery % "compile->compile,provided", bigtable % "compile->compile,provided", cats % "compile->compile,provided", datastore % "compile->compile,provided", guava % "compile->compile,provided", neo4j % "compile->compile,provided", parquet % "compile->compile,provided", protobuf % "compile->compile,provided", refined % "compile->compile,provided", shared, scalacheck % "compile->compile,provided", tensorflow % "compile->compile,provided", unidocs ) .settings(commonSettings) .settings( description := "Magnolify - Documentation", fork := false, autoAPIMappings := true, gitRemoteRepo := "git@github.com:spotify/magnolify.git", // mdoc // pre-compile md using mdoc mdocExtraArguments ++= Seq("--no-link-hygiene"), // paradox Compile / paradoxOverlayDirectories += mdocOut.value, Compile / paradoxProperties ++= Map( "github.base_url" -> "https://github.com/spotify/magnolify" ), Compile / paradoxMaterialTheme := ParadoxMaterialTheme() .withFavicon("images/favicon.ico") .withColor("white", "indigo") .withLogo("images/logo.png") .withCopyright(s"Copyright (C) $currentYear Spotify AB") .withRepository(uri("https://github.com/spotify/magnolify")) .withSocial(uri("https://github.com/spotify"), uri("https://twitter.com/spotifyeng")), // sbt-site addMappingsToSiteDir( unidocs / ScalaUnidoc / packageDoc / mappings, unidocs / ScalaUnidoc / siteSubdirName ), makeSite := makeSite.dependsOn(mdoc.toTask("")).value ) lazy val unidocs = project .in(file("unidocs")) .enablePlugins( NoPublishPlugin, TypelevelUnidocPlugin ) .settings(commonSettings) .settings( moduleName := "magnolify-docs", crossScalaVersions := Seq(scalaDefault), scalaVersion := scalaDefault, // unidoc ScalaUnidoc / siteSubdirName := "api", ScalaUnidoc / scalacOptions := Seq.empty, ScalaUnidoc / unidoc / unidocProjectFilter := inAnyProject -- inProjects(test, jmh), ScalaUnidoc / unidoc / unidocAllClasspaths ~= { cp => // somehow protobuf 2 is in classpath and fails doc cp.map(_.filterNot(_.data.getName.endsWith("protobuf-java-2.5.0.jar"))) }, ScalaUnidoc / unidoc / unidocAllSources ~= { sources => // filter out doc from generated proto TFMD sources sources.map(_.filterNot(_.getPath.contains("compiled_proto"))) } )