Skip to content

Commit

Permalink
Resolve typelevel#1549. Enable all cross modules for Scala Native. De…
Browse files Browse the repository at this point in the history
  • Loading branch information
arashi01 committed Feb 1, 2021
1 parent 65a8a29 commit 58ea45b
Show file tree
Hide file tree
Showing 10 changed files with 222 additions and 39 deletions.
31 changes: 21 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,33 @@ jobs:
build:
name: Build and Test
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
scala: [2.12.12, 2.13.4, 3.0.0-M2, 3.0.0-M3]
scala: [2.12.13, 2.13.4, 3.0.0-M2, 3.0.0-M3]
java:
- adopt@1.8
- adopt@1.11
- adopt@1.15
- graalvm-ce-java8@20.2.0
platform: [jvm, js]
platform: [jvm, js, native]
exclude:
- platform: js
java: adopt@1.11
- platform: native
java: adopt@1.11
- platform: js
java: adopt@1.15
- platform: native
java: adopt@1.15
- platform: js
java: graalvm-ce-java8@20.2.0
- platform: native
java: graalvm-ce-java8@20.2.0
- platform: native
scala: 3.0.0-M2
- platform: native
scala: 3.0.0-M3
runs-on: ${{ matrix.os }}
steps:
- name: Checkout current branch (full)
Expand Down Expand Up @@ -67,12 +78,12 @@ jobs:
if: matrix.platform == 'js'
run: sbt ++${{ matrix.scala }} validateAllJS

- name: Validate JVM (scala 2)
if: matrix.platform == 'jvm' && (matrix.scala != '3.0.0-M2' && matrix.scala != '3.0.0-M3')
run: sbt ++${{ matrix.scala }} buildJVM bench/test
- name: Validate Scala Native
if: matrix.platform == 'native'
run: sbt ++${{ matrix.scala }} validateAllNative

- name: Validate JVM (scala 3)
if: matrix.platform == 'jvm' && (matrix.scala == '3.0.0-M2' || matrix.scala == '3.0.0-M3')
- name: Validate JVM (Scala ${{ matrix.scala }})
if: matrix.platform == 'jvm'
run: sbt ++${{ matrix.scala }} buildJVM bench/test

- name: Binary compatibility ${{ matrix.scala }}
Expand All @@ -84,7 +95,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
scala: [2.12.12, 2.13.4, 3.0.0-M2, 3.0.0-M3]
scala: [2.12.13, 2.13.4, 3.0.0-M2, 3.0.0-M3]
java: [adopt@1.8]
runs-on: ${{ matrix.os }}
steps:
Expand Down Expand Up @@ -120,7 +131,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
scala: [2.12.12, 2.13.4, 3.0.0-M2, 3.0.0-M3]
scala: [2.12.13, 2.13.4, 3.0.0-M2, 3.0.0-M3]
java: [adopt@1.8]
runs-on: ${{ matrix.os }}
steps:
Expand Down Expand Up @@ -155,7 +166,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
scala: [2.12.12]
scala: [2.12.13]
java: [adopt@1.8]
runs-on: ${{ matrix.os }}
steps:
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ Support this project with your organization. Your logo will show up here with a

### Getting Started

Cats is currently available for Scala 2.10 (up to 1.2.x), 2.11, 2.12, 2.13, and [Scala.js](http://www.scala-js.org/).
Cats is currently available for Scala 2.10 (up to 1.2.x), 2.11, 2.12, 2.13, [Scala.js](http://www.scala-js.org/), and [Scala Native](https://www.scala-native.org/).

Cats relies on improved type inference via the fix for [SI-2712](https://github.com/scala/bug/issues/2712), which is not enabled by default. For **Scala 2.11.9+ or 2.12** you should add the following to your `build.sbt`:

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package alleycats.tests

import org.scalacheck.Test.Parameters

trait TestSettings {

lazy val checkConfiguration: Parameters =
Parameters.default
.withMinSuccessfulTests(50)
.withMaxDiscardRatio(5.0f)
.withMaxSize(10)
.withMinSize(0)
.withWorkers(1)
}
129 changes: 104 additions & 25 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ val GraalVM8 = "graalvm-ce-java8@20.2.0"

ThisBuild / githubWorkflowJavaVersions := Seq(PrimaryJava, LTSJava, LatestJava, GraalVM8)

val Scala212 = "2.12.12"
val Scala212 = "2.12.13"
val Scala213 = "2.13.4"
val DottyOld = "3.0.0-M2"
val DottyNew = "3.0.0-M3"
Expand All @@ -46,34 +46,40 @@ ThisBuild / scalaVersion := Scala213
ThisBuild / githubWorkflowPublishTargetBranches := Seq() // disable publication for now

ThisBuild / githubWorkflowBuildMatrixAdditions +=
"platform" -> List("jvm", "js")
"platform" -> List("jvm", "js", "native")

ThisBuild / githubWorkflowBuildMatrixExclusions ++=
githubWorkflowJavaVersions.value.filterNot(Set(PrimaryJava)).map { java =>
MatrixExclude(Map("platform" -> "js", "java" -> java))
githubWorkflowJavaVersions.value.filterNot(Set(PrimaryJava)).flatMap { java =>
Seq(MatrixExclude(Map("platform" -> "js", "java" -> java)),
MatrixExclude(Map("platform" -> "native", "java" -> java))
)
}

ThisBuild / githubWorkflowBuildMatrixExclusions ++= Seq(DottyOld, DottyNew).map { dottyVersion =>
MatrixExclude(Map("platform" -> "native", "scala" -> dottyVersion))
} // Dotty is not yet supported by Scala Native

// we don't need this since we aren't publishing
ThisBuild / githubWorkflowArtifactUpload := false

ThisBuild / githubWorkflowBuildMatrixFailFast := Some(false)

val JvmCond = s"matrix.platform == 'jvm'"
val JsCond = s"matrix.platform == 'js'"
val NativeCond = s"matrix.platform == 'native'"

val Scala2Cond = s"(matrix.scala != '$DottyOld' && matrix.scala != '$DottyNew')"
val Scala3Cond = s"(matrix.scala == '$DottyOld' || matrix.scala == '$DottyNew')"

ThisBuild / githubWorkflowBuild := Seq(
WorkflowStep.Sbt(List("validateAllJS"), name = Some("Validate JavaScript"), cond = Some(JsCond)),
WorkflowStep.Sbt(List("validateAllNative"), name = Some("Validate Scala Native"), cond = Some(NativeCond)),
WorkflowStep.Sbt(List("buildJVM", "bench/test"),
name = Some("Validate JVM (scala 2)"),
cond = Some(JvmCond + " && " + Scala2Cond)
),
WorkflowStep.Sbt(List("buildJVM", "bench/test"),
name = Some("Validate JVM (scala 3)"),
cond = Some(JvmCond + " && " + Scala3Cond)
name = Some("Validate JVM (Scala ${{ matrix.scala }})"),
cond = Some(JvmCond)
),
WorkflowStep.Sbt(
List("clean", "validateBC"), // cleaning here to avoid issues with codecov
List("clean", "validateBC"),
name = Some("Binary compatibility ${{ matrix.scala }}"),
cond = Some(JvmCond + " && " + Scala2Cond)
)
Expand Down Expand Up @@ -134,6 +140,7 @@ lazy val commonSettings = Seq(
resolvers ++= Seq(Resolver.sonatypeRepo("releases"), Resolver.sonatypeRepo("snapshots")),
parallelExecution in Test := false,
testFrameworks += new TestFramework("munit.Framework"),
doctestTestFramework := DoctestTestFramework.Munit,
scalacOptions in (Compile, doc) := (scalacOptions in (Compile, doc)).value.filter(_ != "-Xfatal-warnings"),
Compile / doc / sources := {
val old = (Compile / doc / sources).value
Expand Down Expand Up @@ -196,6 +203,14 @@ lazy val commonJsSettings = Seq(
doctestGenTests := Seq.empty
)

lazy val commonNativeSettings = Seq(
// currently sbt-doctest doesn't work in Native/JS builds
// https://github.com/tkawachi/sbt-doctest/issues/52
doctestGenTests := Seq.empty,
// Currently scala-native does not support Dotty
crossScalaVersions := { crossScalaVersions.value.filterNot(Seq(DottyOld, DottyNew).contains) }
)

lazy val commonJvmSettings = Seq(
testOptions in Test += {
val flag = if (githubIsWorkflowBuild.value) "-oCI" else "-oDF"
Expand Down Expand Up @@ -494,8 +509,8 @@ lazy val cats = project
.settings(moduleName := "root")
.settings(publishSettings) // these settings are needed to release all aggregated modules under this root module
.settings(noPublishSettings) // this is to exclude the root module itself from being published.
.aggregate(catsJVM, catsJS)
.dependsOn(catsJVM, catsJS, tests.jvm % "test-internal -> test")
.aggregate(catsJVM, catsJS, catsNative)
.dependsOn(catsJVM, catsJS, catsNative, tests.jvm % "test-internal -> test")

lazy val catsJVM = project
.in(file(".catsJVM"))
Expand Down Expand Up @@ -562,7 +577,41 @@ lazy val catsJS = project
)
.enablePlugins(ScalaJSPlugin)

lazy val kernel = crossProject(JSPlatform, JVMPlatform)
lazy val catsNative = project
.in(file(".catsNative"))
.settings(moduleName := "cats")
.settings(noPublishSettings)
.settings(catsSettings)
.settings(commonNativeSettings)
.aggregate(
kernel.native,
kernelLaws.native,
core.native,
laws.native,
free.native,
testkit.native,
tests.native,
alleycatsCore.native,
alleycatsLaws.native,
alleycatsTests.native,
native
)
.dependsOn(
kernel.native,
kernelLaws.native,
core.native,
laws.native,
free.native,
testkit.native,
tests.native % "test-internal -> test",
alleycatsCore.native,
alleycatsLaws.native,
alleycatsTests.native % "test-internal -> test",
native
)
.enablePlugins(ScalaNativePlugin)

lazy val kernel = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.in(file("kernel"))
.settings(moduleName := "cats-kernel", name := "Cats kernel")
Expand All @@ -572,11 +621,13 @@ lazy val kernel = crossProject(JSPlatform, JVMPlatform)
.settings(includeGeneratedSrc)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-kernel"))
.nativeSettings(commonNativeSettings)
.settings(testingDependencies)
.settings(
libraryDependencies += "org.scalacheck" %%% "scalacheck" % scalaCheckVersion % Test
)

lazy val kernelLaws = crossProject(JSPlatform, JVMPlatform)
lazy val kernelLaws = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("kernel-laws"))
.settings(moduleName := "cats-kernel-laws", name := "Cats kernel laws")
.settings(commonSettings)
Expand All @@ -587,8 +638,9 @@ lazy val kernelLaws = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-kernel-laws", includeCats1 = false))
.dependsOn(kernel)
.nativeSettings(commonNativeSettings)

lazy val core = crossProject(JSPlatform, JVMPlatform)
lazy val core = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(kernel)
.settings(moduleName := "cats-core", name := "Cats core")
Expand All @@ -608,8 +660,10 @@ lazy val core = crossProject(JSPlatform, JVMPlatform)
)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-core"))
.settings(testingDependencies)
.nativeSettings(commonNativeSettings)

lazy val laws = crossProject(JSPlatform, JVMPlatform)
lazy val laws = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(kernel, core, kernelLaws)
.settings(moduleName := "cats-laws", name := "Cats laws")
Expand All @@ -618,16 +672,18 @@ lazy val laws = crossProject(JSPlatform, JVMPlatform)
.settings(testingDependencies)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-laws", includeCats1 = false))
.nativeSettings(commonNativeSettings)

lazy val free = crossProject(JSPlatform, JVMPlatform)
lazy val free = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(core, tests % "test-internal -> test")
.settings(moduleName := "cats-free", name := "Cats Free")
.settings(catsSettings)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-free"))
.nativeSettings(commonNativeSettings)

lazy val tests = crossProject(JSPlatform, JVMPlatform)
lazy val tests = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(testkit % Test)
.settings(moduleName := "cats-tests")
Expand All @@ -637,8 +693,9 @@ lazy val tests = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings)
.settings(scalacOptions in Test := (scalacOptions in Test).value.filter(_ != "-Xfatal-warnings"))
.nativeSettings(commonNativeSettings)

lazy val testkit = crossProject(JSPlatform, JVMPlatform)
lazy val testkit = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(core, laws)
.enablePlugins(BuildInfoPlugin)
Expand All @@ -649,8 +706,9 @@ lazy val testkit = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-testkit", includeCats1 = false))
.settings(scalacOptions := scalacOptions.value.filter(_ != "-Xfatal-warnings"))
.nativeSettings(commonNativeSettings)

lazy val alleycatsCore = crossProject(JSPlatform, JVMPlatform)
lazy val alleycatsCore = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.in(file("alleycats-core"))
.dependsOn(core)
Expand All @@ -660,8 +718,9 @@ lazy val alleycatsCore = crossProject(JSPlatform, JVMPlatform)
.settings(includeGeneratedSrc)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("alleycats-core", includeCats1 = false))
.nativeSettings(commonNativeSettings)

lazy val alleycatsLaws = crossProject(JSPlatform, JVMPlatform)
lazy val alleycatsLaws = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.in(file("alleycats-laws"))
.dependsOn(alleycatsCore, laws)
Expand All @@ -672,8 +731,9 @@ lazy val alleycatsLaws = crossProject(JSPlatform, JVMPlatform)
.settings(testingDependencies)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("alleycats-laws", includeCats1 = false))
.nativeSettings(commonNativeSettings)

lazy val alleycatsTests = crossProject(JSPlatform, JVMPlatform)
lazy val alleycatsTests = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("alleycats-tests"))
.dependsOn(alleycatsLaws, tests % "test-internal -> test")
.settings(moduleName := "alleycats-tests")
Expand All @@ -682,6 +742,7 @@ lazy val alleycatsTests = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings)
.settings(scalacOptions in Test := (scalacOptions in Test).value.filter(_ != "-Xfatal-warnings"))
.nativeSettings(commonNativeSettings)

// bench is currently JVM-only

Expand Down Expand Up @@ -726,6 +787,14 @@ lazy val js = project
.settings(commonJsSettings)
.enablePlugins(ScalaJSPlugin)

// cats-native is Native-only
lazy val native = project
.dependsOn(core.native, tests.native % "test-internal -> test")
.settings(moduleName := "cats-native")
.settings(catsSettings)
.settings(commonNativeSettings)
.enablePlugins(ScalaNativePlugin)

// cats-jvm is JVM-only
lazy val jvm = project
.dependsOn(core.jvm, tests.jvm % "test-internal -> test")
Expand Down Expand Up @@ -830,14 +899,24 @@ addCommandAlias("buildTestsJVM", ";lawsJVM/test;testkitJVM/test;testsJVM/test;jv
addCommandAlias("buildFreeJVM", ";freeJVM/test")
addCommandAlias("buildAlleycatsJVM", ";alleycatsCoreJVM/test;alleycatsLawsJVM/test;alleycatsTestsJVM/test")
addCommandAlias("buildJVM", ";buildKernelJVM;buildCoreJVM;buildTestsJVM;buildFreeJVM;buildAlleycatsJVM")
addCommandAlias("validateBC", ";binCompatTest/test;mimaReportBinaryIssues")
addCommandAlias("validateBC", ";binCompatTest/test;catsJVM/mimaReportBinaryIssues")
addCommandAlias("validateJVM", ";fmtCheck;buildJVM;bench/test;validateBC;makeMicrosite")
addCommandAlias("validateJS", ";testsJS/test;js/test")
addCommandAlias("validateKernelJS", "kernelLawsJS/test")
addCommandAlias("validateFreeJS", "freeJS/test")
addCommandAlias("validateAlleycatsJS", "alleycatsTestsJS/test")
addCommandAlias("validateAllJS", "all testsJS/test js/test kernelLawsJS/test freeJS/test alleycatsTestsJS/test")
addCommandAlias("validate", ";clean;validateJS;validateKernelJS;validateFreeJS;validateJVM")
addCommandAlias("validateNative", ";testsNative/test;native/test")
addCommandAlias("validateKernelNative", "kernelLawsNative/test")
addCommandAlias("validateFreeNative", "freeNative/test")
addCommandAlias("validateAlleycatsNative", "alleycatsTestsNative/test")
addCommandAlias("validateAllNative",
"all testsNative/test native/test kernelLawsNative/test freeNative/test alleycatsTestsNative/test"
)
addCommandAlias(
"validate",
";clean;validateJS;validateKernelJS;validateFreeJS;validateNative;validateKernelNative;validateFreeNative;validateJVM"
)

addCommandAlias("prePR", "fmt")

Expand Down
Loading

0 comments on commit 58ea45b

Please sign in to comment.