This is an automated email from the ASF dual-hosted git repository.
sergeykamov pushed a commit to branch NLPCRAFT-491
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
The following commit(s) were added to refs/heads/NLPCRAFT-491 by this push:
new 10497d3c WIP.
10497d3c is described below
commit 10497d3c7074b4ce02ba41709004c3c5f90f05db
Author: Sergey Kamov <[email protected]>
AuthorDate: Thu Apr 7 19:37:59 2022 +0300
WIP.
---
.../{order => pizzeria}/PizzeriaModel.scala | 25 +++------
.../PizzeriaModelPipeline.scala | 4 +-
.../{order => pizzeria}/PizzeriaOrder.scala | 22 +++++---
.../components/ElementExtender.scala | 2 +-
.../components/RequestValidator.scala | 2 +-
.../{order => pizzeria}/PizzeriaModelSpec.scala | 63 ++++++++++++++++++----
.../cli/PizzeriaModelClientCli.scala | 2 +-
.../cli/PizzeriaModelServer.scala | 4 +-
8 files changed, 83 insertions(+), 41 deletions(-)
diff --git
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModel.scala
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
similarity index 89%
rename from
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModel.scala
rename to
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
index 8bcd5f29..faf3e891 100644
---
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModel.scala
+++
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModel.scala
@@ -15,12 +15,12 @@
* limitations under the License.
*/
-package org.apache.nlpcraft.examples.order
+package org.apache.nlpcraft.examples.pizzeria
import com.typesafe.scalalogging.LazyLogging
import org.apache.nlpcraft.*
import org.apache.nlpcraft.NCResultType.*
-import org.apache.nlpcraft.examples.order.State.*
+import org.apache.nlpcraft.examples.pizzeria.State.*
import org.apache.nlpcraft.nlp.*
import java.util.Properties
@@ -32,7 +32,6 @@ import scala.jdk.OptionConverters.*
*
*/
object PizzeriaModel extends LazyLogging:
- private val DFLT_QTY = 1
private val UNEXPECTED_REQUEST = new NCRejection("Unexpected request for
current dialog context.")
private def extractPizzaSize(e: NCEntity): String =
e.get[String]("ord:pizza:size:value")
@@ -42,17 +41,8 @@ object PizzeriaModel extends LazyLogging:
private def extractDrink(e: NCEntity): Drink =
Drink(e.get[String]("ord:drink:value"), extractQty(e, "ord:drink:qty"))
- private def getDescription(o: PizzeriaOrder): String =
- if !o.isEmpty then
- def s(name: String, seq: Iterable[String]): String = if
seq.nonEmpty then s"$name: ${seq.mkString(", ")}" else ""
- val s1 = s("Pizza", o.getPizzas.map(p => s"${p.name},
'${p.size.getOrElse("undefined size")}' ${p.qty.getOrElse(DFLT_QTY)} p."))
- val s2 = s("Drinks", o.getDrinks.map(p => s"${p.name}
${p.qty.getOrElse(DFLT_QTY)} p."))
- if s2.isEmpty then s1 else if s1.isEmpty then s2 else s"$s1 $s2"
- else "Nothing ordered."
-
-
-import org.apache.nlpcraft.examples.order.PizzeriaModel.*
+import org.apache.nlpcraft.examples.pizzeria.PizzeriaModel.*
/**
*
@@ -102,25 +92,26 @@ class PizzeriaModel extends NCModelAdapter (new
NCModelConfig("nlpcraft.pizzeria
)
private def doShowStatus(o: PizzeriaOrder, newState: State) =
- val res = NCResult(s"Current order state: ${getDescription(o)}",
ASK_RESULT)
+ val res = NCResult(s"Current order state: ${o.getDescription}",
ASK_RESULT)
o.setState(newState)
res
private def askConfirm(o: PizzeriaOrder): NCResult =
require(o.isValid)
- val res = NCResult(s"Let's specify your order. ${getDescription(o)} Is
it correct?", ASK_DIALOG)
+ val res = NCResult(s"Let's specify your order. ${o.getDescription} Is
it correct?", ASK_DIALOG)
o.setState(DIALOG_CONFIRM)
res
private def clear(im: NCIntentMatch, o: PizzeriaOrder): Unit =
+ o.setState(NO_DIALOG)
im.getContext.getConversation.getData.remove(im.getContext.getRequest.getUserId)
val conv = im.getContext.getConversation
conv.clearStm(_ => true)
conv.clearDialog(_ => true)
- private def doExecute(im: NCIntentMatch, o: PizzeriaOrder): NCResult =
+ private[pizzeria] def doExecute(im: NCIntentMatch, o: PizzeriaOrder):
NCResult =
require(o.isValid)
- val res = NCResult(s"Executed: ${getDescription(o)}", ASK_RESULT)
+ val res = NCResult(s"Executed: ${o.getDescription}", ASK_RESULT)
clear(im, o)
res
diff --git
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModelPipeline.scala
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelPipeline.scala
similarity index 94%
rename from
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModelPipeline.scala
rename to
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelPipeline.scala
index b8b73a65..ce342519 100644
---
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaModelPipeline.scala
+++
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelPipeline.scala
@@ -1,8 +1,8 @@
-package org.apache.nlpcraft.examples.order
+package org.apache.nlpcraft.examples.pizzeria
import edu.stanford.nlp.pipeline.StanfordCoreNLP
import opennlp.tools.stemmer.PorterStemmer
-import org.apache.nlpcraft.examples.order.components.*
+import org.apache.nlpcraft.examples.pizzeria.components.*
import org.apache.nlpcraft.nlp.entity.parser.semantic.*
import org.apache.nlpcraft.nlp.entity.parser.stanford.NCStanfordNLPEntityParser
import org.apache.nlpcraft.nlp.token.enricher.NCEnStopWordsTokenEnricher
diff --git
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaOrder.scala
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
similarity index 81%
rename from
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaOrder.scala
rename to
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
index d9445826..0e751b98 100644
---
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/PizzeriaOrder.scala
+++
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaOrder.scala
@@ -15,10 +15,10 @@
* limitations under the License.
*/
-package org.apache.nlpcraft.examples.order
+package org.apache.nlpcraft.examples.pizzeria
+import java.util.Objects
import scala.collection.mutable
-
/**
*
*/
@@ -45,11 +45,10 @@ case class Drink(name: String, var qty: Option[Int])
extends OrderElement
enum State:
case NO_DIALOG, DIALOG_IS_READY, DIALOG_SHOULD_CANCEL, DIALOG_SPECIFY,
DIALOG_CONFIRM
-import org.apache.nlpcraft.examples.order.State.*
+import org.apache.nlpcraft.examples.pizzeria.State.*
-/**
- *
- */
+object PizzeriaOrder:
+ private val DFLT_QTY = 1
class PizzeriaOrder:
private var state = NO_DIALOG
private val pizzas = mutable.ArrayBuffer.empty[Pizza]
@@ -131,4 +130,13 @@ class PizzeriaOrder:
*
* @param state
*/
- def setState(state: State): Unit = this.state = state
\ No newline at end of file
+ def setState(state: State): Unit = this.state = state
+
+ def getDescription: String =
+ if !isEmpty then
+ def s(name: String, seq: Iterable[String]): String = if
seq.nonEmpty then s"$name: ${seq.mkString(", ")}" else ""
+ val s1 = s("Pizza", getPizzas.map(p => s"${p.name},
'${p.size.getOrElse("undefined size")}'
${p.qty.getOrElse(PizzeriaOrder.DFLT_QTY)} p."))
+ val s2 = s("Drinks", getDrinks.map(p => s"${p.name}
${p.qty.getOrElse(PizzeriaOrder.DFLT_QTY)} p."))
+
+ if s2.isEmpty then s1 else if s1.isEmpty then s2 else s"$s1 $s2"
+ else "Nothing ordered."
\ No newline at end of file
diff --git
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/ElementExtender.scala
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/ElementExtender.scala
similarity index 97%
rename from
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/ElementExtender.scala
rename to
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/ElementExtender.scala
index d4a84201..364f1058 100644
---
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/ElementExtender.scala
+++
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/ElementExtender.scala
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.nlpcraft.examples.order.components
+package org.apache.nlpcraft.examples.pizzeria.components
import org.apache.nlpcraft.*
diff --git
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/RequestValidator.scala
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/RequestValidator.scala
similarity index 96%
rename from
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/RequestValidator.scala
rename to
nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/RequestValidator.scala
index f94e160b..34f5d698 100644
---
a/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/order/components/RequestValidator.scala
+++
b/nlpcraft-examples/pizzeria/src/main/java/org/apache/nlpcraft/examples/pizzeria/components/RequestValidator.scala
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.nlpcraft.examples.order.components
+package org.apache.nlpcraft.examples.pizzeria.components
import org.apache.nlpcraft.*
diff --git
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/PizzeriaModelSpec.scala
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
similarity index 54%
rename from
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/PizzeriaModelSpec.scala
rename to
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
index 38a13282..4e3b22cf 100644
---
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/PizzeriaModelSpec.scala
+++
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/PizzeriaModelSpec.scala
@@ -15,11 +15,12 @@
* limitations under the License.
*/
-package org.apache.nlpcraft.examples.order
+package org.apache.nlpcraft.examples.pizzeria
import org.apache.nlpcraft.*
import org.apache.nlpcraft.NCResultType.*
-import org.junit.jupiter.api.{AfterEach, BeforeEach, Test}
+import org.apache.nlpcraft.examples.pizzeria.State.*
+import org.junit.jupiter.api.*
import scala.util.Using
import scala.collection.mutable
@@ -27,13 +28,32 @@ import scala.collection.mutable
*
*/
class PizzeriaModelSpec:
+ private class TestWrapper extends PizzeriaModel:
+ private var o: PizzeriaOrder = _
+ override def doExecute(im: NCIntentMatch, o: PizzeriaOrder): NCResult =
+ val res = super.doExecute(im, o)
+ this.o = o
+ res
+ def getLastExecutedOrder: PizzeriaOrder = o
+
+ case class Builder(state: State):
+ private val o = new PizzeriaOrder
+ o.setState(state)
+ def withPizza(name: String, size: String, qty: Int): Builder =
+ o.add(Seq(Pizza(name, Some(size), Some(qty))), Seq.empty)
+ this
+ def withDrink(name: String, qty: Int): Builder =
+ o.add(Seq.empty, Seq(Drink(name, Some(qty))))
+ this
+ def build: PizzeriaOrder = o
+
+ private val mdl = new TestWrapper()
+ private val client = new NCModelClient(mdl)
+
private val msgs = mutable.ArrayBuffer.empty[mutable.ArrayBuffer[String]]
private val errs = mutable.HashMap.empty[Int, Throwable]
-
- private var client: NCModelClient = _
private var testNum: Int = 0
- @BeforeEach def setUp(): Unit = client = new NCModelClient(new
PizzeriaModel)
@AfterEach def tearDown(): Unit =
if client != null then client.close()
@@ -47,7 +67,9 @@ class PizzeriaModelSpec:
require(errs.isEmpty)
- private def dialog(reqs: String*): Unit =
+ private def dialog(reqs: String*): Unit = dialog(None, reqs*)
+ private def dialog(expResOrder: PizzeriaOrder, reqs: String*): Unit =
dialog(Option(expResOrder), reqs*)
+ private def dialog(expResOrderOpt: Option[PizzeriaOrder], reqs: String*):
Unit =
val testMsgs = mutable.ArrayBuffer.empty[String]
msgs += testMsgs
@@ -63,12 +85,29 @@ class PizzeriaModelSpec:
val expType = if idx == reqs.size - 1 then ASK_RESULT else
ASK_DIALOG
if expType != resp.getType then
- errs += testNum -> new Exception(s"Error during test
[num=$testNum, expRespType=$expType, type=${resp.getType}]")
+ errs += testNum -> new Exception(s"Unexpected result for
test:$testNum [expected:\n$expType, type=${resp.getType}]")
+
+ if idx == reqs.size - 1 then
+ expResOrderOpt match
+ case Some(expResOrder) =>
+ val lastOrder = mdl.getLastExecutedOrder
+ def s(o: PizzeriaOrder) = if o == null then null
else s"Order [state=${o.getState}, desc=${o.getDescription}]"
+ val s1 = s(expResOrder)
+ val s2 = s(lastOrder)
+ if s1 != s2 then
+ errs += testNum -> new Exception(s"Unexpected
result for test (excepted/real):$testNum\n$s1\n$s2")
+ case None => // No-op.
catch
case e: Exception => errs += testNum -> new Exception(s"Error
during test [num=$testNum]", e)
testNum += 1
+ private def mkOrder(state: State, ps: Seq[Pizza], ds: Seq[Drink]):
PizzeriaOrder =
+ val o = new PizzeriaOrder
+ o.setState(state)
+ o.add(ps, ds)
+ o
+
@Test
def test(): Unit =
dialog(
@@ -99,12 +138,16 @@ class PizzeriaModelSpec:
)
dialog(
- "carbonara",
+ "marinara",
"stop"
)
-
dialog(
- "carbonara two, marinara and 2 tea",
+ Builder(NO_DIALOG).
+ withPizza("margherita", "small", 2).
+ withPizza("marinara", "small", 3).
+ withDrink("tea", 1).
+ build,
+ "margherita two, marinara and 3 tea",
"small",
"small",
"yes",
diff --git
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelClientCli.scala
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
similarity index 98%
rename from
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelClientCli.scala
rename to
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
index b621d1f8..7c35164f 100644
---
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelClientCli.scala
+++
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelClientCli.scala
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.nlpcraft.examples.order.cli
+package org.apache.nlpcraft.examples.pizzeria.cli
import com.typesafe.scalalogging.LazyLogging
import org.apache.nlpcraft.*
diff --git
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelServer.scala
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
similarity index 97%
rename from
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelServer.scala
rename to
nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
index e345dbe4..1f89208d 100644
---
a/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/order/cli/PizzeriaModelServer.scala
+++
b/nlpcraft-examples/pizzeria/src/test/java/org/apache/nlpcraft/examples/pizzeria/cli/PizzeriaModelServer.scala
@@ -15,12 +15,12 @@
* limitations under the License.
*/
-package org.apache.nlpcraft.examples.order.cli
+package org.apache.nlpcraft.examples.pizzeria.cli
import com.sun.net.httpserver.*
import org.apache.nlpcraft.*
import org.apache.nlpcraft.NCResultType.*
-import org.apache.nlpcraft.examples.order.PizzeriaModel
+import org.apache.nlpcraft.examples.pizzeria.PizzeriaModel
import java.io.*
import java.net.InetSocketAddress