Skip to content

Commit 801aa7e

Browse files
committed
add setting for console report details threshold
1 parent 520db46 commit 801aa7e

File tree

10 files changed

+290
-252
lines changed

10 files changed

+290
-252
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,14 @@ archRules {
156156
}
157157
```
158158

159+
You can set the threshold for filtering details in the console report. For example, to only see details for HIGH priority failures:
160+
```kotlin
161+
archRules {
162+
consoleDetailsThreshold("HIGH")
163+
}
164+
```
165+
The default threshold is MEDIUM.
166+
159167
#### Configuring which code is tested
160168

161169
You can skip running rules on a specific source set:

nebula-archrules-gradle-plugin/src/main/java/com/netflix/nebula/archrules/gradle/PrintConsoleReportTask.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ abstract class ArchrulesExtension {
1717
abstract val sourceSetsToSkip: ListProperty<String>
1818

1919
abstract val failureThreshold: Property<Priority>
20+
abstract val consoleDetailsThreshold: Property<Priority>
2021

2122
/**
2223
* Add a source set to the list of sourcesets to skip
@@ -32,4 +33,12 @@ abstract class ArchrulesExtension {
3233
fun failureThreshold(priority: String) {
3334
failureThreshold.set(Priority.valueOf(priority))
3435
}
36+
37+
fun consoleDetailsThreshold(priority: Priority) {
38+
consoleDetailsThreshold.set(priority)
39+
}
40+
41+
fun consoleDetailsThreshold(priority: String) {
42+
consoleDetailsThreshold.set(Priority.valueOf(priority))
43+
}
3544
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.netflix.nebula.archrules.gradle
22

33
import com.netflix.nebula.archrules.gradle.ArchRuleAttribute.ARCH_RULES
4+
import com.tngtech.archunit.lang.Priority
45
import org.gradle.api.Plugin
56
import org.gradle.api.Project
67
import org.gradle.api.attributes.Bundling
@@ -32,6 +33,7 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
3233
archRulesExt.consoleReportEnabled.convention(true)
3334
archRulesExt.skipPassingSummaries.convention(false)
3435
archRulesExt.sourceSetsToSkip.add("archRulesTest")
36+
archRulesExt.consoleDetailsThreshold.convention(Priority.MEDIUM)
3537
project.extensions.getByType<JavaPluginExtension>().sourceSets
3638
.configureEach {
3739
project.configureCheckTaskForSourceSet(this, archRulesExt)
@@ -46,10 +48,11 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
4648
}
4749

4850
val consoleReportTask = project.tasks.register<PrintConsoleReportTask>("archRulesConsoleReport") {
49-
getDataFiles().set(
51+
dataFiles.set(
5052
project.provider { (project.tasks.withType<CheckRulesTask>().flatMap { it.outputs.files }) }
5153
)
5254
summaryForPassingDisabled.set(archRulesExt.skipPassingSummaries)
55+
detailsThreshold.set(archRulesExt.consoleDetailsThreshold)
5356
dependsOn(checkTasks)
5457
onlyIf { archRulesExt.consoleReportEnabled.get() }
5558
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.netflix.nebula.archrules.gradle
2+
3+
import com.tngtech.archunit.lang.Priority
4+
import org.gradle.api.DefaultTask
5+
import org.gradle.api.provider.ListProperty
6+
import org.gradle.api.provider.Property
7+
import org.gradle.api.tasks.*
8+
import org.gradle.internal.logging.text.StyledTextOutput
9+
import org.gradle.internal.logging.text.StyledTextOutputFactory
10+
import org.gradle.kotlin.dsl.support.get
11+
import java.io.File
12+
13+
/**
14+
* Prints summary and detail information about {@link RuleResult}s to the console
15+
*/
16+
@UntrackedTask(because = "Provides console feedback to the user")
17+
abstract class PrintConsoleReportTask : DefaultTask() {
18+
19+
/**
20+
* The data files to read in. These files should container binary data representing {@link RuleResult}s
21+
* @return all data files to process
22+
*/
23+
@get:InputFiles
24+
@get:PathSensitive(PathSensitivity.RELATIVE)
25+
abstract val dataFiles: ListProperty<File>
26+
27+
/**
28+
* if summary lines for passing rules should print
29+
*/
30+
@get:Input
31+
abstract val summaryForPassingDisabled: Property<Boolean>
32+
33+
/**
34+
* the priority threshold for printing failure details
35+
*/
36+
@get:Input
37+
@get:Optional
38+
abstract val detailsThreshold: Property<Priority>
39+
40+
@TaskAction
41+
fun printReport() {
42+
val consoleOutput = services.get<StyledTextOutputFactory>().create("archrules")
43+
val list = dataFiles.get()
44+
.filter(File::exists)
45+
.flatMap { ViolationsUtil.readDetails(it) }
46+
.toList()
47+
val byRule = ViolationsUtil.consolidatedFailures(list)
48+
ViolationsUtil.printSummary(byRule, consoleOutput, summaryForPassingDisabled.get())
49+
if (list.any {
50+
it.status() == RuleResultStatus.FAIL
51+
&& !it.rule().priority().meetsThreshold(detailsThreshold.orNull)
52+
&& !logger.isInfoEnabled
53+
}) {
54+
consoleOutput.style(StyledTextOutput.Style.Header)
55+
.text("Note: ")
56+
.style(StyledTextOutput.Style.Normal)
57+
.println("In order to see details of ${detailsThreshold.orElse(Priority.LOW)} and lower priority rules, run build with --info")
58+
}
59+
ViolationsUtil.printReport(byRule, consoleOutput, detailsThreshold.orNull, logger.isInfoEnabled)
60+
}
61+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.netflix.nebula.archrules.gradle
2+
3+
import com.tngtech.archunit.lang.Priority
4+
5+
fun Priority.meetsThreshold(threshold: Priority?): Boolean {
6+
return when (threshold) {
7+
null -> true
8+
Priority.LOW -> true
9+
Priority.MEDIUM -> this != Priority.LOW
10+
Priority.HIGH -> this == Priority.HIGH
11+
}
12+
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ class ViolationsUtil {
3131
}
3232

3333
@JvmStatic
34-
fun printReport(violations: Map<Rule, List<RuleResult>>, output: StyledTextOutput, infoLogging: Boolean) {
34+
fun printReport(violations: Map<Rule, List<RuleResult>>,
35+
output: StyledTextOutput,
36+
priorityThreshold: Priority?,
37+
infoLogging: Boolean) {
3538
output.style(StyledTextOutput.Style.Header).println("ArchRule Violation Details:")
3639
violations
37-
.mapValues { it.value.filter { it.rule().priority() != Priority.LOW || infoLogging } }
40+
.mapValues { it.value.filter { it.rule().priority().meetsThreshold(priorityThreshold) || infoLogging } }
3841
.filter { it.value.isNotEmpty() }
3942
.forEach { (rule, ruleViolations) ->
4043
val style = when (rule.priority()) {

0 commit comments

Comments
 (0)