From 82e0ada80e34f841d01e545b40976ff0360389bf Mon Sep 17 00:00:00 2001 From: Vinoth Rajendran Date: Sun, 27 Oct 2019 16:12:00 +0530 Subject: [PATCH] Added email prompt Added email prompt , test_email_prompt & Init.py --- .../source/__init__.py | 6 +- .../source/email_prompt.py | 64 +++++++++++++++++++ .../test/test_email_prompt.py | 59 +++++++++++++++++ 3 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 libraries/botbuilder-community-dialogs-prompts/source/email_prompt.py create mode 100644 libraries/botbuilder-community-dialogs-prompts/test/test_email_prompt.py diff --git a/libraries/botbuilder-community-dialogs-prompts/source/__init__.py b/libraries/botbuilder-community-dialogs-prompts/source/__init__.py index 29aabc4..768c332 100644 --- a/libraries/botbuilder-community-dialogs-prompts/source/__init__.py +++ b/libraries/botbuilder-community-dialogs-prompts/source/__init__.py @@ -1,6 +1,7 @@ from number_with_type_prompt import NumberWithTypePrompt, NumberWithTypePromptType -from number_with_unit_prompt import NumberWithUnitPrompt, NumberWithUnitPromptType +from number_with_unit_prompt import NumberWithUnitPrompt, NumberWithUnitPromptType,NumberWithUnitResult from phone_prompt import PhoneNumberPrompt +from email_prompt import EmailPrompt __all__ = [ "NumberWithUnitPrompt", @@ -8,5 +9,6 @@ "NumberWithUnitResult", "NumberWithTypePromptType", "NumberWithTypePrompt", - "PhoneNumberPrompt" + "PhoneNumberPrompt", + "EmailPrompt" ] diff --git a/libraries/botbuilder-community-dialogs-prompts/source/email_prompt.py b/libraries/botbuilder-community-dialogs-prompts/source/email_prompt.py new file mode 100644 index 0000000..ce52dc0 --- /dev/null +++ b/libraries/botbuilder-community-dialogs-prompts/source/email_prompt.py @@ -0,0 +1,64 @@ +from botbuilder.dialogs.prompts import Prompt, PromptOptions,PromptRecognizerResult +from botbuilder.core.turn_context import TurnContext +from botbuilder.schema import ActivityTypes +from recognizers_text import Culture, ModelResult,StringUtility +from recognizers_sequence import SequenceRecognizer + +from typing import Callable, Dict +import enum + +class EmailPrompt (Prompt): + def __init__(self, + dialog_id, + validator : object = None, + defaultLocale = None): + super().__init__(dialog_id, validator=validator) + + if defaultLocale is None: + defaultLocale = Culture.English + + self._defaultLocale = defaultLocale + + async def on_prompt( + self, + turn_context: TurnContext, + state: Dict[str, object], + options: PromptOptions, + is_retry: bool, + ): + if not turn_context: + raise TypeError("turn_context Can’t be none") + if not options: + raise TypeError("options Can’t be none") + + if is_retry and options.retry_prompt is not None: + await turn_context.send_activity(options.retry_prompt) + else: + if options.prompt is not None: + await turn_context.send_activity(options.prompt) + + async def on_recognize(self, + turn_context: TurnContext, + state: Dict[str, object], + options: PromptOptions, + ) -> PromptRecognizerResult: + if not turn_context: + raise TypeError("turn_context Can’t be none") + + if turn_context.activity.type == ActivityTypes.message: + utterance = turn_context.activity.text + + turn_context.activity.locale = self._defaultLocale + + recognizer_result = PromptRecognizerResult() + + recognizer = SequenceRecognizer(turn_context.activity.locale) + model = recognizer.get_email_model() + + model_result = model.parse(utterance) + + if len(model_result) > 0 and len(model_result[0].resolution) > 0: + recognizer_result.succeeded = True + recognizer_result.value = model_result[0].resolution["value"] + + return recognizer_result \ No newline at end of file diff --git a/libraries/botbuilder-community-dialogs-prompts/test/test_email_prompt.py b/libraries/botbuilder-community-dialogs-prompts/test/test_email_prompt.py new file mode 100644 index 0000000..949e1ef --- /dev/null +++ b/libraries/botbuilder-community-dialogs-prompts/test/test_email_prompt.py @@ -0,0 +1,59 @@ +import sys +import pathlib +import pytest +import aiounittest +import asyncio + +current = pathlib.Path(__file__).parent.parent +libpath = current.joinpath("source") +sys.path.append(str(libpath)) + +from botbuilder.dialogs.prompts import ( + AttachmentPrompt, + PromptOptions, + PromptValidatorContext, +) + +from botbuilder.core import ( + TurnContext, + ConversationState, + MemoryStorage, + MessageFactory, +) +from botbuilder.schema import Activity, ActivityTypes, Attachment +from botbuilder.core.adapters import TestAdapter +from botbuilder.dialogs import DialogSet, DialogTurnStatus +from email_prompt import EmailPrompt + +class EmailPromptTest(aiounittest.AsyncTestCase): + async def test_email_prompt(self): + async def exec_test(turn_context:TurnContext): + dialog_context = await dialogs.create_context(turn_context) + + results = await dialog_context.continue_dialog() + if (results.status == DialogTurnStatus.Empty): + options = PromptOptions( + prompt = Activity( + type = ActivityTypes.message, + text = "What is your email address?" + ) + ) + await dialog_context.prompt("emailprompt", options) + + elif results.status == DialogTurnStatus.Complete: + reply = results.result + await turn_context.send_activity(reply) + + await conv_state.save_changes(turn_context) + + adapter = TestAdapter(exec_test) + + conv_state = ConversationState(MemoryStorage()) + + dialog_state = conv_state.create_property("dialog-state") + dialogs = DialogSet(dialog_state) + dialogs.add(EmailPrompt("emailprompt")) + + step1 = await adapter.test('Hello', 'What is your email address?') + step2 = await step1.send('My email id is r.vinoth@live.com') + await step2.assert_reply("r.vinoth@live.com") \ No newline at end of file