Skip to content

Commit ae1872b

Browse files
committed
Add support for coroutines version verification in CheckVersionCompatibility task
1 parent f6e3283 commit ae1872b

3 files changed

Lines changed: 32 additions & 10 deletions

File tree

build-logic/src/main/kotlin/io/github/composegears/valkyrie/task/CheckVersionCompatibility.kt

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,47 @@ package io.github.composegears.valkyrie.task
33
import net.swiftzer.semver.SemVer
44
import org.gradle.api.DefaultTask
55
import org.gradle.api.GradleException
6-
import org.gradle.api.provider.ListProperty
6+
import org.gradle.api.provider.MapProperty
77
import org.gradle.api.provider.Property
88
import org.gradle.api.tasks.Input
99
import org.gradle.api.tasks.TaskAction
1010

1111
abstract class CheckVersionCompatibility : DefaultTask() {
1212

13+
/** Maps each resolved coordinate (`group:name:version`) to the list of coordinates that depend on it. */
1314
@get:Input
14-
abstract val resolvedComponents: ListProperty<String>
15+
abstract val resolvedComponents: MapProperty<String, List<String>>
1516

1617
@get:Input
1718
abstract val maxKotlinVersion: Property<String>
1819

1920
@get:Input
2021
abstract val maxComposeVersion: Property<String>
2122

23+
@get:Input
24+
abstract val maxCoroutinesVersion: Property<String>
25+
2226
@TaskAction
2327
fun check() {
2428
val maxKotlin = SemVer.parse(maxKotlinVersion.get())
2529
val maxCompose = SemVer.parse(maxComposeVersion.get())
30+
val maxCoroutines = SemVer.parse(maxCoroutinesVersion.get())
2631

2732
val violations = resolvedComponents.get()
28-
.mapNotNull { coordinate ->
33+
.mapNotNull { (coordinate, dependents) ->
2934
val (group, name, version) = coordinate.split(":")
35+
val requiredBy = if (dependents.isNotEmpty()) {
36+
"\n" + dependents.joinToString("\n") { "\t\t - $it" }
37+
} else {
38+
""
39+
}
3040
when {
3141
group == "org.jetbrains.kotlin" && SemVer.parse(version) > maxKotlin ->
32-
"\t- $group:$name:$version (max supported: $maxKotlin)"
42+
"\t- $group:$name:$version (max supported: $maxKotlin)$requiredBy"
3343
group.startsWith("org.jetbrains.compose") && SemVer.parse(version) > maxCompose ->
34-
"\t- $group:$name:$version (max supported: $maxCompose)"
44+
"\t- $group:$name:$version (max supported: $maxCompose)$requiredBy"
45+
group == "org.jetbrains.kotlinx" && name.startsWith("kotlinx-coroutines") && SemVer.parse(version) > maxCoroutines ->
46+
"\t- $group:$name:$version (max supported: $maxCoroutines)$requiredBy"
3547
else -> null
3648
}
3749
}
@@ -45,6 +57,6 @@ abstract class CheckVersionCompatibility : DefaultTask() {
4557
},
4658
)
4759
}
48-
logger.lifecycle("✅ All dependencies are compatible (kotlin ≤ $maxKotlin, compose ≤ $maxCompose)")
60+
logger.lifecycle("✅ All dependencies are compatible (kotlin ≤ $maxKotlin, compose ≤ $maxCompose, coroutines ≤ $maxCoroutines)")
4961
}
5062
}

gradle/libs.versions.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
[versions]
22
compose = "1.10.0"
3+
# https://plugins.jetbrains.com/docs/intellij/using-kotlin.html#coroutinesLibraries
4+
coroutines = "1.10.2"
35
intellij = "2.13.1"
46
jacoco = "0.8.13"
57
jdkRelease = "21"
@@ -46,7 +48,7 @@ assertk = "com.willowtreeapps.assertk:assertk:0.28.1"
4648
junit5-jupiter = "org.junit.jupiter:junit-jupiter:6.0.3"
4749
junit-launcher = "org.junit.platform:junit-platform-launcher:6.0.3"
4850
junit4 = "junit:junit:4.13.2"
49-
kotlin-coroutines-test = "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2"
51+
kotlin-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
5052
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
5153

5254
semver = "net.swiftzer.semver:semver:2.1.0"

tools/idea-plugin/build.gradle.kts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,18 @@ tasks.register<CheckVersionCompatibility>("checkVersionCompatibility") {
181181
dependencies.addAll(configurations.getByName("implementation").dependencies)
182182
}
183183
resolvedComponents = checkConfig.map { config ->
184-
config.incoming.resolutionResult.allComponents
185-
.mapNotNull { it.moduleVersion }
186-
.map { "${it.group}:${it.name}:${it.version}" }
184+
val result = mutableMapOf<String, MutableSet<String>>()
185+
for (component in config.incoming.resolutionResult.allComponents) {
186+
val mv = component.moduleVersion ?: continue
187+
val coordinate = "${mv.group}:${mv.name}:${mv.version}"
188+
val dependents = result.getOrPut(coordinate) { mutableSetOf() }
189+
component.dependents.forEach { dep ->
190+
dep.from.moduleVersion?.let { dependents.add("${it.group}:${it.name}:${it.version}") }
191+
}
192+
}
193+
result.mapValues { (_, deps) -> deps.toList() }
187194
}
188195
maxKotlinVersion = libs.versions.kotlin
189196
maxComposeVersion = libs.versions.compose
197+
maxCoroutinesVersion = libs.versions.coroutines
190198
}

0 commit comments

Comments
 (0)