Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/pavelkorolevxyz/danger-detekt-kotlin
Danger-kotlin plugin to parse and report Detekt violations
https://github.com/pavelkorolevxyz/danger-detekt-kotlin
danger detekt kotlin
Last synced: 3 months ago
JSON representation
Danger-kotlin plugin to parse and report Detekt violations
- Host: GitHub
- URL: https://github.com/pavelkorolevxyz/danger-detekt-kotlin
- Owner: pavelkorolevxyz
- License: apache-2.0
- Created: 2022-06-25T08:18:25.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-02-14T08:25:11.000Z (almost 2 years ago)
- Last Synced: 2024-08-03T14:07:45.204Z (6 months ago)
- Topics: danger, detekt, kotlin
- Language: Kotlin
- Homepage: https://pavelkorolev.xyz/blog/2022-06-29-detekt-danger-custom/
- Size: 348 KB
- Stars: 14
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-danger - danger-detekt-kotlin - Parse and report detekt outputs in customizable manner (Plugins / Kotlin (danger-kotlin))
README
[ ![Maven Central](https://maven-badges.herokuapp.com/maven-central/xyz.pavelkorolev.danger.detekt/plugin/badge.svg)](https://maven-badges.herokuapp.com/maven-central/xyz.pavelkorolev.danger.detekt/plugin)
# Detekt Plugin for Danger Kotlin
Plugin for [danger/kotlin](https://github.com/danger/kotlin) which helps to parse and report [detekt](https://github.com/detekt/detekt) violations from its Checkstyle XML or SARIF report files.
## How it looks like
Depends on you. We constrained only with **danger/kotlin** file and line appearance, and repository hosting (e.g. **GitHub**) markdown capabilities. Anything else is customizable.
### Like this
### With inline comments
### Or this
## Usage
`Dangerfile.df.kts` is the main configuration file of any **danger/kotlin** setup. To use this plugin you should add it as a dependency on top of this file and call register.
Latest version could be found in [Maven Central](https://search.maven.org/artifact/xyz.pavelkorolev.danger.detekt/plugin)
```kotlin
@file:DependsOn("xyz.pavelkorolev.danger.detekt:plugin:x.y.z")register.plugin(DetektPlugin)
```### Basic
#### Single file parse and report
This does what it says. If you have one detekt report and don't want any customization - that's probably your choice.
```kotlin
DetektPlugin.parseAndReport(reportFile)
```#### Multiple files parse and report
Actually parameters of all `parse` functions are `varargs`, so you could provide it as many report files as you want.
```kotlin
DetektPlugin.parseAndReport(reportFile1, reportFile2, reportFile3)
```or
```kotlin
val files: Array = findReportFilesByYourself()
DetektPlugin.parseAndReport(*files)
```### Parse
You could also parse files without immediate reporting.
```kotlin
val report: DetektReport = DetektPlugin.parse(files)
```This `DetektReport` contains everything from parsed detekt reports, so it could be useful you want to check something before actual reporting.
### Report
You could also report it like this
```kotlin
DetektPlugin.report(report)
```Please note, in order to make danger report files correctly you should configure detekt to return paths relative to working directory.
```kotlin
detekt {
basePath = rootDir.absolutePath
}
```## Full example
```kotlin
@file:DependsOn("xyz.pavelkorolev.danger.detekt:plugin:x.y.z")import systems.danger.kotlin.*
import systems.danger.kotlin.models.github.*
import xyz.pavelkorolev.danger.detekt.DetektPlugin
import java.io.Fileregister.plugin(DetektPlugin)
danger(args) {
warnDetekt()
}fun warnDetekt() {
val file = File("build/reports/detekt/report.xml") // or report.sarif
if (!file.exists()) {
warn(
"🙈 No detekt report found",
)
return
}
with(DetektPlugin) {
val report = parse(file)
val count = report.count
if (count == 0) {
message("👏👏👏 Good job! Detekt found no violations here!")
return
}
fail(
"🙁 Detekt violations found: **${report.count}**.\n" +
"Please fix them to proceed. We have zero-warning policy"
)
report(report)
}
}
```## Customization
Functions `DetektPlugin.report` and `DetektPlugin.parseAndReport` have `reporter: DetektViolationReporter` parameter, which is in fact a functional interface with `report(violation: DetektViolation)` function.
By implementing this you could customize reporting logic and appearance as you want.
By default, there is [DefaultDetektViolationReporter](https://github.com/pavelkorolevxyz/danger-detekt-kotlin/blob/4bb723c900845d32db56c7209ef413ea622961f3/plugin/src/main/kotlin/xyz/pavelkorolev/danger/detekt/DetektViolationReporter.kt#L31) which has its own opinionated way to create messages and respect violations severities.
`DefaultDetektViolationReporter` uses inline comments if file and line provided for error. If you want to use only global report without inline comments then use `DefaultDetektViolationReporter(context, isInlineEnabled = false)` instead.
### Implementation
Let's say you want to send everything found into fail table with emojis at the end. Write it like this.
```kotlin
class FailReporter(private val context: DangerContext) : DetektViolationReporter {override fun report(violation: DetektViolation) {
val message = violation.message ?: return
context.fail("$message 💥💥💥")
}
}
```And use it like this
```kotlin
DetektPlugin.report(report, reporter = FailReporter(context))
```Or you could implement the same as inline reporter thanks to its functional interface nature like so.
```kotlin
plugin.report(report) { violation ->
violation.message?.let(context::fail)
}
```## Ideas
- You may want to send some warning if there are no detekt reports at all. Maybe something went wrong and detekt didn't even run for this build.
- You may want to check violations count before reporting. If nothing found say "Good job" to PR author. Be grateful for such moments, appreciate your colleagues work.
- You may want to check violations count to NOT send huge comments into PR. GitHub for example has a limitation on comment size. If there are many violations then Danger will fail sending them. Set a reasonable limit and print some generic message instead.
- You even may want to check if some violations reported in someone's module or directory to mention them automatically.
- Add a ton of emojis. Everyone loves them. Just kidding 😁. Or not 🤔.## Side notes
This plugin is heavily inspired by [AckeeCZ/danger-kotlin-detekt](https://github.com/AckeeCZ/danger-kotlin-detekt) which is great, but lacks of customization and preliminary checks capabilities.