Skip to content

Commit

Permalink
Rework addon metadata and library loading
Browse files Browse the repository at this point in the history
- Switched from addon.yml to addon_metadata.json + addon_libraries.json
- Reworked addon (library) class loading to fix some issues
  • Loading branch information
NichtStudioCode committed Aug 2, 2023
1 parent 8a45edd commit f482562
Show file tree
Hide file tree
Showing 13 changed files with 253 additions and 324 deletions.
5 changes: 3 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ kotlin = "1.9.0"
ktor = "2.3.1"
paper = "1.20.1-R0.1-SNAPSHOT"
paperweight = "1.5.5"
stringremapper = "1.5"
xenondevs-commons = "1.4"
stringremapper = "1.6"
xenondevs-commons = "1.5"

[libraries]
adventure-api = { group = "net.kyori", name = "adventure-api", version = "4.12.0" }
Expand All @@ -30,6 +30,7 @@ configurate-extra-kotlin = { group = "xyz.xenondevs.configurate", name = "config
cosmic-binary-format = { group = "xyz.xenondevs.cbf", name = "cosmic-binary-format", version.ref = "cbf" }
cosmic-binary-format-netty-adapter = { group = "xyz.xenondevs.cbf", name = "cosmic-binary-format-netty-adapter", version.ref = "cbf" }
fuzzywuzzy = { group = "me.xdrop", name = "fuzzywuzzy", version = "1.4.0" }
gson = { group = "com.google.code.gson", name = "gson", version = "2.10.1" }
inventoryaccess = { group = "xyz.xenondevs.invui", name = "inventory-access-r14", version.ref = "invui" }
invui-kotlin = { group = "xyz.xenondevs.invui", name = "invui-kotlin", version.ref = "invui" }
invui-resourcepack = { group = "xyz.xenondevs.invui", name = "invui-resourcepack", version.ref = "invui" }
Expand Down
6 changes: 3 additions & 3 deletions nova-gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ plugins {
`java-gradle-plugin`
`kotlin-dsl`
`maven-publish`
kotlin("jvm") version libs.versions.kotlin
alias(libs.plugins.kotlin)
}

dependencies {
implementation(libs.gson)
implementation(libs.bundles.xenondevs.commons)
implementation(libs.bundles.minecraft.assets)
implementation(libs.paper.api)
implementation(libs.zip4j)
}

gradlePlugin {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import org.gradle.jvm.tasks.Jar
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.getByName
import org.gradle.kotlin.dsl.register
import xyz.xenondevs.novagradle.task.AddonExtension
import xyz.xenondevs.novagradle.task.AddonTask
import xyz.xenondevs.novagradle.task.AddonMetadataExtension
import xyz.xenondevs.novagradle.task.AddonMetadataTask
import xyz.xenondevs.novagradle.task.GenerateLanguageFilesTask
import xyz.xenondevs.novagradle.task.GenerateWailaTexturesExtension
import xyz.xenondevs.novagradle.task.GenerateWailaTexturesTask
Expand All @@ -16,10 +16,10 @@ import xyz.xenondevs.novagradle.util.AddonUtils
class NovaGradlePlugin : Plugin<Project> {

override fun apply(project: Project) {
val addonExt = project.extensions.create<AddonExtension>("addon")
val addonTask = project.tasks.register<AddonTask>("addon")
val addonExt = project.extensions.create<AddonMetadataExtension>("addon")
val addonMetadataTask = project.tasks.register<AddonMetadataTask>("addon")

addonTask.configure {
addonMetadataTask.configure {
id.set(addonExt.id)
addonName.set(addonExt.name)
version.set(addonExt.version)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.jvm.tasks.Jar

abstract class AddonExtension {
abstract class AddonMetadataExtension {

abstract val id: Property<String>
abstract val name: Property<String>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package xyz.xenondevs.novagradle.task

import com.google.gson.JsonArray
import com.google.gson.JsonObject
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.artifacts.ExcludeRule
import org.gradle.api.artifacts.ExternalModuleDependency
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
import org.gradle.api.internal.artifacts.repositories.DefaultMavenLocalArtifactRepository
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier
import org.gradle.jvm.tasks.Jar
import xyz.xenondevs.commons.gson.toJsonArray
import xyz.xenondevs.commons.gson.writeToFile
import xyz.xenondevs.novagradle.util.TaskUtils
import java.nio.file.FileSystems

abstract class AddonMetadataTask : DefaultTask() {

@get:Input
abstract val id: Property<String>

@get:Input
abstract val addonName: Property<String>

@get:Input
abstract val version: Property<String>

@get:Input
abstract val novaVersion: Property<String>

@get:Input
abstract val main: Property<String>

@get:Input
abstract val authors: ListProperty<String>

@get:Input
abstract val depend: ListProperty<String>

@get:Input
abstract val softdepend: ListProperty<String>

@get:Input
abstract val jarTask: Property<Jar>

@TaskAction
fun run() {
FileSystems.newFileSystem(TaskUtils.getOutputFile(jarTask.get()).toPath()).use {
val root = it.rootDirectories.first()

val addonMetadataFile = root.resolve("addon_metadata.json")
createPluginMetadata().writeToFile(addonMetadataFile)

val addonLibrariesFile = root.resolve("addon_libraries.json")
createLibrariesJson(project, "nova", emptyList()).writeToFile(addonLibrariesFile)
}
}

private fun createPluginMetadata(): JsonObject {
return JsonObject().apply {
addProperty("id", id.get())
addProperty("name", addonName.get())
addProperty("version", version.get())
addProperty("nova_version", novaVersion.get())
addProperty("main", main.get())
add("authors", authors.get().toJsonArray())
add("depend", depend.get().toJsonArray())
add("softdepend", softdepend.get().toJsonArray())
}
}

@Suppress("SENSELESS_COMPARISON") // falsely interpreted as non-nullable
private fun createLibrariesJson(project: Project, configurationName: String, excludedConfigurationNames: List<String>): JsonObject {
val json = JsonObject()

// repositories
val repositories = JsonArray().also { json.add("repositories", it) }
project.repositories.asSequence()
.filterIsInstance<MavenArtifactRepository>()
.filter { it !is DefaultMavenLocalArtifactRepository }
.mapTo(LinkedHashSet()) { it.url.toString() }
.forEach(repositories::add)

// libraries and exclusions
val libraries = JsonArray().also { json.add("libraries", it) }
val configuration = project.configurations.getByName(configurationName)

fun writeExcludeRules(rules: Set<ExcludeRule>, excludes: JsonArray) {
rules.forEach {
require(it.group != null && it.module != null) { "Exclusion rules need to specify group and module" }
excludes.add("${it.group}:${it.module}")
}
}

configuration.incoming.dependencies.asSequence()
.filterIsInstance<ExternalModuleDependency>()
.forEach { dependency ->
val library = JsonObject().also(libraries::add)

library.addProperty("coords", getArtifactCoords(dependency))
val excludeRules = dependency.excludeRules
writeExcludeRules(excludeRules, JsonArray().also { library.add("excludes", it) })
}

val excludes = JsonArray().also { json.add("excludes", it) }
writeExcludeRules(configuration.excludeRules, excludes)
for (exclusionConfigurationName in excludedConfigurationNames) {
project.configurations.getByName(exclusionConfigurationName)
.incoming.artifacts.artifacts.asSequence()
.map { it.variant.owner }
.filterIsInstance<DefaultModuleComponentIdentifier>()
.forEach { excludes.add("${it.group}:${it.module}") }
}

return json
}

private fun getArtifactCoords(dependency: ExternalModuleDependency): String {
val artifact = dependency.artifacts.firstOrNull()
return if (artifact != null)
"${dependency.group}:${dependency.name}:${artifact.extension}:${artifact.classifier}:${dependency.version}"
else "${dependency.group}:${dependency.name}:${dependency.version}"
}

}

This file was deleted.

49 changes: 13 additions & 36 deletions nova/src/main/kotlin/xyz/xenondevs/nova/addon/AddonDescription.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package xyz.xenondevs.nova.addon

import org.bukkit.configuration.file.YamlConfiguration
import com.google.gson.JsonObject
import xyz.xenondevs.commons.gson.getString
import xyz.xenondevs.nova.data.serialization.json.getDeserialized
import xyz.xenondevs.nova.util.data.Version
import java.io.Reader

data class AddonDescription internal constructor(
val id: String,
Expand All @@ -17,40 +18,16 @@ data class AddonDescription internal constructor(

internal companion object {

fun deserialize(reader: Reader): AddonDescription {
val cfg = YamlConfiguration.loadConfiguration(reader)

val id = cfg.getString("id")
val name = cfg.getString("name")
val version = cfg.getString("version")
val main = cfg.getString("main")
val novaVersion = cfg.getString("novaVersion")

val authors = if ("author" in cfg)
listOf(cfg.getString("author")!!)
else if ("authors" in cfg)
cfg.getStringList("authors")
else null

require(id != null) { "Missing required field 'id'" }
require(name != null) { "Missing required field 'name'" }
require(version != null) { "Missing required field 'version'" }
require(main != null) { "Missing required field 'main'" }
require(novaVersion != null) { "Missing required field 'novaVersion'" }
require(authors != null) { "Missing required field 'author' or 'authors'" }
require(authors.isNotEmpty()) { "List of authors cannot be empty" }

return AddonDescription(
id,
name,
version,
main,
Version(novaVersion),
authors,
cfg.getStringList("depend").toHashSet(),
cfg.getStringList("softdepend").toHashSet()
)
}
fun fromJson(obj: JsonObject) = AddonDescription(
obj.getString("id"),
obj.getString("name"),
obj.getString("version"),
obj.getString("main"),
obj.getDeserialized("nova_version"),
obj.getDeserialized("authors"),
obj.getDeserialized<HashSet<String>>("depend"),
obj.getDeserialized<HashSet<String>>("softdepend")
)

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import java.util.logging.Logger

internal class AddonLogger(name: String) : Logger("Nova", null) {

private val prefix = "[$name]"
private val prefix = "[$name] "

init {
parent = LOGGER
Expand Down
Loading

0 comments on commit f482562

Please sign in to comment.