This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a commit to branch NLPCRAFT-153
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 46aaa159f1e46129ebfb80f280039d3053ffdbb5
Author: Sergey Kamov <[email protected]>
AuthorDate: Wed Oct 28 15:14:18 2020 +0300

    WIP.
---
 .../nlpcraft/model/tools/cmdline/NCCli.scala       | 140 ++++++++++++++++++---
 1 file changed, 120 insertions(+), 20 deletions(-)

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 7b21809..a176dc4 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
@@ -17,46 +17,51 @@
 
 package org.apache.nlpcraft.model.tools.cmdline
 
+import java.io._
+import java.lang.ProcessBuilder.Redirect
+import java.lang.management.ManagementFactory
+import java.nio.charset.StandardCharsets
+import java.nio.file.Paths
+import java.text.DateFormat
+import java.util
+import java.util.Date
+import java.util.regex.Pattern
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
+import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature
 import javax.net.ssl.SSLException
+import org.apache.commons.io.input.{ReversedLinesFileReader, Tailer, 
TailerListenerAdapter}
 import org.apache.commons.lang3.SystemUtils
+import org.apache.commons.lang3.time.DurationFormatUtils
 import org.apache.http.HttpResponse
 import org.apache.http.client.ResponseHandler
 import org.apache.http.client.methods.{HttpGet, HttpPost}
 import org.apache.http.client.utils.URIBuilder
 import org.apache.http.entity.StringEntity
 import org.apache.http.impl.client.HttpClients
-import org.apache.nlpcraft.common.ascii.NCAsciiTable
+import org.apache.http.util.EntityUtils
 import org.apache.nlpcraft.common._
-import org.apache.nlpcraft.common.ansi.{NCAnsi, NCAnsiProgressBar, 
NCAnsiSpinner}
 import org.apache.nlpcraft.common.ansi.NCAnsi._
+import org.apache.nlpcraft.common.ansi.{NCAnsi, NCAnsiProgressBar, 
NCAnsiSpinner}
+import org.apache.nlpcraft.common.ascii.NCAsciiTable
 import org.apache.nlpcraft.common.version.NCVersion
-import java.lang.ProcessBuilder.Redirect
-import java.lang.management.ManagementFactory
-import java.text.DateFormat
-import java.util
-import java.util.Date
-import java.io._
-import java.nio.charset.StandardCharsets
-import java.nio.file.Paths
-import java.util.regex.Pattern
-
-import org.apache.commons.io.input.{ReversedLinesFileReader, Tailer, 
TailerListenerAdapter}
-import org.apache.commons.lang3.time.DurationFormatUtils
-import org.apache.http.util.EntityUtils
+import org.apache.nlpcraft.model.NCModelAdapter
 import org.jline.builtins.Commands
-import org.jline.reader.{Candidate, Completer, EndOfFileException, 
Highlighter, LineReader, LineReaderBuilder, ParsedLine, UserInterruptException}
 import org.jline.reader.impl.DefaultParser
-import org.jline.terminal.{Terminal, TerminalBuilder}
 import org.jline.reader.impl.DefaultParser.Bracket
 import org.jline.reader.impl.history.DefaultHistory
+import org.jline.reader._
+import org.jline.terminal.{Terminal, TerminalBuilder}
 import org.jline.utils.AttributedString
 import org.jline.utils.InfoCmp.Capability
 import resource.managed
 
-import scala.collection.mutable
-import scala.compat.java8.OptionConverters._
 import scala.collection.JavaConverters._
+import scala.collection.mutable
 import scala.compat.Platform.currentTime
+import scala.compat.java8.OptionConverters._
 import scala.util.Try
 import scala.util.control.Breaks.{break, breakable}
 import scala.util.control.Exception.ignoring
@@ -1128,6 +1133,42 @@ object NCCli extends App {
                     desc = s"Display only the release date, e.g. ${VER.date}."
                 )
             )
+        ),
+        // TODO:
+        Command(
+            name = "model",
+            group = "3. REPL Commands",
+            synopsis = s"Generates model file stub.",
+            desc = Some(
+                "Generates model file stub as json or yaml file."
+            ),
+            body = cmdModel,
+            params = Seq(
+                Parameter(
+                    id = "outputDir",
+                    names = Seq("--output-dir", "-d"),
+                    value = Some("path"),
+                    optional = false,
+                    desc = "Output dir."
+                ),
+                Parameter(
+                    id = "fileName",
+                    names = Seq("--file-name", "-f"),
+                    value = Some("path"),
+                    optional = false,
+                    desc = "File name."
+                )
+            ),
+            examples = Seq(
+                Example(
+                    usage = Seq("> model -d=. -f=myModel.json"),
+                    desc = s"Generates model in given output folder and file 
name"
+                ),
+                Example(
+                    usage = Seq("> model --file-name=. 
--file-name=myModel.json"),
+                    desc = s"Generates model in given output folder and file 
name"
+                )
+            )
         )
     ).sortBy(_.name)
 
@@ -2177,6 +2218,65 @@ object NCCli extends App {
     }
 
     /**
+      *
+      * @param cmd Command descriptor.
+      * @param args Arguments, if any, for this command.
+      * @param repl Whether or not executing from REPL.
+      */
+    private def cmdModel(cmd: Command, args: Seq[Argument], repl: Boolean): 
Unit = {
+        def get(name: String): String =
+            args.find(_.parameter.id == name).flatMap(_.value).getOrElse(throw 
MissingParameter(cmd, name))
+
+        val outputDir = get("outputDir")
+        val fileName = get("fileName")
+
+        val idx = fileName.lastIndexOf(".")
+
+        if (idx <= 0)
+            throw InvalidParameter(cmd, "fileName")
+
+        val isJson =
+            fileName.substring(idx + 1).toLowerCase match {
+                case "js" | "json" ⇒ true
+                case "yml" | "yaml" ⇒ false
+
+                case _ ⇒ throw InvalidParameter(cmd, "fileName")
+            }
+
+        val dir = new File(outputDir)
+
+        val okDir = if (dir.exists()) dir.isDirectory else dir.mkdirs()
+
+        if (!okDir)
+            logln(s"${r("FAIL")} ${y(s"Invalid folder: $outputDir")}")
+        else {
+            val mdl = new NCModelAdapter ("id", "Generated model", "1.0.0" ) {}
+            val file = new File(outputDir, fileName)
+
+            val mapper =
+                if (isJson)
+                    new ObjectMapper()
+                else
+                    new ObjectMapper(new 
YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER))
+
+            mapper.setSerializationInclusion(Include.NON_NULL)
+
+            try {
+                managed(new FileOutputStream(file)) acquireAndGet { stream ⇒
+                    mapper.writerWithDefaultPrettyPrinter().writeValue(stream, 
mdl)
+
+                    stream.flush()
+                }
+
+                logln(s"\nFile ${c(file.getAbsolutePath)} created.")
+            }
+            catch {
+                case e: IOException ⇒ logln(s"${r("FAIL")} processing 
${c(file.getAbsolutePath)}: ${y(e.getLocalizedMessage)}")
+            }
+        }
+    }
+
+    /**
      *
      * @param cmd
      * @param path
@@ -2243,7 +2343,7 @@ object NCCli extends App {
         parser.regexCommand("")
         parser.regexVariable("")
 
-        val completer = new Completer {
+        val completer: Completer = new Completer {
             private val cmds = CMDS.map(c ⇒ (c.name, c.synopsis, c.group))
 
             /**

Reply via email to