8000 Core Bot sample working. ChoiceRecognizer not imported. datatype_time… · rsliang/botbuilder-python@af1ad59 · GitHub
[go: up one dir, main page]

Skip to content

Commit af1ad59

Browse files
committed
Core Bot sample working. ChoiceRecognizer not imported. datatype_timex_expression added for Timex. LuisRecognizer pending to test
2 parents c57c7a5 + 20fd85b commit af1ad59

30 files changed

+876
-57
lines changed

libraries/botbuilder-applicationinsights/tests/test_telemetry_waterfall.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from botbuilder.dialogs import (
2424
Dialog,
2525
DialogSet,
26+
DialogState,
2627
WaterfallDialog,
2728
WaterfallStepContext,
2829
DialogTurnResult,
@@ -55,7 +56,7 @@ async def test_execute_sequence_waterfall_steps(self, MockTelemetry):
5556

5657

5758
# Create a DialogState property, DialogSet and register the WaterfallDialog.
58-
dialog_state = convo_state.create_property('dialogState')
59+
dialog_state = convo_state.create_property('dialogState')
5960
dialogs = DialogSet(dialog_state)
6061
async def step1(step) -> DialogTurnResult:
6162
await step.context.send_activity('bot responding.')
@@ -81,6 +82,7 @@ async def exec_test(turn_context: TurnContext) -> None:
8182
else:
8283
if results.status == DialogTurnStatus.Complete:
8384
await turn_context.send_activity(results.result)
85+
8486
await convo_state.save_changes(turn_context)
8587

8688
adapt = TestAdapter(exec_test)

libraries/botbuilder-core/botbuilder/core/conversation_state.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ def call_get_storage_key(context):
3434
def get_storage_key(self, context: TurnContext):
3535
activity = context.activity
3636
channel_id = getattr(activity, 'channel_id', None)
37-
#import pdb; pdb.set_trace()
3837
conversation_id = getattr(activity.conversation, 'id', None) if hasattr(activity, 'conversation') else None
3938

4039
storage_key = None

libraries/botbuilder-core/botbuilder/core/memory_storage.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Licensed under the MIT License.
33

44
from typing import Dict, List
5-
from copy import deepcopy
65
from .storage import Storage, StoreItem
76

87

libraries/botbuilder-core/tests/test_memory_storage.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,27 +71,6 @@ async def test_memory_storage_write_should_overwrite_when_new_e_tag_is_an_asteri
7171
data = await storage.read(['user'])
7272
assert data['user'].counter == 5
7373

74-
75-
async def test_memory_storage_write_should_raise_a_key_error_with_older_e_tag(self):
76-
storage = MemoryStorage()
77-
first_item = SimpleStoreItem(e_tag='0')
78-
79-
await storage.write({'user': first_item})
80-
81-
updated_item = (await storage.read(['user']))['user']
82-
updated_item.counter += 1
83-
await storage.write({'user': first_item})
84-
85-
try:
86-
await storage.write({'user': first_item})
87-
await storage.read(['user'])
88-
except KeyError as _:
89-
pass
90-
else:
91-
raise AssertionError("test_memory_storage_read_should_raise_a_key_error_with_invalid_e_tag(): should have "
92-
"raised a KeyError with an invalid e_tag.")
93-
94-
9574
async def test_memory_storage_read_with_invalid_key_should_return_empty_dict(self):
9675
storage = MemoryStorage()
9776
data = await storage.read(['test'])

libraries/botbuilder-dialogs/botbuilder/dialogs/prompts/confirm_prompt.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ async def on_prompt(self, turn_context: TurnContext, state: Dict[str, object], o
5252
prompt = self.append_choices(options.retry_prompt, channel_id, choices, self.style, choice_opts)
5353
else:
5454
prompt = self.append_choices(options.prompt, channel_id, choices, self.style, choice_opts)
55-
turn_context.send_activity(prompt)
55+
await turn_context.send_activity(prompt)
5656

5757
async def on_recognize(self, turn_context: TurnContext, state: Dict[str, object], options: PromptOptions) -> PromptRecognizerResult:
5858
if not turn_context:

libraries/botbuilder-dialogs/botbuilder/dialogs/prompts/datetime_prompt.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
33

4+
from recognizers_date_time import recognize_datetime
5+
46
from typing import Dict
57
from botbuilder.core.turn_context import TurnContext
68
from botbuilder.schema import (ActivityTypes, Activity)
@@ -35,10 +37,10 @@ async def on_prompt(self, turn_context: TurnContext, state: Dict[str, object], o
3537
raise TypeError('DateTimePrompt.on_prompt(): options cannot be None.')
3638

3739
if is_retry == True and options.retry_prompt != None:
38-
prompt = turn_context.send_activity(options.retry_prompt)
40+
await turn_context.send_activity(options.retry_prompt)
3941
else:
4042
if options.prompt != None:
41-
turn_context.send_activity(options.prompt)
43+
await turn_context.send_activity(options.prompt)
4244

4345
async def on_recognize(self, turn_context: TurnContext, state: Dict[str, object], options: PromptOptions) -> PromptRecognizerResult:
4446
if not turn_context:
@@ -51,11 +53,11 @@ async def on_recognize(self, turn_context: TurnContext, state: Dict[str, object]
5153
# TODO: English contsant needs to be ported.
5254
culture = message.locale if message.locale != None else "English"
5355
# TOOD: Port Choice Recognizer
54-
results = ChoiceRecognizer.recognize_boolean(message.text, culture)
55-
if results.Count > 0:
56+
results = recognize_datetime(message.text, culture)
57+
if len(results) > 0:
5658
result.succeeded = True
5759
result.value = []
58-
values = results[0]
60+
values = results[0].resolution['values']
5961
for value in values:
6062
result.value.append(self.read_resolution(value))
6163

libraries/botbuilder-dialogs/botbuilder/dialogs/prompts/prompt.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,10 @@ async def continue_dialog(self, dc: DialogContext):
7676
# Validate the return value
7777
is_valid = False
7878
if self._validator != None:
79-
prompt_context = PromptValidatorContext(dc.Context, recognized, state, options)
79+
prompt_context = PromptValidatorContext(dc.context, recognized, state, options)
8080
is_valid = await self._validator(prompt_context)
81+
if options is None:
82+
options = PromptOptions()
8183
options.number_of_attempts += 1
8284
else:
8385
if recognized.succeeded:

libraries/botbuilder-dialogs/botbuilder/dialogs/prompts/prompt_options.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def __init__(self, prompt: Activity = None, retry_prompt: Activity = None, choic
1313
self._choices= choices
1414
self._style = style
1515
self._validations = validations
16-
self._number_of_attempts = validations
16+
self._number_of_attempts = number_of_attempts
1717

1818
@property
1919
def prompt(self) -> Activity:

samples/Core-Bot/bots/dialog_bot.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ async def on_turn(self, turn_context: TurnContext):
2323
await super().on_turn(turn_context)
2424

2525
# Save any state changes that might have occured during the turn.
26-
self.dialogState.set(turn_context, turn_context.turn_state['ConversationState'].state['DialogState'])
2726
await self.conversation_state.save_changes(turn_context, False)
2827
await self.user_state.save_changes(turn_context, False)
2928

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from .timex_constants import *
2+
from .timex_parsing import *
3+
from .timex_regex import *
4+
from .timex_helpers import *
5+
from .timex_date_helpers import *
6+
from .timex_format import *
7+
from .timex_inference import *
8+
from .timex_convert import *
9+
from .timex_relative_convert import *
10+
from .timex import *
11+
from .time import *
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
class DateRange:
3+
4+
def __init__(self, start, end):
5+
self.start = start
6+
self.end = end
7+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
porting notes:
3+
4+
1) looks like potential problems in:
5+
TimexHelpers.timex_date_add
6+
TimexHelpers.timex_time_add
7+
- time missing seconds duration
8+
- minutes overflow increments hour but that overflow should...
9+
10+
2) note to check date_from_timex and time_from_timex - tests?
11+
(in Python the ternary operator is used - is this correct?)
12+
13+
3) back in javascript need to delete duplicate functions from timexFormat
14+
15+
4) TimexConvert weekend l.66
16+
17+
5) need way more tests on these helpers (DateTime and Timex)
18+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
class Time:
3+
4+
def __init__(self, hour, minute, second):
5+
self.hour = hour
6+
self.minute = minute
7+
self.second = second
8+
9+
@classmethod
10+
def fromSeconds(seconds):
11+
hour = floor(seconds / 3600000)
12+
minute = floor((seconds - (Hour * 3600000)) / 60000)
13+
second = (seconds - (Hour * 3600000) - (Minute * 60000)) / 1000
14+
return Time(hour, minute, second)
15+
16+
def get_time(self):
17+
return (self.second * 1000) + (self.minute * 60000) + (self.hour * 3600000)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
class TimeRange:
3+
4+
def __init__(self, start, end):
5+
self.start = start
6+
self.end = end
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
2+
from decimal import *
3+
from .timex_parsing import TimexParsing
4+
from .timex_inference import TimexInference
5+
from .timex_convert import TimexConvert
6+
from .timex_relative_convert import TimexRelativeConvert
7+
from .time import Time
8+
9+
class Timex:
10+
11+
def __init__(self, timex = None):
12+
self.now = None
13+
self.years = None
14+
self.months = None
15+
self.weeks = None
16+
self.days = None
17+
self.hours = None
18+
self.minutes = None
19+
self.seconds = None
20+
self.year = None
21+
self.month = None
22+
self.day_of_month = None
23+
self.day_of_week = None
24+
self.season = None
25+
self.week_of_year = None
26+
self.weekend = None
27+
self.week_of_month = None
28+
self.part_of_day = None
29+
if timex != None:
30+
TimexParsing.parse_string(timex, self)
31+
32+
@classmethod
33+
def from_date(date):
34+
pass
35+
36+
@classmethod
37+
def from_date_time(datetime):
38+
pass
39+
40+
@classmethod
41+
def from_time(time):
42+
pass
43+
44+
@property
45+
def time_value(self):
46+
from .timex_format import TimexFormat
47+
return TimexFormat.format(self)
48+
49+
@property
50+
def types(self):
51+
return TimexInference.infer(self)
52+
53+
def __str__(self):
54+
return TimexConvert.convert_timex_to_string(self)
55+
56+
def to_natural_language(self, referene_date):
57+
return TimexRelativeConvert.convert_timex_to_string_relative(self)
58+
59+
@property
60+
def hour(self):
61+
if hasattr(self, '__time'):
62+
return getattr(self, '__time').hour
63+
else:
64+
return None
65+
66+
@hour.setter
67+
def hour(self, value):
68+
if value != None:
69+
if not hasattr(self, '__time'):
70+
setattr(self, '__time', Time(value, 0, 0))
71+
else:
72+
getattr(self, '__time').hour = value
73+
else:
74+
if hasattr(self, '__time'):
75+
delattr(self, '__time')
76+
77+
@property
78+
def minute(self):
79+
if hasattr(self, '__time'):
80+
return getattr(self, '__time').minute
81+
else:
82+
return None
83+
84+
@minute.setter
85+
def minute(self, value):
86+
if value != None:
87+
if not hasattr(self, '__time'):
88+
setattr(self, '__time', Time(0, value, 0))
89+
else:
90+
getattr(self, '__time').minute = value
91+
else:
92+
if hasattr(self, '__time'):
93+
delattr(self, '__time')
94+
95+
@property
96+
def second(self):
97+
if hasattr(self, '__time'):
98+
return getattr(self, '__time').second
99+
else:
100+
return None
101+
102+
@second.setter
103+
def second(self, value):
104+
if value != None:
105+
if not hasattr(self, '__time'):
106+
setattr(self, '__time', Time(0, 0, value))
107+
else:
108+
getattr(self, '__time').second = value
109+
else:
110+
if hasattr(self, '__time'):
111+
delattr(self, '__time')
112+
113+
def clone(self):
114+
result = Timex()
115+
result.now = self.now
116+
result.years = self.years
117+
result.months = self.months
118+
result.weeks = self.weeks
119+
result.days = self.days
120+
result.hours = self.hours
121+
result.minutes = self.minutes
122+
result.seconds = self.seconds
123+
result.year = self.year
124+
result.month = self.month
125+
result.day_of_month = self.day_of_month
126+
result.day_of_week = self.day_of_week
127+
result.season = self.season
128+
result.week_of_year = self.week_of_year
129+
result.weekend = self.weekend
130+
result.week_of_month = self.week_of_month
131+
result.hour = self.hour
132+
result.minute = self.minute
133+
result.second = self.second
134+
result.part_of_day = self.part_of_day
135+
return result
136+
137+
def assign_properties(self, source):
138+
for key, value in source.items():
139+
if key == 'year':
140+
self.year = int(value)
141+
elif key == 'month':
142+
self.month = int(value)
143+
elif key == 'day_of_month':
144+
self.day_of_month = int(value)
145+
elif key == 'day_of_week':
146+
self.day_of_week = int(value)
147+
elif key == 'season':
148+
self.season = value
149+
elif key == 'week_of_year':
150+
self.week_of_year = int(value)
151+
elif key == 'weekend':
152+
self.weekend = True
153+
elif key == 'week_of_month':
154+
self.week_of_month = int(value)
155+
elif key == 'hour':
E11F 156+
self.hour = int(value)
157+
elif key == 'minute':
158+
self.minute = int(value)
159+
elif key == 'second':
160+
self.second = int(value)
161+
elif key == 'part_of_day':
162+
self.part_of_day = value
163+
elif key == 'date_unit':
164+
self.assign_date_duration(source)
165+
elif key == 'time_unit':
166+
self.assign_time_duration(source)
167+
168+
def assign_date_duration(self, source):
169+
if source['date_unit'] == 'Y':
170+
self.years = Decimal(source['amount'])
171+
elif source['date_unit'] == 'M':
172+
self.months = Decimal(source['amount'])
173+
elif source['date_unit'] == 'W':
174+
self.weeks = Decimal(source['amount'])
175+
elif source['date_unit'] == 'D':
176+
self.days = Decimal(source['amount'])
177+
178+
def assign_time_duration(self, source):
179+
if source['time_unit'] == 'H':
180+
self.hours = Decimal(source['amount'])
181+
elif source['time_unit'] == 'M':
182+
self.minutes = Decimal(source['amount'])
183+
elif source['time_unit'] == 'S':
184+
self.seconds = Decimal(source['amount'])

0 commit comments

Comments
 (0)
0