Skip to content

Commit 8d9ac23

Browse files
committed
fix aggregate report collecting invalid configurations
1 parent 5b45c6c commit 8d9ac23

File tree

2 files changed

+69
-16
lines changed

2 files changed

+69
-16
lines changed

nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesAggregateConsoleReportPlugin.kt

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,21 @@ package com.netflix.nebula.archrules.gradle
33
import com.tngtech.archunit.lang.Priority
44
import org.gradle.api.Plugin
55
import org.gradle.api.Project
6+
import org.gradle.api.artifacts.result.ResolvedArtifactResult
67
import org.gradle.api.attributes.Category
78
import org.gradle.api.attributes.VerificationType
9+
import org.gradle.api.model.ObjectFactory
810
import org.gradle.kotlin.dsl.named
911
import org.gradle.kotlin.dsl.project
1012
import org.gradle.kotlin.dsl.register
13+
import javax.inject.Inject
14+
15+
class ArchrulesAggregateConsoleReportPlugin @Inject constructor(val objects: ObjectFactory) : Plugin<Project> {
1116

12-
class ArchrulesAggregateConsoleReportPlugin : Plugin<Project> {
1317
override fun apply(project: Project) {
14-
val ext = project.extensions.create("archRulesAggregate", ArchrulesAggregateExtension::class.java)
18+
val verification: Category = objects.named(Category.VERIFICATION)
19+
val archRulesVerificationType: VerificationType = objects.named("arch-rules")
20+
val ext = project.extensions.create("archRulesAggregate", ArchrulesAggregateExtension::class.java)
1521
ext.skipPassingSummaries.set(false)
1622
ext.consoleDetailsThreshold(Priority.MEDIUM)
1723
val archRulesAggregateDependencies = project.configurations.dependencyScope("archRulesAggregateDependencies") {
@@ -20,21 +26,36 @@ class ArchrulesAggregateConsoleReportPlugin : Plugin<Project> {
2026
val archRulesDataFiles = project.configurations.resolvable("archRulesDataFiles") {
2127
extendsFrom(archRulesAggregateDependencies.get())
2228
attributes {
23-
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.VERIFICATION))
24-
attribute(VerificationType.VERIFICATION_TYPE_ATTRIBUTE, project.objects.named("arch-rules"))
29+
attribute(Category.CATEGORY_ATTRIBUTE, verification)
30+
attribute(VerificationType.VERIFICATION_TYPE_ATTRIBUTE, archRulesVerificationType)
2531
}
2632
}
33+
2734
project.subprojects {
2835
project.dependencies.add("archRulesAggregateDependencies", project.dependencies.project(":$name"))
2936
}
37+
3038
project.tasks.register<PrintConsoleReportTask>("archRulesAggregateConsoleReport") {
31-
dataFiles.from(archRulesDataFiles.map {
39+
dataFiles.from(archRulesDataFiles.flatMap {
3240
it.incoming.artifactView {
33-
lenient(true) // to handle the case where a subproject doesn't have archrules runner
34-
}.files
41+
lenient(true) // to handle the case where a subproject doesn't have archrules runner
42+
}.artifacts.resolvedArtifacts.map {
43+
// filter for only artifacts that match the attributes
44+
it.filter {
45+
it.hasCategory(verification) && it.hasVerificationType(archRulesVerificationType)
46+
}.map {
47+
it.file
48+
}
49+
}
3550
})
3651
summaryForPassingDisabled.set(ext.skipPassingSummaries)
3752
detailsThreshold.set(ext.consoleDetailsThreshold)
3853
}
3954
}
55+
56+
fun ResolvedArtifactResult.hasCategory(category: Category): Boolean =
57+
variant.attributes.getAttribute(Category.CATEGORY_ATTRIBUTE)?.name == category.name
58+
59+
fun ResolvedArtifactResult.hasVerificationType(type: VerificationType): Boolean =
60+
variant.attributes.getAttribute(VerificationType.VERIFICATION_TYPE_ATTRIBUTE)?.name == type.name
4061
}

nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesAggregateConsoleReportPluginTest.kt

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import nebula.test.dsl.subProject
1414
import nebula.test.dsl.testProject
1515
import org.gradle.kotlin.dsl.findByType
1616
import org.gradle.testfixtures.ProjectBuilder
17+
import org.gradle.testkit.runner.TaskOutcome
1718
import org.junit.jupiter.api.Test
1819
import org.junit.jupiter.api.io.TempDir
1920
import java.io.File
@@ -22,9 +23,11 @@ class ArchrulesAggregateConsoleReportPluginTest {
2223
@TempDir
2324
lateinit var projectDir: File
2425

25-
private fun TestProjectBuilder.setup(withFailures : Boolean = true) {
26+
private fun TestProjectBuilder.setup(withFailures: Boolean = true) {
2627
properties {
2728
buildCache(true)
29+
configurationCache(true)
30+
property("org.gradle.unsafe.isolated-projects","true")
2831
}
2932
rootProject {
3033
plugins {
@@ -55,7 +58,7 @@ class ArchrulesAggregateConsoleReportPluginTest {
5558
)
5659
src {
5760
main {
58-
if(withFailures) {
61+
if (withFailures) {
5962
exampleDeprecatedUsage("FailingCode1")
6063
}
6164
}
@@ -66,7 +69,7 @@ class ArchrulesAggregateConsoleReportPluginTest {
6669
id("java")
6770
id("com.netflix.nebula.archrules.runner")
6871
}
69-
repositories{
72+
repositories {
7073
mavenCentral()
7174
}
7275
dependencies(
@@ -75,7 +78,7 @@ class ArchrulesAggregateConsoleReportPluginTest {
7578
)
7679
src {
7780
main {
78-
if(withFailures) {
81+
if (withFailures) {
7982
exampleDeprecatedUsage("FailingCode2")
8083
}
8184
}
@@ -96,11 +99,13 @@ class ArchrulesAggregateConsoleReportPluginTest {
9699
@Test
97100
fun test() {
98101
val runner = testProject(projectDir) {
99-
setup()
102+
setup()
100103
}
101104
val result = runner.run("archRulesAggregateConsoleReport") {
102105
forwardOutput()
103106
}
107+
assertThat(result.task(":sub1:checkArchRulesMain"))
108+
.hasOutcome(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE)
104109
assertThat(result.output)
105110
.contains("deprecatedForRemoval MEDIUM (2 failures)")
106111
.contains("deprecated LOW (4 failures)")
@@ -110,8 +115,9 @@ class ArchrulesAggregateConsoleReportPluginTest {
110115
fun `test passing skip`() {
111116
val runner = testProject(projectDir) {
112117
setup(withFailures = false)
113-
rootProject{
114-
rawBuildScript("""
118+
rootProject {
119+
rawBuildScript(
120+
"""
115121
archRulesAggregate {
116122
skipPassingSummaries = true
117123
}
@@ -132,8 +138,9 @@ archRulesAggregate {
132138
fun `test details threshold`() {
133139
val runner = testProject(projectDir) {
134140
setup()
135-
rootProject{
136-
rawBuildScript("""
141+
rootProject {
142+
rawBuildScript(
143+
"""
137144
archRulesAggregate {
138145
consoleDetailsThreshold("LOW")
139146
}
@@ -147,4 +154,29 @@ archRulesAggregate {
147154
assertThat(result.output)
148155
.contains("Method <com.example.consumer.FailingCode1.aMethod()> calls method <com.example.library.LibraryClass.deprecatedApi()>")
149156
}
157+
158+
@Test
159+
fun `test empty subproject`() {
160+
val runner = testProject(projectDir) {
161+
setup()
162+
subProject("empty") {
163+
plugins {
164+
id("base")
165+
}
166+
rawBuildScript(
167+
// language=kotlin
168+
"""
169+
val jarTask = tasks.register<Jar>("someJar")
170+
artifacts {
171+
add("default", jarTask)
172+
}
173+
"""
174+
)
175+
}
176+
}
177+
val result = runner.run("archRulesAggregateConsoleReport")
178+
assertThat(result.task(":archRulesAggregateConsoleReport"))
179+
.hasOutcome(TaskOutcome.SUCCESS)
180+
assertThat(result.output).doesNotContain("Archrules data read failed")
181+
}
150182
}

0 commit comments

Comments
 (0)