Skip to content

Commit b72b51d

Browse files
authored
Deduplicated version catalog entries (#23)
1 parent eda2ba3 commit b72b51d

File tree

2 files changed

+146
-4
lines changed

2 files changed

+146
-4
lines changed

core/src/main/kotlin/com/mitteloupe/cag/core/generation/versioncatalog/VersionCatalogUpdater.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ class VersionCatalogUpdater(
9191
val resolvedPluginIdToAliasMutable = existingPluginIdToAlias.toMutableMap()
9292
val pluginRequirements = mutableListOf<PluginRequirement>()
9393
val pluginAliasToIdMutable = existingPluginAliasToId.toMutableMap()
94+
val uniqueDesiredPlugins = dependencyConfiguration.plugins.distinctBy { it.id }
9495

95-
for (desired in dependencyConfiguration.plugins) {
96+
for (desired in uniqueDesiredPlugins) {
9697
val existingAlias = existingPluginIdToAlias[desired.id]
9798
if (existingAlias != null) {
9899
resolvedPluginIdToAliasMutable[desired.id] = existingAlias
@@ -131,8 +132,9 @@ class VersionCatalogUpdater(
131132
val resolvedLibraryModuleToAliasMutable = existingLibraryModuleToAlias.toMutableMap()
132133
val libraryRequirements = mutableListOf<LibraryRequirement>()
133134
val libraryAliasToModuleMutable = existingLibraryAliasToModule.toMutableMap()
135+
val uniqueDesiredLibraries = dependencyConfiguration.libraries.distinctBy { it.module }
134136

135-
for (desired in dependencyConfiguration.libraries) {
137+
for (desired in uniqueDesiredLibraries) {
136138
val existingAlias = existingLibraryModuleToAlias[desired.module]
137139
if (existingAlias != null) {
138140
resolvedLibraryModuleToAliasMutable[desired.module] = existingAlias
@@ -201,7 +203,7 @@ class VersionCatalogUpdater(
201203
fileCreator.createFileIfNotExists(catalogFile) { "" }
202204

203205
val pluginRequirements =
204-
dependencyConfiguration.plugins.map { desired ->
206+
dependencyConfiguration.plugins.distinctBy { it.id }.map { desired ->
205207
PluginRequirement(
206208
key = desired.key,
207209
id = desired.id,
@@ -210,7 +212,7 @@ class VersionCatalogUpdater(
210212
}
211213

212214
val libraryRequirements =
213-
dependencyConfiguration.libraries.map { desired ->
215+
dependencyConfiguration.libraries.distinctBy { it.module }.map { desired ->
214216
LibraryRequirement(
215217
key = desired.key,
216218
module = desired.module,

core/src/test/kotlin/com/mitteloupe/cag/core/generation/VersionCatalogUpdaterTest.kt

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.mitteloupe.cag.core.fake.FakeFileSystemBridge
44
import com.mitteloupe.cag.core.generation.filesystem.FileCreator
55
import com.mitteloupe.cag.core.generation.versioncatalog.DependencyConfiguration
66
import com.mitteloupe.cag.core.generation.versioncatalog.LibraryConstants
7+
import com.mitteloupe.cag.core.generation.versioncatalog.LibraryConstants.TEST_MOCKITO_ANDROID
78
import com.mitteloupe.cag.core.generation.versioncatalog.PluginConstants
89
import com.mitteloupe.cag.core.generation.versioncatalog.SectionEntryRequirement.LibraryRequirement
910
import com.mitteloupe.cag.core.generation.versioncatalog.SectionEntryRequirement.PluginRequirement
@@ -24,6 +25,145 @@ class VersionCatalogUpdaterTest {
2425
classUnderTest = VersionCatalogUpdater(FileCreator(FakeFileSystemBridge()))
2526
}
2627

28+
@Test
29+
fun `Given libraries include library twice when createOrUpdateVersionCatalog then deduplicates`() {
30+
// Given
31+
val (projectRoot, catalogFile) =
32+
createProjectWithCatalog(
33+
initialContent =
34+
"""
35+
[versions]
36+
kotlin = "2.2.10"
37+
compileSdk = "36"
38+
minSdk = "24"
39+
""".trimIndent()
40+
)
41+
42+
val dependencyConfiguration =
43+
DependencyConfiguration(
44+
versions = emptyList(),
45+
libraries = listOf(TEST_MOCKITO_ANDROID, TEST_MOCKITO_ANDROID),
46+
plugins = emptyList()
47+
)
48+
val expectedCatalog =
49+
"""
50+
[versions]
51+
kotlin = "2.2.10"
52+
compileSdk = "36"
53+
minSdk = "24"
54+
mockitoAndroid = "2.28.6"
55+
56+
[libraries]
57+
test-mockito-android = { module = "com.linkedin.dexmaker:dexmaker-mockito-inline", version.ref = "mockitoAndroid" }
58+
59+
""".trimIndent()
60+
61+
// When
62+
classUnderTest.createOrUpdateVersionCatalog(projectRootDir = projectRoot, dependencyConfiguration = dependencyConfiguration)
63+
val actualCatalog = catalogFile.readText()
64+
65+
// Then
66+
assertEquals(expectedCatalog, actualCatalog)
67+
}
68+
69+
@Test
70+
fun `Given plugins include plugin twice when createOrUpdateVersionCatalog then deduplicates`() {
71+
// Given
72+
val (projectRoot, catalogFile) =
73+
createProjectWithCatalog(
74+
initialContent =
75+
"""
76+
[versions]
77+
kotlin = "2.2.10"
78+
compileSdk = "36"
79+
minSdk = "24"
80+
""".trimIndent()
81+
)
82+
83+
val dependencyConfiguration =
84+
DependencyConfiguration(
85+
versions = emptyList(),
86+
libraries = emptyList(),
87+
plugins = listOf(PluginConstants.KOTLIN_JVM, PluginConstants.KOTLIN_JVM)
88+
)
89+
val expectedCatalog =
90+
"""
91+
[versions]
92+
kotlin = "2.2.10"
93+
compileSdk = "36"
94+
minSdk = "24"
95+
96+
[plugins]
97+
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
98+
99+
""".trimIndent()
100+
101+
// When
102+
classUnderTest.createOrUpdateVersionCatalog(projectRootDir = projectRoot, dependencyConfiguration = dependencyConfiguration)
103+
val actualCatalog = catalogFile.readText()
104+
105+
// Then
106+
assertEquals(expectedCatalog, actualCatalog)
107+
}
108+
109+
@Test
110+
fun `Given libraries include library twice when createOrReplaceVersionCatalog then deduplicates`() {
111+
// Given
112+
val projectRoot = createTempDirectory(prefix = "newCatalogDedupLib").toFile()
113+
114+
val dependencyConfiguration =
115+
DependencyConfiguration(
116+
versions = emptyList(),
117+
libraries = listOf(TEST_MOCKITO_ANDROID, TEST_MOCKITO_ANDROID),
118+
plugins = emptyList()
119+
)
120+
val expectedCatalog =
121+
"""
122+
[versions]
123+
mockitoAndroid = "2.28.6"
124+
125+
[libraries]
126+
test-mockito-android = { module = "com.linkedin.dexmaker:dexmaker-mockito-inline", version.ref = "mockitoAndroid" }
127+
128+
""".trimIndent()
129+
130+
// When
131+
classUnderTest.createOrReplaceVersionCatalog(projectRootDir = projectRoot, dependencyConfiguration = dependencyConfiguration)
132+
val actualCatalog = File(projectRoot, "gradle/libs.versions.toml").readText()
133+
134+
// Then
135+
assertEquals(expectedCatalog, actualCatalog)
136+
}
137+
138+
@Test
139+
fun `Given plugins include plugin twice when createOrReplaceVersionCatalog then deduplicates`() {
140+
// Given
141+
val projectRoot = createTempDirectory(prefix = "newCatalogDedupPlugin").toFile()
142+
143+
val dependencyConfiguration =
144+
DependencyConfiguration(
145+
versions = emptyList(),
146+
libraries = emptyList(),
147+
plugins = listOf(PluginConstants.KOTLIN_JVM, PluginConstants.KOTLIN_JVM)
148+
)
149+
val expectedCatalog =
150+
"""
151+
[versions]
152+
kotlin = "2.2.10"
153+
154+
[plugins]
155+
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
156+
157+
""".trimIndent()
158+
159+
// When
160+
classUnderTest.createOrReplaceVersionCatalog(projectRootDir = projectRoot, dependencyConfiguration = dependencyConfiguration)
161+
val actualCatalog = File(projectRoot, "gradle/libs.versions.toml").readText()
162+
163+
// Then
164+
assertEquals(expectedCatalog, actualCatalog)
165+
}
166+
27167
@Test
28168
fun `Given no catalog file when createOrUpdateVersionCatalog then does nothing`() {
29169
// Given

0 commit comments

Comments
 (0)