diff --git a/.travis.yml b/.travis.yml index c93ef49..dda8574 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,35 +1,57 @@ sudo: false language: scala -scala: - - 2.13.1 - - 2.12.10 - jdk: - openjdk11 -dist: xenial - before_install: + - git fetch --tags - export PATH=${PATH}:./vendor/bundle -install: - - rvm use 2.6.0 --install --fuzzy - - gem update --system - - gem install sass - - gem install jekyll -v 3.2.1 - -script: - - sbt ++$TRAVIS_SCALA_VERSION test - - test $TRAVIS_SCALA_VERSION == "2.13.1" || sbt ++$TRAVIS_SCALA_VERSION mimaReportBinaryIssues - - test $TRAVIS_SCALA_VERSION == "2.13.1" || sbt ++$TRAVIS_SCALA_VERSION docs/makeMicrosite - -after_success: - - test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && test $TRAVIS_REPO_SLUG == "ChristopherDavenport/circuit" && sbt ++$TRAVIS_SCALA_VERSION publish - - test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && test $TRAVIS_REPO_SLUG == "ChristopherDavenport/circuit" && test $TRAVIS_SCALA_VERSION == "2.12.10" && sbt docs/publishMicrosite +stages: + - name: test + - name: release + if: ((branch = master AND type = push) OR (tag IS present)) AND NOT fork + +scala_version_213: &scala_version_213 "2.13.1" +scala_version_212: &scala_version_212 "2.12.10" + +jobs: + include: + # stage="test" if no stage is specified + - name: test 2.13 + scala: *scala_version_213 + script: sbt ++$TRAVIS_SCALA_VERSION test + - name: test 2.12 + scala: *scala_version_212 + script: sbt ++$TRAVIS_SCALA_VERSION test + - name: mima + script: sbt +mimaReportBinaryIssues + - name: site + scala: *scala_version_212 + install: + - rvm use 2.6.0 --install --fuzzy + - gem update --system + - gem install sass + - gem install jekyll -v 3.2.1 + script: sbt ++$TRAVIS_SCALA_VERSION docs/makeMicrosite + # run ci-release only if previous stages passed + - stage: release + name: release + script: sbt ci-release + - stage: release + name: microsite + scala: *scala_version_212 + install: + - rvm use 2.6.0 --install --fuzzy + - gem update --system + - gem install sass + - gem install jekyll -v 3.2.1 + script: sbt ++$TRAVIS_SCALA_VERSION docs/publishMicrosite cache: directories: - $HOME/.ivy2/cache - - $HOME/.coursier/cache - - $HOME/.sbt + - $HOME/.coursier + - $HOME/.cache + - $HOME/.sbt \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 4b39d39..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# changelog - -This file summarizes **notable** changes for each release, but does not describe internal changes unless they are particularly exciting. This change log is ordered chronologically, so each release contains all changes described below it. - ----- - -## Unreleased Changes \ No newline at end of file diff --git a/build.sbt b/build.sbt index 8f655c6..98faf52 100644 --- a/build.sbt +++ b/build.sbt @@ -1,48 +1,82 @@ import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType} +val scala213V = "2.13.1" +val scala212V = "2.12.10" + +val catsV = "2.0.0" +val catsEffectV = "2.0.0" +val scalaTestV = "3.2.0-M1" + +val kindProjectorV = "0.11.0" +val betterMonadicForV = "0.3.1" + lazy val `circuit` = project.in(file(".")) .disablePlugins(MimaPlugin) - .settings(commonSettings, releaseSettings, skipOnPublishSettings) + .settings(publish / skip := true) .aggregate(core) lazy val core = project.in(file("core")) - .settings(commonSettings, releaseSettings, mimaSettings) + .settings(commonSettings) .settings( name := "circuit" ) lazy val docs = project.in(file("docs")) - .settings(commonSettings, skipOnPublishSettings, micrositeSettings) - .dependsOn(core) + .disablePlugins(MimaPlugin) .enablePlugins(MicrositesPlugin) .enablePlugins(TutPlugin) - -lazy val contributors = Seq( - "ChristopherDavenport" -> "Christopher Davenport" -) - -val catsV = "2.0.0" -val catsEffectV = "2.0.0" -val scalaTestV = "3.2.0-M1" - -val kindProjectorV = "0.10.3" -val betterMonadicForV = "0.3.1" - + .dependsOn(core) + .settings(publish / skip := true) + .settings(commonSettings) + .settings(crossScalaVersions := Seq(scala212V)) + .settings{ + import microsites._ + Seq( + micrositeName := "circuit", + micrositeDescription := "Circuit Breaker for Scala", + micrositeAuthor := "Christopher Davenport", + micrositeGithubOwner := "ChristopherDavenport", + micrositeGithubRepo := "circuit", + micrositeBaseUrl := "/circuit", + micrositeDocumentationUrl := "https://www.javadoc.io/doc/io.chrisdavenport/circuit_2.12", + micrositeFooterText := None, + micrositeHighlightTheme := "atom-one-light", + micrositePalette := Map( + "brand-primary" -> "#3e5b95", + "brand-secondary" -> "#294066", + "brand-tertiary" -> "#2d5799", + "gray-dark" -> "#49494B", + "gray" -> "#7B7B7E", + "gray-light" -> "#E5E5E6", + "gray-lighter" -> "#F4F3F4", + "white-color" -> "#FFFFFF" + ), + fork in tut := true, + scalacOptions in Tut --= Seq( + "-Xfatal-warnings", + "-Ywarn-unused-import", + "-Ywarn-numeric-widen", + "-Ywarn-dead-code", + "-Ywarn-unused:imports", + "-Xlint:-missing-interpolator,_" + ), + libraryDependencies += "com.47deg" %% "github4s" % "0.20.1", + micrositePushSiteWith := GitHub4s, + micrositeGithubToken := sys.env.get("GITHUB_TOKEN"), + micrositeExtraMdFiles := Map( + file("CODE_OF_CONDUCT.md") -> ExtraMdFileConfig("code-of-conduct.md", "page", Map("title" -> "code of conduct", "section" -> "code of conduct", "position" -> "101")), + file("LICENSE") -> ExtraMdFileConfig("license.md", "page", Map("title" -> "license", "section" -> "license", "position" -> "102")) + ) + ) + } // General Settings lazy val commonSettings = Seq( - organization := "io.chrisdavenport", - scalaVersion := "2.13.1", - crossScalaVersions := Seq( scalaVersion.value, "2.12.10"), - - scalacOptions in (Compile, doc) ++= Seq( - "-groups", - "-sourcepath", (baseDirectory in LocalRootProject).value.getAbsolutePath, - "-doc-source-url", "https://github.com/ChristopherDavenport/circuit/blob/v" + version.value + "€{FILE_PATH}.scala" - ), + scalaVersion := scala213V, + crossScalaVersions := Seq(scalaVersion.value, scala212V), - addCompilerPlugin("org.typelevel" % "kind-projector" % kindProjectorV cross CrossVersion.binary), + addCompilerPlugin("org.typelevel" %% "kind-projector" % kindProjectorV cross CrossVersion.full), addCompilerPlugin("com.olegpy" %% "better-monadic-for" % betterMonadicForV), libraryDependencies ++= Seq( "org.typelevel" %% "cats-core" % catsV, @@ -51,173 +85,17 @@ lazy val commonSettings = Seq( ) ) -lazy val releaseSettings = { - import ReleaseTransformations._ - Seq( - releaseCrossBuild := true, - releaseProcess := Seq[ReleaseStep]( - checkSnapshotDependencies, - inquireVersions, - runClean, - runTest, - setReleaseVersion, - commitReleaseVersion, - tagRelease, - // For non cross-build projects, use releaseStepCommand("publishSigned") - releaseStepCommandAndRemaining("+publishSigned"), - setNextVersion, - commitNextVersion, - releaseStepCommand("sonatypeReleaseAll"), - pushChanges - ), - publishTo := { - val nexus = "https://oss.sonatype.org/" - if (isSnapshot.value) - Some("snapshots" at nexus + "content/repositories/snapshots") - else - Some("releases" at nexus + "service/local/staging/deploy/maven2") - }, - credentials ++= ( - for { - username <- Option(System.getenv().get("SONATYPE_USERNAME")) - password <- Option(System.getenv().get("SONATYPE_PASSWORD")) - } yield - Credentials( - "Sonatype Nexus Repository Manager", - "oss.sonatype.org", - username, - password - ) - ).toSeq, - publishArtifact in Test := false, - releasePublishArtifactsAction := PgpKeys.publishSigned.value, - scmInfo := Some( - ScmInfo( - url("https://github.com/ChristopherDavenport/circuit"), - "git@github.com:ChristopherDavenport/circuit.git" - ) - ), - homepage := Some(url("https://github.com/ChristopherDavenport/circuit")), - licenses := Seq("Apache-2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0.html")), - publishMavenStyle := true, - pomIncludeRepository := { _ => - false - }, - pomExtra := { - - {for ((username, name) <- contributors) yield - - {username} - {name} - http://github.com/{username} - - } - - } - ) -} - -lazy val mimaSettings = { - import sbtrelease.Version - - def semverBinCompatVersions(major: Int, minor: Int, patch: Int): Set[(Int, Int, Int)] = { - val majorVersions: List[Int] = - if (major == 0 && minor == 0) List.empty[Int] // If 0.0.x do not check MiMa - else List(major) - val minorVersions : List[Int] = - if (major >= 1) Range(0, minor).inclusive.toList - else List(minor) - def patchVersions(currentMinVersion: Int): List[Int] = - if (minor == 0 && patch == 0) List.empty[Int] - else if (currentMinVersion != minor) List(0) - else Range(0, patch - 1).inclusive.toList - - val versions = for { - maj <- majorVersions - min <- minorVersions - pat <- patchVersions(min) - } yield (maj, min, pat) - versions.toSet - } - - def mimaVersions(version: String): Set[String] = { - Version(version) match { - case Some(Version(major, Seq(minor, patch), _)) => - semverBinCompatVersions(major.toInt, minor.toInt, patch.toInt) - .map{case (maj, min, pat) => maj.toString + "." + min.toString + "." + pat.toString} - case _ => - Set.empty[String] - } - } - // Safety Net For Exclusions - lazy val excludedVersions: Set[String] = Set() - - // Safety Net for Inclusions - lazy val extraVersions: Set[String] = Set() - - Seq( - mimaFailOnNoPrevious := false, - mimaFailOnProblem := mimaVersions(version.value).toList.headOption.isDefined, - mimaPreviousArtifacts := (mimaVersions(version.value) ++ extraVersions) - .filterNot(excludedVersions.contains(_)) - .map{v => - val moduleN = moduleName.value + "_" + scalaBinaryVersion.value.toString - organization.value % moduleN % v - }, - mimaBinaryIssueFilters ++= { - import com.typesafe.tools.mima.core._ - import com.typesafe.tools.mima.core.ProblemFilters._ - Seq() - } - ) -} - -lazy val micrositeSettings = { - import microsites._ - Seq( - micrositeName := "circuit", - micrositeDescription := "Circuit Breaker for Scala", - micrositeAuthor := "Christopher Davenport", - micrositeGithubOwner := "ChristopherDavenport", - micrositeGithubRepo := "circuit", - micrositeBaseUrl := "/circuit", - micrositeDocumentationUrl := "https://www.javadoc.io/doc/io.chrisdavenport/circuit_2.12", - micrositeFooterText := None, - micrositeHighlightTheme := "atom-one-light", - micrositePalette := Map( - "brand-primary" -> "#3e5b95", - "brand-secondary" -> "#294066", - "brand-tertiary" -> "#2d5799", - "gray-dark" -> "#49494B", - "gray" -> "#7B7B7E", - "gray-light" -> "#E5E5E6", - "gray-lighter" -> "#F4F3F4", - "white-color" -> "#FFFFFF" - ), - fork in tut := true, - scalacOptions in Tut --= Seq( - "-Xfatal-warnings", - "-Ywarn-unused-import", - "-Ywarn-numeric-widen", - "-Ywarn-dead-code", - "-Ywarn-unused:imports", - "-Xlint:-missing-interpolator,_" - ), - libraryDependencies += "com.47deg" %% "github4s" % "0.20.0", - micrositePushSiteWith := GitHub4s, - micrositeGithubToken := sys.env.get("GITHUB_TOKEN"), - micrositeExtraMdFiles := Map( - file("CHANGELOG.md") -> ExtraMdFileConfig("changelog.md", "page", Map("title" -> "changelog", "section" -> "changelog", "position" -> "100")), - file("CODE_OF_CONDUCT.md") -> ExtraMdFileConfig("code-of-conduct.md", "page", Map("title" -> "code of conduct", "section" -> "code of conduct", "position" -> "101")), - file("LICENSE") -> ExtraMdFileConfig("license.md", "page", Map("title" -> "license", "section" -> "license", "position" -> "102")) - ) - ) -} - -lazy val skipOnPublishSettings = Seq( - skip in publish := true, - publish := (()), - publishLocal := (()), - publishArtifact := false, - publishTo := None -) +inThisBuild(List( + organization := "io.chrisdavenport", + developers := List( + Developer("ChristopherDavenport", "Christopher Davenport", "chris@christopherdavenport.tech", url("https://github.com/ChristopherDavenport")) + ), + homepage := Some(url("https://github.com/ChristopherDavenport/circuit")), + licenses := Seq("Apache-2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0.html")), + pomIncludeRepository := { _ => false }, + scalacOptions in (Compile, doc) ++= Seq( + "-groups", + "-sourcepath", (baseDirectory in LocalRootProject).value.getAbsolutePath, + "-doc-source-url", "https://github.com/ChristopherDavenport/circuit/blob/v" + version.value + "€{FILE_PATH}.scala" + ), +)) diff --git a/project/plugins.sbt b/project/plugins.sbt index ccc6540..2d22e6b 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,15 +1,10 @@ -addSbtPlugin("com.dwijnand" % "sbt-travisci" % "1.2.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.0") -addSbtPlugin("com.jsuereth" % "sbt-pgp" % "2.0.0") addSbtPlugin("io.github.davidgregory084" % "sbt-tpolecat" % "0.1.8") -addSbtPlugin("org.lyranthe.sbt" % "partial-unification" % "1.1.2") -addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.11") -addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.8") -addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.6.1") -addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.6.13") -addSbtPlugin("com.47deg" % "sbt-microsites" % "0.9.7") -addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.3") -addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.3.7") + addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.6.1") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.29") -addSbtPlugin("org.typelevel" % "sbt-catalysts" % "0.29") \ No newline at end of file + +addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.3.2") +addSbtPlugin("io.chrisdavenport" % "sbt-mima-version-check" % "0.1.2") + +addSbtPlugin("com.47deg" % "sbt-microsites" % "0.9.6") +addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.6.13") \ No newline at end of file diff --git a/version.sbt b/version.sbt deleted file mode 100644 index 87c01ed..0000000 --- a/version.sbt +++ /dev/null @@ -1 +0,0 @@ -version in ThisBuild := "0.3.0-SNAPSHOT"