Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import net.xolt.freecam.publish.model.CurseForgeConfig
import net.xolt.freecam.publish.model.ModrinthConfig
import java.nio.file.Path
import kotlin.io.path.inputStream
import kotlin.io.path.readText

internal class PublishCliCommand(
version: String = "0.0.1",
Expand Down Expand Up @@ -47,6 +48,10 @@ internal class PublishCliCommand(
)
}

val releaseNotes: String by lazy {
releaseNotesPath.readText()
}

@OptIn(ExperimentalSerializationApi::class)
val metadata: ReleaseMetadata by lazy {
metadataPath.inputStream().use { input ->
Expand All @@ -58,6 +63,13 @@ internal class PublishCliCommand(
.path(mustExist = true, mustBeReadable = true, canBeFile = false, canBeDir = true)
.help("Directory containing the release artifacts")

val releaseNotesPath: Path by option("--release-notes")
.path(mustExist = true, mustBeReadable = true, canBeFile = true, canBeDir = false)
.help("Release notes file")
.defaultLazy(defaultForHelp = "[artifacts-dir]/release-notes.md") {
artifactsDir.resolve("release-notes.md")
}

val metadataPath: Path by option("--metadata")
.path(mustExist = true, mustBeReadable = true, canBeFile = true, canBeDir = false)
.help("Release metadata JSON file")
Expand Down Expand Up @@ -91,6 +103,6 @@ internal class PublishCliCommand(
}
}

publisher(metadata)
publisher(releaseNotes, metadata)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class PublishCliCommandTest {

@Test
fun `dry-run uses dry publisher`() = runTest {
val releaseNotes = "release notes"
val metadata = testMetadata()
val dir = createTestDir()
var dryPublisher: Boolean? = null
Expand All @@ -66,8 +67,8 @@ class PublishCliCommandTest {
"--dry-run",
"--curseforge-token", "token",
"--modrinth-token", "token",
"--metadata",
metadata.toTestFile().absolutePathString(),
"--release-notes", releaseNotes.toTestFile().absolutePathString(),
"--metadata", metadata.toTestFile().absolutePathString(),
dir.absolutePathString(),
))

Expand All @@ -76,12 +77,13 @@ class PublishCliCommandTest {
dryPublisher shouldBe true
actualDir shouldBe dir.absolute()
result.statusCode shouldBe 0
coVerifySequence { publisher(metadata) }
coVerifySequence { publisher(releaseNotes, metadata) }
confirmVerified(publisher)
}

@Test
fun `non-dry-run uses 'real' publisher`() = runTest {
val releaseNotes = "release notes"
val metadata = testMetadata()
var dryPublisher: Boolean? = null
var actualDir: Path? = null
Expand All @@ -100,16 +102,16 @@ class PublishCliCommandTest {
val result = cmd.test(listOf(
"--curseforge-token", "token",
"--modrinth-token", "token",
"--metadata",
metadata.toTestFile().absolutePathString(),
"--release-notes", releaseNotes.toTestFile().absolutePathString(),
"--metadata", metadata.toTestFile().absolutePathString(),
dir.absolutePathString(),
))

result.statusCode shouldBe 0
cmd.dryRun shouldBe false
dryPublisher shouldBe false
actualDir shouldBe dir.absolute()
coVerifySequence { publisher(metadata) }
coVerifySequence { publisher(releaseNotes, metadata) }
confirmVerified(publisher)
}

Expand All @@ -121,8 +123,8 @@ class PublishCliCommandTest {

val cmd = testCommand()
val result = cmd.test(listOf(
"--metadata",
metadata.toTestFile().absolutePathString(),
"--release-notes", createTestFile().absolutePathString(),
"--metadata", metadata.toTestFile().absolutePathString(),
dir.absolutePathString(),
))

Expand All @@ -138,8 +140,8 @@ class PublishCliCommandTest {
val cmd = testCommand()

val result = cmd.test(listOf(
"--metadata",
metadata.toTestFile().absolutePathString(),
"--release-notes", createTestFile().absolutePathString(),
"--metadata", metadata.toTestFile().absolutePathString(),
file.absolutePathString(),
))

Expand Down
5 changes: 3 additions & 2 deletions core/src/main/kotlin/net/xolt/freecam/publish/Publisher.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ import net.xolt.freecam.publish.model.ModrinthConfig
import java.nio.file.Path

fun interface Publisher {
suspend fun publish(metadata: ReleaseMetadata)
suspend operator fun invoke(metadata: ReleaseMetadata) = publish(metadata)
suspend fun publish(releaseNotes: String, metadata: ReleaseMetadata)
suspend operator fun invoke(releaseNotes: String, metadata: ReleaseMetadata)
= publish(releaseNotes, metadata)
}

fun interface PublisherFactory {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ data class ReleaseArtifact(
val displayName: String,
val version: String,
val versionType: ReleaseType,
val changelog: String,
val releaseNotes: String,
val environments: Set<Environment>,
val loaders: Set<String>,
val gameVersion: String,
Expand Down Expand Up @@ -62,23 +62,25 @@ data class ReleaseArtifact(
}
}

fun ReleaseMetadata.resolveArtifacts(artifactsDir: Path): List<ReleaseArtifact>
= versions
fun Path.resolveReleaseArtifacts(
releaseNotes: String,
metadata: ReleaseMetadata,
) = metadata.versions
.asSequence()
.sorted()
.map {
ReleaseArtifact(
displayName = it.displayName,
version = modVersion,
versionType = releaseType,
changelog = changelog,
version = metadata.modVersion,
versionType = metadata.releaseType,
releaseNotes = releaseNotes,
environments = it.environments.toSet(),
loaders = setOf(it.loader),
gameVersion = it.minecraft,
gameVersions = it.gameVersions.toSet(),
javaVersions = it.javaVersions.toSet(),
relationships = it.relationships.toSet(),
artifact = artifactsDir.resolve(it.filename),
artifact = resolve(it.filename),
)
}
.toList()
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,17 @@ class ResolveArtifactsTest {
fun `resolves to expected artifacts`() {
val artifactsDir = createTestDir()
val filenames = listOf("a", "b", "c")
val releaseNotes = "release notes"
val metadata = testMetadata(
versions = filenames.map { testProjectMetadata(filename = it) },
)

val artifacts: List<ReleaseArtifact> = metadata.resolveArtifacts(artifactsDir)
val artifacts: List<ReleaseArtifact> = artifactsDir.resolveReleaseArtifacts(releaseNotes, metadata)

artifacts.map { it.name } shouldContainExactly filenames
artifacts.map { it.releaseNotes } shouldContainExactly List(filenames.size) {
releaseNotes
}
artifacts.map { it.artifact } shouldContainExactly filenames.map {
artifactsDir.resolve(it)
}
Expand All @@ -31,21 +35,21 @@ class ResolveArtifactsTest {
@Test
fun `retains top-level metadata`() {
val artifactsDir = Path("")
val releaseNotes = "release notes"
val metadata = testMetadata(
modVersion = "1.2.3",
releaseType = ReleaseType.ALPHA,
changelog = "Changelog",
versions = List(10) { testProjectMetadata() },
)

val artifacts: List<ReleaseArtifact> = metadata.resolveArtifacts(artifactsDir)
val artifacts: List<ReleaseArtifact> = artifactsDir.resolveReleaseArtifacts(releaseNotes, metadata)

assertSoftly(artifacts) {
size shouldBe 10
forEach {
it.version shouldBe "1.2.3"
it.versionType shouldBe ReleaseType.ALPHA
it.changelog shouldBe "Changelog"
it.releaseNotes shouldBe releaseNotes
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions core/src/testFixtures/kotlin/test/ReleaseArtifactFixtures.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ object ReleaseArtifactFixtures {
displayName: String = "Fake Release",
version: String = "1.2.3",
versionType: ReleaseType = ReleaseType.RELEASE,
changelog: String = "",
releaseNotes: String = "",
environments: Set<Environment> = emptySet(),
loaders: Set<String> = setOf("loader"),
gameVersion: String = "1.2.3",
Expand All @@ -23,7 +23,7 @@ object ReleaseArtifactFixtures {
displayName = displayName,
version = version,
versionType = versionType,
changelog = changelog,
releaseNotes = releaseNotes,
environments = environments,
loaders = loaders,
gameVersion = gameVersion,
Expand Down
7 changes: 7 additions & 0 deletions core/src/testFixtures/kotlin/test/StringUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.xolt.freecam.test

import kotlin.io.path.writeText

fun String.toTestFile() = createTestFile().also { file ->
file.writeText(this)
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ internal class CurseForgeClient(
displayName(spec.displayName)
releaseType(spec.versionType.toCurseForge())

spec.changelog.takeIf { it.isNotBlank() }?.let {
spec.releaseNotes.takeIf { it.isNotBlank() }?.let {
changelog(it)
changelogType(CurseChangelogType.MARKDOWN)
}
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

schema_version=0.0.3
version=0.0.5
schema_version=0.1.0
version=0.0.6
group=net.xolt.freecam
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ internal class ModrinthClient(
suspend fun uploadVersion(spec: ReleaseArtifact) = uploadVersion {
projectId(projectId)
name(spec.displayName)
changelog(spec.changelog)
changelog(spec.releaseNotes)
versionNumber(spec.version)
versionType(spec.versionType.toModrinth())
loaders(spec.loaders.toList())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ data class ReleaseMetadata(
@SerialName("mod_version") val modVersion: String,
@SerialName("display_name") val displayName: String,
@SerialName("release_type") val releaseType: ReleaseType,
val changelog: String,
val platforms: Platforms,
val versions: List<ProjectReleaseMetadata>,
)
Expand Down
2 changes: 0 additions & 2 deletions schema/src/testFixtures/kotlin/test/MetadataFixtures.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ object MetadataFixtures {
modVersion: String = "0.1.0",
releaseType: ReleaseType = ReleaseType.RELEASE,
displayName: String = "Fake Release",
changelog: String = "Changelog",
githubTag: String = "v0.1.0",
modrinthId: String = "id",
curseforgeId: ULong = 1234UL,
Expand All @@ -22,7 +21,6 @@ object MetadataFixtures {
modVersion = modVersion,
releaseType = releaseType,
displayName = displayName,
changelog = changelog,
platforms = Platforms(
github = Platforms.Github(githubTag),
modrinth = Platforms.Modrinth(modrinthId),
Expand Down
10 changes: 4 additions & 6 deletions src/main/kotlin/net/xolt/freecam/publish/DefaultPublisher.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ package net.xolt.freecam.publish

import net.xolt.freecam.model.ReleaseMetadata
import net.xolt.freecam.publish.model.ReleaseArtifact
import net.xolt.freecam.publish.model.resolveArtifacts
import net.xolt.freecam.publish.model.resolveReleaseArtifacts
import net.xolt.freecam.publish.platforms.CurseForgePlatform
import net.xolt.freecam.publish.platforms.create
import net.xolt.freecam.publish.platforms.ModrinthPlatform
import net.xolt.freecam.publish.platforms.create
import java.nio.file.Path
Expand All @@ -25,10 +24,9 @@ data class DefaultPublisher(
val modrinth: ModrinthPlatform,
) : Publisher {

override suspend fun publish(metadata: ReleaseMetadata) {
val artifacts = metadata.resolveArtifacts(artifactsDir).apply {
verifyExists()
}
override suspend fun publish(releaseNotes: String, metadata: ReleaseMetadata) {
val artifacts = artifactsDir.resolveReleaseArtifacts(releaseNotes, metadata)
artifacts.verifyExists()
curseforge.publishRelease(metadata, artifacts)
modrinth.publishRelease(metadata, artifacts)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,17 @@ class DefaultPublisherTest {
val modrinth = mockk<ModrinthPlatform>(relaxUnitFun = true)

val dir = createTestDir()
val releaseNotes = "release notes"
val metadata = testMetadata(versions = testVersions)
val metadataArtifacts = metadata.versions.map {
dir.resolve(it.filename).apply(Path::createFile)
}

DefaultPublisher(dir, curseforge, modrinth).publish(metadata)
DefaultPublisher(dir, curseforge, modrinth).publish(releaseNotes, metadata)

fun MockKMatcherScope.verifyArtifacts() = match<List<ReleaseArtifact>> { artifacts ->
artifacts.map { it.artifact } == metadataArtifacts
&& artifacts.map { it.releaseNotes } == List(metadata.versions.size) { releaseNotes }
}

coVerify { curseforge.publishRelease(metadata, verifyArtifacts()) }
Expand All @@ -51,11 +53,12 @@ class DefaultPublisherTest {
val modrinth = mockk<ModrinthPlatform>(relaxUnitFun = true)

val dir = createTestDir()
val releaseNotes = "release notes"
val metadata = testMetadata(versions = testVersions)
val publisher = DefaultPublisher(dir, curseforge, modrinth)

val ex = shouldThrowExactly<IllegalArgumentException> {
publisher.publish(metadata)
publisher.publish(releaseNotes, metadata)
}

ex.message shouldContainOnlyOnce "artifacts were not found"
Expand Down
Loading