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)
 

Reply via email to