Skip to content

Commit

Permalink
Close #81 - Add some extension methods
Browse files Browse the repository at this point in the history
  • Loading branch information
kevin-lee committed May 28, 2021
1 parent 252a426 commit 1e5e894
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 25 deletions.
6 changes: 6 additions & 0 deletions src/main/scala/just/semver/AdditionalInfo.scala
Expand Up @@ -12,12 +12,18 @@ object AdditionalInfo {

final case class PreRelease(identifier: List[Dsv])
object PreRelease {
implicit final class PreReleaseOps(val preRelease: PreRelease) extends AnyVal {
@inline def render: String = PreRelease.render(preRelease)
}
def render(preRelease: PreRelease): String =
preRelease.identifier.map(Dsv.render).mkString(".")
}

final case class BuildMetaInfo(identifier: List[Dsv])
object BuildMetaInfo {
implicit final class BuildMetaInfoOps(val buildMetaInfo: BuildMetaInfo) extends AnyVal {
@inline def render: String = BuildMetaInfo.render(buildMetaInfo)
}
def render(buildMetaInfo: BuildMetaInfo): String =
buildMetaInfo.identifier.map(Dsv.render).mkString(".")
}
Expand Down
4 changes: 4 additions & 0 deletions src/main/scala/just/semver/Anh.scala
Expand Up @@ -54,6 +54,10 @@ object Anh {
def hyphen: Anh =
Hyphen

implicit final class AnhOps(val anh: Anh) extends AnyVal {
@inline def render: String = Anh.render(anh)
}

def render(alphaNumHyphen: Anh): String = alphaNumHyphen match {
case Num(value) => value
case Alphabet(value) => value
Expand Down
5 changes: 5 additions & 0 deletions src/main/scala/just/semver/Dsv.scala
Expand Up @@ -7,6 +7,7 @@ import just.fp.syntax._
import scala.annotation.tailrec

/**
* Dot separated value
* @author Kevin Lee
* @since 2018-10-21
*/
Expand All @@ -19,6 +20,10 @@ object Dsv {

import Anh._

implicit final class DsvOps(val dsv: Dsv) extends AnyVal {
@inline def render: String = Dsv.render(dsv)
}

def render(alphaNumHyphenGroup: Dsv): String =
alphaNumHyphenGroup.values.map(Anh.render).mkString

Expand Down
50 changes: 27 additions & 23 deletions src/main/scala/just/semver/ParseError.scala
Expand Up @@ -20,6 +20,30 @@ object ParseError {

final case class InvalidVersionStringError(value: String) extends ParseError

def invalidAlphaNumHyphenError(c: Char, rest: List[Char]): ParseError =
InvalidAlphaNumHyphenError(c, rest)

def emptyAlphaNumHyphenError: ParseError =
EmptyAlphaNumHyphenError

def leadingZeroNumError(n: String): ParseError =
LeadingZeroNumError(n)

def preReleaseParseError(parseError: ParseError): ParseError =
PreReleaseParseError(parseError)

def buildMetadataParseError(parseError: ParseError): ParseError =
BuildMetadataParseError(parseError)

def combine(preReleaseError: ParseError, buildMetadataError: ParseError): ParseError =
CombinedParseError(
preReleaseParseError(preReleaseError)
, buildMetadataParseError(buildMetadataError)
)

def invalidVersionStringError(value: String): ParseError =
InvalidVersionStringError(value)

@SuppressWarnings(Array("org.wartremover.warts.Recursion"))
def render(parseError: ParseError): String = parseError match {
case InvalidAlphaNumHyphenError(c, rest) =>
Expand Down Expand Up @@ -47,28 +71,8 @@ object ParseError {
s"Invalid SemVer String. value: $value"
}

def invalidAlphaNumHyphenError(c: Char, rest: List[Char]): ParseError =
InvalidAlphaNumHyphenError(c, rest)

def emptyAlphaNumHyphenError: ParseError =
EmptyAlphaNumHyphenError

def leadingZeroNumError(n: String): ParseError =
LeadingZeroNumError(n)

def preReleaseParseError(parseError: ParseError): ParseError =
PreReleaseParseError(parseError)

def buildMetadataParseError(parseError: ParseError): ParseError =
BuildMetadataParseError(parseError)

def combine(preReleaseError: ParseError, buildMetadataError: ParseError): ParseError =
CombinedParseError(
preReleaseParseError(preReleaseError)
, buildMetadataParseError(buildMetadataError)
)

def invalidVersionStringError(value: String): ParseError =
InvalidVersionStringError(value)
implicit final class ParseErrorOps(val parseError: ParseError) extends AnyVal {
@inline def render: String = ParseError.render(parseError)
}

}
7 changes: 7 additions & 0 deletions src/main/scala/just/semver/SemVer.scala
Expand Up @@ -58,6 +58,13 @@ object SemVer {
val semVerRegex: Regex =
"""(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z\d-\.]+)?)?(?:\+([a-zA-Z\d-\.]+)?)?""".r

implicit final class SemVerOps(val semVer: SemVer) extends AnyVal {
@inline def majorMinorPatch: (SemVer.Major, SemVer.Minor, SemVer.Patch) =
SemVer.majorMinorPatch(semVer)

@inline def render: String = SemVer.render(semVer)
}

def majorMinorPatch(semVer: SemVer): (SemVer.Major, SemVer.Minor, SemVer.Patch) =
(semVer.major, semVer.minor, semVer.patch)

Expand Down
22 changes: 22 additions & 0 deletions src/test/scala/just/semver/AlphaNumHyphenSpec.scala
Expand Up @@ -16,6 +16,8 @@ object AlphaNumHyphenSpec extends Properties {
, property("AlphaHyphen(same).compare(AlphaHyphen(same)) should return 0", testAlphaHyphenEqual)
, property("AlphaHyphen(less).compare(AlphaHyphen(greater)) should return the Int < 0", testAlphaHyphenLess)
, property("AlphaHyphen(greater).compare(AlphaHyphen(less)) should return the Int > 0", testAlphaHyphenMore)
, property("test Anh.render(anh)", testAnhRenderAnh)
, property("test anh.render", testAnhRenderAnh)
)

@SuppressWarnings(Array("org.wartremover.warts.Equals"))
Expand Down Expand Up @@ -60,4 +62,24 @@ object AlphaNumHyphenSpec extends Properties {
Result.assert(alphaHyphen2.compare(alphaHyphen1) > 0)
}

def testAnhRenderAnh: Property = for {
anh <- Gen.frequency1(3 -> Gens.genNum, 6 -> Gens.genAlphabet(10), 1 -> Gens.genHyphen).log("anh")
} yield {
val expected: String = anh match {
case Anh.Alphabet(value) => value
case Anh.Num(value) => value
case Anh.Hyphen => "-"
}
val actual = Anh.render(anh)
actual ==== expected
}

def testAnhRender: Property = for {
anh <- Gen.frequency1(3 -> Gens.genNum, 6 -> Gens.genAlphabet(10), 1 -> Gens.genHyphen).log("anh")
} yield {
val expected: String = Anh.render(anh)
val actual = anh.render
actual ==== expected
}

}
13 changes: 11 additions & 2 deletions src/test/scala/just/semver/SemVerSpec.scala
Expand Up @@ -54,7 +54,8 @@ object SemVerSpec extends Properties {
, property("SemVer(greater) >= SemVer(less) should be true", testSemVerGreaterOrEqualTrue)
, property("SemVer(same) >= SemVer(same) should be true", testSemVerGreaterOrEqualTrueForSame)
, property("SemVer(less) >= SemVer(greater) should be false", testSemVerGreaterOrEqualFalse)
, property("SemVer round trip", roundTripSemVer)
, property("SemVer round trip SemVer.render(semVer)", roundTripSemVerRenderSemVer)
, property("SemVer round trip semVer.render", roundTripSemVerRender)
, property(
"SemVer.majorMinorPatch(semVer) should return (SemVer.Major, SemVer.Minor, SemVer.Patch)",
testSemVerMajorMinorPatch
Expand Down Expand Up @@ -681,14 +682,22 @@ object SemVerSpec extends Properties {
, v1, v2)((x, y) => !(x >= y))
}

def roundTripSemVer: Property = for {
def roundTripSemVerRenderSemVer: Property = for {
semVer <- Gens.genSemVer.log("semVer")
} yield {
val rendered = SemVer.render(semVer)
val actual = SemVer.parse(rendered)
actual ==== Right(semVer)
}

def roundTripSemVerRender: Property = for {
semVer <- Gens.genSemVer.log("semVer")
} yield {
val rendered = semVer.render
val actual = SemVer.parse(rendered)
actual ==== Right(semVer)
}

def testSemVerMajorMinorPatch: Property = for {
semVer <- Gens.genSemVer.log("semVer")
} yield {
Expand Down

0 comments on commit 1e5e894

Please sign in to comment.