Skip to content

Commit 1ba565d

Browse files
committed
Add version number validation
1 parent 592ac18 commit 1ba565d

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ repositories {
1212
dependencies {
1313
testImplementation(platform("org.junit:junit-bom:5.8.2"))
1414
testImplementation("org.junit.jupiter:junit-jupiter")
15-
testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.2")
15+
testImplementation("org.junit.jupiter:junit-jupiter-params")
16+
testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.12.6")
1617
testImplementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.2")
1718
}
1819

src/main/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionTask.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import java.util.concurrent.TimeUnit
1010

1111
abstract class SemanticVersionTask : DefaultTask() {
1212

13+
private val versionRegex = "^\\d+\\.\\d+\$".toRegex()
1314
private val versions = mutableMapOf<String, String>()
1415

1516
@TaskAction
1617
fun setVersion() {
1718
project.allprojects.forEach { p ->
1819
p.extensions.getByType(PublishingExtension::class.java).publications.forEach { publication ->
1920
val pub = publication as MavenPublication
21+
checkVersion(pub.version)
2022
val (key, version) = findVersion(pub)
2123
pub.version = version
2224
versions[key] = version
@@ -28,6 +30,12 @@ abstract class SemanticVersionTask : DefaultTask() {
2830
}
2931
}
3032

33+
private fun checkVersion(version: String) {
34+
if (!versionRegex.matches(version)) {
35+
throw IllegalArgumentException("Invalid version, must be in format $versionRegex")
36+
}
37+
}
38+
3139
private fun findVersion(publication: MavenPublication): Pair<String, String> {
3240
val dep = project.dependencies.create(group = publication.groupId, name = publication.artifactId, version = "${publication.version}+")
3341
val conf = project.rootProject.configurations.detachedConfiguration(dep)

src/test/kotlin/dev/poolside/gradle/semanticversion/SemanticVersionPluginTest.kt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package dev.poolside.gradle.semanticversion
22

33
import org.gradle.testkit.runner.GradleRunner
4+
import org.gradle.testkit.runner.TaskOutcome.FAILED
5+
import org.gradle.testkit.runner.UnexpectedBuildFailure
46
import org.junit.jupiter.api.Assertions.assertEquals
57
import org.junit.jupiter.api.Assertions.assertTrue
68
import org.junit.jupiter.api.Assertions.fail
79
import org.junit.jupiter.api.Test
10+
import org.junit.jupiter.api.assertThrows
811
import org.junit.jupiter.api.io.TempDir
12+
import org.junit.jupiter.params.ParameterizedTest
13+
import org.junit.jupiter.params.provider.ValueSource
914
import java.io.File
1015

1116
class SemanticVersionPluginTest {
@@ -279,4 +284,46 @@ class SemanticVersionPluginTest {
279284
}
280285
assertTrue(valid.isEmpty())
281286
}
287+
288+
@ParameterizedTest(name = "{index} invalid version {0}")
289+
@ValueSource(strings = ["0.1.0", "1", "10.0.0-SNAPSHOT", "1.0-SNAPSHOT", "SNAPSHOT"])
290+
fun `invalid version`(version: String) {
291+
val build = """
292+
plugins {
293+
java
294+
`maven-publish`
295+
id("dev.poolside.gradle.semantic-version")
296+
}
297+
repositories {
298+
maven { url = uri("${mavenRepo.absolutePath}") }
299+
}
300+
group = "dev.poolside.test"
301+
version = "$version"
302+
publishing {
303+
repositories {
304+
maven { url = uri("${mavenRepo.absolutePath}") }
305+
}
306+
publications {
307+
create<MavenPublication>("mavenJava") {
308+
artifactId = "my-library"
309+
from(components["java"])
310+
}
311+
}
312+
}
313+
""".trimIndent()
314+
val settings = """rootProject.name = "testing""""
315+
File(testProjectDir, "build.gradle.kts").writeText(build)
316+
File(testProjectDir, "settings.gradle.kts").writeText(settings)
317+
val exception = assertThrows<UnexpectedBuildFailure> {
318+
GradleRunner.create()
319+
.withPluginClasspath()
320+
.withProjectDir(testProjectDir)
321+
.withArguments("publish")
322+
// .withDebug(true)
323+
.build()
324+
}
325+
val result = exception.buildResult
326+
assertTrue(result.output.contains("Invalid version, must be in format ^\\d+\\.\\d+\$"))
327+
assertEquals(FAILED, result.task(":semanticVersion")?.outcome)
328+
}
282329
}

0 commit comments

Comments
 (0)