This is an automated email from the ASF dual-hosted git repository.
aradzinski pushed a commit to branch NLPCRAFT-108
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
The following commit(s) were added to refs/heads/NLPCRAFT-108 by this push:
new c3e5ef6 WIP.
c3e5ef6 is described below
commit c3e5ef619e6cf0e3e14b09387c0102b2557bb77a
Author: Aaron Radzinski <[email protected]>
AuthorDate: Sat Oct 3 19:21:48 2020 -0700
WIP.
---
.../nlpcraft/common/ansi/NCAnsiSpinner.scala | 59 ++++++++++++----------
.../nlpcraft/model/tools/cmdline/NCCli.scala | 40 ++++++++-------
2 files changed, 54 insertions(+), 45 deletions(-)
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ansi/NCAnsiSpinner.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ansi/NCAnsiSpinner.scala
index 0280780..d891d6c 100644
---
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ansi/NCAnsiSpinner.scala
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/ansi/NCAnsiSpinner.scala
@@ -17,7 +17,7 @@
package org.apache.nlpcraft.common.ansi
-import java.io.PrintStream
+import java.io.PrintWriter
import java.util.Random
import NCAnsi._
@@ -27,28 +27,27 @@ import org.apache.nlpcraft.common.ansi.NCAnsiSpinner.RND
/**
*
*/
-class NCAnsiSpinner(out: PrintStream = System.out, ansiColor: String =
ansiCyanFg, useAnsi: Boolean = true) {
+class NCAnsiSpinner(out: PrintWriter, ansiColor: String = ansiCyanFg, useAnsi:
Boolean = true) {
@volatile var thread: Thread = _
final val SPIN_CHAR_SETS = Seq(
-// Seq('-', '\\', '|', '/'),
-// Seq('.', 'o', 'O', '@', '*'),
-// Seq('←', '↖', '↑', '↗', '→', '↘', '↓', '↙'),
-// Seq('▁', '▂', '▃', '▄', '▅', '▆', '▇', '█', '▇', '▆', '▅', '▄', '▃',
'▁'),
-// Seq('▖', '▘', '▝', '▗'),
-// Seq('┤', '┘', '┴', '└', '├', '┌', '┬', '┐'),
- Seq('\u25E2', '\u25E3', '\u25E4', '\u25E5')
-// Seq('◰', '◳', '◲', '◱'),
-// Seq('◴', '◷', '◶', '◵'),
-// Seq('◐', '◓', '◑', '◒'),
-// Seq('◡', '⊙', '◠', '⊙'),
-// Seq('⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'),
-// Seq('⠁', '⠂', '⠄', '⡀', '⢀', '⠠', '⠐', '⠈')
+ Seq('-', '\\', '|', '/'),
+ Seq('.', 'o', 'O', '@', '*'),
+ Seq('←', '↖', '↑', '↗', '→', '↘', '↓', '↙'),
+ Seq('▁', '▂', '▃', '▄', '▅', '▆', '▇', '█', '▇', '▆', '▅', '▄', '▃',
'▁'),
+ Seq('▖', '▘', '▝', '▗'),
+ Seq('┤', '┘', '┴', '└', '├', '┌', '┬', '┐'),
+ Seq('◢', '◣', '◤', '◥'),
+ Seq('◰', '◳', '◲', '◱'),
+ Seq('◴', '◷', '◶', '◵'),
+ Seq('◐', '◓', '◑', '◒'),
+ Seq('◡', '⊙', '◠', '⊙'),
+ Seq('⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'),
+ Seq('⠁', '⠂', '⠄', '⡀', '⢀', '⠠', '⠐', '⠈')
)
- private val SPIN_CHARS = SPIN_CHAR_SETS(RND.nextInt(SPIN_CHAR_SETS.size))
- private var rightPrompt = ""
- private var leftPrompt = ""
+ private var suffix = ""
+ private var prefix = ""
private var lastLength = 0
private var frame = 0
@@ -56,15 +55,15 @@ class NCAnsiSpinner(out: PrintStream = System.out,
ansiColor: String = ansiCyanF
*
* @param p
*/
- def setRightPrompt(p: String): Unit =
- this.rightPrompt = if (p == null) "" else p
+ def setSuffix(p: String): Unit =
+ this.suffix = if (p == null) "" else p
/**
*
* @param p
*/
- def setLeftPrompt(p: String): Unit =
- this.leftPrompt = if (p == null) "" else p
+ def setPrefix(p: String): Unit =
+ this.prefix = if (p == null) "" else p
/**
*
@@ -80,15 +79,21 @@ class NCAnsiSpinner(out: PrintStream = System.out,
ansiColor: String = ansiCyanF
def start(): Unit =
if (useAnsi) {
thread = U.mkThread("ansi-spinner") { t ⇒
+ frame = 0
+ lastLength = 0
+
+ val chars = SPIN_CHAR_SETS(RND.nextInt(SPIN_CHAR_SETS.size))
+
+ // Hide cursor to avoid blinking.
out.print(ansiCursorHide)
while (!t.isInterrupted) {
-// if (frame > 0)
-// clean()
+ if (frame > 0)
+ clean()
- out.print(s"$leftPrompt$ansiColor${SPIN_CHARS(frame %
SPIN_CHARS.size)}$ansiReset$rightPrompt")
+ out.print(s"$prefix$ansiColor${chars(frame %
chars.size)}$ansiReset$suffix")
- lastLength = U.stripAnsi(leftPrompt).length + 1 +
U.stripAnsi(rightPrompt).length
+ lastLength = U.stripAnsi(prefix).length + 1 +
U.stripAnsi(suffix).length
frame += 1
@@ -109,6 +114,8 @@ class NCAnsiSpinner(out: PrintStream = System.out,
ansiColor: String = ansiCyanF
if (useAnsi && frame > 0) {
clean()
+
+ // Show cursor.
out.print(ansiCursorShow)
}
}
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
index d781d8c..bd37f60 100644
---
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/tools/cmdline/NCCli.scala
@@ -43,7 +43,7 @@ import java.util.regex.PatternSyntaxException
import org.apache.nlpcraft.common.util.NCUtils.IntTimeUnits
import org.jline.reader.Completer
import org.jline.reader.impl.DefaultParser
-import org.jline.terminal.TerminalBuilder
+import org.jline.terminal.{Terminal, TerminalBuilder}
import org.jline.reader.{Candidate, EndOfFileException, LineReader,
LineReaderBuilder, ParsedLine, UserInterruptException}
import org.jline.reader.impl.DefaultParser.Bracket
import org.jline.reader.impl.history.DefaultHistory
@@ -82,8 +82,12 @@ object NCCli extends App {
private var exitStatus = 0
+ private var term: Terminal = _
+
private val gson = new GsonBuilder().setPrettyPrinting().create
+ case class SplitError(index: Int) extends Exception
+
case class State(
var isServer: Boolean,
var accessToken: Option[String]
@@ -480,9 +484,7 @@ object NCCli extends App {
else {
log(s"Server is starting ")
- def getServerBeacon = loadServerBeacon().orNull
-
- var beacon = getServerBeacon
+ var beacon = loadServerBeacon().orNull
var online = false
val spinner = mkSpinner()
val timeout = currentTime + 5.mins
@@ -492,13 +494,14 @@ object NCCli extends App {
while (currentTime < timeout && !online) {
if (beacon == null)
- beacon = getServerBeacon
+ beacon = loadServerBeacon().orNull
else
online = Try(restHealth("http://" +
beacon.restEndpoint) == 200).getOrElse(false)
if (!online) {
if (currentTime > warnTimeout)
- spinner.setRightPrompt(s" ${r("(taking too long -
check logs)")}")
+ // Warn if it's taking too long.
+ spinner.setSuffix(s" ${r("(taking too long - check
logs)")}")
Thread.sleep(2.secs) // Check every 2 secs.
}
@@ -536,7 +539,7 @@ object NCCli extends App {
* @return
*/
private def mkSpinner() = new NCAnsiSpinner(
- System.out,
+ term.writer(),
ansiCyanFg,
// ANSI is NOT disabled & we ARE NOT running from IDEA or Eclipse...
NCAnsi.isEnabled && IS_SCRIPT
@@ -880,13 +883,6 @@ object NCCli extends App {
val appName = s"$NAME ver. ${VER.version}"
- val term = TerminalBuilder.builder()
- .name(appName)
- .system(true)
- .dumb(true)
- .jansi(true)
- .build()
-
val parser = new DefaultParser()
parser.setEofOnUnclosedBracket(Bracket.CURLY, Bracket.ROUND,
Bracket.SQUARE)
@@ -1057,20 +1053,20 @@ object NCCli extends App {
val msg2 = if (msg.head.isLower) msg.head.toUpper + msg.tail else msg
- System.out.println(s"${y("ERR:")} $msg2")
+ term.writer().println(s"${y("ERR:")} $msg2")
}
/**
*
* @param msg
*/
- private def logln(msg: String = ""): Unit = System.out.println(msg)
+ private def logln(msg: String = ""): Unit = term.writer().println(msg)
/**
*
* @param msg
*/
- private def log(msg: String = ""): Unit = System.out.print(msg)
+ private def log(msg: String = ""): Unit = term.writer().print(msg)
/**
*
@@ -1143,8 +1139,6 @@ object NCCli extends App {
get.releaseConnection()
}
- case class SplitError(index: Int) extends Exception
-
/**
* Splits given string by spaces taking into an account double and single
quotes,
* '\' escaping as well as checking for uneven <>, {}, [], () pairs.
@@ -1305,6 +1299,14 @@ object NCCli extends App {
* @param args
*/
private def boot(args: Array[String]): Unit = {
+ // Initialize OS-aware terminal.
+ term = TerminalBuilder.builder()
+ .name(NAME)
+ .system(true)
+ .dumb(true)
+ .jansi(true)
+ .build()
+
// Process 'no-ansi' and 'ansi' commands first (before ASCII title is
shown).
processAnsi(args, repl = false)