Skip to content

Commit 4e8fe90

Browse files
authored
Merge pull request #47 from rubensousa/kmp_support
Add support for kmp by considering its configurations
2 parents 0c7249d + 81c0c72 commit 4e8fe90

File tree

16 files changed

+193
-44
lines changed

16 files changed

+193
-44
lines changed

gradle/libs.versions.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ truth = "1.4.5"
55
junit = "4.13.2"
66
mockk = "1.14.9"
77
jackson = "2.17.0"
8+
runner = "1.5.2"
9+
core = "1.5.0"
10+
junitVersion = "1.1.5"
811

912
[libraries]
1013
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
@@ -14,6 +17,10 @@ junit = { group = "junit", name = "junit", version.ref = "junit" }
1417
kotlin-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version = "1.7.1" }
1518
jackson-yaml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", version.ref = "jackson" }
1619
jackson-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" }
20+
kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" }
21+
runner = { group = "androidx.test", name = "runner", version.ref = "runner" }
22+
core = { group = "androidx.test", name = "core", version.ref = "core" }
23+
ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
1724

1825
[plugins]
1926
android-application = { id = "com.android.application", version.ref = "agp" }
@@ -24,6 +31,9 @@ projectguard = { id = "com.rubensousa.projectguard", version = "unspecified" }
2431
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
2532
kover = { id = "org.jetbrains.kotlinx.kover", version = "0.9.7" }
2633
android-library = { id = "com.android.library", version.ref = "agp" }
34+
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
35+
android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" }
36+
android-lint = { id = "com.android.lint", version.ref = "agp" }
2737

2838
[bundles]
2939
test = [

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/ProjectGuardPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package com.rubensousa.projectguard.plugin
1818

19-
import com.rubensousa.projectguard.plugin.internal.report.DependencyGraphBuilder
19+
import com.rubensousa.projectguard.plugin.internal.DependencyGraphBuilder
2020
import com.rubensousa.projectguard.plugin.internal.task.TaskAggregateDependencyDump
2121
import com.rubensousa.projectguard.plugin.internal.task.TaskAggregateRestrictionDump
2222
import com.rubensousa.projectguard.plugin.internal.task.TaskBaseline
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright 2026 Rúben Sousa
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.rubensousa.projectguard.plugin.internal
18+
19+
internal object DependencyConfiguration {
20+
21+
private val supportedConfigurations = mutableSetOf(
22+
"androidTestUtil",
23+
"compileClasspath",
24+
"testCompileClasspath",
25+
"testFixturesCompileClasspath",
26+
)
27+
28+
fun isConfigurationSupported(configurationId: String): Boolean {
29+
return supportedConfigurations.any { pattern ->
30+
configurationId.lowercase().contains(pattern.lowercase())
31+
}
32+
}
33+
34+
fun isReleaseConfiguration(configurationId: String): Boolean {
35+
val lowerCaseConfiguration = configurationId.lowercase()
36+
return lowerCaseConfiguration.contains("compileclasspath")
37+
&& !lowerCaseConfiguration.contains("test")
38+
&& !lowerCaseConfiguration.contains("metadata")
39+
}
40+
41+
}

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/internal/report/DependencyGraphBuilder.kt renamed to projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/internal/DependencyGraphBuilder.kt

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.rubensousa.projectguard.plugin.internal.report
17+
package com.rubensousa.projectguard.plugin.internal
1818

19-
import com.rubensousa.projectguard.plugin.internal.DependencyGraph
19+
import com.rubensousa.projectguard.plugin.internal.report.DependencyGraphDump
2020
import org.gradle.api.Project
2121
import org.gradle.api.artifacts.ExternalModuleDependency
2222
import org.gradle.api.artifacts.ProjectDependency
@@ -50,7 +50,7 @@ internal class DependencyGraphBuilder {
5050

5151
fun buildFromProject(project: Project): List<DependencyGraph> {
5252
return project.configurations
53-
.filter { config -> config.isCanBeResolved && isConfigurationSupported(config.name) }
53+
.filter { config -> config.isCanBeResolved && DependencyConfiguration.isConfigurationSupported(config.name) }
5454
.map { config ->
5555
val graph = DependencyGraph(
5656
configurationId = config.name,
@@ -69,45 +69,14 @@ internal class DependencyGraphBuilder {
6969
}
7070

7171
is ExternalModuleDependency -> {
72-
if (dependency.group == null) {
73-
// Java/Kotlin libraries provided to android modules are treated as external modules
74-
// TODO: Improve detection
75-
graph.addInternalDependency(
76-
module = moduleId,
77-
dependency = ":${dependency.name}:${dependency.versionConstraint.displayName}"
78-
)
79-
} else {
80-
graph.addExternalDependency(
81-
module = moduleId,
82-
dependency = "${dependency.group}:${dependency.name}",
83-
)
84-
}
72+
graph.addExternalDependency(
73+
module = moduleId,
74+
dependency = "${dependency.group}:${dependency.name}",
75+
)
8576
}
8677
}
8778
}
8879
graph
8980
}
9081
}
91-
92-
93-
companion object {
94-
private val supportedConfigurations = mutableSetOf(
95-
"androidTestUtil",
96-
"compileClasspath",
97-
"testCompileClasspath",
98-
"testFixturesCompileClasspath",
99-
)
100-
101-
fun isConfigurationSupported(configurationId: String): Boolean {
102-
return supportedConfigurations.any { pattern ->
103-
configurationId.lowercase().contains(pattern.lowercase())
104-
}
105-
}
106-
107-
fun isReleaseConfiguration(configurationId: String): Boolean {
108-
return configurationId == "compileClasspath"
109-
|| configurationId.lowercase().contains("releasecompileclasspath")
110-
}
111-
}
112-
113-
}
82+
}

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/internal/report/VerificationReportBuilder.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.rubensousa.projectguard.plugin.internal.report
1818

19+
import com.rubensousa.projectguard.plugin.internal.DependencyConfiguration
1920
import com.rubensousa.projectguard.plugin.internal.SuppressionMap
2021

2122
internal class VerificationReportBuilder(
@@ -76,7 +77,7 @@ internal class VerificationReportBuilder(
7677
// TODO: Until https://github.com/rubensousa/ProjectGuard/issues/3 is clarified,
7778
// filter out test dependencies from the graph reports
7879
val moduleDependencies = graph.getOrPut(report.module) { mutableSetOf() }
79-
if (DependencyGraphBuilder.isReleaseConfiguration(configuration.id)) {
80+
if (DependencyConfiguration.isReleaseConfiguration(configuration.id)) {
8081
moduleDependencies.addAll(configuration.dependencies.map { dependency ->
8182
DependencyReferenceDump(dependency.id, dependency.isLibrary)
8283
})

projectguard/src/main/kotlin/com/rubensousa/projectguard/plugin/internal/task/TaskRestrictionDump.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import com.rubensousa.projectguard.plugin.internal.DependencyRestrictionFinder
2020
import com.rubensousa.projectguard.plugin.internal.DirectDependencyRestriction
2121
import com.rubensousa.projectguard.plugin.internal.ProjectGuardSpec
2222
import com.rubensousa.projectguard.plugin.internal.TransitiveDependencyRestriction
23-
import com.rubensousa.projectguard.plugin.internal.report.DependencyGraphBuilder
23+
import com.rubensousa.projectguard.plugin.internal.DependencyGraphBuilder
2424
import com.rubensousa.projectguard.plugin.internal.report.DependencyGraphDump
2525
import com.rubensousa.projectguard.plugin.internal.report.JsonFileWriter
2626
import com.rubensousa.projectguard.plugin.internal.report.RestrictionDependencyReport
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* Copyright 2026 Rúben Sousa
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.rubensousa.projectguard.plugin.internal
18+
19+
import com.google.common.truth.Truth.assertThat
20+
import kotlin.test.Test
21+
22+
class DependencyConfigurationTest {
23+
24+
@Test
25+
fun `kmp android configuration is considered release`() {
26+
assertThat(DependencyConfiguration.isReleaseConfiguration("androidCompileClasspath")).isTrue()
27+
}
28+
29+
@Test
30+
fun `kmp android test configuration is not considered release`() {
31+
assertThat(DependencyConfiguration.isReleaseConfiguration("androidDeviceTestCompileClasspath")).isFalse()
32+
}
33+
34+
@Test
35+
fun `android release configuration is considered release`() {
36+
assertThat(DependencyConfiguration.isReleaseConfiguration("releaseCompileClasspath")).isTrue()
37+
}
38+
39+
@Test
40+
fun `android unit test release configuration is not considered release`() {
41+
assertThat(DependencyConfiguration.isReleaseConfiguration("releaseUnitTestCompileClasspath")).isFalse()
42+
}
43+
44+
@Test
45+
fun `android instrumented test configuration is not considered release`() {
46+
assertThat(DependencyConfiguration.isReleaseConfiguration("debugAndroidTestCompileClasspath")).isFalse()
47+
}
48+
49+
@Test
50+
fun `test configuration is not considered release`() {
51+
assertThat(DependencyConfiguration.isReleaseConfiguration("testCompileClasspath")).isFalse()
52+
}
53+
54+
@Test
55+
fun `test fixture configuration is not considered release`() {
56+
assertThat(DependencyConfiguration.isReleaseConfiguration("testFixturesCompileClasspath")).isFalse()
57+
}
58+
59+
}

projectguard/src/test/kotlin/com/rubensousa/projectguard/plugin/internal/DependencyGraphBuilderTest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.rubensousa.projectguard.plugin.internal
1818

1919
import com.google.common.truth.Truth.assertThat
20-
import com.rubensousa.projectguard.plugin.internal.report.DependencyGraphBuilder
2120
import org.gradle.api.Project
2221
import org.gradle.testfixtures.ProjectBuilder
2322
import org.junit.Before

sample/android/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ android {
1818
}
1919

2020
dependencies {
21-
implementation(":domain:a")
21+
implementation(project(":domain:a"))
2222
testImplementation(libs.junit)
2323
androidTestImplementation(project(":legacy:a"))
2424
}

sample/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ plugins {
66
alias(libs.plugins.maven.publish) apply false
77
alias(libs.plugins.android.library) apply false
88
alias(libs.plugins.projectguard) apply true
9+
alias(libs.plugins.kotlin.multiplatform) apply false
10+
alias(libs.plugins.android.kotlin.multiplatform.library) apply false
11+
alias(libs.plugins.android.lint) apply false
912
}
1013

1114
projectGuard {

0 commit comments

Comments
 (0)