Improved version parsing.

This commit is contained in:
Erik C. Thauvin 2019-07-26 12:26:34 -07:00
parent c16f95a8d3
commit c678bb7889
2 changed files with 34 additions and 13 deletions

View file

@ -36,6 +36,7 @@ import org.gradle.api.GradleException
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.IOException
import java.util.Properties import java.util.Properties
/** /**
@ -77,7 +78,7 @@ object Utils {
if (!exists() && createNewFile()) { if (!exists() && createNewFile()) {
isNew = true isNew = true
} }
} catch (e: Exception) { } catch (e: IOException) {
throw GradleException("Unable to create: `$absoluteFile`", e) throw GradleException("Unable to create: `$absoluteFile`", e)
} }
if (canReadFile()) { if (canReadFile()) {
@ -131,26 +132,29 @@ object Utils {
if (input.isNullOrBlank()) return false if (input.isNullOrBlank()) return false
try { try {
val max = 5
val min = 3
val parts = input.split( val parts = input.split(
Regex("[\\Q${version.separator}${version.preReleasePrefix}${version.buildMetaPrefix}\\E]"), Regex("[\\Q${version.separator}${version.preReleasePrefix}${version.buildMetaPrefix}\\E]"),
5 max
) )
if (parts.size >= 3) { if (parts.size >= min) {
version.major = parts[0].toInt() version.major = parts[0].toInt()
version.minor = parts[1].toInt() version.minor = parts[1].toInt()
version.patch = parts[2].toInt() version.patch = parts[2].toInt()
version.preRelease = "" version.preRelease = ""
version.buildMeta = "" version.buildMeta = ""
if (parts.size > 3) { if (parts.size > min) {
when { when {
parts.size == 5 -> { parts.size == max -> {
version.preRelease = parts[3] version.preRelease = parts[3]
version.buildMeta = parts[4] version.buildMeta = parts[4]
} }
parts.size == 4 -> { parts.size == 4 -> {
if (input.contains(version.buildMetaPrefix)) { if (input.endsWith(version.buildMetaPrefix + parts[3])) {
version.buildMeta = parts[3] version.buildMeta = parts[3]
} else { } else {
version.preRelease = parts[3] version.preRelease = parts[3]
@ -208,11 +212,11 @@ object Utils {
store(it, "Generated by the Semver Plugin for Gradle") store(it, "Generated by the Semver Plugin for Gradle")
} }
} else { } else {
throw GradleException() throw IOException("Can't write.")
} }
} }
} catch (e: Exception) { } catch (e: IOException) {
throw GradleException("Unable to write version to: `${propsFile.absoluteFile}`") throw GradleException("Unable to write version to: `${propsFile.absoluteFile}`", e)
} }
} }
} }

View file

@ -152,8 +152,10 @@ object UtilsSpec : Spek({
} }
} }
Scenario("Testing Version Parsing") { Scenario("Version Parsing") {
When("validating version parsing") { When("validating version parsing") {}
Then("versions should parse") {
listOf( listOf(
"1.0.0", "1.0.0",
"2.1.0-beta", "2.1.0-beta",
@ -168,19 +170,34 @@ object UtilsSpec : Spek({
} }
} }
Then("should throw exceptions") {
assertFailsWith<GradleException> {
Utils.parseSemVer("2.1.1a", version)
}
assertFailsWith<GradleException> {
Utils.parseSemVer("2a.1.1", version)
}
assertFailsWith<GradleException> {
Utils.parseSemVer("2.1a.1", version)
}
assertFailsWith<GradleException> {
Utils.parseSemVer("2.1", version)
}
}
Given("new prefixes") { Given("new prefixes") {
version.preReleasePrefix = "." version.preReleasePrefix = "."
version.buildMetaPrefix = "." version.buildMetaPrefix = "."
} }
Then("validating prefixes parsing") { Then("prefixes should parse") {
listOf("2.1.0.beta.1", "2.1.1.1", "3.2.1.beta.1.007").forEach { listOf("2.1.0.beta.1", "2.1.1.1", "3.2.1.beta.1.007").forEach {
assertTrue(Utils.parseSemVer(it, version), "parsing semver: $it") assertTrue(Utils.parseSemVer(it, version), "parsing semver: $it")
assertEquals(it, version.semver, it) assertEquals(it, version.semver, it)
} }
} }
Then("verifying pre-release and meta") { Then("last pre-release and meta should match") {
assertEquals(version.preRelease, "beta") assertEquals(version.preRelease, "beta")
assertEquals(version.buildMeta, "1.007") assertEquals(version.buildMeta, "1.007")
} }