Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prepare build.sbt for Dotty cross-compilation #181

Merged
merged 4 commits into from
Dec 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
scala: [2.12.15, 2.13.7]
scala: [2.12.15, 2.13.7, 3.1.0]
java: [temurin@8, temurin@17]
runs-on: ${{ matrix.os }}
steps:
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
# IntelliJ
/out/
/.idea

# mpeltonen/sbt-idea plugin
.idea_modules/

Expand Down Expand Up @@ -66,5 +65,7 @@ project/plugins/project/
# macOS specific
.DS_Store

.metals
.vscode
.bloop
project/.bloop
1 change: 1 addition & 0 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
runner.dialect = dotty
style = defaultWithAlign
maxColumn = 139
assumeStandardLibraryStripMargin = true
Expand Down
114 changes: 82 additions & 32 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
import sbt.librarymanagement.ConflictWarning

val scala_2_12 = "2.12.15"
val scala_2_13 = "2.13.7"
val scala_3 = "3.1.0"
val mainScalaVersion = scala_2_13
val supportedScalaVersions = Seq(scala_2_12, scala_2_13)
val supportedScalaVersions = Seq(scala_2_12, scala_2_13, scala_3)

ThisBuild / crossScalaVersions := supportedScalaVersions
ThisBuild / scalaVersion := mainScalaVersion

ThisBuild / conflictWarning := ConflictWarning.disable

lazy val baseSettings = Seq(
organization := "pl.iterators",
organizationName := "Iterators",
organizationHomepage := Some(url("https://iterato.rs")),
homepage := Some(url("https://github.com/theiterators/kebs")),
scalacOptions := Seq("-deprecation", "-unchecked", "-feature", "-encoding", "utf8"),
scalafmtVersion := "1.3.0",
scalafmtOnCompile := true
scalacOptions := Seq("-deprecation", "-unchecked", "-feature", "-encoding", "utf8")
)

lazy val commonMacroSettings = baseSettings ++ Seq(
libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value,
libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value % "provided"
libraryDependencies ++= (if (scalaVersion.value.startsWith("3")) Nil
else
Seq("org.scala-lang" % "scala-compiler" % scalaVersion.value % "provided",
"org.scala-lang" % "scala-reflect" % scalaVersion.value))
)

lazy val metaSettings = commonSettings ++ Seq(
Expand Down Expand Up @@ -69,6 +74,33 @@ lazy val noPublishSettings =
}
)

lazy val disableScala3 = Def.settings(
libraryDependencies := {
if (scalaBinaryVersion.value == "3") {
Nil
} else {
libraryDependencies.value
}
},
Seq(Compile, Test).map { x =>
(x / sources) := {
if (scalaBinaryVersion.value == "3") {
Nil
} else {
(x / sources).value
}
}
},
Test / test := {
if (scalaBinaryVersion.value == "3") {
()
} else {
(Test / test).value
}
},
publish / skip := (scalaBinaryVersion.value == "3")
)

def optional(dependency: ModuleID) = dependency % "provided"
def sv[A](scalaVersion: String, scala2_12Version: => A, scala2_13Version: => A) =
CrossVersion.partialVersion(scalaVersion) match {
Expand Down Expand Up @@ -114,9 +146,9 @@ val enumeratumPlayJsonVersion = "1.5.16"
val enumeratum = "com.beachape" %% "enumeratum" % enumeratumVersion
def enumeratumInExamples = {
val playJsonSupport = "com.beachape" %% "enumeratum-play-json" % enumeratumPlayJsonVersion
Seq(enumeratum, playJsonSupport)
Seq(enumeratum.cross(CrossVersion.for3Use2_13), playJsonSupport.cross(CrossVersion.for3Use2_13))
}
val optionalEnumeratum = optional(enumeratum)
val optionalEnumeratum = optional(enumeratum.cross(CrossVersion.for3Use2_13))

val akkaVersion = "2.6.17"
val akkaHttpVersion = "10.2.7"
Expand All @@ -126,74 +158,80 @@ val akkaHttp = "com.typesafe.akka" %% "akka-http" % akkaHttpVersion
val akkaHttpTestkit = "com.typesafe.akka" %% "akka-http-testkit" % akkaHttpVersion
def akkaHttpInExamples = {
val akkaHttpSprayJson = "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion
Seq(akkaStream, akkaHttp, akkaHttpSprayJson)
Seq(akkaStream.cross(CrossVersion.for3Use2_13),
akkaHttp.cross(CrossVersion.for3Use2_13),
akkaHttpSprayJson.cross(CrossVersion.for3Use2_13))
}
def akkaHttpInBenchmarks = akkaHttpInExamples :+ akkaHttpTestkit

def akkaHttpInBenchmarks = akkaHttpInExamples :+ (akkaHttpTestkit).cross(CrossVersion.for3Use2_13)

lazy val commonSettings = baseSettings ++ Seq(
scalacOptions ++= Seq("-language:experimental.macros"),
scalacOptions ++=
(if (scalaVersion.value.startsWith("3"))
Seq("-language:implicitConversions", "-Ykind-projector", "-Xignore-scala2-macros")
else Seq("-language:implicitConversions", "-language:experimental.macros")),
// (scalacOptions in Test) ++= Seq("-Ymacro-debug-lite" /*, "-Xlog-implicits"*/ ),
libraryDependencies += scalaTest % "test",
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
)

lazy val slickSettings = commonSettings ++ Seq(
libraryDependencies += slick,
libraryDependencies += slickPg,
libraryDependencies += optionalEnumeratum
libraryDependencies += slick.cross(CrossVersion.for3Use2_13),
libraryDependencies += (slickPg % "test").cross(CrossVersion.for3Use2_13),
libraryDependencies += optionalEnumeratum.cross(CrossVersion.for3Use2_13)
)

lazy val macroUtilsSettings = commonMacroSettings ++ Seq(
libraryDependencies += scalaCheck % "test",
libraryDependencies += (scalaCheck % "test").cross(CrossVersion.for3Use2_13),
libraryDependencies += optionalEnumeratum
)

lazy val sprayJsonMacroSettings = commonMacroSettings ++ Seq(
libraryDependencies += sprayJson
libraryDependencies += sprayJson.cross(CrossVersion.for3Use2_13)
)

lazy val sprayJsonSettings = commonSettings ++ Seq(
libraryDependencies += optionalEnumeratum
libraryDependencies += optionalEnumeratum.cross(CrossVersion.for3Use2_13)
)

lazy val playJsonSettings = commonSettings ++ Seq(
libraryDependencies += playJson
libraryDependencies += playJson.cross(CrossVersion.for3Use2_13)
)

lazy val circeSettings = commonSettings ++ Seq(
libraryDependencies += circe,
libraryDependencies += circeAuto,
libraryDependencies += circeAutoExtras,
libraryDependencies += optionalEnumeratum,
libraryDependencies += circeAutoExtras.cross(CrossVersion.for3Use2_13),
libraryDependencies += optionalEnumeratum.cross(CrossVersion.for3Use2_13),
libraryDependencies += circeParser % "test"
)

lazy val akkaHttpSettings = commonSettings ++ Seq(
libraryDependencies += akkaHttp,
libraryDependencies += akkaStreamTestkit % "test",
libraryDependencies += akkaHttpTestkit % "test",
libraryDependencies += optionalEnumeratum,
libraryDependencies += (akkaHttp).cross(CrossVersion.for3Use2_13),
libraryDependencies += (akkaStreamTestkit % "test").cross(CrossVersion.for3Use2_13),
libraryDependencies += (akkaHttpTestkit % "test").cross(CrossVersion.for3Use2_13),
libraryDependencies += optionalEnumeratum.cross(CrossVersion.for3Use2_13),
libraryDependencies ++= paradisePlugin(scalaVersion.value),
scalacOptions ++= paradiseFlag(scalaVersion.value)
)

lazy val jsonschemaSettings = commonSettings ++ Seq(
libraryDependencies += jsonschema
libraryDependencies += jsonschema.cross(CrossVersion.for3Use2_13)
)

lazy val scalacheckSettings = commonSettings ++ Seq(
libraryDependencies += scalacheck,
libraryDependencies += scalacheckEnumeratum,
libraryDependencies += scalacheckShapeless
libraryDependencies += scalacheck.cross(CrossVersion.for3Use2_13),
libraryDependencies += scalacheckEnumeratum.cross(CrossVersion.for3Use2_13),
libraryDependencies += scalacheckShapeless.cross(CrossVersion.for3Use2_13)
)

lazy val taggedSettings = commonSettings ++ Seq(
libraryDependencies += optionalSlick,
libraryDependencies += optionalSlick.cross(CrossVersion.for3Use2_13),
libraryDependencies += optionalCirce
)

lazy val examplesSettings = commonSettings ++ Seq(
libraryDependencies += slickPg,
libraryDependencies += slickPg.cross(CrossVersion.for3Use2_13),
libraryDependencies += circeParser,
libraryDependencies ++= enumeratumInExamples,
libraryDependencies ++= akkaHttpInExamples,
Expand All @@ -203,12 +241,12 @@ lazy val examplesSettings = commonSettings ++ Seq(

lazy val benchmarkSettings = commonSettings ++ Seq(
libraryDependencies += scalaTest,
libraryDependencies += enumeratum,
libraryDependencies += enumeratum.cross(CrossVersion.for3Use2_13),
libraryDependencies ++= akkaHttpInBenchmarks
)

lazy val taggedMetaSettings = metaSettings ++ Seq(
libraryDependencies += optional(sprayJson),
libraryDependencies += optional(sprayJson.cross(CrossVersion.for3Use2_13)),
libraryDependencies += optional(circe)
)

Expand All @@ -230,6 +268,7 @@ lazy val slickSupport = project
.dependsOn(macroUtils, instances)
.settings(slickSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "slick",
description := "Library to eliminate the boilerplate code that comes with the use of Slick",
Expand All @@ -242,6 +281,7 @@ lazy val sprayJsonMacros = project
.dependsOn(macroUtils)
.settings(sprayJsonMacroSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "spray-json-macros",
description := "Automatic generation of Spray json formats for case-classes - macros",
Expand All @@ -254,6 +294,7 @@ lazy val sprayJsonSupport = project
.dependsOn(sprayJsonMacros, instances)
.settings(sprayJsonSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "spray-json",
description := "Automatic generation of Spray json formats for case-classes",
Expand All @@ -266,6 +307,7 @@ lazy val playJsonSupport = project
.dependsOn(macroUtils)
.settings(playJsonSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "play-json",
description := "Automatic generation of Play json formats for case-classes",
Expand All @@ -279,6 +321,7 @@ lazy val circeSupport = project
.settings(circeSettings: _*)
.settings(crossBuildSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "circe",
description := "Automatic generation of circe formats for case-classes",
Expand All @@ -290,6 +333,7 @@ lazy val akkaHttpSupport = project
.dependsOn(macroUtils, instances, tagged, taggedMeta % "test -> test")
.settings(akkaHttpSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "akka-http",
description := "Automatic generation of akka-http deserializers for 1-element case classes",
Expand All @@ -302,6 +346,7 @@ lazy val jsonschemaSupport = project
.dependsOn(macroUtils)
.settings(jsonschemaSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "jsonschema",
description := "Automatic generation of JSON Schemas for case classes",
Expand All @@ -314,6 +359,7 @@ lazy val scalacheckSupport = project
.dependsOn(macroUtils)
.settings(scalacheckSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "scalacheck",
description := "Automatic generation of scalacheck generators for case classes",
Expand All @@ -326,6 +372,7 @@ lazy val tagged = project
.dependsOn(macroUtils)
.settings(taggedSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "tagged",
description := "Representation of tagged types",
Expand All @@ -345,6 +392,7 @@ lazy val taggedMeta = project
)
.settings(taggedMetaSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "tagged-meta",
description := "Representation of tagged types - code generation based on scala-meta",
Expand All @@ -357,6 +405,7 @@ lazy val examples = project
.dependsOn(slickSupport, sprayJsonSupport, playJsonSupport, akkaHttpSupport, taggedMeta, circeSupport, instances)
.settings(examplesSettings: _*)
.settings(noPublishSettings: _*)
.settings(disableScala3)
.settings(
name := "examples",
moduleName := "kebs-examples"
Expand All @@ -377,6 +426,7 @@ lazy val instances = project
.in(file("instances"))
.settings(instancesSettings: _*)
.settings(publishSettings: _*)
.settings(disableScala3)
.settings(
name := "instances",
description := "Standard type mappings",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package pl.iterators.kebs.macros

final class CaseClass1Rep[CC, F1](val apply: F1 => CC, val unapply: CC => F1)