From 25232ee0392cc87e7df2193c6665659542215151 Mon Sep 17 00:00:00 2001 From: Stijn Date: Wed, 17 Mar 2021 20:43:57 +0100 Subject: [PATCH] chore: replace krow with picnic #336 --- OrchidCore/build.gradle.kts | 2 +- .../api/generators/GeneratorService.java | 4 +- .../api/generators/GeneratorServiceImpl.java | 13 +- .../orchid/api/options/OptionsExtractor.java | 38 +++--- .../orchid/api/tasks/TaskServiceImpl.java | 2 +- .../eden/orchid/utilities/OrchidUtils.java | 41 +----- .../orchid/api/generators/BuildMetrics.kt | 125 ++++++++---------- .../eden/orchid/impl/commands/HelpCommand.kt | 6 +- .../com/eden/orchid/impl/tasks/HelpTask.kt | 113 ++++++---------- buildSrc/src/main/kotlin/Libs.kt | 6 +- buildSrc/src/main/kotlin/Versions.kt | 2 +- gradle/actions/repositories.gradle | 1 - 12 files changed, 132 insertions(+), 221 deletions(-) diff --git a/OrchidCore/build.gradle.kts b/OrchidCore/build.gradle.kts index e38c4d9614..ec513eef1e 100644 --- a/OrchidCore/build.gradle.kts +++ b/OrchidCore/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { // core utilities api(Libs.com_eden_common) api(Libs.clog4j) - api(Libs.krow) + api(Libs.picnic) api(Libs.okhttp) api(Libs.commons_io) api(Libs.commons_lang3) diff --git a/OrchidCore/src/main/java/com/eden/orchid/api/generators/GeneratorService.java b/OrchidCore/src/main/java/com/eden/orchid/api/generators/GeneratorService.java index b8341e238b..892af493a0 100644 --- a/OrchidCore/src/main/java/com/eden/orchid/api/generators/GeneratorService.java +++ b/OrchidCore/src/main/java/com/eden/orchid/api/generators/GeneratorService.java @@ -1,9 +1,9 @@ package com.eden.orchid.api.generators; -import com.copperleaf.krow.KrowTable; import com.eden.orchid.api.OrchidService; import com.eden.orchid.api.theme.pages.OrchidPage; import com.google.inject.ImplementedBy; +import com.jakewharton.picnic.Table; @ImplementedBy(GeneratorServiceImpl.class) public interface GeneratorService extends OrchidService { @@ -24,7 +24,7 @@ default String getBuildSummary() { return getService(GeneratorService.class).getBuildSummary(); } - default KrowTable getBuildDetail() { + default Table getBuildDetail() { return getService(GeneratorService.class).getBuildDetail(); } diff --git a/OrchidCore/src/main/java/com/eden/orchid/api/generators/GeneratorServiceImpl.java b/OrchidCore/src/main/java/com/eden/orchid/api/generators/GeneratorServiceImpl.java index 417caac7c5..496881cc2e 100644 --- a/OrchidCore/src/main/java/com/eden/orchid/api/generators/GeneratorServiceImpl.java +++ b/OrchidCore/src/main/java/com/eden/orchid/api/generators/GeneratorServiceImpl.java @@ -1,7 +1,6 @@ package com.eden.orchid.api.generators; import com.caseyjbrooks.clog.Clog; -import com.copperleaf.krow.KrowTable; import com.eden.common.json.JSONElement; import com.eden.common.util.EdenUtils; import com.eden.orchid.Orchid; @@ -11,9 +10,9 @@ import com.eden.orchid.api.options.annotations.Description; import com.eden.orchid.api.options.annotations.Option; import com.eden.orchid.api.options.archetypes.ConfigArchetype; -import com.eden.orchid.api.theme.Theme; import com.eden.orchid.api.theme.pages.OrchidPage; import com.eden.orchid.utilities.OrchidUtils; +import com.jakewharton.picnic.Table; import kotlin.Lazy; import kotlin.LazyKt; import kotlin.Pair; @@ -21,13 +20,7 @@ import javax.inject.Inject; import javax.inject.Singleton; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -213,7 +206,7 @@ public String getBuildSummary() { } @Override - public KrowTable getBuildDetail() { + public Table getBuildDetail() { return metrics.getDetail(); } diff --git a/OrchidCore/src/main/java/com/eden/orchid/api/options/OptionsExtractor.java b/OrchidCore/src/main/java/com/eden/orchid/api/options/OptionsExtractor.java index bf727111c8..e1deba1754 100644 --- a/OrchidCore/src/main/java/com/eden/orchid/api/options/OptionsExtractor.java +++ b/OrchidCore/src/main/java/com/eden/orchid/api/options/OptionsExtractor.java @@ -1,24 +1,21 @@ package com.eden.orchid.api.options; import com.caseyjbrooks.clog.Clog; -import com.copperleaf.krow.KrowTable; import com.eden.common.util.EdenPair; import com.eden.common.util.EdenUtils; import com.eden.orchid.api.OrchidContext; import com.eden.orchid.api.options.annotations.Archetype; import com.eden.orchid.api.options.annotations.Description; import com.eden.orchid.api.options.annotations.Option; +import com.jakewharton.picnic.Table; +import com.jakewharton.picnic.TableSection; import javax.inject.Inject; import javax.inject.Singleton; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; @Singleton public class OptionsExtractor extends Extractor { @@ -191,21 +188,24 @@ private Class[] getFieldTypeParams(Field field) { return genericClasses; } - public KrowTable getDescriptionTable(OptionHolderDescription optionsHolderDescription) { - KrowTable table = new KrowTable(); + public Table getDescriptionTable(OptionHolderDescription optionsHolderDescription) { List options = optionsHolderDescription.getOptionsDescriptions(); - + Table.Builder builder = new Table.Builder() + .setHeader( + new TableSection.Builder() + .addRow("Key", "Type", "Default Value", "Description") + .build() + ); + TableSection.Builder rows = new TableSection.Builder(); options.forEach(option -> { - table.cell("Type", option.getKey(), cell -> {cell.setContent(option.getOptionType().getSimpleName()); return null;}); - table.cell("Default Value", option.getKey(), cell -> {cell.setContent(option.getDefaultValue()); return null;}); - table.cell("Description", option.getKey(), cell -> {cell.setContent(option.getDescription()); return null;}); - }); - - table.column("Description", cell -> {cell.setWrapTextAt(45); return null;}); - table.column("Type", cell -> {cell.setWrapTextAt(15); return null;}); - table.column("Default Value", cell -> {cell.setWrapTextAt(15); return null;}); - - return table; + rows.addRow( + option.getKey(), + option.getOptionType().getSimpleName(), + option.getDefaultValue(), + option.getDescription() + ); + }); + return builder.setBody(rows.build()).build(); } } diff --git a/OrchidCore/src/main/java/com/eden/orchid/api/tasks/TaskServiceImpl.java b/OrchidCore/src/main/java/com/eden/orchid/api/tasks/TaskServiceImpl.java index 98a3e8bea8..93d76ee647 100644 --- a/OrchidCore/src/main/java/com/eden/orchid/api/tasks/TaskServiceImpl.java +++ b/OrchidCore/src/main/java/com/eden/orchid/api/tasks/TaskServiceImpl.java @@ -133,7 +133,7 @@ public void build() { context.broadcast(Orchid.Lifecycle.GeneratingStart.fire(this)); context.startGeneration(); context.broadcast(Orchid.Lifecycle.GeneratingFinish.fire(this)); - Clog.tag("\nBuild Metrics").log("\n{}", context.getBuildDetail().print(OrchidUtils.defaultTableFormatter)); + Clog.tag("\nBuild Metrics").log("\n{}", context.getBuildDetail().toString()); Clog.noTag().log("Build Complete"); Clog.noTag().log(context.getBuildSummary() + "\n"); context.broadcast(Orchid.Lifecycle.BuildFinish.fire(this)); diff --git a/OrchidCore/src/main/java/com/eden/orchid/utilities/OrchidUtils.java b/OrchidCore/src/main/java/com/eden/orchid/utilities/OrchidUtils.java index af44d374b8..217d59f636 100644 --- a/OrchidCore/src/main/java/com/eden/orchid/utilities/OrchidUtils.java +++ b/OrchidCore/src/main/java/com/eden/orchid/utilities/OrchidUtils.java @@ -1,54 +1,25 @@ package com.eden.orchid.utilities; import com.caseyjbrooks.clog.Clog; -import com.copperleaf.krow.TableFormatter; -import com.copperleaf.krow.formatters.ascii.AsciiTableFormatter; -import com.copperleaf.krow.formatters.ascii.CrossingBorder; -import com.copperleaf.krow.formatters.ascii.NoBorder; -import com.copperleaf.krow.formatters.ascii.SingleBorder; import com.eden.common.util.EdenUtils; import com.eden.orchid.api.OrchidContext; import com.eden.orchid.api.options.OrchidFlags; -import com.eden.orchid.api.theme.assets.AssetHolder; -import com.eden.orchid.api.theme.assets.CssPage; -import com.eden.orchid.api.theme.assets.JsPage; -import com.eden.orchid.api.theme.components.ComponentHolder; -import com.eden.orchid.api.theme.components.OrchidComponent; -import com.eden.orchid.api.theme.pages.OrchidPage; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.json.JSONObject; - -import javax.annotation.Nonnull; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; + +import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Formatter; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Stream; -import static com.eden.orchid.utilities.OrchidExtensionsKt.from; -import static com.eden.orchid.utilities.OrchidExtensionsKt.to; - public final class OrchidUtils { // constants @@ -57,12 +28,6 @@ public final class OrchidUtils { public static boolean isWindows = File.separator.equals("\\"); public static int DEFAULT_PRIORITY = 100; - public static final TableFormatter defaultTableFormatter = (OrchidUtils.isWindows) - ? new AsciiTableFormatter(new CrossingBorder()) - : new AsciiTableFormatter(new SingleBorder()); - - public static final TableFormatter compactTableFormatter = new AsciiTableFormatter(new NoBorder()); - // Tested and documented methods //---------------------------------------------------------------------------------------------------------------------- diff --git a/OrchidCore/src/main/kotlin/com/eden/orchid/api/generators/BuildMetrics.kt b/OrchidCore/src/main/kotlin/com/eden/orchid/api/generators/BuildMetrics.kt index 69454e73d0..a8c579830f 100644 --- a/OrchidCore/src/main/kotlin/com/eden/orchid/api/generators/BuildMetrics.kt +++ b/OrchidCore/src/main/kotlin/com/eden/orchid/api/generators/BuildMetrics.kt @@ -1,13 +1,14 @@ package com.eden.orchid.api.generators import com.caseyjbrooks.clog.Clog -import com.copperleaf.krow.HorizontalAlignment -import com.copperleaf.krow.KrowTable import com.eden.orchid.Orchid import com.eden.orchid.api.OrchidContext import com.eden.orchid.api.theme.pages.OrchidPage -import java.util.ArrayList -import java.util.HashMap +import com.jakewharton.picnic.BorderStyle +import com.jakewharton.picnic.Table +import com.jakewharton.picnic.TextAlignment +import com.jakewharton.picnic.table +import java.util.* import javax.inject.Inject class BuildMetrics @@ -31,75 +32,64 @@ constructor(val context: OrchidContext) { ) } - val detail: KrowTable + val detail: Table get() { if (compositeMetrics == null) throw IllegalStateException("Cannot get build summary: build not complete") - titleColumnWidth = "Generator".length - pageCountColumnWidth = "Page Count".length - indexingTimeColumnWidth = "Indexing Time".length - generationTimeColumnWidth = "Generation Time".length - meanPageTimeColumnWidth = "Mean Page Generation Time".length - medianPageTimeColumnWidth = "Median Page Generation Time".length - val table = KrowTable() - table.columns( - "Page Count", - "Indexing Time", - "Generation Time", - "Mean Page Generation Time", - "Median Page Generation Time" - ) val metricsList = ArrayList(generatorMetricsMap.values) - metricsList.add(compositeMetrics) - for (metric in metricsList) { - if (metric.pageCount == 0) continue - table.cell("Page Count", metric.key!!) { - content = "" + metric.pageCount + val table = table { + style { + borderStyle = BorderStyle.Hidden } - table.cell("Indexing Time", metric.key!!) { - content = "" + metric.indexingTime + cellStyle { + alignment = TextAlignment.MiddleRight + paddingLeft = 1 + paddingRight = 1 + borderLeft = true + borderRight = true } - table.cell("Generation Time", metric.key!!) { - content = "" + metric.generatingTime + header { + cellStyle { + border = true + alignment = TextAlignment.BottomLeft + } + row { + cell("#") + cell("Page Count") + cell("Indexing Time") + cell("Generation Time") + cell("Mean Page Generation Time") + cell("Median Page Generation Time") + } } - table.cell("Mean Page Generation Time", metric.key!!) { - content = "" + metric.meanPageTime + body { + metricsList.forEach { + row { + cell(it.key) + cell(it.pageCount) + cell(it.indexingTime) + cell(it.generatingTime) + cell(it.meanPageTime) + cell(it.medianPageTime) + } + } } - table.cell("Median Page Generation Time", metric.key!!) { - content = "" + metric.medianPageTime + footer { + cellStyle { + border = true + } + row { + cell(compositeMetrics!!.key) + cell(compositeMetrics!!.pageCount) + cell(compositeMetrics!!.indexingTime) + cell(compositeMetrics!!.generatingTime) + cell(compositeMetrics!!.meanPageTime) + cell(compositeMetrics!!.medianPageTime) + } } } - table.column("Page Count") { - wrapTextAt = pageCountColumnWidth - - } - table.column("Indexing Time") { - wrapTextAt = indexingTimeColumnWidth - } - table.column("Generation Time") { - wrapTextAt = generationTimeColumnWidth - } - table.column("Mean Page Generation Time") { - wrapTextAt = meanPageTimeColumnWidth - } - table.column("Median Page Generation Time") { - wrapTextAt = medianPageTimeColumnWidth - } - table.table { - horizontalAlignment = HorizontalAlignment.CENTER - } - table.row("TOTAL") { - horizontalAlignment = HorizontalAlignment.RIGHT - } return table } - var titleColumnWidth: Int = 0 - var pageCountColumnWidth: Int = 0 - var indexingTimeColumnWidth: Int = 0 - var generationTimeColumnWidth: Int = 0 - var meanPageTimeColumnWidth: Int = 0 - var medianPageTimeColumnWidth: Int = 0 - // Measure Indexing Phase //---------------------------------------------------------------------------------------------------------------------- fun startIndexing(generators: Set>) { @@ -162,9 +152,7 @@ constructor(val context: OrchidContext) { generatorMetricsMap .values .stream() - .peek { compositeMetrics!!.compose(it) } - .forEach { this.setColumnWidths(it) } - setColumnWidths(compositeMetrics!!) + .forEach { compositeMetrics!!.compose(it) } context.broadcast(Orchid.Lifecycle.ProgressEvent.fire(this, "building", maxProgress, maxProgress, 0)) } @@ -176,15 +164,6 @@ constructor(val context: OrchidContext) { } } - private fun setColumnWidths(metric: GeneratorMetrics) { - titleColumnWidth = Math.max(titleColumnWidth, metric.key!!.length) - pageCountColumnWidth = Math.max(pageCountColumnWidth, ("" + metric.pageCount).length) - indexingTimeColumnWidth = Math.max(indexingTimeColumnWidth, metric.indexingTime.length) - generationTimeColumnWidth = Math.max(generationTimeColumnWidth, metric.generatingTime.length) - meanPageTimeColumnWidth = Math.max(meanPageTimeColumnWidth, metric.meanPageTime.length) - medianPageTimeColumnWidth = Math.max(medianPageTimeColumnWidth, metric.medianPageTime.length) - } - fun setGeneratorMetricsMap(generatorMetricsMap: MutableMap) { this.generatorMetricsMap = generatorMetricsMap } diff --git a/OrchidCore/src/main/kotlin/com/eden/orchid/impl/commands/HelpCommand.kt b/OrchidCore/src/main/kotlin/com/eden/orchid/impl/commands/HelpCommand.kt index c5e3304c29..a32e871bba 100644 --- a/OrchidCore/src/main/kotlin/com/eden/orchid/impl/commands/HelpCommand.kt +++ b/OrchidCore/src/main/kotlin/com/eden/orchid/impl/commands/HelpCommand.kt @@ -1,7 +1,6 @@ package com.eden.orchid.impl.commands import com.caseyjbrooks.clog.Clog -import com.copperleaf.krow.formatters.html.HtmlTableFormatter import com.eden.orchid.api.OrchidContext import com.eden.orchid.api.options.OptionsExtractor import com.eden.orchid.api.options.OptionsHolder @@ -43,11 +42,12 @@ constructor( val description = extractor.describeAllOptions(parsedClass) val table = extractor.getDescriptionTable(description) - val asciiTable = table.print(OrchidUtils.compactTableFormatter) + val asciiTable = table.toString(); Clog.i("\n{}", asciiTable) if (server != null && server.websocket != null) { - var htmlTable = table.print(HtmlTableFormatter()) + //TODO does this need to be HTML? + var htmlTable = table.toString(); htmlTable = htmlTable.replace("".toRegex(), "
") server.websocket!!.sendMessage("describe", htmlTable) } diff --git a/OrchidCore/src/main/kotlin/com/eden/orchid/impl/tasks/HelpTask.kt b/OrchidCore/src/main/kotlin/com/eden/orchid/impl/tasks/HelpTask.kt index a833851e33..5ebc3840b8 100644 --- a/OrchidCore/src/main/kotlin/com/eden/orchid/impl/tasks/HelpTask.kt +++ b/OrchidCore/src/main/kotlin/com/eden/orchid/impl/tasks/HelpTask.kt @@ -1,14 +1,12 @@ package com.eden.orchid.impl.tasks -import com.copperleaf.krow.krow import com.eden.common.util.EdenUtils import com.eden.orchid.api.OrchidContext import com.eden.orchid.api.options.OrchidFlags import com.eden.orchid.api.options.annotations.Description import com.eden.orchid.api.tasks.OrchidTask import com.eden.orchid.api.tasks.TaskService -import com.eden.orchid.utilities.OrchidUtils -import com.eden.orchid.utilities.SuppressedWarnings +import com.jakewharton.picnic.table import javax.inject.Inject import javax.inject.Provider @@ -20,79 +18,54 @@ constructor( ) : OrchidTask("help", TaskService.TaskType.OTHER, 10) { override fun run(context: OrchidContext) { - println(printHeader(context)) - println("Usage:") - println(printUsage()) - println("Tasks:") - println(printTasks()) - println("Options:") - println(printOptions()) - } - - @Suppress(SuppressedWarnings.UNUSED_PARAMETER) - private fun printHeader(context: OrchidContext): String { - return "\n\nOrchid Static Site Generator.\nVersion " + context.site.orchidVersion + "\n" - } - - private fun printUsage(): String? { - return krow { - showHeaders = false - showLeaders = false - - cell("key", "value") { - content = - " (orchid) <" + OrchidFlags.getInstance().positionalFlags.joinToString("> <") + "> [-- ]" - paddingLeft = 4 - } + println(printHeader(context)); + println( table { - wrapTextAt = 80 - } - }.print(OrchidUtils.compactTableFormatter) - } - - private fun printTasks(): String? { - return krow { - showHeaders = false - showLeaders = false - - for (task in tasks.get()) { - cell("key", task.name) { - content = task.name - paddingLeft = 4 + header { + row("#", "alias", "description") } - cell("description", task.name) { - content = task.description + body { + row{ + cell("Usage") + cell("-") + cell(" (orchid) <" + OrchidFlags.getInstance().positionalFlags.joinToString("> <") + "> [-- ]") + } + row { + cell("Tasks") { + columnSpan = 2 + } + } + tasks.get().forEach { + row { + cell(it.name) + cell("-") + cell(it.description) + } + } + row { + cell("Options") { + columnSpan = 2 + } + } + OrchidFlags.getInstance().describeFlags().values.forEach { + var flagText = "" + if (!EdenUtils.isEmpty(it.aliases)) { + flagText = it.aliases.joinToString(", -") + } + row { + cell(it.key) + cell(flagText) + cell(it.description) + } + } + } } - table { - wrapTextAt = 80 - } - - }.print(OrchidUtils.compactTableFormatter) + ) } - private fun printOptions(): String? { - return krow { - showHeaders = false - showLeaders = false - - for (flag in OrchidFlags.getInstance().describeFlags().values) { - cell("key", flag.key) { - var flagText = "--" + flag.key - if (!EdenUtils.isEmpty(flag.aliases)) { - flagText += ", -" + flag.aliases.joinToString(", -") - } - content = flagText - paddingLeft = 4 - } - cell("description", flag.key) { - content = flag.description - } - } - table { - wrapTextAt = 80 - } - }.print(OrchidUtils.compactTableFormatter) + private fun printHeader(context: OrchidContext): String { + return "\n\nOrchid Static Site Generator.\nVersion " + context.site.orchidVersion + "\n" } } diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index 526c55e14d..313ab4032f 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -254,7 +254,9 @@ object Libs { const val json: String = "org.json:json:" + Versions.json /** - * https://copper-leaf.github.io/krow + * https://github.com/JakeWharton/picnic */ - const val krow: String = "com.eden:krow:" + Versions.krow + const val picnic: String = "com.jakewharton.picnic:picnic:" + Versions.picnic; + + } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 3f0949eda1..b083268fe4 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -98,7 +98,7 @@ object Versions { const val json: String = "20210307" - const val krow: String = "0.1.13" + const val picnic: String = "0.5.0" /** * Current version: "6.4.1" diff --git a/gradle/actions/repositories.gradle b/gradle/actions/repositories.gradle index 980551f7f0..6adad5c348 100644 --- a/gradle/actions/repositories.gradle +++ b/gradle/actions/repositories.gradle @@ -7,7 +7,6 @@ repositories { includeModule("com.eden", "Common") includeModule("com.eden", "Clog4j") includeModule("com.eden", "Clog") - includeModule("com.eden", "krow") includeModule("com.eden", "groovydoc-runner") includeModule("com.eden", "groovydoc-models") includeModule("com.eden", "javadoc-runner")