From db6879c6d244ee4b06edccbb41211849cf3d54e2 Mon Sep 17 00:00:00 2001 From: Kamil Patora Date: Mon, 3 Aug 2026 09:52:46 +0200 Subject: [PATCH] feat: add support for upgrading Testcontainers module aliases in version catalog bundles --- .../TomlVersionCatalogDependencyRewriter.kt | 18 +++- .../gradle/TomlVersionCatalogRewritePlan.kt | 6 ++ .../recipes/spring/SpringBoot4_0Test.kt | 86 +++++++++++++++++++ 3 files changed, 109 insertions(+), 1 deletion(-) diff --git a/allwrite-recipes/src/main/kotlin/pl/allegro/tech/allwrite/recipes/gradle/TomlVersionCatalogDependencyRewriter.kt b/allwrite-recipes/src/main/kotlin/pl/allegro/tech/allwrite/recipes/gradle/TomlVersionCatalogDependencyRewriter.kt index 57cd41c9..a8cb078c 100644 --- a/allwrite-recipes/src/main/kotlin/pl/allegro/tech/allwrite/recipes/gradle/TomlVersionCatalogDependencyRewriter.kt +++ b/allwrite-recipes/src/main/kotlin/pl/allegro/tech/allwrite/recipes/gradle/TomlVersionCatalogDependencyRewriter.kt @@ -6,6 +6,7 @@ import org.openrewrite.toml.tree.Space import org.openrewrite.toml.tree.Toml import pl.allegro.tech.allwrite.recipes.toml.Builders.kv import pl.allegro.tech.allwrite.recipes.toml.Builders.literal +import pl.allegro.tech.allwrite.recipes.toml.asString import pl.allegro.tech.allwrite.recipes.toml.name import pl.allegro.tech.allwrite.recipes.toml.stringKey import pl.allegro.tech.allwrite.recipes.toml.stringValue @@ -33,10 +34,25 @@ internal class TomlVersionCatalogDependencyRewriter( VERSION_CATALOG_TABLE_LIBS -> rewriteLibraryEntry(table, keyValue) VERSION_CATALOG_TABLE_VERSIONS -> rewriteVersionEntry(keyValue) VERSION_CATALOG_TABLE_PLUGINS -> rewritePluginEntry(keyValue) - else -> keyValue + else -> super.visitKeyValue(keyValue, p) } } + override fun visitLiteral(literal: Toml.Literal, p: ExecutionContext): Toml.Literal { + val visited = super.visitLiteral(literal, p) + val table = cursor.firstEnclosing(Toml.Table::class.java) ?: return visited + if (table.name() != VERSION_CATALOG_TABLE_BUNDLES) return visited + val replacement = plan.bundleAliasReplacements[visited.asString()] ?: return visited + return Toml.Literal( + visited.id, + visited.prefix, + visited.markers, + visited.type, + "\"$replacement\"", + replacement, + ) + } + override fun visitTable(table: Toml.Table, p: ExecutionContext): Toml.Table { val visited = super.visitTable(table, p) if (visited.name() != VERSION_CATALOG_TABLE_VERSIONS) return visited diff --git a/allwrite-recipes/src/main/kotlin/pl/allegro/tech/allwrite/recipes/gradle/TomlVersionCatalogRewritePlan.kt b/allwrite-recipes/src/main/kotlin/pl/allegro/tech/allwrite/recipes/gradle/TomlVersionCatalogRewritePlan.kt index 3511427e..9bb585f0 100644 --- a/allwrite-recipes/src/main/kotlin/pl/allegro/tech/allwrite/recipes/gradle/TomlVersionCatalogRewritePlan.kt +++ b/allwrite-recipes/src/main/kotlin/pl/allegro/tech/allwrite/recipes/gradle/TomlVersionCatalogRewritePlan.kt @@ -38,6 +38,7 @@ internal data class TomlVersionCatalogRewritePlan( val versionRefOverrides: Map, val versionRefUpdates: Map, val versionEntriesToAdd: Map, + val bundleAliasReplacements: Map, ) internal class TomlVersionCatalogRewritePlanner( @@ -49,6 +50,7 @@ internal class TomlVersionCatalogRewritePlanner( val versionRefOverrides = mutableMapOf() val versionRefUpdates = mutableMapOf() val versionEntriesToAdd = mutableMapOf() + val bundleAliasReplacements = mutableMapOf() catalog.libraries .filter { entry -> @@ -62,6 +64,9 @@ internal class TomlVersionCatalogRewritePlanner( .forEach { entry -> val entryName = entry.keyValue.stringKey() ?: return@forEach val library = entry.library + target.targetEntryName(entryName) + .takeIf { it != entryName } + ?.let { bundleAliasReplacements[entryName] = it } val versionRef = (library.version as? VersionRef)?.ref ?: return@forEach val version = target.newVersion ?: return@forEach val targetRef = target.targetVersionRef(entryName) @@ -100,6 +105,7 @@ internal class TomlVersionCatalogRewritePlanner( versionRefOverrides, versionRefUpdates, versionEntriesToAdd, + bundleAliasReplacements, ) } } diff --git a/allwrite-recipes/src/test/kotlin/pl/allegro/tech/allwrite/recipes/spring/SpringBoot4_0Test.kt b/allwrite-recipes/src/test/kotlin/pl/allegro/tech/allwrite/recipes/spring/SpringBoot4_0Test.kt index e88a743c..b79f1d42 100644 --- a/allwrite-recipes/src/test/kotlin/pl/allegro/tech/allwrite/recipes/spring/SpringBoot4_0Test.kt +++ b/allwrite-recipes/src/test/kotlin/pl/allegro/tech/allwrite/recipes/spring/SpringBoot4_0Test.kt @@ -146,6 +146,92 @@ class SpringBoot4_0Test : RewriteTest { ) } + @Test + fun `should upgrade Testcontainers module aliases in version catalog bundles`() { + rewriteRun( + toml( + before = """ + [libraries] + junit-jupiter = { group = "org.testcontainers", name = "junit-jupiter" } + + [bundles] + testcontainers = [ + "junit-jupiter" + ] + """.trimIndent(), + after = """ + [libraries] + testcontainers-junit-jupiter = { group = "org.testcontainers", name = "testcontainers-junit-jupiter" } + + [bundles] + testcontainers = [ + "testcontainers-junit-jupiter" + ] + """.trimIndent(), + ) { path("gradle/libs.versions.toml") }, + ) + } + + @Test + fun `should upgrade Testcontainers module aliases in every bundle`() { + rewriteRun( + toml( + before = """ + [libraries] + junit-jupiter = { module = "org.testcontainers:junit-jupiter" } + + [bundles] + testcontainers = [ + "junit-jupiter", + "unrelated-library", + ] + integration = [ + "junit-jupiter", + ] + """.trimIndent(), + after = """ + [libraries] + testcontainers-junit-jupiter = { group = "org.testcontainers", name = "testcontainers-junit-jupiter" } + + [bundles] + testcontainers = [ + "testcontainers-junit-jupiter", + "unrelated-library", + ] + integration = [ + "testcontainers-junit-jupiter", + ] + """.trimIndent(), + ) { path("gradle/libs.versions.toml") }, + ) + } + + @Test + fun `should preserve custom Testcontainers library aliases in bundles`() { + rewriteRun( + toml( + before = """ + [libraries] + testcontainers-junit = { group = "org.testcontainers", name = "junit-jupiter" } + + [bundles] + testcontainers = [ + "testcontainers-junit", + ] + """.trimIndent(), + after = """ + [libraries] + testcontainers-junit = { group = "org.testcontainers", name = "testcontainers-junit-jupiter" } + + [bundles] + testcontainers = [ + "testcontainers-junit", + ] + """.trimIndent(), + ) { path("gradle/libs.versions.toml") }, + ) + } + @Test fun `should add Any bounds to Spring Data repository type parameters`() { rewriteRun(