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)) /**
