Skip to content

Commit

Permalink
Updating to Projektor Gradle plugin 9.0.0 and ktlint 1.2.1
Browse files Browse the repository at this point in the history
  • Loading branch information
craigatk committed Apr 12, 2024
1 parent 8a9e5d3 commit aa808e4
Show file tree
Hide file tree
Showing 294 changed files with 5,245 additions and 3,967 deletions.
5 changes: 5 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[*.{kt,kts}]
ktlint_code_style = ktlint_official
ktlint_standard_no-wildcard-imports = disabled
ktlint_standard_max-line-length = disabled

4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ buildscript {

dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jlleitschuh.gradle:ktlint-gradle:11.6.1"
classpath "org.jlleitschuh.gradle:ktlint-gradle:12.1.0"
}
}

plugins {
id "dev.projektor.publish" version "8.7.0"
id "dev.projektor.publish" version "9.0.0"
id "com.atkinsondev.opentelemetry-build" version "1.10.0"
id 'com.github.psxpaul.execfork' version '0.2.2' apply false
}
Expand Down
3 changes: 1 addition & 2 deletions gradle/kotlin.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ test {
}

ktlint {
version = "0.42.1"
disabledRules = ["no-wildcard-imports"]
version = "1.2.1"
reporters {
reporter "plain?group_by_file"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package projektor.notification.badge

enum class BuildLabel(val fillColor: String) {
PASS("#4c1"),
FAIL("#e05d44");
FAIL("#e05d44"),
;

companion object {
fun of(testRunPassed: Boolean): BuildLabel =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ enum class CoverageLevel(val fillColor: String) {
GOOD("#4c1"),
OK("#dfb317"),
POOR("#fe7d37"),
TERRIBLE("#e05d44");
TERRIBLE("#e05d44"),
;

companion object {
fun of(coveredPercentage: BigDecimal): CoverageLevel =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,17 @@ class SvgCoverageBadgeCreator(templateFileName: String = "coverage.template.svg"
val fillColor = coverageLevel.fillColor
val roundedCoveredPercentage = coveredPercentage.setScale(0, RoundingMode.HALF_UP)

val svgText = svgTemplate
.replace("{coveredPercentage}", roundedCoveredPercentage.toPlainString())
.replace("{fillColor}", fillColor)
val svgText =
svgTemplate
.replace("{coveredPercentage}", roundedCoveredPercentage.toPlainString())
.replace("{fillColor}", fillColor)

return svgText
}

private fun loadTextFromFile(filename: String) = javaClass
.getResourceAsStream("/$filename")
.bufferedReader()
.readText()
private fun loadTextFromFile(filename: String) =
javaClass
.getResourceAsStream("/$filename")
.bufferedReader()
.readText()
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,24 @@ class SvgTestRunBadgeCreator(templateFileName: String = "test_run.template.svg")
val buildLabel = BuildLabel.of(testRunPassed)
val fillColor = buildLabel.fillColor

val displayText = if (testRunPassed) {
"passing"
} else {
"failing"
}
val displayText =
if (testRunPassed) {
"passing"
} else {
"failing"
}

val svgText = svgTemplate
.replace("{displayText}", displayText)
.replace("{fillColor}", fillColor)
val svgText =
svgTemplate
.replace("{displayText}", displayText)
.replace("{fillColor}", fillColor)

return svgText
}

private fun loadTextFromFile(filename: String) = javaClass
.getResourceAsStream("/$filename")
.bufferedReader()
.readText()
private fun loadTextFromFile(filename: String) =
javaClass
.getResourceAsStream("/$filename")
.bufferedReader()
.readText()
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@ class SvgCoverageBadgeCreatorSpec : StringSpec() {
row(BigDecimal("90.25"), "90%", CoverageLevel.GOOD.fillColor),
row(BigDecimal("95.75"), "96%", CoverageLevel.GOOD.fillColor),
row(BigDecimal("100.00"), "100%", CoverageLevel.GOOD.fillColor),
row(BigDecimal("0.00"), "0%", CoverageLevel.TERRIBLE.fillColor)
row(BigDecimal("0.00"), "0%", CoverageLevel.TERRIBLE.fillColor),
) { coveredPercentage, expectedBadgePercentage, expectedFillColor ->
"should create coverage badge for covered percentage $coveredPercentage" {
val svgCoverageBadgeCreator = SvgCoverageBadgeCreator("coverage.template.test")

val badge = svgCoverageBadgeCreator.createBadge(coveredPercentage)

expectThat(badge).isEqualTo("<coverage><percentage>$expectedBadgePercentage</percentage><fill>$expectedFillColor</fill></coverage>")
expectThat(
badge,
).isEqualTo("<coverage><percentage>$expectedBadgePercentage</percentage><fill>$expectedFillColor</fill></coverage>")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ package projektor.notification.github.auth
data class JwtTokenConfig(
val gitHubAppId: String,
val pemContents: String,
val ttlMillis: Long
val ttlMillis: Long,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ package projektor.notification.github.auth
import java.util.Base64

object PrivateKeyEncoder {
fun base64Encode(keyContents: String): String =
Base64.getEncoder().encodeToString(keyContents.toByteArray())
fun base64Encode(keyContents: String): String = Base64.getEncoder().encodeToString(keyContents.toByteArray())

fun base64Decode(encodedKeyContents: String): String =
String(Base64.getDecoder().decode(encodedKeyContents))
fun base64Decode(encodedKeyContents: String): String = String(Base64.getDecoder().decode(encodedKeyContents))
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,38 +11,55 @@ import projektor.notification.github.auth.JwtProvider

class GitHubCommentClient(
private val clientConfig: GitHubClientConfig,
private val jwtProvider: JwtProvider
private val jwtProvider: JwtProvider,
) {
private val logger = LoggerFactory.getLogger(javaClass.canonicalName)

fun addComment(repository: GHRepository, issueId: Int, commentText: String) {
fun addComment(
repository: GHRepository,
issueId: Int,
commentText: String,
) {
val ghIssue = repository.getIssue(issueId)
ghIssue.comment(commentText)
}

fun findCommentWithText(repository: GHRepository, issueId: Int, commentText: String): GHIssueComment? {
fun findCommentWithText(
repository: GHRepository,
issueId: Int,
commentText: String,
): GHIssueComment? {
val ghIssue = repository.getIssue(issueId)

val comments = ghIssue.listComments().toList()

return comments.find { it.body.contains(commentText) }
}

fun updateComment(comment: GHIssueComment, newText: String) {
fun updateComment(
comment: GHIssueComment,
newText: String,
) {
comment.update(newText)
}

fun findOpenPullRequests(repository: GHRepository, branchName: String?, commitSha: String?): Int? {
val pullRequestsResults = repository
.queryPullRequests()
.state(GHIssueState.OPEN)
.list()
.toList()
fun findOpenPullRequests(
repository: GHRepository,
branchName: String?,
commitSha: String?,
): Int? {
val pullRequestsResults =
repository
.queryPullRequests()
.state(GHIssueState.OPEN)
.list()
.toList()

val pullRequestForBranch = branchName?.let {
pullRequestsResults
.firstOrNull { it.head.ref.endsWith(branchName) }
}
val pullRequestForBranch =
branchName?.let {
pullRequestsResults
.firstOrNull { it.head.ref.endsWith(branchName) }
}

return if (pullRequestForBranch != null) {
pullRequestForBranch.number
Expand All @@ -53,21 +70,26 @@ class GitHubCommentClient(
}
}

fun getRepository(orgName: String, repoName: String): GHRepository? {
fun getRepository(
orgName: String,
repoName: String,
): GHRepository? {
val jwtToken = jwtProvider.createJWT()

val gitHub = GitHubBuilder()
.withJwtToken(jwtToken)
.withEndpoint(this.clientConfig.gitHubApiUrl)
.build()
val gitHub =
GitHubBuilder()
.withJwtToken(jwtToken)
.withEndpoint(this.clientConfig.gitHubApiUrl)
.build()
val gitHubApp = gitHub.app
return try {
val appInstallation = gitHubApp.getInstallationByRepository(orgName, repoName)
val appInstallationToken = appInstallation.createToken().create()
val githubAuthAsInst = GitHubBuilder()
.withAppInstallationToken(appInstallationToken.token)
.withEndpoint(this.clientConfig.gitHubApiUrl)
.build()
val githubAuthAsInst =
GitHubBuilder()
.withAppInstallationToken(appInstallationToken.token)
.withEndpoint(this.clientConfig.gitHubApiUrl)
.build()
val repository = githubAuthAsInst.getRepository("$orgName/$repoName")

repository
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@ import java.math.RoundingMode
import java.time.format.DateTimeFormatter

object GitHubCommentCreator {
const val headerText = "Projektor reports"
const val HEADER_TEXT = "Projektor reports"

private val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm a")

fun appendComment(existingComment: String, report: ReportCommentData): String {
fun appendComment(
existingComment: String,
report: ReportCommentData,
): String {
return existingComment + "\n" + createReportTableRow(report)
}

Expand All @@ -19,21 +22,37 @@ object GitHubCommentCreator {

private fun createReportTableHeader(): String {
return """
**$headerText**
**$HEADER_TEXT**
| Projektor report | Result | Tests executed | Coverage | Project | Date |
| ---------------- | ------ | -------------- | -------- | ------- | ---- |
""".trimIndent().trim()
""".trimIndent().trim()
}

private fun createReportTableRow(report: ReportCommentData): String {
val resultText = if (report.passed) "Passed" else "Failed"

return "| [Projektor report](${createReportLink(report, "")}) | $resultText | ${createTestsCellValue(report)} | ${createCoverageCellValue(report)} | ${report.project ?: ""} | ${dateFormatter.format(report.createdDate)} UTC |"
return "| [Projektor report](${createReportLink(
report,
"",
)}) | $resultText | ${createTestsCellValue(
report,
)} | ${createCoverageCellValue(report)} | ${report.project ?: ""} | ${dateFormatter.format(report.createdDate)} UTC |"
}

private fun createReportLink(report: ReportCommentData, uri: String): String {
val baseUrl = if (report.projektorServerBaseUrl.endsWith("/")) report.projektorServerBaseUrl else "${report.projektorServerBaseUrl}/"
private fun createReportLink(
report: ReportCommentData,
uri: String,
): String {
val baseUrl =
if (report.projektorServerBaseUrl.endsWith(
"/",
)
) {
report.projektorServerBaseUrl
} else {
"${report.projektorServerBaseUrl}/"
}

return "${baseUrl}tests/${report.publicId}/$uri"
}
Expand All @@ -44,7 +63,10 @@ object GitHubCommentCreator {
return when {
!performanceData.isNullOrEmpty() -> "[${createPerformanceCellValue(performanceData)}](${createReportLink(report, "")})"
report.passed -> "[${report.totalTestCount} total](${createReportLink(report, "all")})"
else -> "[${report.failedTestCount} failed](${createReportLink(report, "failed")}) / [${report.totalTestCount} total](${createReportLink(report, "all")})"
else -> "[${report.failedTestCount} failed](${createReportLink(
report,
"failed",
)}) / [${report.totalTestCount} total](${createReportLink(report, "all")})"
}
}

Expand All @@ -58,29 +80,34 @@ object GitHubCommentCreator {
}

private fun createPerformanceRow(performanceData: ReportCommentPerformanceData) =
"p95: ${performanceData.p95.setScale(0, RoundingMode.HALF_UP)} ms, RPS: ${performanceData.requestsPerSecond.setScale(0, RoundingMode.HALF_UP)}"
"p95: ${performanceData.p95.setScale(
0,
RoundingMode.HALF_UP,
)} ms, RPS: ${performanceData.requestsPerSecond.setScale(0, RoundingMode.HALF_UP)}"

private fun createCoverageCellValue(report: ReportCommentData): String {
val coverage = report.coverage

return if (coverage != null) {
val (lineCoveredPercentage, lineCoverageDelta) = report.coverage

val deltaString = if (lineCoverageDelta != null) {
when {
lineCoverageDelta > BigDecimal.ZERO -> "(+$lineCoverageDelta%)"
lineCoverageDelta < BigDecimal.ZERO -> "($lineCoverageDelta%)"
else -> null
val deltaString =
if (lineCoverageDelta != null) {
when {
lineCoverageDelta > BigDecimal.ZERO -> "(+$lineCoverageDelta%)"
lineCoverageDelta < BigDecimal.ZERO -> "($lineCoverageDelta%)"
else -> null
}
} else {
null
}
} else {
null
}

val displayValue = if (deltaString != null) {
"$lineCoveredPercentage% $deltaString"
} else {
"$lineCoveredPercentage%"
}
val displayValue =
if (deltaString != null) {
"$lineCoveredPercentage% $deltaString"
} else {
"$lineCoveredPercentage%"
}

"[$displayValue](${createReportLink(report, "coverage")})"
} else {
Expand Down
Loading

0 comments on commit aa808e4

Please sign in to comment.