From ab33355b955998193dc2532e8e943aff26a49c45 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Tue, 17 May 2022 12:45:12 +0300 Subject: [PATCH 1/9] Add Markdown report --- detekt-report-md/build.gradle.kts | 14 ++ .../github/detekt/report/md/MdOutputReport.kt | 158 ++++++++++++ .../io/github/detekt/report/md/MdUtils.kt | 77 ++++++ ....gitlab.arturbosch.detekt.api.OutputReport | 1 + .../resources/default-md-report-template.md | 18 ++ .../detekt/report/md/MdOutputReportSpec.kt | 224 ++++++++++++++++++ .../io/github/detekt/report/md/MdUtilsSpec.kt | 57 +++++ .../src/test/resources/MdOutputFormatTest.md | 37 +++ settings.gradle.kts | 1 + 9 files changed, 587 insertions(+) create mode 100644 detekt-report-md/build.gradle.kts create mode 100644 detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt create mode 100644 detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdUtils.kt create mode 100644 detekt-report-md/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.OutputReport create mode 100644 detekt-report-md/src/main/resources/default-md-report-template.md create mode 100644 detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdOutputReportSpec.kt create mode 100644 detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdUtilsSpec.kt create mode 100644 detekt-report-md/src/test/resources/MdOutputFormatTest.md diff --git a/detekt-report-md/build.gradle.kts b/detekt-report-md/build.gradle.kts new file mode 100644 index 00000000000..6c1b0765a0c --- /dev/null +++ b/detekt-report-md/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + id("module") +} + +dependencies { + implementation(projects.detektMetrics) + implementation(projects.detektApi) + implementation(projects.detektUtils) + + testImplementation(projects.detektTestUtils) + testImplementation(testFixtures(projects.detektApi)) + testImplementation(libs.mockk) + testImplementation(libs.assertj) +} diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt new file mode 100644 index 00000000000..70e01d1537b --- /dev/null +++ b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt @@ -0,0 +1,158 @@ +package io.github.detekt.report.md + +import io.github.detekt.metrics.ComplexityReportGenerator +import io.github.detekt.psi.toUnifiedString +import io.gitlab.arturbosch.detekt.api.Detektion +import io.gitlab.arturbosch.detekt.api.Finding +import io.gitlab.arturbosch.detekt.api.OutputReport +import io.gitlab.arturbosch.detekt.api.ProjectMetric +import io.gitlab.arturbosch.detekt.api.SourceLocation +import io.gitlab.arturbosch.detekt.api.internal.whichDetekt +import java.time.OffsetDateTime +import java.time.ZoneOffset +import java.time.format.DateTimeFormatter +import java.util.Locale +import kotlin.math.max +import kotlin.math.min + +private const val DETEKT_WEBSITE_BASE_URL = "https://detekt.dev" + +private const val EXTRA_LINES_IN_SNIPPET = 3 + +/** + * Contains rule violations in Markdown format report. + * [See:](https://detekt.dev/docs/introduction/configurations/#output-reports) + */ +class MdOutputReport : OutputReport() { + override val ending: String = "md" + + override val name = "Markdown report" + + override fun render(detektion: Detektion) = markdown { + h1("detekt") + h2("Metrics") { + renderMetrics(detektion.metrics) + } + h2("Complexity Report") { + renderComplexity(getComplexityMetrics(detektion)) + } + h2("Findings") { + renderFindings(detektion.findings) + } + text(" ") + val detektLink = link("detekt version ${renderVersion()}", "$DETEKT_WEBSITE_BASE_URL/") + text("generated with $detektLink on ${renderDate()}") + }.toString() + + private fun renderVersion(): String = whichDetekt() ?: "unknown" + + private fun renderDate(): String { + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") + return "${OffsetDateTime.now(ZoneOffset.UTC).format(formatter)} UTC" + } + + private fun MdUtils.renderMetrics(metrics: Collection) { + metrics.forEach { + listItem(("%,d ${it.type}".format(Locale.US, it.value))) + } + } + + private fun MdUtils.renderComplexity(complexityReport: List) { + complexityReport.forEach { + listItem(it.trim()) + } + } + + private fun getComplexityMetrics(detektion: Detektion): List { + return ComplexityReportGenerator.create(detektion).generate().orEmpty() + } + + private fun MdUtils.renderFindings(findings: Map>) { + val total = findings.values + .asSequence() + .map { it.size } + .fold(0) { a, b -> a + b } + + h3("Total: %,d".format(Locale.US, total)) + + findings + .filter { it.value.isNotEmpty() } + .toList() + .sortedBy { (group, _) -> group } + .forEach { (group, groupFindings) -> + orderedListItem(group) { + renderGroup(group, groupFindings) + } + } + } + + private fun MdUtils.renderGroup(group: String, findings: List) { + findings + .groupBy { it.id } + .toList() + .sortedBy { (rule, _) -> rule } + .forEach { (rule, ruleFindings) -> + renderRule(rule, group, ruleFindings) + } + } + + private fun MdUtils.renderRule(rule: String, group: String, findings: List) { + text("$rule: %,d ".format(Locale.US, findings.size)) + text(findings.first().issue.description) + + val ruleLink = link( + "Documentation", + "$DETEKT_WEBSITE_BASE_URL/docs/rules/${group.toLowerCase(Locale.US)}#${rule.toLowerCase(Locale.US)}" + ) + text(ruleLink) + + findings + .sortedWith(compareBy({ it.file }, { it.location.source.line }, { it.location.source.column })) + .forEach { + renderFinding(it) + } + } + + private fun MdUtils.renderFinding(finding: Finding) { + val filePath = finding.location.filePath.relativePath ?: finding.location.filePath.absolutePath + val location = "${filePath.toUnifiedString()}:${finding.location.source.line}:${finding.location.source.column}" + + listItem(location) { + if (finding.message.isNotEmpty()) { + codeBlock(finding.message, "") + } + + val psiFile = finding.entity.ktElement?.containingFile + if (psiFile != null) { + val lineSequence = psiFile.text.splitToSequence('\n') + snippetCode(lineSequence, finding.startPosition) + } + } + } +} + +internal fun MdUtils.snippetCode(lines: Sequence, location: SourceLocation) { + val dropLineCount = max(location.line - 1 - EXTRA_LINES_IN_SNIPPET, 0) + val takeLineCount = EXTRA_LINES_IN_SNIPPET + 1 + min(location.line - 1, EXTRA_LINES_IN_SNIPPET) + var currentLineNumber = dropLineCount + 1 + var text = "" + + val lineNoSpace = (currentLineNumber + takeLineCount).toString().length + + lines + .drop(dropLineCount) + .take(takeLineCount) + .forEach { line -> + val lineNo = ("$currentLineNumber ").take(lineNoSpace) + text += "$lineNo $line\n" + + if (currentLineNumber == location.line) { + val positions = currentLineNumber.toString().length + val lineErr = "!".repeat(positions) + " ".repeat(location.column + lineNoSpace - positions) + text += "$lineErr^ error\n" + } + currentLineNumber++ + } + + codeBlock(text, "kotlin") +} diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdUtils.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdUtils.kt new file mode 100644 index 00000000000..1615f4d435e --- /dev/null +++ b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdUtils.kt @@ -0,0 +1,77 @@ +package io.github.detekt.report.md + +import org.jetbrains.kotlin.backend.common.peek +import org.jetbrains.kotlin.backend.common.pop +import org.jetbrains.kotlin.backend.common.push +import kotlin.math.min + +private const val MAX_INDENT = 3 + +typealias Block = () -> Unit + +@Suppress("TooManyFunctions") +class MdUtils { + private var content: String = "" + private val indentStack = ArrayDeque() + + override fun toString() = content + + private fun indent() = " ".repeat(getBlockIndent()) + private fun getBlockIndent() = indentStack.peek() ?: 0 + private fun saveBlockIndent(indent: Int) { indentStack.push(getBlockIndent() + indent) } + private fun restoreBlockIndent() { indentStack.pop() } + + private fun addBlock(tag: String = "", text: String = "", block: Block) { + if ((tag + text).isNotEmpty()) { + addText(tag + text) + } + + if (block != {}) { + saveBlockIndent(min(tag.length, MAX_INDENT)) + block() + restoreBlockIndent() + } + } + + private fun addText(text: String) { content += indentText(text) } + + private fun indentText(text: String): String { + val indent = indent() + val indentedText = text.replace("\n", "\n$indent") + return "$indent$indentedText\n" + } + + fun h1(text: String, block: Block = {}) { addBlock("# ", text, block) } + fun h2(text: String, block: Block = {}) { addBlock("## ", text, block) } + fun h3(text: String, block: Block = {}) { addBlock("### ", text, block) } + fun h4(text: String, block: Block = {}) { addBlock("#### ", text, block) } + fun h5(text: String, block: Block = {}) { addBlock("##### ", text, block) } + fun h6(text: String, block: Block = {}) { addBlock("###### ", text, block) } + fun line(block: Block = {}) { addBlock(tag = "---", block = block) } + fun text(text: String, block: Block = {}) { addBlock(text = text, block = block) } + fun orderedListItem(text: String, block: Block = {}) { addBlock("1. ", text, block) } + fun listItem(text: String, block: Block = {}) { addBlock("- ", text, block) } + fun codeLine(text: String) { addText("`$text`") } + fun codeBlock(text: String, lang: String) { addText("```$lang\n$text\n```") } + + fun details(summary: String, block: Block = {}) { + addText("
") + addText("$summary\n") + addBlock(block = block) + addText("
") + } + + fun bold(text: String) = "**$text**" + fun italic(text: String) = "*$text*" + fun strikethrough(text: String) = "~~$text~~" + fun subscript(text: String) = "$text" + fun superscript(text: String) = "$text" + fun quote(text: String) = "> $text" + fun link(text: String, url: String) = "[$text]($url)" +} + +fun markdown(build: MdUtils.() -> Unit): MdUtils { + val markdown = MdUtils() + markdown.build() + return markdown +} diff --git a/detekt-report-md/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.OutputReport b/detekt-report-md/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.OutputReport new file mode 100644 index 00000000000..fd8718df3bf --- /dev/null +++ b/detekt-report-md/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.OutputReport @@ -0,0 +1 @@ +io.github.detekt.report.txt.MdOutputReport diff --git a/detekt-report-md/src/main/resources/default-md-report-template.md b/detekt-report-md/src/main/resources/default-md-report-template.md new file mode 100644 index 00000000000..d787ab5c7e3 --- /dev/null +++ b/detekt-report-md/src/main/resources/default-md-report-template.md @@ -0,0 +1,18 @@ +# detekt + +--- +### Metrics +@@@metrics@@@ + +--- + +### Complexity report +@@@complexity@@@ + +--- +### Findings +@@@findings@@@ + +generated with detekt version @@@version@@@ on @@@date@@@. + +--- diff --git a/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdOutputReportSpec.kt b/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdOutputReportSpec.kt new file mode 100644 index 00000000000..1ae00a16570 --- /dev/null +++ b/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdOutputReportSpec.kt @@ -0,0 +1,224 @@ +package io.github.detekt.report.md + +import io.github.detekt.metrics.CognitiveComplexity +import io.github.detekt.metrics.processors.commentLinesKey +import io.github.detekt.metrics.processors.complexityKey +import io.github.detekt.metrics.processors.linesKey +import io.github.detekt.metrics.processors.logicalLinesKey +import io.github.detekt.metrics.processors.sourceLinesKey +import io.gitlab.arturbosch.detekt.api.Detektion +import io.gitlab.arturbosch.detekt.api.Finding +import io.gitlab.arturbosch.detekt.api.ProjectMetric +import io.gitlab.arturbosch.detekt.api.internal.whichDetekt +import io.gitlab.arturbosch.detekt.test.TestDetektion +import io.gitlab.arturbosch.detekt.test.createEntity +import io.gitlab.arturbosch.detekt.test.createFinding +import io.gitlab.arturbosch.detekt.test.createIssue +import io.mockk.every +import io.mockk.mockk +import org.assertj.core.api.Assertions.assertThat +import org.jetbrains.kotlin.com.intellij.psi.PsiFile +import org.jetbrains.kotlin.psi.KtElement +import org.junit.jupiter.api.Test + +class MdOutputReportSpec { + private val mdReport = MdOutputReport() + private val detektion = createTestDetektionWithMultipleSmells() + private val result = mdReport.render(detektion) + + @Test + fun `renders Markdown structure correctly`() { + assertThat(result).contains("Metrics") + assertThat(result).contains("Complexity Report") + assertThat(result).contains("Findings") + } + + @Test + fun `contains zero findings`() { + val result = mdReport.render(TestDetektion()) + + assertThat(result).contains("Total: 0") + } + + @Test + fun `contains the total number of findings`() { + assertThat(result).contains("Total: 3") + } + + @Test + fun `renders the 'generated with' text correctly`() { + val header = "generated with [detekt version ${whichDetekt()}](https://detekt.dev/) on " + + assertThat(result).contains(header) + } + + @Test + fun `renders the right file locations`() { + assertThat(result).contains("src/main/com/sample/Sample1.kt:9:17") + assertThat(result).contains("src/main/com/sample/Sample2.kt:13:17") + assertThat(result).contains("src/main/com/sample/Sample3.kt:14:16") + } + + @Test + fun `renders the right number of issues per rule`() { + assertThat(result).contains("id_a: 2") + assertThat(result).contains("id_b: 1") + } + + @Test + fun `renders the right violation messages for the rules`() { + assertThat(result).contains("Message finding 1") + assertThat(result).contains("Message finding 2") + } + + @Test + fun `renders the right violation description for the rules`() { + assertThat(result).contains("Description id_a") + assertThat(result).contains("Description id_b") + } + + @Test + fun `renders the right documentation links for the rules`() { + val detektion = object : TestDetektion() { + override val findings: Map> = mapOf( + "Style" to listOf( + createFinding(createIssue("ValCouldBeVar"), createEntity("")) + ), + "empty" to listOf( + createFinding(createIssue("EmptyBody"), createEntity("")), + createFinding(createIssue("EmptyIf"), createEntity("")) + ) + ) + } + + val result = mdReport.render(detektion) + assertThat(result).contains("[Documentation](https://detekt.dev/docs/rules/style#valcouldbevar)") + assertThat(result).contains("[Documentation](https://detekt.dev/docs/rules/empty#emptybody)") + assertThat(result).contains("[Documentation](https://detekt.dev/docs/rules/empty#emptyif)") + } + + @Test + fun `asserts that the generated HTML is the same even if we change the order of the findings`() { + val findings = findings() + val reversedFindings = findings + .reversedArray() + .map { (section, findings) -> section to findings.asReversed() } + .toTypedArray() + + val firstDetektion = createMdDetektion(*findings) + val secondDetektion = createMdDetektion(*reversedFindings) + + val firstReport = mdReport.render(firstDetektion) + val secondReport = mdReport.render(secondDetektion) + + assertThat(firstReport).isEqualTo(secondReport) + } +} + +private fun mockKtElement(): KtElement { + val ktElementMock = mockk() + val psiFileMock = mockk() + val code = """ + package com.example.test + + import io.github.* + + class Test() { + val greeting: String = "Hello, World!" + + init { + println(greetings) + } + + fun foo() { + println(greetings) + return this + } + } + """.trimIndent() + + every { psiFileMock.text } returns code + every { ktElementMock.containingFile } returns psiFileMock + return ktElementMock +} + +private fun createTestDetektionWithMultipleSmells(): Detektion { + val entity1 = createEntity( + path = "src/main/com/sample/Sample1.kt", + position = 9 to 17, + text = 17..20, + ktElement = mockKtElement(), + basePath = "/Users/tester/detekt/" + ) + val entity2 = createEntity( + path = "src/main/com/sample/Sample2.kt", + ktElement = mockKtElement(), + position = 13 to 17, + basePath = "/Users/tester/detekt/" + ) + val entity3 = createEntity( + path = "src/main/com/sample/Sample3.kt", + position = 14 to 16, + ktElement = mockKtElement(), + basePath = "/Users/tester/detekt/" + ) + + val issueA = createIssue("id_a") + val issueB = createIssue("id_b") + + return createMdDetektion( + "Section-1" to listOf( + createFinding(issueA, entity1, "Message finding 1"), + createFinding(issueA, entity2, "Message finding 2") + ), + "Section-2" to listOf( + createFinding(issueB, entity3, "") + ) + ).also { + it.addData(complexityKey, 10) + it.addData(CognitiveComplexity.KEY, 10) + it.addData(sourceLinesKey, 20) + it.addData(logicalLinesKey, 10) + it.addData(commentLinesKey, 2) + it.addData(linesKey, 2222) + } +} + +private fun createMdDetektion(vararg findingPairs: Pair>): Detektion { + return object : TestDetektion() { + override val findings: Map> = findingPairs.toMap() + + override val metrics: Collection = listOf( + ProjectMetric("M1", 10_000), + ProjectMetric("M2", 2) + ) + } +} + +private fun findings(): Array>> { + val issueA = createIssue("id_a") + val issueB = createIssue("id_b") + val issueC = createIssue("id_c") + + val entity1 = createEntity("src/main/com/sample/Sample1.kt", 11 to 5) + val entity2 = createEntity("src/main/com/sample/Sample1.kt", 22 to 2) + val entity3 = createEntity("src/main/com/sample/Sample1.kt", 11 to 2) + val entity4 = createEntity("src/main/com/sample/Sample2.kt", 1 to 1) + + return arrayOf( + "Section 1" to listOf( + createFinding(issueA, entity1), + createFinding(issueA, entity2), + createFinding(issueA, entity3), + createFinding(issueA, entity4), + createFinding(issueB, entity2), + createFinding(issueB, entity1), + createFinding(issueB, entity4) + ), + "Section 2" to listOf( + createFinding(issueB, entity3), + createFinding(issueC, entity1), + createFinding(issueC, entity2) + ) + ) +} diff --git a/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdUtilsSpec.kt b/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdUtilsSpec.kt new file mode 100644 index 00000000000..af4f14ace79 --- /dev/null +++ b/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdUtilsSpec.kt @@ -0,0 +1,57 @@ +package io.github.detekt.report.md + +import io.github.detekt.test.utils.readResourceContent +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class MdUtilsSpec { + @Test + fun `asserts that the generated Markdown is the same as expected`() { + val expected = readResourceContent("MdOutputFormatTest.md") + val result = renderSample() + + assertThat(result).isEqualTo(expected) + } +} + +private fun renderSample() = markdown { + h1("h1") { + h2("h2") + h3("h3") + h4("h4") + h5("h5") + h6("h6") + text("text") + line() + orderedListItem("orderedListItem") + orderedListItem("") { + details("orderedListItem") { + orderedListItem("orderedListItem") + orderedListItem("orderedListItem") + orderedListItem("") { + details("details") { + listItem("listItem") + listItem("listItem") + text(" ") + codeLine("codeLine") + text(quote("quote")) + text(" ") + text(bold("bold")) + text(italic("italic")) + text(strikethrough("strikethrough")) + text(subscript("subscript")) + text(superscript("superscript")) + text(link("link", "https://detekt.dev/")) + } + } + } + } + orderedListItem("orderedListItem") + codeBlock( + """ + codeBlock + """.trimIndent(), + "kotlin" + ) + } +}.toString() diff --git a/detekt-report-md/src/test/resources/MdOutputFormatTest.md b/detekt-report-md/src/test/resources/MdOutputFormatTest.md new file mode 100644 index 00000000000..9b9f0aab077 --- /dev/null +++ b/detekt-report-md/src/test/resources/MdOutputFormatTest.md @@ -0,0 +1,37 @@ +# h1 + ## h2 + ### h3 + #### h4 + ##### h5 + ###### h6 + text + --- + 1. orderedListItem + 1. +
+ orderedListItem + + 1. orderedListItem + 1. orderedListItem + 1. +
+ details + + - listItem + - listItem + + `codeLine` + > quote + + **bold** + *italic* + ~~strikethrough~~ + subscript + superscript + [link](https://detekt.dev/) +
+
+ 1. orderedListItem + ```kotlin + codeBlock + ``` diff --git a/settings.gradle.kts b/settings.gradle.kts index 2a1dd6fd5cd..bd249984bf4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,6 +17,7 @@ include("detekt-metrics") include("detekt-parser") include("detekt-psi-utils") include("detekt-report-html") +include("detekt-report-md") include("detekt-report-sarif") include("detekt-report-txt") include("detekt-report-xml") From 0373fb34f859bcbd81a57278751a707fc9db2025 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Wed, 25 May 2022 17:33:46 +0300 Subject: [PATCH 2/9] Improve output report Use headings instead of list for 'Rules' section --- .../io/github/detekt/report/md/MdOutputReport.kt | 14 +++++--------- .../github/detekt/report/md/MdOutputReportSpec.kt | 8 ++++---- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt index 70e01d1537b..3d2b4cee35b 100644 --- a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt +++ b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt @@ -21,7 +21,7 @@ private const val EXTRA_LINES_IN_SNIPPET = 3 /** * Contains rule violations in Markdown format report. - * [See:](https://detekt.dev/docs/introduction/configurations/#output-reports) + * [See](https://detekt.dev/docs/introduction/configurations/#output-reports) */ class MdOutputReport : OutputReport() { override val ending: String = "md" @@ -36,9 +36,7 @@ class MdOutputReport : OutputReport() { h2("Complexity Report") { renderComplexity(getComplexityMetrics(detektion)) } - h2("Findings") { - renderFindings(detektion.findings) - } + renderFindings(detektion.findings) text(" ") val detektLink = link("detekt version ${renderVersion()}", "$DETEKT_WEBSITE_BASE_URL/") text("generated with $detektLink on ${renderDate()}") @@ -73,16 +71,14 @@ class MdOutputReport : OutputReport() { .map { it.size } .fold(0) { a, b -> a + b } - h3("Total: %,d".format(Locale.US, total)) + h2("Findings (%,d)".format(Locale.US, total)) findings .filter { it.value.isNotEmpty() } .toList() .sortedBy { (group, _) -> group } .forEach { (group, groupFindings) -> - orderedListItem(group) { - renderGroup(group, groupFindings) - } + renderGroup(group, groupFindings) } } @@ -97,7 +93,7 @@ class MdOutputReport : OutputReport() { } private fun MdUtils.renderRule(rule: String, group: String, findings: List) { - text("$rule: %,d ".format(Locale.US, findings.size)) + h3("$group, $rule (%,d)".format(Locale.US, findings.size)) text(findings.first().issue.description) val ruleLink = link( diff --git a/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdOutputReportSpec.kt b/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdOutputReportSpec.kt index 1ae00a16570..378d6643605 100644 --- a/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdOutputReportSpec.kt +++ b/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdOutputReportSpec.kt @@ -37,12 +37,12 @@ class MdOutputReportSpec { fun `contains zero findings`() { val result = mdReport.render(TestDetektion()) - assertThat(result).contains("Total: 0") + assertThat(result).contains("Findings (0)") } @Test fun `contains the total number of findings`() { - assertThat(result).contains("Total: 3") + assertThat(result).contains("Findings (3)") } @Test @@ -61,8 +61,8 @@ class MdOutputReportSpec { @Test fun `renders the right number of issues per rule`() { - assertThat(result).contains("id_a: 2") - assertThat(result).contains("id_b: 1") + assertThat(result).contains("id_a (2)") + assertThat(result).contains("id_b (1)") } @Test From 6da4de04d24c29db75834aa43e0395b68758e7df Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Thu, 26 May 2022 15:19:46 +0300 Subject: [PATCH 3/9] Make report use 'detekt-generator' module --- detekt-report-md/build.gradle.kts | 1 + .../github/detekt/report/md/MdOutputReport.kt | 153 ++++++++++-------- .../io/github/detekt/report/md/MdUtils.kt | 77 --------- .../resources/default-md-report-template.md | 18 --- .../io/github/detekt/report/md/MdUtilsSpec.kt | 57 ------- .../src/test/resources/MdOutputFormatTest.md | 37 ----- 6 files changed, 87 insertions(+), 256 deletions(-) delete mode 100644 detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdUtils.kt delete mode 100644 detekt-report-md/src/main/resources/default-md-report-template.md delete mode 100644 detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdUtilsSpec.kt delete mode 100644 detekt-report-md/src/test/resources/MdOutputFormatTest.md diff --git a/detekt-report-md/build.gradle.kts b/detekt-report-md/build.gradle.kts index 6c1b0765a0c..a1e2c791c39 100644 --- a/detekt-report-md/build.gradle.kts +++ b/detekt-report-md/build.gradle.kts @@ -6,6 +6,7 @@ dependencies { implementation(projects.detektMetrics) implementation(projects.detektApi) implementation(projects.detektUtils) + implementation(projects.detektGenerator) testImplementation(projects.detektTestUtils) testImplementation(testFixtures(projects.detektApi)) diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt index 3d2b4cee35b..c2f2aab6b7c 100644 --- a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt +++ b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt @@ -8,6 +8,16 @@ import io.gitlab.arturbosch.detekt.api.OutputReport import io.gitlab.arturbosch.detekt.api.ProjectMetric import io.gitlab.arturbosch.detekt.api.SourceLocation import io.gitlab.arturbosch.detekt.api.internal.whichDetekt +import io.gitlab.arturbosch.detekt.generator.out.MarkdownContent +import io.gitlab.arturbosch.detekt.generator.out.codeBlock +import io.gitlab.arturbosch.detekt.generator.out.emptyLine +import io.gitlab.arturbosch.detekt.generator.out.h1 +import io.gitlab.arturbosch.detekt.generator.out.h2 +import io.gitlab.arturbosch.detekt.generator.out.h3 +import io.gitlab.arturbosch.detekt.generator.out.item +import io.gitlab.arturbosch.detekt.generator.out.list +import io.gitlab.arturbosch.detekt.generator.out.markdown +import io.gitlab.arturbosch.detekt.generator.out.paragraph import java.time.OffsetDateTime import java.time.ZoneOffset import java.time.format.DateTimeFormatter @@ -29,18 +39,22 @@ class MdOutputReport : OutputReport() { override val name = "Markdown report" override fun render(detektion: Detektion) = markdown { - h1("detekt") - h2("Metrics") { - renderMetrics(detektion.metrics) - } - h2("Complexity Report") { - renderComplexity(getComplexityMetrics(detektion)) - } + h1 { "detekt" } + + h2 { "Metrics" } + renderMetrics(detektion.metrics) + + h2 { "Complexity Report" } + renderComplexity(getComplexityMetrics(detektion)) + renderFindings(detektion.findings) - text(" ") - val detektLink = link("detekt version ${renderVersion()}", "$DETEKT_WEBSITE_BASE_URL/") - text("generated with $detektLink on ${renderDate()}") - }.toString() + emptyLine() + + paragraph { + val detektLink = link("detekt version ${renderVersion()}", "$DETEKT_WEBSITE_BASE_URL/") + "generated with $detektLink on ${renderDate()}" + } + } private fun renderVersion(): String = whichDetekt() ?: "unknown" @@ -49,85 +63,88 @@ class MdOutputReport : OutputReport() { return "${OffsetDateTime.now(ZoneOffset.UTC).format(formatter)} UTC" } - private fun MdUtils.renderMetrics(metrics: Collection) { - metrics.forEach { - listItem(("%,d ${it.type}".format(Locale.US, it.value))) - } - } - - private fun MdUtils.renderComplexity(complexityReport: List) { - complexityReport.forEach { - listItem(it.trim()) - } - } - private fun getComplexityMetrics(detektion: Detektion): List { return ComplexityReportGenerator.create(detektion).generate().orEmpty() } +} - private fun MdUtils.renderFindings(findings: Map>) { - val total = findings.values - .asSequence() - .map { it.size } - .fold(0) { a, b -> a + b } - - h2("Findings (%,d)".format(Locale.US, total)) - - findings - .filter { it.value.isNotEmpty() } - .toList() - .sortedBy { (group, _) -> group } - .forEach { (group, groupFindings) -> - renderGroup(group, groupFindings) - } +private fun MarkdownContent.renderMetrics(metrics: Collection) { + list { + metrics.forEach { item { "%,d ${it.type}".format(Locale.US, it.value) } } } +} - private fun MdUtils.renderGroup(group: String, findings: List) { - findings - .groupBy { it.id } - .toList() - .sortedBy { (rule, _) -> rule } - .forEach { (rule, ruleFindings) -> - renderRule(rule, group, ruleFindings) - } +private fun MarkdownContent.renderComplexity(complexityReport: List) { + list { + complexityReport.forEach { item { it.trim() } } } +} - private fun MdUtils.renderRule(rule: String, group: String, findings: List) { - h3("$group, $rule (%,d)".format(Locale.US, findings.size)) - text(findings.first().issue.description) +private fun MarkdownContent.renderGroup(group: String, findings: List) { + findings + .groupBy { it.id } + .toList() + .sortedBy { (rule, _) -> rule } + .forEach { (rule, ruleFindings) -> + renderRule(rule, group, ruleFindings) + } +} + +private fun MarkdownContent.renderRule(rule: String, group: String, findings: List) { + h3 { "$group, $rule (%,d)".format(Locale.US, findings.size) } + paragraph { (findings.first().issue.description) } - val ruleLink = link( + paragraph { + link( "Documentation", "$DETEKT_WEBSITE_BASE_URL/docs/rules/${group.toLowerCase(Locale.US)}#${rule.toLowerCase(Locale.US)}" ) - text(ruleLink) + } + list { findings .sortedWith(compareBy({ it.file }, { it.location.source.line }, { it.location.source.column })) .forEach { - renderFinding(it) + item { renderFinding(it) } } } +} - private fun MdUtils.renderFinding(finding: Finding) { - val filePath = finding.location.filePath.relativePath ?: finding.location.filePath.absolutePath - val location = "${filePath.toUnifiedString()}:${finding.location.source.line}:${finding.location.source.column}" +private fun MarkdownContent.renderFindings(findings: Map>) { + val total = findings.values + .asSequence() + .map { it.size } + .fold(0) { a, b -> a + b } - listItem(location) { - if (finding.message.isNotEmpty()) { - codeBlock(finding.message, "") - } + h2 { "Findings (%,d)".format(Locale.US, total) } - val psiFile = finding.entity.ktElement?.containingFile - if (psiFile != null) { - val lineSequence = psiFile.text.splitToSequence('\n') - snippetCode(lineSequence, finding.startPosition) - } + findings + .filter { it.value.isNotEmpty() } + .toList() + .sortedBy { (group, _) -> group } + .forEach { (group, groupFindings) -> + renderGroup(group, groupFindings) } - } } -internal fun MdUtils.snippetCode(lines: Sequence, location: SourceLocation) { +private fun MarkdownContent.renderFinding(finding: Finding): String { + val filePath = finding.location.filePath.relativePath ?: finding.location.filePath.absolutePath + val location = "${filePath.toUnifiedString()}:${finding.location.source.line}:${finding.location.source.column}" + + val message = if (finding.message.isNotEmpty()) { + codeBlock("") { finding.message } + } else { "" } + + val psiFile = finding.entity.ktElement?.containingFile + val snippet = if (psiFile != null) { + val lineSequence = psiFile.text.splitToSequence('\n') + snippetCode(lineSequence, finding.startPosition) + } else { "" } + + return "$location\n$message\n$snippet" +} + +private fun MarkdownContent.snippetCode(lines: Sequence, location: SourceLocation): String { val dropLineCount = max(location.line - 1 - EXTRA_LINES_IN_SNIPPET, 0) val takeLineCount = EXTRA_LINES_IN_SNIPPET + 1 + min(location.line - 1, EXTRA_LINES_IN_SNIPPET) var currentLineNumber = dropLineCount + 1 @@ -150,5 +167,7 @@ internal fun MdUtils.snippetCode(lines: Sequence, location: SourceLocati currentLineNumber++ } - codeBlock(text, "kotlin") + return codeBlock("kotlin") { text } } + +internal fun MarkdownContent.link(text: String, url: String) = "[$text]($url)" diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdUtils.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdUtils.kt deleted file mode 100644 index 1615f4d435e..00000000000 --- a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdUtils.kt +++ /dev/null @@ -1,77 +0,0 @@ -package io.github.detekt.report.md - -import org.jetbrains.kotlin.backend.common.peek -import org.jetbrains.kotlin.backend.common.pop -import org.jetbrains.kotlin.backend.common.push -import kotlin.math.min - -private const val MAX_INDENT = 3 - -typealias Block = () -> Unit - -@Suppress("TooManyFunctions") -class MdUtils { - private var content: String = "" - private val indentStack = ArrayDeque() - - override fun toString() = content - - private fun indent() = " ".repeat(getBlockIndent()) - private fun getBlockIndent() = indentStack.peek() ?: 0 - private fun saveBlockIndent(indent: Int) { indentStack.push(getBlockIndent() + indent) } - private fun restoreBlockIndent() { indentStack.pop() } - - private fun addBlock(tag: String = "", text: String = "", block: Block) { - if ((tag + text).isNotEmpty()) { - addText(tag + text) - } - - if (block != {}) { - saveBlockIndent(min(tag.length, MAX_INDENT)) - block() - restoreBlockIndent() - } - } - - private fun addText(text: String) { content += indentText(text) } - - private fun indentText(text: String): String { - val indent = indent() - val indentedText = text.replace("\n", "\n$indent") - return "$indent$indentedText\n" - } - - fun h1(text: String, block: Block = {}) { addBlock("# ", text, block) } - fun h2(text: String, block: Block = {}) { addBlock("## ", text, block) } - fun h3(text: String, block: Block = {}) { addBlock("### ", text, block) } - fun h4(text: String, block: Block = {}) { addBlock("#### ", text, block) } - fun h5(text: String, block: Block = {}) { addBlock("##### ", text, block) } - fun h6(text: String, block: Block = {}) { addBlock("###### ", text, block) } - fun line(block: Block = {}) { addBlock(tag = "---", block = block) } - fun text(text: String, block: Block = {}) { addBlock(text = text, block = block) } - fun orderedListItem(text: String, block: Block = {}) { addBlock("1. ", text, block) } - fun listItem(text: String, block: Block = {}) { addBlock("- ", text, block) } - fun codeLine(text: String) { addText("`$text`") } - fun codeBlock(text: String, lang: String) { addText("```$lang\n$text\n```") } - - fun details(summary: String, block: Block = {}) { - addText("
") - addText("$summary\n") - addBlock(block = block) - addText("
") - } - - fun bold(text: String) = "**$text**" - fun italic(text: String) = "*$text*" - fun strikethrough(text: String) = "~~$text~~" - fun subscript(text: String) = "$text" - fun superscript(text: String) = "$text" - fun quote(text: String) = "> $text" - fun link(text: String, url: String) = "[$text]($url)" -} - -fun markdown(build: MdUtils.() -> Unit): MdUtils { - val markdown = MdUtils() - markdown.build() - return markdown -} diff --git a/detekt-report-md/src/main/resources/default-md-report-template.md b/detekt-report-md/src/main/resources/default-md-report-template.md deleted file mode 100644 index d787ab5c7e3..00000000000 --- a/detekt-report-md/src/main/resources/default-md-report-template.md +++ /dev/null @@ -1,18 +0,0 @@ -# detekt - ---- -### Metrics -@@@metrics@@@ - ---- - -### Complexity report -@@@complexity@@@ - ---- -### Findings -@@@findings@@@ - -generated with detekt version @@@version@@@ on @@@date@@@. - ---- diff --git a/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdUtilsSpec.kt b/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdUtilsSpec.kt deleted file mode 100644 index af4f14ace79..00000000000 --- a/detekt-report-md/src/test/kotlin/io/github/detekt/report/md/MdUtilsSpec.kt +++ /dev/null @@ -1,57 +0,0 @@ -package io.github.detekt.report.md - -import io.github.detekt.test.utils.readResourceContent -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -class MdUtilsSpec { - @Test - fun `asserts that the generated Markdown is the same as expected`() { - val expected = readResourceContent("MdOutputFormatTest.md") - val result = renderSample() - - assertThat(result).isEqualTo(expected) - } -} - -private fun renderSample() = markdown { - h1("h1") { - h2("h2") - h3("h3") - h4("h4") - h5("h5") - h6("h6") - text("text") - line() - orderedListItem("orderedListItem") - orderedListItem("") { - details("orderedListItem") { - orderedListItem("orderedListItem") - orderedListItem("orderedListItem") - orderedListItem("") { - details("details") { - listItem("listItem") - listItem("listItem") - text(" ") - codeLine("codeLine") - text(quote("quote")) - text(" ") - text(bold("bold")) - text(italic("italic")) - text(strikethrough("strikethrough")) - text(subscript("subscript")) - text(superscript("superscript")) - text(link("link", "https://detekt.dev/")) - } - } - } - } - orderedListItem("orderedListItem") - codeBlock( - """ - codeBlock - """.trimIndent(), - "kotlin" - ) - } -}.toString() diff --git a/detekt-report-md/src/test/resources/MdOutputFormatTest.md b/detekt-report-md/src/test/resources/MdOutputFormatTest.md deleted file mode 100644 index 9b9f0aab077..00000000000 --- a/detekt-report-md/src/test/resources/MdOutputFormatTest.md +++ /dev/null @@ -1,37 +0,0 @@ -# h1 - ## h2 - ### h3 - #### h4 - ##### h5 - ###### h6 - text - --- - 1. orderedListItem - 1. -
- orderedListItem - - 1. orderedListItem - 1. orderedListItem - 1. -
- details - - - listItem - - listItem - - `codeLine` - > quote - - **bold** - *italic* - ~~strikethrough~~ - subscript - superscript - [link](https://detekt.dev/) -
-
- 1. orderedListItem - ```kotlin - codeBlock - ``` From 71b735dd8b2c19d007e4efcf3fc51ea085a5a635 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Sun, 29 May 2022 13:53:01 +0300 Subject: [PATCH 4/9] Move markdown/yaml generators to 'detekt-tooling' Move Markdown.kt, Yaml.kt and YamlSpec.kt from 'detekt-generator' to 'detekt-tooling' package. Refactor 'detekt-generator' and 'detekt-report-md' so that they depend on 'detekt-tooling'. --- detekt-generator/build.gradle.kts | 2 + .../detekt/generator/DetektPrinter.kt | 2 +- .../printer/RuleConfigurationPrinter.kt | 16 ++-- .../detekt/generator/printer/RulePrinter.kt | 14 +-- .../generator/printer/RuleSetPagePrinter.kt | 4 +- .../printer/defaultconfig/ConfigPrinter.kt | 2 +- .../defaultconfig/RuleSetConfigPrinter.kt | 8 +- .../defaultconfig/RuleSetConfigPrinterTest.kt | 2 +- detekt-report-md/build.gradle.kts | 4 +- .../github/detekt/report/md/MdOutputReport.kt | 20 ++-- detekt-tooling/api/detekt-tooling.api | 92 +++++++++++++++++++ .../io/github/detekt/tooling}/out/Markdown.kt | 2 +- .../io/github/detekt/tooling}/out/Yaml.kt | 2 +- .../io/github/detekt/tooling}/out/YamlSpec.kt | 2 +- 14 files changed, 132 insertions(+), 40 deletions(-) rename {detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator => detekt-tooling/src/main/kotlin/io/github/detekt/tooling}/out/Markdown.kt (97%) rename {detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator => detekt-tooling/src/main/kotlin/io/github/detekt/tooling}/out/Yaml.kt (97%) rename {detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator => detekt-tooling/src/test/kotlin/io/github/detekt/tooling}/out/YamlSpec.kt (97%) diff --git a/detekt-generator/build.gradle.kts b/detekt-generator/build.gradle.kts index ed37935d573..ef384a980c1 100644 --- a/detekt-generator/build.gradle.kts +++ b/detekt-generator/build.gradle.kts @@ -10,10 +10,12 @@ dependencies { implementation(projects.detektRulesEmpty) implementation(projects.detektFormatting) implementation(projects.detektCli) + implementation(projects.detektTooling) implementation(libs.jcommander) testImplementation(projects.detektCore) testImplementation(projects.detektTestUtils) + testImplementation(projects.detektTooling) testImplementation(libs.assertj) testImplementation(libs.reflections) } diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt index 2db46a6beb6..a72274ef062 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt @@ -1,10 +1,10 @@ package io.gitlab.arturbosch.detekt.generator +import io.github.detekt.tooling.out.yaml import io.gitlab.arturbosch.detekt.generator.collection.RuleSetPage import io.gitlab.arturbosch.detekt.generator.out.MarkdownWriter import io.gitlab.arturbosch.detekt.generator.out.PropertiesWriter import io.gitlab.arturbosch.detekt.generator.out.YamlWriter -import io.gitlab.arturbosch.detekt.generator.out.yaml import io.gitlab.arturbosch.detekt.generator.printer.DeprecatedPrinter import io.gitlab.arturbosch.detekt.generator.printer.RuleSetPagePrinter import io.gitlab.arturbosch.detekt.generator.printer.defaultconfig.ConfigPrinter diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleConfigurationPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleConfigurationPrinter.kt index 56f2ffe2c67..618da47b2cd 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleConfigurationPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleConfigurationPrinter.kt @@ -1,14 +1,14 @@ package io.gitlab.arturbosch.detekt.generator.printer +import io.github.detekt.tooling.out.bold +import io.github.detekt.tooling.out.code +import io.github.detekt.tooling.out.crossOut +import io.github.detekt.tooling.out.description +import io.github.detekt.tooling.out.h4 +import io.github.detekt.tooling.out.item +import io.github.detekt.tooling.out.list +import io.github.detekt.tooling.out.markdown import io.gitlab.arturbosch.detekt.generator.collection.Configuration -import io.gitlab.arturbosch.detekt.generator.out.bold -import io.gitlab.arturbosch.detekt.generator.out.code -import io.gitlab.arturbosch.detekt.generator.out.crossOut -import io.gitlab.arturbosch.detekt.generator.out.description -import io.gitlab.arturbosch.detekt.generator.out.h4 -import io.gitlab.arturbosch.detekt.generator.out.item -import io.gitlab.arturbosch.detekt.generator.out.list -import io.gitlab.arturbosch.detekt.generator.out.markdown internal object RuleConfigurationPrinter : DocumentationPrinter> { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RulePrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RulePrinter.kt index 318ae70af2d..bf42dcf21fb 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RulePrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RulePrinter.kt @@ -1,14 +1,14 @@ package io.gitlab.arturbosch.detekt.generator.printer +import io.github.detekt.tooling.out.MarkdownContent +import io.github.detekt.tooling.out.bold +import io.github.detekt.tooling.out.codeBlock +import io.github.detekt.tooling.out.h3 +import io.github.detekt.tooling.out.h4 +import io.github.detekt.tooling.out.markdown +import io.github.detekt.tooling.out.paragraph import io.gitlab.arturbosch.detekt.generator.collection.Active import io.gitlab.arturbosch.detekt.generator.collection.Rule -import io.gitlab.arturbosch.detekt.generator.out.MarkdownContent -import io.gitlab.arturbosch.detekt.generator.out.bold -import io.gitlab.arturbosch.detekt.generator.out.codeBlock -import io.gitlab.arturbosch.detekt.generator.out.h3 -import io.gitlab.arturbosch.detekt.generator.out.h4 -import io.gitlab.arturbosch.detekt.generator.out.markdown -import io.gitlab.arturbosch.detekt.generator.out.paragraph internal object RulePrinter : DocumentationPrinter { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleSetPagePrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleSetPagePrinter.kt index db88a74c223..d0d8de82679 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleSetPagePrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleSetPagePrinter.kt @@ -1,8 +1,8 @@ package io.gitlab.arturbosch.detekt.generator.printer +import io.github.detekt.tooling.out.markdown +import io.github.detekt.tooling.out.paragraph import io.gitlab.arturbosch.detekt.generator.collection.RuleSetPage -import io.gitlab.arturbosch.detekt.generator.out.markdown -import io.gitlab.arturbosch.detekt.generator.out.paragraph object RuleSetPagePrinter : DocumentationPrinter { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt index 486e36b94bd..c89812defc4 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt @@ -1,7 +1,7 @@ package io.gitlab.arturbosch.detekt.generator.printer.defaultconfig +import io.github.detekt.tooling.out.yaml import io.gitlab.arturbosch.detekt.generator.collection.RuleSetPage -import io.gitlab.arturbosch.detekt.generator.out.yaml import io.gitlab.arturbosch.detekt.generator.printer.DocumentationPrinter object ConfigPrinter : DocumentationPrinter> { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinter.kt index 9e4c896053b..1d5df7b1586 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinter.kt @@ -1,14 +1,14 @@ package io.gitlab.arturbosch.detekt.generator.printer.defaultconfig +import io.github.detekt.tooling.out.YamlNode +import io.github.detekt.tooling.out.keyValue +import io.github.detekt.tooling.out.list +import io.github.detekt.tooling.out.node import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.generator.collection.Configuration import io.gitlab.arturbosch.detekt.generator.collection.Rule import io.gitlab.arturbosch.detekt.generator.collection.RuleSetPage import io.gitlab.arturbosch.detekt.generator.collection.RuleSetProvider -import io.gitlab.arturbosch.detekt.generator.out.YamlNode -import io.gitlab.arturbosch.detekt.generator.out.keyValue -import io.gitlab.arturbosch.detekt.generator.out.list -import io.gitlab.arturbosch.detekt.generator.out.node internal fun YamlNode.printRuleSetPage(ruleSetPage: RuleSetPage) { printRuleSet(ruleSetPage.ruleSet, ruleSetPage.rules) diff --git a/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinterTest.kt b/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinterTest.kt index 0cfa1fc5e4d..f23e83f275b 100644 --- a/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinterTest.kt +++ b/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinterTest.kt @@ -1,5 +1,6 @@ package io.gitlab.arturbosch.detekt.generator.printer.defaultconfig +import io.github.detekt.tooling.out.yaml import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.generator.collection.Active import io.gitlab.arturbosch.detekt.generator.collection.Configuration @@ -7,7 +8,6 @@ import io.gitlab.arturbosch.detekt.generator.collection.DefaultValue import io.gitlab.arturbosch.detekt.generator.collection.Inactive import io.gitlab.arturbosch.detekt.generator.collection.Rule import io.gitlab.arturbosch.detekt.generator.collection.RuleSetProvider -import io.gitlab.arturbosch.detekt.generator.out.yaml import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test diff --git a/detekt-report-md/build.gradle.kts b/detekt-report-md/build.gradle.kts index a1e2c791c39..c93355bfe97 100644 --- a/detekt-report-md/build.gradle.kts +++ b/detekt-report-md/build.gradle.kts @@ -5,10 +5,8 @@ plugins { dependencies { implementation(projects.detektMetrics) implementation(projects.detektApi) - implementation(projects.detektUtils) - implementation(projects.detektGenerator) + implementation(projects.detektTooling) - testImplementation(projects.detektTestUtils) testImplementation(testFixtures(projects.detektApi)) testImplementation(libs.mockk) testImplementation(libs.assertj) diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt index c2f2aab6b7c..50dbec02bd3 100644 --- a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt +++ b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt @@ -2,22 +2,22 @@ package io.github.detekt.report.md import io.github.detekt.metrics.ComplexityReportGenerator import io.github.detekt.psi.toUnifiedString +import io.github.detekt.tooling.out.MarkdownContent +import io.github.detekt.tooling.out.codeBlock +import io.github.detekt.tooling.out.emptyLine +import io.github.detekt.tooling.out.h1 +import io.github.detekt.tooling.out.h2 +import io.github.detekt.tooling.out.h3 +import io.github.detekt.tooling.out.item +import io.github.detekt.tooling.out.list +import io.github.detekt.tooling.out.markdown +import io.github.detekt.tooling.out.paragraph import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding import io.gitlab.arturbosch.detekt.api.OutputReport import io.gitlab.arturbosch.detekt.api.ProjectMetric import io.gitlab.arturbosch.detekt.api.SourceLocation import io.gitlab.arturbosch.detekt.api.internal.whichDetekt -import io.gitlab.arturbosch.detekt.generator.out.MarkdownContent -import io.gitlab.arturbosch.detekt.generator.out.codeBlock -import io.gitlab.arturbosch.detekt.generator.out.emptyLine -import io.gitlab.arturbosch.detekt.generator.out.h1 -import io.gitlab.arturbosch.detekt.generator.out.h2 -import io.gitlab.arturbosch.detekt.generator.out.h3 -import io.gitlab.arturbosch.detekt.generator.out.item -import io.gitlab.arturbosch.detekt.generator.out.list -import io.gitlab.arturbosch.detekt.generator.out.markdown -import io.gitlab.arturbosch.detekt.generator.out.paragraph import java.time.OffsetDateTime import java.time.ZoneOffset import java.time.format.DateTimeFormatter diff --git a/detekt-tooling/api/detekt-tooling.api b/detekt-tooling/api/detekt-tooling.api index 8cd9687dfbd..0f67edd4a78 100644 --- a/detekt-tooling/api/detekt-tooling.api +++ b/detekt-tooling/api/detekt-tooling.api @@ -338,3 +338,95 @@ public final class io/github/detekt/tooling/dsl/RulesSpecBuilder : io/github/det public final fun setRunPolicy (Lio/github/detekt/tooling/api/spec/RulesSpec$RunPolicy;)V } +public abstract class io/github/detekt/tooling/out/Markdown { + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun append (Ljava/lang/String;)V + public fun getContent ()Ljava/lang/String; + public fun setContent (Ljava/lang/String;)V +} + +public final class io/github/detekt/tooling/out/MarkdownContent : io/github/detekt/tooling/out/Markdown { + public fun ()V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lio/github/detekt/tooling/out/MarkdownContent; + public static synthetic fun copy$default (Lio/github/detekt/tooling/out/MarkdownContent;Ljava/lang/String;ILjava/lang/Object;)Lio/github/detekt/tooling/out/MarkdownContent; + public fun equals (Ljava/lang/Object;)Z + public fun getContent ()Ljava/lang/String; + public fun hashCode ()I + public fun setContent (Ljava/lang/String;)V + public fun toString ()Ljava/lang/String; +} + +public final class io/github/detekt/tooling/out/MarkdownKt { + public static final fun bold (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)Ljava/lang/String; + public static final fun code (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)Ljava/lang/String; + public static final fun codeBlock (Lio/github/detekt/tooling/out/MarkdownContent;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Ljava/lang/String; + public static synthetic fun codeBlock$default (Lio/github/detekt/tooling/out/MarkdownContent;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Ljava/lang/String; + public static final fun crossOut (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)Ljava/lang/String; + public static final fun description (Lio/github/detekt/tooling/out/MarkdownList;Lkotlin/jvm/functions/Function0;)V + public static final fun emptyLine (Lio/github/detekt/tooling/out/MarkdownContent;)V + public static final fun h1 (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V + public static final fun h2 (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V + public static final fun h3 (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V + public static final fun h4 (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V + public static final fun item (Lio/github/detekt/tooling/out/MarkdownList;Lkotlin/jvm/functions/Function0;)V + public static final fun list (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function1;)V + public static final fun markdown (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V + public static final fun markdown (Lkotlin/jvm/functions/Function1;)Ljava/lang/String; + public static final fun orderedList (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V + public static final fun paragraph (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V +} + +public final class io/github/detekt/tooling/out/MarkdownList : io/github/detekt/tooling/out/Markdown { + public fun ()V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lio/github/detekt/tooling/out/MarkdownList; + public static synthetic fun copy$default (Lio/github/detekt/tooling/out/MarkdownList;Ljava/lang/String;ILjava/lang/Object;)Lio/github/detekt/tooling/out/MarkdownList; + public fun equals (Ljava/lang/Object;)Z + public fun getContent ()Ljava/lang/String; + public fun hashCode ()I + public fun setContent (Ljava/lang/String;)V + public fun toString ()Ljava/lang/String; +} + +public abstract class io/github/detekt/tooling/out/YML { + public synthetic fun (ILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILjava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun append (Ljava/lang/String;)V + public final fun emptyLine ()V + public fun getContent ()Ljava/lang/String; + public fun getIndent ()I + public fun setContent (Ljava/lang/String;)V +} + +public final class io/github/detekt/tooling/out/YamlKt { + public static final fun keyValue (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V + public static synthetic fun keyValue$default (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V + public static final fun list (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Ljava/util/List;)V + public static final fun node (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static final fun times (ILkotlin/jvm/functions/Function0;)V + public static final fun yaml (Lio/github/detekt/tooling/out/YamlNode;Lkotlin/jvm/functions/Function0;)V + public static final fun yaml (Lkotlin/jvm/functions/Function1;)Ljava/lang/String; +} + +public final class io/github/detekt/tooling/out/YamlNode : io/github/detekt/tooling/out/YML { + public fun ()V + public fun (ILjava/lang/String;)V + public synthetic fun (ILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()I + public final fun component2 ()Ljava/lang/String; + public final fun copy (ILjava/lang/String;)Lio/github/detekt/tooling/out/YamlNode; + public static synthetic fun copy$default (Lio/github/detekt/tooling/out/YamlNode;ILjava/lang/String;ILjava/lang/Object;)Lio/github/detekt/tooling/out/YamlNode; + public fun equals (Ljava/lang/Object;)Z + public fun getContent ()Ljava/lang/String; + public fun getIndent ()I + public fun hashCode ()I + public fun setContent (Ljava/lang/String;)V + public fun toString ()Ljava/lang/String; +} + diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/out/Markdown.kt b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Markdown.kt similarity index 97% rename from detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/out/Markdown.kt rename to detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Markdown.kt index 5989a3ecd93..d9581f0f055 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/out/Markdown.kt +++ b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Markdown.kt @@ -1,6 +1,6 @@ @file:Suppress("detekt.TooManyFunctions") -package io.gitlab.arturbosch.detekt.generator.out +package io.github.detekt.tooling.out sealed class Markdown(open var content: String = "") { fun append(value: String) { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/out/Yaml.kt b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Yaml.kt similarity index 97% rename from detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/out/Yaml.kt rename to detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Yaml.kt index 6807507c7a9..5dd7888d093 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/out/Yaml.kt +++ b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Yaml.kt @@ -1,4 +1,4 @@ -package io.gitlab.arturbosch.detekt.generator.out +package io.github.detekt.tooling.out sealed class YML(open val indent: Int = 0, open var content: String = "") { fun append(value: String) { diff --git a/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/out/YamlSpec.kt b/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/out/YamlSpec.kt similarity index 97% rename from detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/out/YamlSpec.kt rename to detekt-tooling/src/test/kotlin/io/github/detekt/tooling/out/YamlSpec.kt index 839d0ba5250..1af6b24d0e4 100644 --- a/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/out/YamlSpec.kt +++ b/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/out/YamlSpec.kt @@ -1,4 +1,4 @@ -package io.gitlab.arturbosch.detekt.generator.out +package io.github.detekt.tooling.out import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Nested From d8af304f90f8c4715fa4d3638cdd594293298dd5 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Sun, 29 May 2022 18:36:36 +0300 Subject: [PATCH 5/9] Remove useless dependency in detekt-generator/build.gradle.kts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Brais GabĂ­n --- detekt-generator/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/detekt-generator/build.gradle.kts b/detekt-generator/build.gradle.kts index ef384a980c1..7279fc12cd5 100644 --- a/detekt-generator/build.gradle.kts +++ b/detekt-generator/build.gradle.kts @@ -15,7 +15,6 @@ dependencies { testImplementation(projects.detektCore) testImplementation(projects.detektTestUtils) - testImplementation(projects.detektTooling) testImplementation(libs.assertj) testImplementation(libs.reflections) } From 4935d7e37e03572399f5c1dd13692abdf166209a Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Sat, 4 Jun 2022 15:49:42 +0300 Subject: [PATCH 6/9] Fix errors after merge --- .../detekt/generator/collection/DefaultValue.kt | 8 ++++---- detekt-tooling/api/detekt-tooling.api | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/collection/DefaultValue.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/collection/DefaultValue.kt index f3b481b2371..01a0a66fd99 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/collection/DefaultValue.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/collection/DefaultValue.kt @@ -1,10 +1,10 @@ package io.gitlab.arturbosch.detekt.generator.collection +import io.github.detekt.tooling.out.YamlNode +import io.github.detekt.tooling.out.keyValue +import io.github.detekt.tooling.out.list +import io.github.detekt.tooling.out.listOfMaps import io.gitlab.arturbosch.detekt.api.ValuesWithReason -import io.gitlab.arturbosch.detekt.generator.out.YamlNode -import io.gitlab.arturbosch.detekt.generator.out.keyValue -import io.gitlab.arturbosch.detekt.generator.out.list -import io.gitlab.arturbosch.detekt.generator.out.listOfMaps sealed interface DefaultValue { diff --git a/detekt-tooling/api/detekt-tooling.api b/detekt-tooling/api/detekt-tooling.api index 0f67edd4a78..b8d6e522e49 100644 --- a/detekt-tooling/api/detekt-tooling.api +++ b/detekt-tooling/api/detekt-tooling.api @@ -408,6 +408,7 @@ public final class io/github/detekt/tooling/out/YamlKt { public static final fun keyValue (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V public static synthetic fun keyValue$default (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V public static final fun list (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Ljava/util/List;)V + public static final fun listOfMaps (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Ljava/util/List;)V public static final fun node (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V public static final fun times (ILkotlin/jvm/functions/Function0;)V public static final fun yaml (Lio/github/detekt/tooling/out/YamlNode;Lkotlin/jvm/functions/Function0;)V From 81ac7704ad398006b4fa074a61a2127220d7fd33 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Sun, 5 Jun 2022 14:13:18 +0300 Subject: [PATCH 7/9] Move markdown/yaml generators to 'detekt-utils' --- detekt-generator/build.gradle.kts | 2 +- .../detekt/generator/DetektPrinter.kt | 2 +- .../generator/collection/DefaultValue.kt | 8 +- .../printer/RuleConfigurationPrinter.kt | 16 ++-- .../detekt/generator/printer/RulePrinter.kt | 14 +-- .../generator/printer/RuleSetPagePrinter.kt | 4 +- .../printer/defaultconfig/ConfigPrinter.kt | 2 +- .../defaultconfig/RuleSetConfigPrinter.kt | 6 +- .../defaultconfig/RuleSetConfigPrinterTest.kt | 2 +- detekt-report-md/build.gradle.kts | 2 +- .../github/detekt/report/md/MdOutputReport.kt | 20 ++-- detekt-tooling/api/detekt-tooling.api | 93 ------------------- detekt-utils/build.gradle.kts | 4 + .../io/github/detekt/utils}/Markdown.kt | 2 +- .../kotlin/io/github/detekt/utils}/Yaml.kt | 2 +- .../io/github/detekt/utils}/YamlSpec.kt | 2 +- 16 files changed, 46 insertions(+), 135 deletions(-) rename {detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out => detekt-utils/src/main/kotlin/io/github/detekt/utils}/Markdown.kt (98%) rename {detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out => detekt-utils/src/main/kotlin/io/github/detekt/utils}/Yaml.kt (98%) rename {detekt-tooling/src/test/kotlin/io/github/detekt/tooling/out => detekt-utils/src/test/kotlin/io/github/detekt/utils}/YamlSpec.kt (99%) diff --git a/detekt-generator/build.gradle.kts b/detekt-generator/build.gradle.kts index 7279fc12cd5..e1a96393dcb 100644 --- a/detekt-generator/build.gradle.kts +++ b/detekt-generator/build.gradle.kts @@ -10,7 +10,7 @@ dependencies { implementation(projects.detektRulesEmpty) implementation(projects.detektFormatting) implementation(projects.detektCli) - implementation(projects.detektTooling) + implementation(projects.detektUtils) implementation(libs.jcommander) testImplementation(projects.detektCore) diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt index a72274ef062..a9dbb1e11f8 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/DetektPrinter.kt @@ -1,6 +1,6 @@ package io.gitlab.arturbosch.detekt.generator -import io.github.detekt.tooling.out.yaml +import io.github.detekt.utils.yaml import io.gitlab.arturbosch.detekt.generator.collection.RuleSetPage import io.gitlab.arturbosch.detekt.generator.out.MarkdownWriter import io.gitlab.arturbosch.detekt.generator.out.PropertiesWriter diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/collection/DefaultValue.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/collection/DefaultValue.kt index 01a0a66fd99..1fb9be76beb 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/collection/DefaultValue.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/collection/DefaultValue.kt @@ -1,9 +1,9 @@ package io.gitlab.arturbosch.detekt.generator.collection -import io.github.detekt.tooling.out.YamlNode -import io.github.detekt.tooling.out.keyValue -import io.github.detekt.tooling.out.list -import io.github.detekt.tooling.out.listOfMaps +import io.github.detekt.utils.YamlNode +import io.github.detekt.utils.keyValue +import io.github.detekt.utils.list +import io.github.detekt.utils.listOfMaps import io.gitlab.arturbosch.detekt.api.ValuesWithReason sealed interface DefaultValue { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleConfigurationPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleConfigurationPrinter.kt index 076087d88fe..6ac43d2411e 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleConfigurationPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleConfigurationPrinter.kt @@ -1,13 +1,13 @@ package io.gitlab.arturbosch.detekt.generator.printer -import io.github.detekt.tooling.out.bold -import io.github.detekt.tooling.out.code -import io.github.detekt.tooling.out.crossOut -import io.github.detekt.tooling.out.description -import io.github.detekt.tooling.out.h4 -import io.github.detekt.tooling.out.item -import io.github.detekt.tooling.out.list -import io.github.detekt.tooling.out.markdown +import io.github.detekt.utils.bold +import io.github.detekt.utils.code +import io.github.detekt.utils.crossOut +import io.github.detekt.utils.description +import io.github.detekt.utils.h4 +import io.github.detekt.utils.item +import io.github.detekt.utils.list +import io.github.detekt.utils.markdown import io.gitlab.arturbosch.detekt.generator.collection.Configuration internal object RuleConfigurationPrinter : DocumentationPrinter> { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RulePrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RulePrinter.kt index bf42dcf21fb..9c171d7f8e0 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RulePrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RulePrinter.kt @@ -1,12 +1,12 @@ package io.gitlab.arturbosch.detekt.generator.printer -import io.github.detekt.tooling.out.MarkdownContent -import io.github.detekt.tooling.out.bold -import io.github.detekt.tooling.out.codeBlock -import io.github.detekt.tooling.out.h3 -import io.github.detekt.tooling.out.h4 -import io.github.detekt.tooling.out.markdown -import io.github.detekt.tooling.out.paragraph +import io.github.detekt.utils.MarkdownContent +import io.github.detekt.utils.bold +import io.github.detekt.utils.codeBlock +import io.github.detekt.utils.h3 +import io.github.detekt.utils.h4 +import io.github.detekt.utils.markdown +import io.github.detekt.utils.paragraph import io.gitlab.arturbosch.detekt.generator.collection.Active import io.gitlab.arturbosch.detekt.generator.collection.Rule diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleSetPagePrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleSetPagePrinter.kt index d0d8de82679..46d0f003e5b 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleSetPagePrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/RuleSetPagePrinter.kt @@ -1,7 +1,7 @@ package io.gitlab.arturbosch.detekt.generator.printer -import io.github.detekt.tooling.out.markdown -import io.github.detekt.tooling.out.paragraph +import io.github.detekt.utils.markdown +import io.github.detekt.utils.paragraph import io.gitlab.arturbosch.detekt.generator.collection.RuleSetPage object RuleSetPagePrinter : DocumentationPrinter { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt index c89812defc4..7396b68efeb 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt @@ -1,6 +1,6 @@ package io.gitlab.arturbosch.detekt.generator.printer.defaultconfig -import io.github.detekt.tooling.out.yaml +import io.github.detekt.utils.yaml import io.gitlab.arturbosch.detekt.generator.collection.RuleSetPage import io.gitlab.arturbosch.detekt.generator.printer.DocumentationPrinter diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinter.kt index e4ded8427d4..e412afc64d9 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinter.kt @@ -1,8 +1,8 @@ package io.gitlab.arturbosch.detekt.generator.printer.defaultconfig -import io.github.detekt.tooling.out.YamlNode -import io.github.detekt.tooling.out.keyValue -import io.github.detekt.tooling.out.node +import io.github.detekt.utils.YamlNode +import io.github.detekt.utils.keyValue +import io.github.detekt.utils.node import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.generator.collection.Configuration import io.gitlab.arturbosch.detekt.generator.collection.Rule diff --git a/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinterTest.kt b/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinterTest.kt index 4a3beac7e47..ee016a857d5 100644 --- a/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinterTest.kt +++ b/detekt-generator/src/test/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/RuleSetConfigPrinterTest.kt @@ -1,6 +1,6 @@ package io.gitlab.arturbosch.detekt.generator.printer.defaultconfig -import io.github.detekt.tooling.out.yaml +import io.github.detekt.utils.yaml import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.valuesWithReason import io.gitlab.arturbosch.detekt.generator.collection.Active diff --git a/detekt-report-md/build.gradle.kts b/detekt-report-md/build.gradle.kts index c93355bfe97..1f7df0f6ae6 100644 --- a/detekt-report-md/build.gradle.kts +++ b/detekt-report-md/build.gradle.kts @@ -5,7 +5,7 @@ plugins { dependencies { implementation(projects.detektMetrics) implementation(projects.detektApi) - implementation(projects.detektTooling) + implementation(projects.detektUtils) testImplementation(testFixtures(projects.detektApi)) testImplementation(libs.mockk) diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt index 50dbec02bd3..45fed53e3c0 100644 --- a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt +++ b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt @@ -2,16 +2,16 @@ package io.github.detekt.report.md import io.github.detekt.metrics.ComplexityReportGenerator import io.github.detekt.psi.toUnifiedString -import io.github.detekt.tooling.out.MarkdownContent -import io.github.detekt.tooling.out.codeBlock -import io.github.detekt.tooling.out.emptyLine -import io.github.detekt.tooling.out.h1 -import io.github.detekt.tooling.out.h2 -import io.github.detekt.tooling.out.h3 -import io.github.detekt.tooling.out.item -import io.github.detekt.tooling.out.list -import io.github.detekt.tooling.out.markdown -import io.github.detekt.tooling.out.paragraph +import io.github.detekt.utils.MarkdownContent +import io.github.detekt.utils.codeBlock +import io.github.detekt.utils.emptyLine +import io.github.detekt.utils.h1 +import io.github.detekt.utils.h2 +import io.github.detekt.utils.h3 +import io.github.detekt.utils.item +import io.github.detekt.utils.list +import io.github.detekt.utils.markdown +import io.github.detekt.utils.paragraph import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding import io.gitlab.arturbosch.detekt.api.OutputReport diff --git a/detekt-tooling/api/detekt-tooling.api b/detekt-tooling/api/detekt-tooling.api index b8d6e522e49..8cd9687dfbd 100644 --- a/detekt-tooling/api/detekt-tooling.api +++ b/detekt-tooling/api/detekt-tooling.api @@ -338,96 +338,3 @@ public final class io/github/detekt/tooling/dsl/RulesSpecBuilder : io/github/det public final fun setRunPolicy (Lio/github/detekt/tooling/api/spec/RulesSpec$RunPolicy;)V } -public abstract class io/github/detekt/tooling/out/Markdown { - public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun append (Ljava/lang/String;)V - public fun getContent ()Ljava/lang/String; - public fun setContent (Ljava/lang/String;)V -} - -public final class io/github/detekt/tooling/out/MarkdownContent : io/github/detekt/tooling/out/Markdown { - public fun ()V - public fun (Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lio/github/detekt/tooling/out/MarkdownContent; - public static synthetic fun copy$default (Lio/github/detekt/tooling/out/MarkdownContent;Ljava/lang/String;ILjava/lang/Object;)Lio/github/detekt/tooling/out/MarkdownContent; - public fun equals (Ljava/lang/Object;)Z - public fun getContent ()Ljava/lang/String; - public fun hashCode ()I - public fun setContent (Ljava/lang/String;)V - public fun toString ()Ljava/lang/String; -} - -public final class io/github/detekt/tooling/out/MarkdownKt { - public static final fun bold (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)Ljava/lang/String; - public static final fun code (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)Ljava/lang/String; - public static final fun codeBlock (Lio/github/detekt/tooling/out/MarkdownContent;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Ljava/lang/String; - public static synthetic fun codeBlock$default (Lio/github/detekt/tooling/out/MarkdownContent;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Ljava/lang/String; - public static final fun crossOut (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)Ljava/lang/String; - public static final fun description (Lio/github/detekt/tooling/out/MarkdownList;Lkotlin/jvm/functions/Function0;)V - public static final fun emptyLine (Lio/github/detekt/tooling/out/MarkdownContent;)V - public static final fun h1 (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V - public static final fun h2 (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V - public static final fun h3 (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V - public static final fun h4 (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V - public static final fun item (Lio/github/detekt/tooling/out/MarkdownList;Lkotlin/jvm/functions/Function0;)V - public static final fun list (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function1;)V - public static final fun markdown (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V - public static final fun markdown (Lkotlin/jvm/functions/Function1;)Ljava/lang/String; - public static final fun orderedList (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V - public static final fun paragraph (Lio/github/detekt/tooling/out/MarkdownContent;Lkotlin/jvm/functions/Function0;)V -} - -public final class io/github/detekt/tooling/out/MarkdownList : io/github/detekt/tooling/out/Markdown { - public fun ()V - public fun (Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lio/github/detekt/tooling/out/MarkdownList; - public static synthetic fun copy$default (Lio/github/detekt/tooling/out/MarkdownList;Ljava/lang/String;ILjava/lang/Object;)Lio/github/detekt/tooling/out/MarkdownList; - public fun equals (Ljava/lang/Object;)Z - public fun getContent ()Ljava/lang/String; - public fun hashCode ()I - public fun setContent (Ljava/lang/String;)V - public fun toString ()Ljava/lang/String; -} - -public abstract class io/github/detekt/tooling/out/YML { - public synthetic fun (ILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (ILjava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun append (Ljava/lang/String;)V - public final fun emptyLine ()V - public fun getContent ()Ljava/lang/String; - public fun getIndent ()I - public fun setContent (Ljava/lang/String;)V -} - -public final class io/github/detekt/tooling/out/YamlKt { - public static final fun keyValue (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V - public static synthetic fun keyValue$default (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V - public static final fun list (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Ljava/util/List;)V - public static final fun listOfMaps (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Ljava/util/List;)V - public static final fun node (Lio/github/detekt/tooling/out/YamlNode;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public static final fun times (ILkotlin/jvm/functions/Function0;)V - public static final fun yaml (Lio/github/detekt/tooling/out/YamlNode;Lkotlin/jvm/functions/Function0;)V - public static final fun yaml (Lkotlin/jvm/functions/Function1;)Ljava/lang/String; -} - -public final class io/github/detekt/tooling/out/YamlNode : io/github/detekt/tooling/out/YML { - public fun ()V - public fun (ILjava/lang/String;)V - public synthetic fun (ILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()I - public final fun component2 ()Ljava/lang/String; - public final fun copy (ILjava/lang/String;)Lio/github/detekt/tooling/out/YamlNode; - public static synthetic fun copy$default (Lio/github/detekt/tooling/out/YamlNode;ILjava/lang/String;ILjava/lang/Object;)Lio/github/detekt/tooling/out/YamlNode; - public fun equals (Ljava/lang/Object;)Z - public fun getContent ()Ljava/lang/String; - public fun getIndent ()I - public fun hashCode ()I - public fun setContent (Ljava/lang/String;)V - public fun toString ()Ljava/lang/String; -} - diff --git a/detekt-utils/build.gradle.kts b/detekt-utils/build.gradle.kts index ed0de36f81c..1598ef9274c 100644 --- a/detekt-utils/build.gradle.kts +++ b/detekt-utils/build.gradle.kts @@ -1,3 +1,7 @@ plugins { id("module") } + +dependencies { + testImplementation(libs.assertj) +} diff --git a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Markdown.kt b/detekt-utils/src/main/kotlin/io/github/detekt/utils/Markdown.kt similarity index 98% rename from detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Markdown.kt rename to detekt-utils/src/main/kotlin/io/github/detekt/utils/Markdown.kt index d9581f0f055..a6879f4f6cf 100644 --- a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Markdown.kt +++ b/detekt-utils/src/main/kotlin/io/github/detekt/utils/Markdown.kt @@ -1,6 +1,6 @@ @file:Suppress("detekt.TooManyFunctions") -package io.github.detekt.tooling.out +package io.github.detekt.utils sealed class Markdown(open var content: String = "") { fun append(value: String) { diff --git a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Yaml.kt b/detekt-utils/src/main/kotlin/io/github/detekt/utils/Yaml.kt similarity index 98% rename from detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Yaml.kt rename to detekt-utils/src/main/kotlin/io/github/detekt/utils/Yaml.kt index 00a98f078f2..92d3ab2c200 100644 --- a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/out/Yaml.kt +++ b/detekt-utils/src/main/kotlin/io/github/detekt/utils/Yaml.kt @@ -1,4 +1,4 @@ -package io.github.detekt.tooling.out +package io.github.detekt.utils sealed class YML(open val indent: Int = 0, open var content: String = "") { fun append(value: String) { diff --git a/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/out/YamlSpec.kt b/detekt-utils/src/test/kotlin/io/github/detekt/utils/YamlSpec.kt similarity index 99% rename from detekt-tooling/src/test/kotlin/io/github/detekt/tooling/out/YamlSpec.kt rename to detekt-utils/src/test/kotlin/io/github/detekt/utils/YamlSpec.kt index 4c0864d39a8..fcae48f37e3 100644 --- a/detekt-tooling/src/test/kotlin/io/github/detekt/tooling/out/YamlSpec.kt +++ b/detekt-utils/src/test/kotlin/io/github/detekt/utils/YamlSpec.kt @@ -1,4 +1,4 @@ -package io.github.detekt.tooling.out +package io.github.detekt.utils import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Nested From a7df4d38ea759b395f7ee578aa50487323c94cbf Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Sun, 5 Jun 2022 17:34:27 +0300 Subject: [PATCH 8/9] Fix Md service package name --- .../services/io.gitlab.arturbosch.detekt.api.OutputReport | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detekt-report-md/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.OutputReport b/detekt-report-md/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.OutputReport index fd8718df3bf..83fe5d76a71 100644 --- a/detekt-report-md/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.OutputReport +++ b/detekt-report-md/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.OutputReport @@ -1 +1 @@ -io.github.detekt.report.txt.MdOutputReport +io.github.detekt.report.md.MdOutputReport From 93c1d89f32937c23ca8a5c3f97c2997261dbb555 Mon Sep 17 00:00:00 2001 From: "Vitaly V. Pinchuk" Date: Sun, 5 Jun 2022 18:03:50 +0300 Subject: [PATCH 9/9] Add MD-report to 'reporting' package --- detekt-core/build.gradle.kts | 1 + .../arturbosch/detekt/core/reporting/Reporting.kt | 2 ++ .../src/main/resources/default-detekt-config.yml | 1 + .../detekt/core/reporting/OutputFacadeSpec.kt | 6 +++++- .../detekt/core/reporting/OutputReportsSpec.kt | 11 ++++++++++- .../generator/printer/defaultconfig/ConfigPrinter.kt | 1 + 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/detekt-core/build.gradle.kts b/detekt-core/build.gradle.kts index 0d92502f418..19e1355f421 100644 --- a/detekt-core/build.gradle.kts +++ b/detekt-core/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { implementation(projects.detektMetrics) implementation(projects.detektPsiUtils) implementation(projects.detektReportHtml) + implementation(projects.detektReportMd) implementation(projects.detektReportTxt) implementation(projects.detektReportXml) implementation(projects.detektReportSarif) diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/Reporting.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/Reporting.kt index f353256ce58..9be5d9d9cc0 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/Reporting.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/Reporting.kt @@ -1,6 +1,7 @@ package io.gitlab.arturbosch.detekt.core.reporting import io.github.detekt.report.html.HtmlOutputReport +import io.github.detekt.report.md.MdOutputReport import io.github.detekt.report.sarif.SarifOutputReport import io.github.detekt.report.txt.TxtOutputReport import io.github.detekt.report.xml.XmlOutputReport @@ -18,6 +19,7 @@ internal fun defaultReportMapping(reportId: String) = when (reportId) { XmlOutputReport::class.java.simpleName -> "xml" HtmlOutputReport::class.java.simpleName -> "html" SarifOutputReport::class.java.simpleName -> "sarif" + MdOutputReport::class.java.simpleName -> "md" else -> reportId } diff --git a/detekt-core/src/main/resources/default-detekt-config.yml b/detekt-core/src/main/resources/default-detekt-config.yml index a5647513d66..f7da171eeb3 100644 --- a/detekt-core/src/main/resources/default-detekt-config.yml +++ b/detekt-core/src/main/resources/default-detekt-config.yml @@ -46,6 +46,7 @@ output-reports: # - 'TxtOutputReport' # - 'XmlOutputReport' # - 'HtmlOutputReport' + # - 'MdOutputReport' comments: active: true diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputFacadeSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputFacadeSpec.kt index 0562b374dc6..2ca6dbad183 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputFacadeSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputFacadeSpec.kt @@ -1,6 +1,7 @@ package io.gitlab.arturbosch.detekt.core.reporting import io.github.detekt.report.html.HtmlOutputReport +import io.github.detekt.report.md.MdOutputReport import io.github.detekt.report.txt.TxtOutputReport import io.github.detekt.report.xml.XmlOutputReport import io.github.detekt.test.utils.StringPrintStream @@ -24,6 +25,7 @@ class OutputFacadeSpec { val plainOutputPath = createTempFileForTest("detekt", ".txt") val htmlOutputPath = createTempFileForTest("detekt", ".html") val xmlOutputPath = createTempFileForTest("detekt", ".xml") + val mdOutputPath = createTempFileForTest("detekt", ".md") val spec = createNullLoggingSpec { project { @@ -33,6 +35,7 @@ class OutputFacadeSpec { report { "html" to htmlOutputPath } report { "txt" to plainOutputPath } report { "xml" to xmlOutputPath } + report { "md" to mdOutputPath } } logging { outputChannel = printStream @@ -44,7 +47,8 @@ class OutputFacadeSpec { assertThat(printStream.toString()).contains( "Successfully generated ${TxtOutputReport().name} at $plainOutputPath", "Successfully generated ${XmlOutputReport().name} at $xmlOutputPath", - "Successfully generated ${HtmlOutputReport().name} at $htmlOutputPath" + "Successfully generated ${HtmlOutputReport().name} at $htmlOutputPath", + "Successfully generated ${MdOutputReport().name} at $mdOutputPath" ) } } diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputReportsSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputReportsSpec.kt index 4f8aace147f..7fdbbf25f20 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputReportsSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputReportsSpec.kt @@ -1,6 +1,7 @@ package io.gitlab.arturbosch.detekt.core.reporting import io.github.detekt.report.html.HtmlOutputReport +import io.github.detekt.report.md.MdOutputReport import io.github.detekt.report.txt.TxtOutputReport import io.github.detekt.report.xml.XmlOutputReport import io.github.detekt.test.utils.resourceAsPath @@ -28,11 +29,12 @@ class OutputReportsSpec { report { "txt" to Paths.get("/tmp/path2") } report { reportUnderTest to Paths.get("/tmp/path3") } report { "html" to Paths.get("D:_Gradle\\xxx\\xxx\\build\\reports\\detekt\\detekt.html") } + report { "md" to Paths.get("/tmp/path4") } }.build().reports.toList() @Test fun `should parse multiple report entries`() { - assertThat(reports).hasSize(4) + assertThat(reports).hasSize(5) } @Test @@ -66,6 +68,13 @@ class OutputReportsSpec { ) } + @Test + fun `it should properly parse MD report entry`() { + val mdRepot = reports[4] + assertThat(mdRepot.type).isEqualTo(defaultReportMapping(MdOutputReport::class.java.simpleName)) + assertThat(mdRepot.path).isEqualTo(Paths.get("/tmp/path4")) + } + @Nested inner class `default report ids` { diff --git a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt index 7396b68efeb..9131be47088 100644 --- a/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt +++ b/detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/defaultconfig/ConfigPrinter.kt @@ -81,5 +81,6 @@ object ConfigPrinter : DocumentationPrinter> { # - 'TxtOutputReport' # - 'XmlOutputReport' # - 'HtmlOutputReport' + # - 'MdOutputReport' """.trimIndent() }