diff --git a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ViolationsUtil.kt b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ViolationsUtil.kt index 9ea5337..4ae1caa 100644 --- a/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ViolationsUtil.kt +++ b/nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ViolationsUtil.kt @@ -37,11 +37,11 @@ class ViolationsUtil { } @JvmStatic - fun writeDetails(dataFile: File, violationList : List) { + fun writeDetails(dataFile: File, violationList: List) { ObjectOutputStream(FileOutputStream(dataFile)).use { out -> out.writeInt(violationList.size) violationList.forEach { - out.writeObject(it); + out.writeObject(it) } } } @@ -88,30 +88,34 @@ class ViolationsUtil { val maxRuleNameLength = resultMap.keys.maxOfOrNull { it.ruleName().length } ?: 1 resultMap.entries.groupBy { entry -> entry.key.ruleClass() } .forEach { (ruleClass, classMap) -> - output.style(StyledTextOutput.Style.Header).println(ruleClass) - classMap.forEach { (rule, results) -> - val failures = results.filter { it.status() != RuleResultStatus.PASS } - if (failures.isEmpty()) { - if (!skipPassing || infoLogging) { - output.style(StyledTextOutput.Style.Success) + val classHasFailures = classMap.flatMap { it.value }.any { it.status != RuleResultStatus.PASS } + val shouldClassPrint = !skipPassing || infoLogging || classHasFailures + if (shouldClassPrint) { + output.style(StyledTextOutput.Style.Header).println(ruleClass) + classMap.forEach { (rule, results) -> + val failures = results.filter { it.status() != RuleResultStatus.PASS } + if (failures.isEmpty()) { + if (!skipPassing || infoLogging) { + output.style(StyledTextOutput.Style.Success) + .text(" ".repeat(indent)) + .text(rule.ruleName().padEnd(maxRuleNameLength + 1)) + .text(" ") + .text(rule.priority().asString().padEnd(10)) + .println(" (No failures)") + } + } else { + val style = when (rule.priority()) { + Priority.LOW -> StyledTextOutput.Style.Normal + Priority.MEDIUM -> StyledTextOutput.Style.Info + Priority.HIGH -> StyledTextOutput.Style.Failure + } + output.style(style) .text(" ".repeat(indent)) .text(rule.ruleName().padEnd(maxRuleNameLength + 1)) .text(" ") .text(rule.priority().asString().padEnd(10)) - .println(" (No failures)") + .println(" (" + failures.size + " failures)") } - } else { - val style = when (rule.priority()) { - Priority.LOW -> StyledTextOutput.Style.Normal - Priority.MEDIUM -> StyledTextOutput.Style.Info - Priority.HIGH -> StyledTextOutput.Style.Failure - } - output.style(style) - .text(" ".repeat(indent)) - .text(rule.ruleName().padEnd(maxRuleNameLength + 1)) - .text(" ") - .text(rule.priority().asString().padEnd(10)) - .println(" (" + failures.size + " failures)") } } } diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt index 313c9d7..0864365 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesRunnerPluginTest.kt @@ -393,7 +393,7 @@ archRules { .hasNoDeprecationWarnings() assertThat(result.output) - .contains("com.netflix.nebula.archrules.deprecation.DeprecationRule") + .doesNotContain("com.netflix.nebula.archrules.deprecation.DeprecationRule") .doesNotContain(LOW_PASSING_SUMMARY) } diff --git a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ViolationsUtilTest.kt b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ViolationsUtilTest.kt index 681f36d..a4cd4fa 100644 --- a/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ViolationsUtilTest.kt +++ b/nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ViolationsUtilTest.kt @@ -33,18 +33,29 @@ internal class ViolationsUtilTest { } @Test - fun `test printSummary skipPassing`() { + fun `test printSummary skipPassing with failures`() { val output = MockStyledTextOutput() val rule = Rule("RuleClass", "RuleName", "description", Priority.MEDIUM) - val results = listOf(RuleResult(rule, "message", RuleResultStatus.PASS)) + val results = listOf(RuleResult(rule, "message", RuleResultStatus.FAIL)) ViolationsUtil.printSummary(mapOf(rule to results), output, true, false) assertThat(output.getOutput()) .contains("RuleClass") + .contains("RuleName") + } + + @Test + fun `test printSummary skipPassing no failures`() { + val output = MockStyledTextOutput() + val rule = Rule("RuleClass", "RuleName", "description", Priority.MEDIUM) + val results = listOf(RuleResult(rule, "message", RuleResultStatus.PASS)) + ViolationsUtil.printSummary(mapOf(rule to results), output, true, false) + assertThat(output.getOutput()) + .doesNotContain("RuleClass") .doesNotContain("RuleName") } @Test - fun `test printSummary skipPassing but infoLogging on`() { + fun `test printSummary skipPassing no failures but infoLogging on`() { val output = MockStyledTextOutput() val rule = Rule("RuleClass", "RuleName", "description", Priority.MEDIUM) val results = listOf(RuleResult(rule, "message", RuleResultStatus.PASS))