Skip to content

Commit 5a6c29c

Browse files
committed
add extension option for skipping passing summary lines in the console report
1 parent d568d8a commit 5a6c29c

File tree

7 files changed

+143
-12
lines changed

7 files changed

+143
-12
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,13 @@ archRules {
147147
}
148148
```
149149

150+
You can also disable printing summary lines for passing rules to reduce noise:
151+
```kotlin
152+
archRules {
153+
skipPassingSummaries = true
154+
}
155+
```
156+
150157
## How it works
151158

152159
The Archrules Library plugin produces a separate Jar for the `archRules` sourceset, which is exposed as an alternate variant of the library. It also will automatically generate a `META-INF/services` file which contains a reference for each implementation of `com.netflix.nebula.archrules.core.ArchRulesService` to declare it as a service provider.

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.tngtech.archunit.lang.Priority;
44
import org.gradle.api.DefaultTask;
55
import org.gradle.api.provider.ListProperty;
6+
import org.gradle.api.provider.Property;
67
import org.gradle.api.tasks.*;
78
import org.gradle.internal.logging.text.StyledTextOutput;
89
import org.gradle.internal.logging.text.StyledTextOutputFactory;
@@ -25,14 +26,21 @@ abstract public class PrintConsoleReportTask extends DefaultTask {
2526
@PathSensitive(PathSensitivity.RELATIVE)
2627
abstract public ListProperty<@NonNull File> getDataFiles();
2728

29+
/**
30+
* The data files to read in. These files should container binary data representing {@link RuleResult}s
31+
* @return all data files to process
32+
*/
33+
@Input
34+
abstract public Property<@NonNull Boolean> getSummaryForPassingDisabled();
35+
2836
@TaskAction
2937
public void printReport() {
3038
final var consoleOutput = getServices().get(StyledTextOutputFactory.class).create("archrules");
3139
List<RuleResult> list = getDataFiles().get().stream()
3240
.flatMap(it -> ViolationsUtil.readDetails(it).stream())
3341
.toList();
3442
final var byRule = ViolationsUtil.consolidatedFailures(list);
35-
ViolationsUtil.printSummary(byRule, consoleOutput);
43+
ViolationsUtil.printSummary(byRule, consoleOutput, getSummaryForPassingDisabled().get());
3644
if (list.stream().anyMatch(it -> it.status() != RuleResultStatus.FAIL && it.rule().priority() == Priority.LOW) && !getLogger().isInfoEnabled()) {
3745
consoleOutput.style(StyledTextOutput.Style.Header)
3846
.text("Note: ")

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ import org.gradle.api.provider.Property
44

55
abstract class ArchrulesExtension {
66
abstract val consoleReportEnabled: Property<Boolean>
7+
abstract val skipPassingSummaries: Property<Boolean>
78
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
3030
project.plugins.withId("java") {
3131
val archRulesExt = project.extensions.create<ArchrulesExtension>("archRules")
3232
archRulesExt.consoleReportEnabled.convention(true)
33+
archRulesExt.skipPassingSummaries.convention(false)
3334
project.extensions.getByType<JavaPluginExtension>().sourceSets
3435
.configureEach {
3536
project.configureCheckTaskForSourceSet(this)
@@ -47,6 +48,7 @@ class ArchrulesRunnerPlugin : Plugin<Project> {
4748
getDataFiles().set(
4849
project.provider { (project.tasks.withType<CheckRulesTask>().flatMap { it.outputs.files }) }
4950
)
51+
summaryForPassingDisabled.set(archRulesExt.skipPassingSummaries)
5052
dependsOn(checkTasks)
5153
onlyIf { archRulesExt.consoleReportEnabled.get() }
5254
}

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class ViolationsUtil {
5555
}
5656

5757
@JvmStatic
58-
fun printSummary(resultMap: Map<Rule, List<RuleResult>>, output: StyledTextOutput) {
58+
fun printSummary(resultMap: Map<Rule, List<RuleResult>>, output: StyledTextOutput, skipPassing: Boolean) {
5959
val indent = 4
6060
val maxRuleNameLength = resultMap.keys.maxOfOrNull { it.ruleName().length } ?: 1
6161
resultMap.entries.groupBy { entry -> entry.key.ruleClass() }
@@ -64,12 +64,14 @@ class ViolationsUtil {
6464
classMap.forEach { (rule, results) ->
6565
val failures = results.filter { it.status() != RuleResultStatus.PASS }
6666
if (failures.isEmpty()) {
67-
output.style(StyledTextOutput.Style.Success)
68-
.text(" ".repeat(indent))
69-
.text(rule.ruleName().padEnd(maxRuleNameLength + 1))
70-
.text(" ")
71-
.text(rule.priority().asString().padEnd(10))
72-
.println(" (No failures)")
67+
if (!skipPassing) {
68+
output.style(StyledTextOutput.Style.Success)
69+
.text(" ".repeat(indent))
70+
.text(rule.ruleName().padEnd(maxRuleNameLength + 1))
71+
.text(" ")
72+
.text(rule.priority().asString().padEnd(10))
73+
.println(" (No failures)")
74+
}
7375
} else {
7476
val style = when (rule.priority()) {
7577
Priority.LOW -> StyledTextOutput.Style.Normal
@@ -84,7 +86,7 @@ class ViolationsUtil {
8486
.println(" (" + failures.size + " failures)")
8587
}
8688
}
87-
}
89+
}
8890
}
8991

9092
/**

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

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,104 @@ archRules {
282282
.hasNoDeprecationWarnings()
283283
}
284284

285+
@Test
286+
fun `passing summaries print by default`() {
287+
val runner = testProject(projectDir) {
288+
properties {
289+
gradleCache(true)
290+
}
291+
settings {
292+
name("consumer")
293+
}
294+
rootProject {
295+
plugins {
296+
id("java")
297+
id("com.netflix.nebula.archrules.runner")
298+
}
299+
repositories {
300+
mavenCentral()
301+
}
302+
dependencies(
303+
"""archRules("com.netflix.nebula:archrules-deprecation:0.1.+")"""
304+
)
305+
src {
306+
main {
307+
exampleLibraryClass()
308+
}
309+
test {
310+
exampleDeprecatedUsage("FailingCodeTest")
311+
}
312+
}
313+
}
314+
}
315+
316+
val result = runner.run("check", "--stacktrace", "-x", "test")
317+
318+
assertThat(result.task(":archRulesConsoleReport"))
319+
.`as`("archRules console report runs by default")
320+
.hasOutcome(TaskOutcome.SUCCESS)
321+
322+
assertThat(result)
323+
.hasNoMutableStateWarnings()
324+
.hasNoDeprecationWarnings()
325+
326+
assertThat(result.output)
327+
.contains("com.netflix.nebula.archrules.deprecation.DeprecationRule")
328+
.contains("deprecated LOW (No failures)")
329+
}
330+
331+
@Test
332+
fun `passing summaries can be disabled`() {
333+
val runner = testProject(projectDir) {
334+
properties {
335+
gradleCache(true)
336+
}
337+
settings {
338+
name("consumer")
339+
}
340+
rootProject {
341+
plugins {
342+
id("java")
343+
id("com.netflix.nebula.archrules.runner")
344+
}
345+
repositories {
346+
mavenCentral()
347+
}
348+
dependencies(
349+
"""archRules("com.netflix.nebula:archrules-deprecation:0.1.+")"""
350+
)
351+
src {
352+
main {
353+
exampleLibraryClass()
354+
}
355+
test {
356+
exampleDeprecatedUsage("FailingCodeTest")
357+
}
358+
}
359+
rawBuildScript("""
360+
archRules {
361+
skipPassingSummaries = true
362+
}
363+
"""
364+
)
365+
}
366+
}
367+
368+
val result = runner.run("check", "--stacktrace", "-x", "test")
369+
370+
assertThat(result.task(":archRulesConsoleReport"))
371+
.`as`("archRules console report runs by default")
372+
.hasOutcome(TaskOutcome.SUCCESS)
373+
374+
assertThat(result)
375+
.hasNoMutableStateWarnings()
376+
.hasNoDeprecationWarnings()
377+
378+
assertThat(result.output)
379+
.contains("com.netflix.nebula.archrules.deprecation.DeprecationRule")
380+
.doesNotContain("deprecated LOW")
381+
}
382+
285383
fun readDetails(dataFile: File): List<RuleResult> {
286384
val list: MutableList<RuleResult> = mutableListOf()
287385
try {

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,27 @@ internal class ViolationsUtilTest {
1212
val output = MockStyledTextOutput()
1313
val rule = Rule("RuleClass", "RuleName", "description", Priority.MEDIUM)
1414
val results = listOf(RuleResult(rule, "message", RuleResultStatus.PASS))
15-
ViolationsUtil.printSummary(mapOf(rule to results), output)
16-
assertThat(output.getOutput()).contains("RuleName MEDIUM (No failures)")
15+
ViolationsUtil.printSummary(mapOf(rule to results), output, false)
16+
assertThat(output.getOutput())
17+
.contains("RuleClass")
18+
.contains("RuleName MEDIUM (No failures)")
19+
}
20+
21+
@Test
22+
fun `test printSummary skipPassing`() {
23+
val output = MockStyledTextOutput()
24+
val rule = Rule("RuleClass", "RuleName", "description", Priority.MEDIUM)
25+
val results = listOf(RuleResult(rule, "message", RuleResultStatus.PASS))
26+
ViolationsUtil.printSummary(mapOf(rule to results), output, true)
27+
assertThat(output.getOutput())
28+
.contains("RuleClass")
29+
.doesNotContain("RuleName")
1730
}
1831

1932
@Test
2033
fun `test printSummary empty results`() {
2134
val output = MockStyledTextOutput()
22-
ViolationsUtil.printSummary(mapOf(), output)
35+
ViolationsUtil.printSummary(mapOf(), output, false)
2336
assertThat(output.getOutput()).isEmpty()
2437
}
2538
}

0 commit comments

Comments
 (0)