From 04d03bb965db85d64d0cdea2649037b845a3e390 Mon Sep 17 00:00:00 2001 From: Yahor Urbanovich Date: Thu, 4 Jun 2026 11:09:15 +0300 Subject: [PATCH] Add support for coroutines version verification in CheckVersionCompatibility task --- .../task/CheckVersionCompatibility.kt | 24 ++++++++++++++----- gradle/libs.versions.toml | 4 +++- tools/idea-plugin/build.gradle.kts | 14 ++++++++--- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/build-logic/src/main/kotlin/io/github/composegears/valkyrie/task/CheckVersionCompatibility.kt b/build-logic/src/main/kotlin/io/github/composegears/valkyrie/task/CheckVersionCompatibility.kt index 9bf78d156..d81a95de4 100644 --- a/build-logic/src/main/kotlin/io/github/composegears/valkyrie/task/CheckVersionCompatibility.kt +++ b/build-logic/src/main/kotlin/io/github/composegears/valkyrie/task/CheckVersionCompatibility.kt @@ -3,15 +3,16 @@ package io.github.composegears.valkyrie.task import net.swiftzer.semver.SemVer import org.gradle.api.DefaultTask import org.gradle.api.GradleException -import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction abstract class CheckVersionCompatibility : DefaultTask() { + /** Maps each resolved coordinate (`group:name:version`) to the list of coordinates that depend on it. */ @get:Input - abstract val resolvedComponents: ListProperty + abstract val resolvedComponents: MapProperty> @get:Input abstract val maxKotlinVersion: Property @@ -19,19 +20,30 @@ abstract class CheckVersionCompatibility : DefaultTask() { @get:Input abstract val maxComposeVersion: Property + @get:Input + abstract val maxCoroutinesVersion: Property + @TaskAction fun check() { val maxKotlin = SemVer.parse(maxKotlinVersion.get()) val maxCompose = SemVer.parse(maxComposeVersion.get()) + val maxCoroutines = SemVer.parse(maxCoroutinesVersion.get()) val violations = resolvedComponents.get() - .mapNotNull { coordinate -> + .mapNotNull { (coordinate, dependents) -> val (group, name, version) = coordinate.split(":") + val requiredBy = if (dependents.isNotEmpty()) { + "\n" + dependents.joinToString("\n") { "\t\t - $it" } + } else { + "" + } when { group == "org.jetbrains.kotlin" && SemVer.parse(version) > maxKotlin -> - "\t- $group:$name:$version (max supported: $maxKotlin)" + "\t- $group:$name:$version (max supported: $maxKotlin)$requiredBy" group.startsWith("org.jetbrains.compose") && SemVer.parse(version) > maxCompose -> - "\t- $group:$name:$version (max supported: $maxCompose)" + "\t- $group:$name:$version (max supported: $maxCompose)$requiredBy" + group == "org.jetbrains.kotlinx" && name.startsWith("kotlinx-coroutines") && SemVer.parse(version) > maxCoroutines -> + "\t- $group:$name:$version (max supported: $maxCoroutines)$requiredBy" else -> null } } @@ -45,6 +57,6 @@ abstract class CheckVersionCompatibility : DefaultTask() { }, ) } - logger.lifecycle("✅ All dependencies are compatible (kotlin ≤ $maxKotlin, compose ≤ $maxCompose)") + logger.lifecycle("✅ All dependencies are compatible (kotlin ≤ $maxKotlin, compose ≤ $maxCompose, coroutines ≤ $maxCoroutines)") } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd1be4c95..f5ad1c588 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,7 @@ [versions] compose = "1.10.0" +# https://plugins.jetbrains.com/docs/intellij/using-kotlin.html#coroutinesLibraries +coroutines = "1.10.2" intellij = "2.13.1" jacoco = "0.8.13" jdkRelease = "21" @@ -46,7 +48,7 @@ assertk = "com.willowtreeapps.assertk:assertk:0.28.1" junit5-jupiter = "org.junit.jupiter:junit-jupiter:6.0.3" junit-launcher = "org.junit.platform:junit-platform-launcher:6.0.3" junit4 = "junit:junit:4.13.2" -kotlin-coroutines-test = "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2" +kotlin-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } semver = "net.swiftzer.semver:semver:2.1.0" diff --git a/tools/idea-plugin/build.gradle.kts b/tools/idea-plugin/build.gradle.kts index 801ebbe66..3c2d04cfb 100644 --- a/tools/idea-plugin/build.gradle.kts +++ b/tools/idea-plugin/build.gradle.kts @@ -181,10 +181,18 @@ tasks.register("checkVersionCompatibility") { dependencies.addAll(configurations.getByName("implementation").dependencies) } resolvedComponents = checkConfig.map { config -> - config.incoming.resolutionResult.allComponents - .mapNotNull { it.moduleVersion } - .map { "${it.group}:${it.name}:${it.version}" } + val result = mutableMapOf>() + for (component in config.incoming.resolutionResult.allComponents) { + val mv = component.moduleVersion ?: continue + val coordinate = "${mv.group}:${mv.name}:${mv.version}" + val dependents = result.getOrPut(coordinate) { mutableSetOf() } + component.dependents.forEach { dep -> + dep.from.moduleVersion?.let { dependents.add("${it.group}:${it.name}:${it.version}") } + } + } + result.toSortedMap().mapValues { (_, deps) -> deps.sorted() } } maxKotlinVersion = libs.versions.kotlin maxComposeVersion = libs.versions.compose + maxCoroutinesVersion = libs.versions.coroutines }