Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
rtyley committed Jan 13, 2024
1 parent 8d9146e commit 9c07f4f
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,13 @@ object SemanticVersion {
)
}

/**
* Often we will prefer the latest release, but if there is no full release, we will select the most recent
* pre-release.
*/
val PreferReleases: Ordering[SemanticVersion] =
Ordering.by[SemanticVersion, Boolean](_.isRelease).orElse(ordering)

private def MajorP[A: P]: P[Int] = Number

// http://semver.org/#spec-item-10
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package scaladex.core.model
import org.scalatest.funspec.AsyncFunSpec
import org.scalatest.matchers.should.Matchers
import org.scalatest.prop.TableDrivenPropertyChecks
import scaladex.core.model.SemanticVersion.PreferReleases
import scaladex.core.test.Values._

class SemanticVersionTests extends AsyncFunSpec with Matchers with TableDrivenPropertyChecks {
it("should parse any version") {
Expand Down Expand Up @@ -39,6 +41,12 @@ class SemanticVersionTests extends AsyncFunSpec with Matchers with TableDrivenPr
forAll(inputs)((lower, higher) => lower shouldBe <(higher))
}

it("should allow us to prefer releases over pre-releases") {
val versions = Seq(`7.0.0`, `7.1.0`, `7.2.0-PREVIEW.1`)
versions.max shouldBe `7.2.0-PREVIEW.1`
versions.max(PreferReleases) shouldBe `7.1.0`
}

it("should encode and decode any version") {
val inputs = Table[SemanticVersion](
"semanticVersion",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ object Values {
val `2.7.0` = PatchVersion(2, 7, 0)
val `7.0.0` = PatchVersion(7, 0, 0)
val `7.1.0` = PatchVersion(7, 1, 0)
val `7.2.0-PREVIEW1` = SemanticVersion.parse("7.2.0-PREVIEW.1").get
val `7.2.0-PREVIEW2` = SemanticVersion.parse("7.2.0-PREVIEW.2").get
val `7.2.0-PREVIEW.1` = SemanticVersion.parse("7.2.0-PREVIEW.1").get
val `7.2.0-PREVIEW.2` = SemanticVersion.parse("7.2.0-PREVIEW.2").get
val `7.2.0` = PatchVersion(7, 2, 0)
val `7.3.0` = PatchVersion(7, 3, 0)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import scaladex.core.model.Scala
import scaladex.core.model.ScalaJs
import scaladex.core.model.ScalaNative
import scaladex.core.model.SemanticVersion
import scaladex.core.model.SemanticVersion.PreferReleases
import scaladex.core.service.WebDatabase

class Badges(database: WebDatabase)(implicit executionContext: ExecutionContext) {
Expand Down Expand Up @@ -173,7 +174,7 @@ object Badges {

private[route] def summaryOfLatestVersions(versionsByScalaVersions: Map[Scala, Seq[SemanticVersion]]): String =
versionsByScalaVersions.view
.mapValues(_.max)
.mapValues(_.max(PreferReleases))
.groupMap { case (_, latestVersion) => latestVersion } { case (scalaVersion, _) => scalaVersion }
.toSeq
.sortBy(_._1)(SemanticVersion.ordering.reverse)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package scaladex.server.route
import scala.concurrent.Await
import scala.concurrent.Future
import scala.concurrent.duration.Duration

import akka.http.scaladsl.model.StatusCodes
import akka.http.scaladsl.model.Uri
import akka.http.scaladsl.model.headers.Location
Expand All @@ -11,7 +12,7 @@ import org.scalatest.BeforeAndAfterAll
import org.scalatest.funspec.AnyFunSpec
import org.scalatest.matchers.should.Matchers
import scaladex.core.model.Scala._
import scaladex.core.test.Values.{`7.2.0`, _}
import scaladex.core.test.Values._
import scaladex.core.util.ScalaExtensions._
import scaladex.server.route.Badges.summaryOfLatestVersions

Expand Down Expand Up @@ -78,11 +79,13 @@ class BadgesUnitTests extends AnyFunSpec with Matchers {
}

it("should prefer releases to pre-releases if both are available") {
summaryOfLatestVersions(Map(`2.13` -> Seq(`7.0.0`, `7.1.0`, `7.2.0-PREVIEW1`))) shouldBe "7.1.0 (Scala 2.13)"
summaryOfLatestVersions(Map(`2.13` -> Seq(`7.0.0`, `7.1.0`, `7.2.0-PREVIEW.1`))) shouldBe "7.1.0 (Scala 2.13)"
}

it("should display latest pre-release if no full release is available") {
summaryOfLatestVersions(Map(`2.13` -> Seq(`7.2.0-PREVIEW1`, `7.2.0-PREVIEW2`))) shouldBe s"${`7.2.0-PREVIEW2`} (Scala 2.13)"
summaryOfLatestVersions(
Map(`2.13` -> Seq(`7.2.0-PREVIEW.1`, `7.2.0-PREVIEW.2`))
) shouldBe s"${`7.2.0-PREVIEW.2`} (Scala 2.13)"
}

}

0 comments on commit 9c07f4f

Please sign in to comment.