You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2020/11/06 14:29:08 UTC
[incubator-nlpcraft] branch NLPCRAFT-153 updated (a626ed3 ->
1b80f55)
This is an automated email from the ASF dual-hosted git repository.
sergeykamov pushed a change to branch NLPCRAFT-153
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git.
from a626ed3 WIP.
new 96e6ade WIP.
new 1b80f55 WIP.
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
nlpcraft/src/main/resources/cli/templates.zip | Bin 0 -> 38550 bytes
.../nlpcraft/model/tools/cmdline/NCCli.scala | 258 ++++++++++++++++-----
2 files changed, 199 insertions(+), 59 deletions(-)
create mode 100644 nlpcraft/src/main/resources/cli/templates.zip
[incubator-nlpcraft] 01/02: WIP.
Posted by se...@apache.org.
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 96e6adefc9a1c2c31df784449e63e44bdd94acb6
Author: Sergey Kamov <se...@apache.org>
AuthorDate: Fri Nov 6 16:58:37 2020 +0300
WIP.
---
nlpcraft/src/main/resources/cli/templates.zip | Bin 0 -> 38550 bytes
.../nlpcraft/model/tools/cmdline/NCCli.scala | 260 ++++++++++++++++-----
2 files changed, 201 insertions(+), 59 deletions(-)
diff --git a/nlpcraft/src/main/resources/cli/templates.zip b/nlpcraft/src/main/resources/cli/templates.zip
new file mode 100644
index 0000000..94fcbb3
Binary files /dev/null and b/nlpcraft/src/main/resources/cli/templates.zip differ
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 114df18..6379fea 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
@@ -26,6 +26,7 @@ import java.text.DateFormat
import java.util
import java.util.Date
import java.util.regex.Pattern
+import java.util.zip.{ZipFile, ZipInputStream}
import javax.net.ssl.SSLException
import org.apache.commons.io.IOUtils
@@ -63,7 +64,7 @@ import scala.util.Try
import scala.util.control.Breaks.{break, breakable}
import scala.util.control.Exception.ignoring
-/**
+/**c
* NLPCraft CLI.
*/
object NCCli extends App {
@@ -204,6 +205,32 @@ object NCCli extends App {
optional: Boolean = false // Mandatory by default.
)
+ case class Replacement(from: String, to: String)
+
+ private lazy val TEMPLATES: Map[String, String] = {
+ val m = mutable.HashMap.empty[String, String]
+
+ try
+ managed(new ZipInputStream(U.getStream("cli/templates.zip"))) acquireAndGet { zis ⇒
+ var entry = zis.getNextEntry
+
+ while (entry != null) {
+ val buf = new StringWriter
+
+ IOUtils.copy(zis, buf, StandardCharsets.UTF_8)
+
+ m += entry.getName → buf.toString
+
+ entry = zis.getNextEntry
+ }
+ }
+ catch {
+ case e: IOException ⇒ throw new NCE(s"Failed to read templates", e)
+ }
+
+ m.toMap
+ }
+
//noinspection DuplicatedCode
// TODO: this needs to be loaded dynamically from OpenAPI spec.
private final val REST_SPEC = Seq(
@@ -1321,7 +1348,7 @@ object NCCli extends App {
// TODO:
Command(
name = "project",
- group = "4. Tools",
+ group = "4. Miscellaneous Tools",
synopsis = s"Generates project stub.",
desc = Some(
"Generates project stub for given parameters."
@@ -1375,7 +1402,7 @@ object NCCli extends App {
names = Seq("--override", "-o"),
value = Some("flag"),
optional = true,
- desc = s"Override output direcory flag. Supported: ${y("'true'")}, ${y("'false'")}. Default value is ${y("'false'")}"
+ desc = s"Override output directory flag. Supported: ${y("'true'")}, ${y("'false'")}. Default value is ${y("'false'")}"
)
),
examples = Seq(
@@ -1391,7 +1418,7 @@ object NCCli extends App {
),
Command(
name = "model",
- group = "4. Tools",
+ group = "4. Miscellaneous Tools",
synopsis = s"Generates model file stub.",
desc = Some(
"Generates model file stub as json or yaml file."
@@ -1411,15 +1438,29 @@ object NCCli extends App {
value = Some("name"),
optional = false,
desc = s"File name. Supported extensions: ${y("'json'")}, ${y("'js'")}, ${y("'yaml'")}, ${y("'yml'")}."
+ ),
+ Parameter(
+ id = "baseName",
+ names = Seq("--baseName", "-n"),
+ value = Some("name"),
+ optional = false,
+ desc = "Base name."
+ ),
+ Parameter(
+ id = "override",
+ names = Seq("--override", "-o"),
+ value = Some("flag"),
+ optional = true,
+ desc = s"Override output directory flag. Supported: ${y("'true'")}, ${y("'false'")}. Default value is ${y("'false'")}"
)
),
examples = Seq(
Example(
- usage = Seq("> model -f=myModel.json"),
+ usage = Seq("> model -f=myModel.json -n=myproject"),
desc = s"Generates model in given output folder and file name"
),
Example(
- usage = Seq("> model --outputDir=c:/tmp --fileName=myModel.json"),
+ usage = Seq("> model --outputDir=c:/tmp --fileName=myModel.json --baseName=myproject --override=true"),
desc = s"Generates model in given output folder and file name"
)
)
@@ -2493,12 +2534,6 @@ object NCCli extends App {
}
/**
- *
- * @param dir
- */
- private def isValidDir(dir: File): Boolean = if (dir.exists()) dir.isDirectory else dir.mkdirs()
-
- /**
* @param cmd
* @param args
* @param id
@@ -2530,6 +2565,41 @@ object NCCli extends App {
/**
*
+ * @param zipInDir
+ * @param dst
+ * @param inEntry
+ * @param outEntry
+ * @param rs
+ */
+ @throws[NCE]
+ private def cp(zipInDir: String, dst: File, inEntry: String, outEntry: String, rs: Replacement*) {
+ val key = s"$zipInDir/$inEntry"
+
+ require(TEMPLATES.contains(key), s"Unexpected template entry for: $key")
+
+ var cont = TEMPLATES(key)
+
+ val outFile = new File(dst, outEntry)
+ val parent = outFile.getParentFile
+
+ if (!parent.exists() && !parent.mkdirs())
+ throw new NCE(s"Invalid folder: ${parent.getAbsolutePath}")
+
+ cont = rs.foldLeft(cont)((s, repl) ⇒ s.replaceAll(repl.from, repl.to))
+
+ try
+ managed(new FileWriter(outFile)) acquireAndGet { w ⇒
+ managed(new BufferedWriter(w)) acquireAndGet { bw ⇒
+ bw.write(cont)
+ }
+ }
+ catch {
+ case e: IOException ⇒ throw new NCE(s"Error writing $outEntry", e)
+ }
+ }
+
+ /**
+ *
* @param cmd Command descriptor.
* @param args Arguments, if any, for this command.
* @param repl Whether or not executing from REPL.
@@ -2537,39 +2607,57 @@ object NCCli extends App {
private def cmdModel(cmd: Command, args: Seq[Argument], repl: Boolean): Unit = {
val outputDir = getOrDefault(args, "outputDir", ".")
val fileName = get(cmd, args, "fileName")
+ val overrideFlag = getOrDefault(args,"override", "false").toLowerCase
+ val baseName = {
+ val s = get(cmd, args,"baseName")
- val idx = fileName.lastIndexOf(".")
-
- if (idx <= 0)
- throw InvalidParameter(cmd, "fileName")
-
- val modelFile =
- fileName.substring(idx + 1).toLowerCase match {
- case "js" | "json" ⇒ "cli/model/lightswitch_model.json"
- case "yml" | "yaml" ⇒ "cli/model/lightswitch_model.yaml"
+ s"${s.head.toLower}${s.tail}"
+ }
- case _ ⇒ throw InvalidParameter(cmd, "fileName")
- }
+ check(cmd,"overrideFlag", overrideFlag, "true", "false")
val outDir = new File(outputDir)
+ val outFile = new File(outDir, fileName)
- if (!isValidDir(outDir))
- logln(s"${r("FAIL")} ${y(s"Invalid folder: $outputDir")}")
- else {
- val outFile = new File(outDir, fileName)
+ try {
+ if (outDir.isFile || !outDir.exists() && !outDir.mkdirs)
+ throw new NCE(s"Invalid folder: ${outDir.getAbsolutePath}")
- try {
- managed(new FileOutputStream(outFile)) acquireAndGet { out ⇒
- managed(U.getStream(modelFile)) acquireAndGet { in ⇒
- IOUtils.copy(in, out)
- }
- }
+ if (outFile.isDirectory)
+ throw new NCE(s"Invalid file: ${outFile.getAbsolutePath}")
- logln(s"\nFile ${c(outFile.getAbsolutePath)} created.")
+ if (outFile.exists()) {
+ if (overrideFlag == "true") {
+ if (!outFile.delete())
+ throw new NCE(s"Couldn't delete file: ${outFile.getAbsolutePath}")
+ }
+ else
+ throw new NCE(s"File already exists: ${outFile.getAbsolutePath}")
}
- catch {
- case e: IOException ⇒ logln(s"${r("FAIL")} processing ${c(outFile.getAbsolutePath)}: ${y(e.getLocalizedMessage)}")
+
+ val templExt = {
+ val lc = fileName.toLowerCase
+
+ if (lc.endsWith(".yaml") || lc.endsWith(".yml"))
+ "yaml"
+ else if (lc.endsWith(".json") || lc.endsWith(".js"))
+ "json"
+ else
+ throw InvalidParameter(cmd, "fileName")
}
+
+ cp(
+ "nlpcraft-java-mvn",
+ outDir,
+ s"src/main/resources/template_model.$templExt",
+ fileName,
+ Replacement("templateModelId", baseName)
+ )
+
+ logln(s"\nFile ${c(outFile.getAbsolutePath)} created.")
+ }
+ catch {
+ case e: NCE ⇒ logln(s"${r("FAIL")}: ${y(e.getLocalizedMessage)}")
}
}
@@ -2581,10 +2669,14 @@ object NCCli extends App {
*/
private def cmdProject(cmd: Command, args: Seq[Argument], repl: Boolean): Unit = {
val outputDir = getOrDefault(args, "outputDir", ".")
- val baseName = get(cmd, args,"baseName")
+ val baseName = {
+ val s = get(cmd, args,"baseName")
+
+ s"${s.head.toLower}${s.tail}"
+ }
val lang = getOrDefault(args,"lang", "java").toLowerCase
val buildTool = getOrDefault(args,"buildTool", "mvn").toLowerCase
- val packageName = get(cmd, args,"packageName").toLowerCase
+ val packName = get(cmd, args,"packageName").toLowerCase
val fileType = getOrDefault(args,"fileType", "yaml").toLowerCase
val overrideFlag = getOrDefault(args,"override", "false").toLowerCase
@@ -2593,21 +2685,78 @@ object NCCli extends App {
check(cmd,"fileType", fileType, "yaml", "yml", "json", "js")
check(cmd,"overrideFlag", overrideFlag, "true", "false")
- val outputDirFull = new File(outputDir, baseName)
+ // TODO: check valid package name.
- if (!isValidDir(outputDirFull))
- logln(s"${r("FAIL")} ${y(s"Invalid folder: $outputDir")}")
- else {
-// FileUtils.copyDirectory(
-// U.getFile(s"cli/projects/$lang-$buildTool"),
-// outputDirFull
-// )
-// FileUtils.copyFile(
-// U.getFile(s"cli/model/lightswitch_model.json"),
-// new File(outputDirFull, "src/main/resources/lightswitch_model.json")
-// )
-
- logln(s"\nProject ${c(outputDirFull.getAbsolutePath)} created.")
+ val dst = new File(outputDir, baseName)
+ val packDir = packName.replaceAll("\\.", "/")
+ val className = s"${baseName.head.toUpper}${baseName.tail}"
+ val mdlFileName = s"$baseName.$fileType"
+ val inFolder = s"nlpcraft-$lang-$buildTool"
+
+ val zip = new ZipFile("cli/templates.zip")
+
+ @throws[NCE]
+ def cp0(inEntry: String, outEntry: String, rs: Replacement*): Unit =
+ cp(inFolder, dst, inEntry, outEntry, rs :_*)
+
+ try {
+ if (dst.isFile || !dst.exists() && !dst.mkdirs)
+ throw new NCE(s"Invalid folder: ${dst.getAbsolutePath}")
+ else if (dst.exists) {
+ if (overrideFlag == "true")
+ U.clearFolder(dst.getAbsolutePath)
+ else
+ throw new NCE(s"Folder already exists: ${dst.getAbsolutePath}")
+ }
+
+ inFolder match {
+ case "nlpcraft-java-mvn" ⇒
+ cp0(
+ "pom.xml",
+ "pom.xml",
+ Replacement("<groupId>com.company.nlp</groupId>", s"<groupId>$packName</groupId>"),
+ Replacement("<artifactId>myapplication</artifactId>", s"<artifactId>$baseName</artifactId>")
+ )
+ cp0(
+ ".gitignore",
+ s".gitignore"
+ )
+ cp0(
+ "src/main/java/com/company/nlp/README.md",
+ s"src/main/java/$packDir/README.md"
+ )
+ cp0(
+ "src/main/java/com/company/nlp/TemplateModel.java",
+ s"src/main/java/$packDir/$className.java",
+ Replacement("package com.company.nlp;", s"package $packName;"),
+ Replacement("TemplateModel", className),
+ Replacement("template_model.json", s"$mdlFileName.$fileType"),
+ )
+ cp0(
+ "src/main/java/com/company/nlp/TemplateModelApp.java",
+ s"src/main/java/$packDir/${className}App.java",
+ Replacement("package com.company.nlp;", s"package $packName;"),
+ Replacement("TemplateModel", className)
+ )
+ cp0(
+ "src/test/java/com/company/nlp/TemplateModelTest.java",
+ s"src/test/java/$packDir/${className}Test.java",
+ Replacement("package com.company.nlp;", s"package $packName;"),
+ Replacement("TemplateModelTest", s"${className}Test"),
+ Replacement("templateModelId", baseName)
+ )
+ cp0(
+ s"src/main/resources/template_model.$fileType",
+ s"src/main/resources/$baseName.$fileType",
+ Replacement("templateModelId", baseName)
+ )
+ case _ ⇒ require(false)
+ }
+
+ logln(s"\nProject ${c(dst.getAbsolutePath)} created.")
+ }
+ catch {
+ case e: NCE ⇒ logln(s"${r("FAIL")}: ${y(e.getLocalizedMessage)}")
}
}
@@ -3336,11 +3485,4 @@ object NCCli extends App {
}
object x extends App {
- x11()
-
- def x11(): Unit = {
- val x = U.getFilesResources("cli/projects/java-mvn")
-
- println(x)
- }
}
[incubator-nlpcraft] 02/02: WIP.
Posted by se...@apache.org.
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 1b80f55905a9f56a13ae5225006ebd6ac946d154
Author: Sergey Kamov <se...@apache.org>
AuthorDate: Fri Nov 6 17:28:59 2020 +0300
WIP.
---
.../org/apache/nlpcraft/model/tools/cmdline/NCCli.scala | 14 ++++++--------
1 file changed, 6 insertions(+), 8 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 6379fea..cd003b6 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
@@ -26,7 +26,7 @@ import java.text.DateFormat
import java.util
import java.util.Date
import java.util.regex.Pattern
-import java.util.zip.{ZipFile, ZipInputStream}
+import java.util.zip.ZipInputStream
import javax.net.ssl.SSLException
import org.apache.commons.io.IOUtils
@@ -2693,8 +2693,6 @@ object NCCli extends App {
val mdlFileName = s"$baseName.$fileType"
val inFolder = s"nlpcraft-$lang-$buildTool"
- val zip = new ZipFile("cli/templates.zip")
-
@throws[NCE]
def cp0(inEntry: String, outEntry: String, rs: Replacement*): Unit =
cp(inFolder, dst, inEntry, outEntry, rs :_*)
@@ -2714,8 +2712,8 @@ object NCCli extends App {
cp0(
"pom.xml",
"pom.xml",
- Replacement("<groupId>com.company.nlp</groupId>", s"<groupId>$packName</groupId>"),
- Replacement("<artifactId>myapplication</artifactId>", s"<artifactId>$baseName</artifactId>")
+ Replacement("com.company.nlp", packName),
+ Replacement("myapplication", baseName)
)
cp0(
".gitignore",
@@ -2728,20 +2726,20 @@ object NCCli extends App {
cp0(
"src/main/java/com/company/nlp/TemplateModel.java",
s"src/main/java/$packDir/$className.java",
- Replacement("package com.company.nlp;", s"package $packName;"),
+ Replacement("com.company.nlp", s"$packName"),
Replacement("TemplateModel", className),
Replacement("template_model.json", s"$mdlFileName.$fileType"),
)
cp0(
"src/main/java/com/company/nlp/TemplateModelApp.java",
s"src/main/java/$packDir/${className}App.java",
- Replacement("package com.company.nlp;", s"package $packName;"),
+ Replacement("com.company.nlp", s"$packName"),
Replacement("TemplateModel", className)
)
cp0(
"src/test/java/com/company/nlp/TemplateModelTest.java",
s"src/test/java/$packDir/${className}Test.java",
- Replacement("package com.company.nlp;", s"package $packName;"),
+ Replacement("com.company.nlp", s"$packName"),
Replacement("TemplateModelTest", s"${className}Test"),
Replacement("templateModelId", baseName)
)