Skip to content
Permalink
Browse files

Update to Piston 0.5.2 + Doctools/Deprecation improvements (#523)

* Update to Piston 0.5.2

* [Doctools] Fix output, be verbose about deprecations

* Improve deprecation system, doctools output
  • Loading branch information...
kenzierocks authored and me4502 committed Oct 5, 2019
1 parent d8d25fb commit 03c0cce53e2fe8cf5ce6a0575a023be5eb05b5a3
Showing with 205 additions and 67 deletions.
  1. +1 −1 buildSrc/src/main/kotlin/Versions.kt
  2. +2 −1 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java
  3. +1 −1 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandInspector.java
  4. +2 −1 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java
  5. +2 −1 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java
  6. +1 −1 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java
  7. +2 −1 worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLICommandSender.java
  8. +33 −21 worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/DocumentationPrinter.kt
  9. +69 −0 worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/RstWorldEditText.kt
  10. +1 −1 worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java
  11. +2 −5 worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java
  12. +59 −4 worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java
  13. +15 −18 ...dapter.java → worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/WorldEditText.java
  14. +5 −7 worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandUsageBox.java
  15. +2 −1 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java
  16. +2 −1 worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java
  17. +2 −1 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java
  18. +2 −1 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java
  19. +2 −0 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java
@@ -3,7 +3,7 @@ import org.gradle.api.Project
object Versions {
const val TEXT = "3.0.1"
const val TEXT_EXTRAS = "3.0.2"
const val PISTON = "0.4.3"
const val PISTON = "0.5.2"
const val AUTO_VALUE = "1.6.5"
const val JUNIT = "5.5.0"
const val MOCKITO = "3.0.0"
@@ -27,6 +27,7 @@
import com.sk89q.worldedit.session.SessionKey;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.auth.AuthorizationException;
import com.sk89q.worldedit.util.formatting.WorldEditText;
import com.sk89q.worldedit.util.formatting.text.Component;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.adapter.bukkit.TextAdapter;
@@ -90,7 +91,7 @@ public void printError(String msg) {

@Override
public void print(Component component) {
TextAdapter.sendComponent(sender, component);
TextAdapter.sendComponent(sender, WorldEditText.format(component));
}

@Override
@@ -33,7 +33,7 @@
import java.util.Optional;

import static com.google.common.base.Preconditions.checkNotNull;
import static com.sk89q.worldedit.bukkit.BukkitTextAdapter.reduceToText;
import static com.sk89q.worldedit.util.formatting.WorldEditText.reduceToText;

class BukkitCommandInspector implements CommandInspector {

@@ -25,6 +25,7 @@
import com.sk89q.worldedit.extension.platform.AbstractNonPlayerActor;
import com.sk89q.worldedit.session.SessionKey;
import com.sk89q.worldedit.util.auth.AuthorizationException;
import com.sk89q.worldedit.util.formatting.WorldEditText;
import com.sk89q.worldedit.util.formatting.text.Component;
import com.sk89q.worldedit.util.formatting.text.adapter.bukkit.TextAdapter;
import org.bukkit.command.CommandSender;
@@ -93,7 +94,7 @@ public void printError(String msg) {

@Override
public void print(Component component) {
TextAdapter.sendComponent(sender, component);
TextAdapter.sendComponent(sender, WorldEditText.format(component));
}

@Override
@@ -31,6 +31,7 @@
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.session.SessionKey;
import com.sk89q.worldedit.util.HandSide;
import com.sk89q.worldedit.util.formatting.WorldEditText;
import com.sk89q.worldedit.util.formatting.text.Component;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BaseBlock;
@@ -129,7 +130,7 @@ public void printError(String msg) {

@Override
public void print(Component component) {
TextAdapter.sendComponent(player, component);
TextAdapter.sendComponent(player, WorldEditText.format(component));
}

@Override
@@ -47,7 +47,7 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static com.sk89q.worldedit.bukkit.BukkitTextAdapter.reduceToText;
import static com.sk89q.worldedit.util.formatting.WorldEditText.reduceToText;

public class BukkitServerInterface implements MultiUserPlatform {
public Server server;
@@ -26,6 +26,7 @@
import com.sk89q.worldedit.session.SessionKey;
import com.sk89q.worldedit.util.FileDialogUtil;
import com.sk89q.worldedit.util.auth.AuthorizationException;
import com.sk89q.worldedit.util.formatting.WorldEditText;
import com.sk89q.worldedit.util.formatting.text.Component;
import com.sk89q.worldedit.util.formatting.text.serializer.plain.PlainComponentSerializer;
import org.slf4j.Logger;
@@ -96,7 +97,7 @@ public void printError(String msg) {

@Override
public void print(Component component) {
print(PlainComponentSerializer.INSTANCE.serialize(component));
print(PlainComponentSerializer.INSTANCE.serialize(WorldEditText.format(component)));
}

@Override
@@ -24,7 +24,6 @@ import com.sk89q.worldedit.WorldEdit
import com.sk89q.worldedit.command.BiomeCommands
import com.sk89q.worldedit.command.ChunkCommands
import com.sk89q.worldedit.command.ClipboardCommands
import com.sk89q.worldedit.command.ExpandCommands
import com.sk89q.worldedit.command.GeneralCommands
import com.sk89q.worldedit.command.GenerationCommands
import com.sk89q.worldedit.command.HistoryCommands
@@ -37,11 +36,10 @@ import com.sk89q.worldedit.command.ToolCommands
import com.sk89q.worldedit.command.ToolUtilCommands
import com.sk89q.worldedit.command.UtilityCommands
import com.sk89q.worldedit.command.util.PermissionCondition
import com.sk89q.worldedit.internal.command.CommandUtil
import com.sk89q.worldedit.util.formatting.text.TextComponent
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent
import com.sk89q.worldedit.util.formatting.text.serializer.plain.PlainComponentSerializer
import org.enginehub.piston.Command
import org.enginehub.piston.TextConfig
import org.enginehub.piston.config.TextConfig
import org.enginehub.piston.part.SubCommandPart
import org.enginehub.piston.util.HelpGenerator
import java.nio.file.Files
@@ -52,7 +50,6 @@ import kotlin.streams.toList
class DocumentationPrinter private constructor() {

private val nameRegex = Regex("name = \"(.+?)\"")
private val serializer = PlainComponentSerializer({ "" }, TranslatableComponent::key)
private val commands = WorldEdit.getInstance().platformManager.platformCommandManager.commandManager.allCommands
.map { it.name to it }.toList().toMap()
private val cmdOutput = StringBuilder()
@@ -111,6 +108,7 @@ class DocumentationPrinter private constructor() {
}

dumpSection("Tool Commands") {
yield("tool")
yieldAllCommandsIn<ToolCommands>()
yieldAllCommandsIn<ToolUtilCommands>()
}
@@ -216,7 +214,7 @@ Other Permissions
private fun dumpSection(title: String, addCommandNames: suspend SequenceScope<String>.() -> Unit) {
cmdOutput.append("\n").append(title).append("\n").append(Strings.repeat("~", title.length)).append("\n")

val prefix = TextConfig.getCommandPrefix()
val prefix = reduceToRst(TextConfig.commandPrefixValue())
val commands = sequence(addCommandNames).map { this.commands.getValue(it) }.toList()
matchedCommands.addAll(commands.map { it.name })

@@ -269,14 +267,19 @@ Other Permissions
}
cmdOutput.appendln()
cmdOutput.appendln(" :class: command-topic").appendln()
CommandUtil.deprecationWarning(command).ifPresent { warning ->
cmdOutput.appendln("""
| .. WARNING::
| ${reduceToRst(warning).makeRstSafe("\n\n")}
""".trimMargin())
}
cmdOutput.appendln("""
| .. csv-table::
| :widths: 8, 15
""".trimMargin())
cmdOutput.appendln()
for ((k, v) in entries) {
val rstSafe = v.trim().replace("\"", "\\\"").replace("\n", "\n" + " ".repeat(2))
.lineSequence().map { line -> line.ifBlank { "" } }.joinToString(separator = "\n")
val rstSafe = v.makeRstSafe("\n")
cmdOutput.append(" ".repeat(2))
.append(k)
.append(",")
@@ -287,32 +290,39 @@ Other Permissions
cmdOutput.appendln()
}

private fun String.makeRstSafe(lineJoiner: String) = trim()
.replace("\"", "\\\"").replace("\n", "\n" + " ".repeat(2))
.lineSequence()
.map { line -> line.ifBlank { "" } }
.joinToString(separator = lineJoiner)

private fun linkSafe(text: String) = text.replace(" ", "-")

private fun commandTableEntries(command: Command, parents: Stream<Command>): Map<String, String> {
return sequence {
val desc = command.description.run {
val footer = CommandUtil.footerWithoutDeprecation(command)
when {
command.footer.isPresent -> append(
TextComponent.builder("\n\n").append(command.footer.get())
footer.isPresent -> append(
TextComponent.builder("\n\n").append(footer.get())
)
else -> this
}
}
yield("**Description**" to serializer.serialize(desc))
yield("**Description**" to reduceToRst(desc))
val cond = command.condition
if (cond is PermissionCondition && cond.permissions.isNotEmpty()) {
val perms = cond.permissions.joinToString(", ") { "``$it``" }
yield("**Permissions**" to perms)
}
val usage = serializer.serialize(HelpGenerator.create(Stream.concat(parents, Stream.of(command)).toList()).usage)
val usage = reduceToRst(HelpGenerator.create(Stream.concat(parents, Stream.of(command)).toList()).usage)
yield("**Usage**" to "``$usage``")

// Part descriptions
command.parts.filterNot { it is SubCommandPart }
.forEach {
val title = "\u2001\u2001``" + serializer.serialize(it.textRepresentation) + "``"
yield(title to serializer.serialize(it.description))
val title = "\u2001\u2001``" + reduceToRst(it.textRepresentation) + "``"
yield(title to reduceToRst(it.description))
}
}.toMap()
}
@@ -324,13 +334,15 @@ Other Permissions
*/
@JvmStatic
fun main(args: Array<String>) {
val printer = DocumentationPrinter()

printer.writeAllCommands()
writeOutput("commands.rst", printer.cmdOutput.toString())
writeOutput("permissions.rst", printer.permsOutput.toString())

WorldEdit.getInstance().sessionManager.unload()
try {
val printer = DocumentationPrinter()

printer.writeAllCommands()
writeOutput("commands.rst", printer.cmdOutput.toString())
writeOutput("permissions.rst", printer.permsOutput.toString())
} finally {
WorldEdit.getInstance().sessionManager.unload()
}
}

private fun writeOutput(file: String, output: String) {
@@ -0,0 +1,69 @@
package com.sk89q.worldedit.internal.util

import com.sk89q.worldedit.util.formatting.WorldEditText
import com.sk89q.worldedit.util.formatting.text.Component
import com.sk89q.worldedit.util.formatting.text.TextComponent
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent
import com.sk89q.worldedit.util.formatting.text.event.ClickEvent
import com.sk89q.worldedit.util.formatting.text.format.TextDecoration
import org.enginehub.piston.util.TextHelper

fun reduceToRst(component: Component): String {
val formatted = WorldEditText.format(component)
return formatAsRst(formatted).toString()
}

private fun formatAsRst(component: Component, currentDeco: String? = null): CharSequence {
return when (component) {
is TextComponent -> {
val content = StringBuilder(component.content())

val deco = when {
// Actions that suggest themselves as commands are marked as code
component.isSuggestingAsCommand(content.toString()) -> "``"
component.decorations().any { it == TextDecoration.BOLD } -> "**"
component.decorations().any { it == TextDecoration.ITALIC } -> "*"
else -> null
}

component.children().joinTo(content, separator = "") {
formatAsRst(it, deco ?: currentDeco)
}

deco?.let {
require(currentDeco == null) {
"Nested decorations are hell in RST. \n" +
"Existing: $currentDeco; New: $deco\n" +
"Offender: ${TextHelper.reduceToText(component)}"
}
content.rstDeco(deco)
}

content
}
is TranslatableComponent -> {
val content = StringBuilder(component.key())
component.children().joinTo(content, separator = "") { formatAsRst(it, currentDeco) }
content
}
else -> component.children().joinToString(separator = "") { formatAsRst(it, currentDeco) }
}
}

private fun Component.isSuggestingAsCommand(text: String): Boolean {
val ce = clickEvent()
return when (ce?.action()) {
ClickEvent.Action.RUN_COMMAND,
ClickEvent.Action.SUGGEST_COMMAND ->
ce.value() == text
else -> false
}
}

private fun StringBuilder.rstDeco(deco: String): StringBuilder = apply {
ensureCapacity(length + deco.length * 2)
val insertionPoint = indexOfFirst { !it.isWhitespace() }.coerceAtLeast(0)
insert(insertionPoint, deco)
val insertionPointEnd = (indexOfLast { !it.isWhitespace() } + 1).takeUnless { it < 1 } ?: length
insert(insertionPointEnd, deco)
}
@@ -88,7 +88,7 @@ public static void register(CommandRegistrationHandler registration,
).build();
}
commandManager.register(CommandUtil.deprecate(
command, "Using global tool names is deprecated " +
command, "Global tool names cause conflicts " +
"and will be removed in WorldEdit 8", ToolCommands::asNonGlobal
));
}
@@ -106,7 +106,8 @@
import com.sk89q.worldedit.world.World;
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.TextConfig;
import org.enginehub.piston.config.ConfigHolder;
import org.enginehub.piston.config.TextConfig;
import org.enginehub.piston.converter.ArgumentConverters;
import org.enginehub.piston.exception.CommandException;
import org.enginehub.piston.exception.CommandExecutionException;
@@ -152,10 +153,6 @@
private static final java.util.logging.Logger COMMAND_LOG =
java.util.logging.Logger.getLogger("com.sk89q.worldedit.CommandLog");

static {
TextConfig.setCommandPrefix("/");
}

private final WorldEdit worldEdit;
private final PlatformManager platformManager;
private final CommandManagerServiceImpl commandManagerService;

0 comments on commit 03c0cce

Please sign in to comment.
You can’t perform that action at this time.