This is an automated email from the ASF dual-hosted git repository. aradzinski pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
commit faaa36cb826aec8dc49cf546cc3e002dfe1f0895 Author: Aaron Radzinski <[email protected]> AuthorDate: Sat Oct 10 11:14:36 2020 -0700 Update NCCli.scala --- .../nlpcraft/model/tools/cmdline/NCCli.scala | 360 +++++++++++++++++++-- 1 file changed, 328 insertions(+), 32 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 2af3e69..e592258 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 @@ -71,36 +71,303 @@ object NCCli extends App { case class RestCall( path: String, desc: String, - group: String + group: String, + params: Seq[RestCallParameter] ) + sealed trait JsonType + case object STRING extends JsonType + case object BOOLEAN extends JsonType + case object NUMERIC extends JsonType + case object OBJECT extends JsonType + case object ARRAY extends JsonType + + case class RestCallParameter( + name: String, + kind: JsonType, + optional: Boolean = false // Mandatory by default. + ) + + //noinspection DuplicatedCode // TODO: this needs to be loaded dynamically from OpenAPI spec. - private final val REST_CMDS = Seq( - RestCall("clear/conversation", "Clears conversation STM", "Asking"), - RestCall("clear/dialog", "Clears dialog flow", "Asking"), - RestCall("model/sugsyn", "Runs model synonym suggestion tool", "Tools"), - RestCall("check", "Gets status and result of submitted requests", "Asking"), - RestCall("cancel", "Cancels a question", "Asking"), - RestCall("ask", "Asks a question", "Asking"), - RestCall("ask/sync", "Asks a question in synchronous mode", "Asking"), - RestCall("user/get", "Gets current user information", "User"), - RestCall("user/all", "Gets all users", "User"), - RestCall("user/update", "Updates regular user", "User"), - RestCall("user/delete", "Deletes user", "User"), - RestCall("user/admin", "Updates user admin permissions", "User"), - RestCall("user/passwd/reset", "Resets password for the user", "User"), - RestCall("user/add", "Adds new user", "User"), - RestCall("company/get", "Gets current user company information", "Company"), - RestCall("company/add", "Adds new company", "Company"), - RestCall("company/update", "Updates company data", "Company"), - RestCall("company/delete", "Deletes company", "Company"), - RestCall("company/token/reset", "Resets company probe auth token", "Company"), - RestCall("feedback/add", "Adds feedback", "Asking"), - RestCall("feedback/delete", "Deletes feedback", "Asking"), - RestCall("feedback/all", "Gets all feedback", "Asking"), - RestCall("signin", "Signs in and obtains new access token", "Authentication"), - RestCall("signout", "Signs out and releases access token", "Authentication"), - RestCall("probe/all", "Gets all probes", "Probe") + private final val REST_SPEC = Seq( + RestCall( + path = "clear/conversation", + desc = "Clears conversation STM", + group = "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "mdlId", kind = STRING), + RestCallParameter(name = "usrId", kind = STRING, optional = true), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true) + ) + ), + RestCall( + "clear/dialog", + "Clears dialog flow", + "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "mdlId", kind = STRING), + RestCallParameter(name = "usrId", kind = STRING, optional = true), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true) + ) + ), + RestCall( + "model/sugsyn", + "Runs model synonym suggestion tool", + "Tools", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "mdlId", kind = STRING), + RestCallParameter(name = "minScore", kind = NUMERIC) + ) + ), + RestCall( + "check", + "Gets status and result of submitted requests", + "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "usrId", kind = STRING, optional = true), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true), + RestCallParameter(name = "srvReqIds", kind = ARRAY, optional = true), + RestCallParameter(name = "maxRows", kind = NUMERIC, optional = true) + ) + ), + RestCall( + "cancel", + "Cancels a question", + "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "usrId", kind = STRING, optional = true), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true), + RestCallParameter(name = "srvReqIds", kind = ARRAY, optional = true), + ) + ), + RestCall( + "ask", + "Asks a question", + "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "usrId", kind = STRING, optional = true), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true), + RestCallParameter(name = "txt", kind = STRING), + RestCallParameter(name = "mdlId", kind = STRING), + RestCallParameter(name = "data", kind = OBJECT, optional = true), + RestCallParameter(name = "enableLog", kind = BOOLEAN, optional = true), + ) + ), + RestCall( + "ask/sync", + "Asks a question in synchronous mode", + "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "usrId", kind = STRING, optional = true), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true), + RestCallParameter(name = "txt", kind = STRING), + RestCallParameter(name = "mdlId", kind = STRING), + RestCallParameter(name = "data", kind = OBJECT, optional = true), + RestCallParameter(name = "enableLog", kind = BOOLEAN, optional = true), + ) + ), + RestCall( + "user/get", + "Gets current user information", + "User", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "id", kind = STRING, optional = true), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true) + ) + ), + RestCall( + "user/all", + "Gets all users", + "User", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + ) + ), + RestCall( + "user/update", + "Updates regular user", + "User", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "firstName", kind = STRING), + RestCallParameter(name = "lastName", kind = STRING), + RestCallParameter(name = "id", kind = STRING, optional = true), + RestCallParameter(name = "avatarUrl", kind = STRING, optional = true), + RestCallParameter(name = "properties", kind = OBJECT, optional = true) + ) + ), + RestCall( + "user/delete", + "Deletes user", + "User", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "id", kind = STRING, optional = true), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true) + ) + ), + RestCall( + "user/admin", + "Updates user admin permissions", + "User", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "id", kind = STRING, optional = true), + RestCallParameter(name = "isAdmin", kind = BOOLEAN) + ) + ), + RestCall( + "user/passwd/reset", + "Resets password for the user", + "User", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "id", kind = STRING, optional = true), + RestCallParameter(name = "newPasswd", kind = STRING) + ) + ), + RestCall( + "user/add", + "Adds new user", + "User", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "firstName", kind = STRING), + RestCallParameter(name = "lastName", kind = STRING), + RestCallParameter(name = "email", kind = STRING), + RestCallParameter(name = "passwd", kind = STRING), + RestCallParameter(name = "isAdmin", kind = BOOLEAN), + RestCallParameter(name = "usrExtId", kind = STRING, optional = true), + RestCallParameter(name = "avatarUrl", kind = STRING, optional = true), + RestCallParameter(name = "properties", kind = OBJECT, optional = true) + ) + ), + RestCall( + "company/get", + "Gets current user company information", + "Company", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + ) + ), + RestCall( + "company/add", + "Adds new company", + "Company", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "name", kind = STRING), + RestCallParameter(name = "website", kind = STRING, optional = true), + RestCallParameter(name = "country", kind = STRING, optional = true), + RestCallParameter(name = "region", kind = STRING, optional = true), + RestCallParameter(name = "city", kind = STRING, optional = true), + RestCallParameter(name = "address", kind = STRING, optional = true), + RestCallParameter(name = "postalCode", kind = STRING, optional = true), + RestCallParameter(name = "adminEmail", kind = STRING), + RestCallParameter(name = "adminPasswd", kind = STRING), + RestCallParameter(name = "adminFirstName", kind = STRING), + RestCallParameter(name = "adminLastName", kind = STRING), + RestCallParameter(name = "adminAvatarUrl", kind = STRING, optional = true) + ) + ), + RestCall( + "company/update", + "Updates company data", + "Company", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "name", kind = STRING), + RestCallParameter(name = "website", kind = STRING, optional = true), + RestCallParameter(name = "country", kind = STRING, optional = true), + RestCallParameter(name = "region", kind = STRING, optional = true), + RestCallParameter(name = "city", kind = STRING, optional = true), + RestCallParameter(name = "address", kind = STRING, optional = true), + RestCallParameter(name = "postalCode", kind = STRING, optional = true) + ) + ), + RestCall( + "company/delete", + "Deletes company", + "Company", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + ) + ), + RestCall( + "company/token/reset", + "Resets company probe auth token", + "Company", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + ) + ), + RestCall( + "feedback/add", + "Adds feedback", + "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "usrId", kind = STRING, optional = true), + RestCallParameter(name = "extUsrId", kind = STRING, optional = true), + RestCallParameter(name = "comment", kind = STRING, optional = true), + RestCallParameter(name = "srvReqId", kind = STRING), + RestCallParameter(name = "score", kind = STRING) + ) + ), + RestCall( + "feedback/delete", + "Deletes feedback", + "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "id", kind = NUMERIC) + ) + ), + RestCall( + "feedback/all", + "Gets all feedback", + "Asking", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + RestCallParameter(name = "usrId", kind = STRING, optional = true), + RestCallParameter(name = "extUsrId", kind = STRING, optional = true), + RestCallParameter(name = "srvReqId", kind = STRING, optional = true) + ) + ), + RestCall( + "signin", + "Signs in and obtains new access token", + "Authentication", + params = Seq( + RestCallParameter(name = "email", kind = STRING), + RestCallParameter(name = "passwd", kind = STRING) + ) + ), + RestCall( + "signout", + "Signs out and releases access token", + "Authentication", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + ) + ), + RestCall( + "probe/all", + "Gets all probes", + "Probe", + params = Seq( + RestCallParameter(name = "acsTok", kind = STRING), + ) + ) ) // Number of server services that need to be started + 1 progress start. @@ -274,7 +541,7 @@ object NCCli extends App { s"In REPL mode, hit ${rv(" Tab ")} to see auto-suggestion and " + s"auto-completion candidates for commonly used paths and call parameters." ), - body = cmdRest, + body = cmdCall, params = Seq( Parameter( id = "path", @@ -662,6 +929,7 @@ object NCCli extends App { private final val QUIT_CMD = CMDS.find(_.name == "quit").get private final val HELP_CMD = CMDS.find(_.name == "help").get private final val REST_CMD = CMDS.find(_.name == "rest").get + private final val CALL_CMD = CMDS.find(_.name == "call").get private final val STOP_SRV_CMD = CMDS.find(_.name == "stop-server").get private final val START_SRV_CMD = CMDS.find(_.name == "start-server").get @@ -1432,6 +1700,29 @@ object NCCli extends App { /** * + * @param path + */ + private def checkRestPath(path: String): Unit = + if (!REST_SPEC.exists(_.path == path)) + throw new IllegalArgumentException(s"Unknown REST path $C'$path'$RST, type ${c("'help --cmd=rest'")} to get help.") + + /** + * + * @param cmd Command descriptor. + * @param args Arguments, if any, for this command. + * @param repl Whether or not executing from REPL. + */ + private def cmdCall(cmd: Command, args: Seq[Argument], repl: Boolean): Unit = { + val normArgs = args.filter(_.parameter != null) + val synthArgs = args.filter(_.parameter == null) + + val path = normArgs.find(_.parameter.id == "path").getOrElse(throw MissingParameter(cmd, "path")).value.get + + checkRestPath(path) + } + + /** + * * @param cmd Command descriptor. * @param args Arguments, if any, for this command. * @param repl Whether or not executing from REPL. @@ -1443,8 +1734,7 @@ object NCCli extends App { if (!U.isValidJson(rawJson)) throw MalformedJson() - if (!REST_CMDS.exists(_.path == path)) - throw new IllegalArgumentException(s"Unknown REST path $C'$path'$RST, type ${c("'help --cmd=rest'")} to get help.") + checkRestPath(path) val endpoint = getRestEndpointFromBeacon @@ -1567,7 +1857,7 @@ object NCCli extends App { if (!hasPathAlready) candidates.addAll( - REST_CMDS.map(cmd ⇒ { + REST_SPEC.map(cmd ⇒ { val name = s"--path=${cmd.path}" mkCandidate( @@ -1895,9 +2185,15 @@ object NCCli extends App { val name = if (parts.size == 1) arg else parts(0) val value = if (parts.size == 1) None else Some(parts(1)) + val hasSynth = cmd.params.exists(_.synthetic) cmd.findParameterByNameOpt(name) match { - case None ⇒ throw mkError() + case None ⇒ + if (hasSynth) + Argument(null, value) // Synthetic argument (name is unspecified). + else + throw mkError() + case Some(param) ⇒ if ((param.value.isDefined && value.isEmpty) || (param.value.isEmpty && value.isDefined)) throw mkError()
