Skip to content

Commit b601fe6

Browse files
authored
Use cats.parse.SemVer for our SemVer.parse (#2013)
1 parent d89e000 commit b601fe6

File tree

5 files changed

+34
-85
lines changed

5 files changed

+34
-85
lines changed

build.sbt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ lazy val core = myCrossProject("core")
104104
Dependencies.log4catsSlf4j,
105105
Dependencies.monocleCore,
106106
Dependencies.refined,
107-
Dependencies.refinedCats,
108107
Dependencies.scalacacheCaffeine,
109108
Dependencies.scalacacheCatsEffect,
110109
Dependencies.logbackClassic % Runtime,

modules/core/src/main/scala/org/scalasteward/core/data/SemVer.scala

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,43 +17,21 @@
1717
package org.scalasteward.core.data
1818

1919
import cats.syntax.all._
20-
import eu.timepit.refined.cats.refTypeEq
21-
import eu.timepit.refined.types.numeric.NonNegBigInt
22-
import eu.timepit.refined.types.string.NonEmptyString
2320
import org.scalasteward.core.data.SemVer.Change._
24-
import org.scalasteward.core.util.string.parseNonNegBigInt
2521

2622
final case class SemVer(
27-
major: NonNegBigInt,
28-
minor: NonNegBigInt,
29-
patch: NonNegBigInt,
30-
preRelease: Option[NonEmptyString],
31-
buildMetadata: Option[NonEmptyString]
32-
) {
33-
def render: String =
34-
s"$major.$minor.$patch" + preRelease.fold("")("-" + _) + buildMetadata.fold("")("+" + _)
35-
}
23+
major: String,
24+
minor: String,
25+
patch: String,
26+
preRelease: Option[String] = None,
27+
buildMetadata: Option[String] = None
28+
)
3629

3730
object SemVer {
38-
def parse(s: String): Option[SemVer] = {
39-
def parseIdentifier(s: String): Option[NonEmptyString] =
40-
Option(s).map(_.drop(1)).flatMap(NonEmptyString.unapply)
41-
42-
val pattern = raw"""(\d+)\.(\d+)\.(\d+)(\-[^\+]+)?(\+.+)?""".r
43-
s match {
44-
case pattern(majorStr, minorStr, patchStr, preReleaseStr, buildMetadataStr) =>
45-
for {
46-
major <- parseNonNegBigInt(majorStr)
47-
minor <- parseNonNegBigInt(minorStr)
48-
patch <- parseNonNegBigInt(patchStr)
49-
preRelease = parseIdentifier(preReleaseStr)
50-
buildMetadata = parseIdentifier(buildMetadataStr)
51-
semVer = SemVer(major, minor, patch, preRelease, buildMetadata)
52-
if semVer.render === s
53-
} yield semVer
54-
case _ => None
31+
def parse(s: String): Option[SemVer] =
32+
cats.parse.SemVer.semver.parseAll(s).toOption.map { v =>
33+
SemVer(v.core.major, v.core.minor, v.core.patch, v.preRelease, v.buildMetadata)
5534
}
56-
}
5735

5836
sealed abstract class Change(val render: String)
5937
object Change {

modules/core/src/main/scala/org/scalasteward/core/util/string.scala

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,11 @@ import cats.syntax.all._
2121
import eu.timepit.refined.api.Refined
2222
import eu.timepit.refined.collection.MinSize
2323
import eu.timepit.refined.refineV
24-
import eu.timepit.refined.types.numeric.NonNegBigInt
2524
import org.scalasteward.core.util.Change.{Changed, Unchanged}
26-
import scala.util.Try
27-
import scala.util.matching.Regex
2825
import shapeless.Witness
2926

27+
import scala.util.matching.Regex
28+
3029
object string {
3130
type MinLengthString[N] = String Refined MinSize[N]
3231

@@ -95,9 +94,6 @@ object string {
9594
s"$line $s $line"
9695
}
9796

98-
def parseNonNegBigInt(s: String): Option[NonNegBigInt] =
99-
Try(BigInt(s)).toOption.flatMap(NonNegBigInt.unapply)
100-
10197
/** Splits a string between lower and upper case characters.
10298
*
10399
* @example {{{
Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,18 @@
11
package org.scalasteward.core.data
22

3-
import eu.timepit.refined.types.numeric.NonNegBigInt
4-
import eu.timepit.refined.types.string.NonEmptyString
53
import munit.FunSuite
64
import org.scalasteward.core.data.SemVer.Change
75

86
class SemVerTest extends FunSuite {
9-
implicit val toNonNegBigInt: Int => NonNegBigInt =
10-
i => NonNegBigInt.unsafeFrom(BigInt(i))
11-
12-
implicit val toNonEmptyString: String => NonEmptyString =
13-
NonEmptyString.unsafeFrom
14-
157
test("parse: simple examples") {
16-
assertEquals(SemVer.parse("1.2.3"), Some(SemVer(1, 2, 3, None, None)))
17-
assertEquals(SemVer.parse("0.0.0"), Some(SemVer(0, 0, 0, None, None)))
18-
assertEquals(SemVer.parse("123.456.789"), Some(SemVer(123, 456, 789, None, None)))
8+
assertEquals(SemVer.parse("1.2.3"), Some(SemVer("1", "2", "3")))
9+
assertEquals(SemVer.parse("0.0.0"), Some(SemVer("0", "0", "0")))
10+
assertEquals(SemVer.parse("123.456.789"), Some(SemVer("123", "456", "789")))
1911
}
2012

2113
test("parse: with pre-release identifier") {
22-
assertEquals(SemVer.parse("1.0.0-SNAP5"), Some(SemVer(1, 0, 0, Some("SNAP5"), None)))
23-
assertEquals(SemVer.parse("9.10.100-0.3.7"), Some(SemVer(9, 10, 100, Some("0.3.7"), None)))
14+
assertEquals(SemVer.parse("1.0.0-SNAP5"), Some(SemVer("1", "0", "0", Some("SNAP5"))))
15+
assertEquals(SemVer.parse("9.10.100-0.3.7"), Some(SemVer("9", "10", "100", Some("0.3.7"))))
2416
}
2517

2618
test("parse: empty pre-release identifier") {
@@ -30,11 +22,11 @@ class SemVerTest extends FunSuite {
3022
test("parse: with build metadata") {
3123
assertEquals(
3224
SemVer.parse("1.0.0+20130313144700"),
33-
Some(SemVer(1, 0, 0, None, Some("20130313144700")))
25+
Some(SemVer("1", "0", "0", None, Some("20130313144700")))
3426
)
3527
assertEquals(
3628
SemVer.parse("1.0.0-beta+exp.sha.5114f85"),
37-
Some(SemVer(1, 0, 0, Some("beta"), Some("exp.sha.5114f85")))
29+
Some(SemVer("1", "0", "0", Some("beta"), Some("exp.sha.5114f85")))
3830
)
3931
}
4032

@@ -56,38 +48,23 @@ class SemVerTest extends FunSuite {
5648
}
5749

5850
test("getChange") {
59-
assertEquals(
60-
SemVer.getChange(SemVer(1, 3, 4, None, None), SemVer(2, 1, 2, None, None)),
61-
Some(Change.Major)
62-
)
63-
assertEquals(
64-
SemVer.getChange(SemVer(2, 3, 4, None, None), SemVer(2, 5, 2, None, None)),
65-
Some(Change.Minor)
66-
)
67-
assertEquals(
68-
SemVer.getChange(
69-
SemVer(2, 3, 4, Some("SNAP1"), None),
70-
SemVer(2, 3, 4, Some("SNAP2"), None)
51+
List(
52+
(SemVer("1", "3", "4"), SemVer("2", "1", "2"), Some(Change.Major)),
53+
(SemVer("2", "3", "4"), SemVer("2", "5", "2"), Some(Change.Minor)),
54+
(
55+
SemVer("2", "3", "4", Some("SNAP1")),
56+
SemVer("2", "3", "4", Some("SNAP2")),
57+
Some(Change.PreRelease)
7158
),
72-
Some(Change.PreRelease)
73-
)
74-
assertEquals(
75-
SemVer.getChange(
76-
SemVer(2, 3, 4, Some("M1"), Some("1")),
77-
SemVer(2, 3, 4, Some("M1"), Some("2"))
78-
),
79-
Some(Change.BuildMetadata)
80-
)
81-
assertEquals(
82-
SemVer.getChange(
83-
SemVer(2, 3, 4, Some("M1"), None),
84-
SemVer(2, 3, 4, Some("M1"), None)
59+
(
60+
SemVer("2", "3", "4", Some("M1"), Some("1")),
61+
SemVer("2", "3", "4", Some("M1"), Some("2")),
62+
Some(Change.BuildMetadata)
8563
),
86-
None
87-
)
88-
assertEquals(
89-
SemVer.getChange(SemVer(0, 20, 0, Some("M4"), None), SemVer(0, 20, 3, None, None)),
90-
Some(Change.PreRelease)
91-
)
64+
(SemVer("2", "3", "4", Some("M1")), SemVer("2", "3", "4", Some("M1")), None),
65+
(SemVer("0", "20", "0", Some("M4")), SemVer("0", "20", "3"), Some(Change.PreRelease))
66+
).foreach { case (from, to, result) =>
67+
assertEquals(SemVer.getChange(from, to), result)
68+
}
9269
}
9370
}

project/Dependencies.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ object Dependencies {
4242
val munit = "org.scalameta" %% "munit" % "0.7.22"
4343
val munitScalacheck = "org.scalameta" %% "munit-scalacheck" % munit.revision
4444
val refined = "eu.timepit" %% "refined" % "0.9.21"
45-
val refinedCats = "eu.timepit" %% "refined-cats" % refined.revision
4645
val refinedScalacheck = "eu.timepit" %% "refined-scalacheck" % refined.revision
4746
val scalacacheCaffeine = "com.github.cb372" %% "scalacache-caffeine" % "0.28.0"
4847
val scalacacheCatsEffect =

0 commit comments

Comments
 (0)