From 8f843c18963b4eb0d50e6c0ba26650da3236f037 Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Fri, 24 Oct 2025 09:38:18 -0500 Subject: [PATCH] feat: implement changelog markdown formatter + tests --- .../aloussase/changelog/ChangelogEntry.kt | 13 +++- .../aloussase/changelog/ChangelogPlugin.kt | 3 + .../changelog/formatter/MarkdownFormatter.kt | 22 ++++++- .../formatter/MarkdownFormatterTests.kt | 64 +++++++++++++++++++ 4 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 changelog-plugin/src/test/kotlin/io/github/aloussase/changelog/formatter/MarkdownFormatterTests.kt diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogEntry.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogEntry.kt index 9d509f1..d8a06f7 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogEntry.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogEntry.kt @@ -5,4 +5,15 @@ import io.github.aloussase.changelog.git.Commit data class ChangelogEntry( val release: String, val commits: List = emptyList(), -) +) : Comparable { + override fun compareTo(other: ChangelogEntry): Int { + val myRelease = release.split(".").map { it.toInt() } + val otherRelease = other.release.split(".").map { it.toInt() } + return Comparator + .comparingInt> { it[0] } + .thenComparing { it[1] } + .thenComparing { it[2] } + .reversed() + .compare(myRelease, otherRelease) + } +} diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogPlugin.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogPlugin.kt index b8d9224..955e984 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogPlugin.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/ChangelogPlugin.kt @@ -25,6 +25,9 @@ class ChangelogPlugin : Plugin { } val document = changelogFile.readText() val changelog = parser.parse(document).getOrThrow() + + // TODO: Add commits from current branch here. + val formatter = ChangelogFormatterFactory.create(config.documentFormat) changelogFile.writeText(formatter.format(changelog)) } diff --git a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/formatter/MarkdownFormatter.kt b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/formatter/MarkdownFormatter.kt index 5f67ce6..81c6344 100644 --- a/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/formatter/MarkdownFormatter.kt +++ b/changelog-plugin/src/main/kotlin/io/github/aloussase/changelog/formatter/MarkdownFormatter.kt @@ -4,6 +4,26 @@ import io.github.aloussase.changelog.Changelog class MarkdownFormatter : ChangelogFormatter { override fun format(changelog: Changelog): String { - return changelog.entries.first().release + return buildString { + append("# CHANGELOG\n\n") + for ((entryIndex, entry) in changelog.entries.sorted().withIndex()) { + append("## [${entry.release}]") + for ((index, commit) in entry.commits.withIndex()) { + if (index == 0) { + append("\n") + } + + append("- ${commit.branchName}: ${commit.message} (${commit.author})") + + if (index < entry.commits.size - 1) { + append("\n") + } + } + + if (entryIndex < changelog.entries.size - 1) { + append("\n\n") + } + } + } } } diff --git a/changelog-plugin/src/test/kotlin/io/github/aloussase/changelog/formatter/MarkdownFormatterTests.kt b/changelog-plugin/src/test/kotlin/io/github/aloussase/changelog/formatter/MarkdownFormatterTests.kt new file mode 100644 index 0000000..d880ce4 --- /dev/null +++ b/changelog-plugin/src/test/kotlin/io/github/aloussase/changelog/formatter/MarkdownFormatterTests.kt @@ -0,0 +1,64 @@ +package io.github.aloussase.changelog.formatter + +import io.github.aloussase.changelog.Changelog +import io.github.aloussase.changelog.ChangelogEntry +import io.github.aloussase.changelog.git.Commit +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers.equalTo +import org.junit.jupiter.api.Test + +class MarkdownFormatterTests { + + @Test + fun givenChangelogWhenFormatIsInvokedThenADocumentWithTheRightFormatIsGenerated() { + val changelog = Changelog( + listOf( + ChangelogEntry( + "0.1.0", + listOf( + Commit( + "johndoe@email.com", + "LOYMAR-123", + "changes nice" + ), + ), + ), + ChangelogEntry( + "0.1.1", + listOf() + ), + ), + ) + + val expectedDocument = + "# CHANGELOG\n\n## [0.1.1]\n\n## [0.1.0]\n- LOYMAR-123: changes nice (johndoe@email.com)" + val formatter = MarkdownFormatter() + + val result = formatter.format(changelog) + + assertThat(result, equalTo(expectedDocument)) + } + + @Test + fun givenChangeloWithEntriesOutOfOrderWhenFormatIsCalledThenDocumentWithEntriesInRightOrderIsGenerated() { + val changelog = Changelog( + listOf( + ChangelogEntry("0.1.0", listOf()), + ChangelogEntry("0.1.1", listOf()), + ChangelogEntry("2.0.0", listOf()), + ChangelogEntry("2.1.0", listOf()), + ChangelogEntry("2.0.2", listOf()), + ChangelogEntry("2.0.1", listOf()), + ), + ) + + val expectedDocument = + "# CHANGELOG\n\n## [2.1.0]\n\n## [2.0.2]\n\n## [2.0.1]\n\n## [2.0.0]\n\n## [0.1.1]\n\n## [0.1.0]" + val formatter = MarkdownFormatter() + + val result = formatter.format(changelog) + + assertThat(result, equalTo(expectedDocument)) + } + +} -- 2.43.0