Skip to content

Commit 4d659bf

Browse files
fix: updated time parsing (#23)
1 parent 138cda9 commit 4d659bf

File tree

3 files changed

+34
-19
lines changed

3 files changed

+34
-19
lines changed

custom_components/ocado/const.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
MIN_IMAP_DAYS = 7
4949
MIN_SCAN_INTERVAL = 60
5050

51+
REGEX_EDIT_UNTIL = r"(?:You\scan\sedit\sthis\sorder\suntil:?\s)"
52+
5153
REGEX_DATE = r"3[01]|[12][0-9]|0?[1-9]"
5254
REGEX_DAY_FULL = r"Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday"
5355
REGEX_DAY_SHORT = r"Mon|Tue|Wed|Thu|Fri|Sat|Sun"
@@ -57,8 +59,8 @@
5759
REGEX_YEAR = r"(?:19|20)\d{2}"
5860
# If this eventually fails due to other formats being used, python-dateutil should be used
5961
REGEX_DATE_FULL = r"((?:" + REGEX_DATE + r")\/(?:" + REGEX_MONTH + r")\/(?:" + REGEX_YEAR + r"))"
60-
REGEX_TIME = r"([01][0-9]|2[0-3]):([0-5][0-9])\s?([AaPp][Mm])?"
61-
REGEX_NOT_ISO_TIME = r"([0-9]|2[0-3])(?::|.)([0-5][0-9])\s?([AaPp][Mm])?"
62+
REGEX_ISO_TIME = r"([01][0-9]|2[0-3]):([0-5][0-9])"
63+
REGEX_APM_TIME = r"(1[0-2]|0?[1-9])(?::|.)([0-5][0-9])\s?([AaPp][Mm])?"
6264
REGEX_ORDINALS = r"st|nd|rd|th"
6365

6466
REGEX_AMOUNT = r"(?:\d+x)?\d+k?(?:g|l|ml)"

custom_components/ocado/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@
1616
"BeautifulSoup4>=4.10.0"
1717
],
1818
"single_config_entry": true,
19-
"version": "1.1.3"
19+
"version": "1.1.4"
2020
}

custom_components/ocado/utils.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@
1919
OCADO_SMARTPASS_SUBJECT,
2020
OCADO_RENEWAL_SUBJECT,
2121
OCADO_SUBJECT_DICT,
22+
REGEX_EDIT_UNTIL,
2223
REGEX_DATE,
2324
# REGEX_DATE_FULL,
2425
REGEX_DAY_FULL,
2526
REGEX_MONTH_FULL,
2627
REGEX_YEAR,
27-
REGEX_TIME,
28-
REGEX_NOT_ISO_TIME,
28+
REGEX_ISO_TIME,
29+
REGEX_APM_TIME,
2930
REGEX_ORDINALS,
3031
STRING_NO_BBD,
3132
REGEX_END_INDEX,
@@ -77,7 +78,7 @@ def get_estimated_total(message: str) -> str:
7778
def get_delivery_datetimes(message: str | None) -> tuple[datetime, datetime] | tuple[None, None]:
7879
"""Parse and return the delivery datetime."""
7980
if message is None:
80-
return None, None
81+
return None, None
8182
pattern = fr"(?:Delivery\sdate:\s)(?P<day>{REGEX_DATE})\s(?P<month>{REGEX_MONTH_FULL})\s(?P<year>{REGEX_YEAR})"
8283
raw = re.search(pattern, message, re.MULTILINE)
8384
if raw:
@@ -103,33 +104,45 @@ def get_delivery_datetimes(message: str | None) -> tuple[datetime, datetime] | t
103104
else:
104105
_LOGGER.error("Delivery date not found when retrieving delivery datetime from message.")
105106
raise ValueError("Delivery date not found when retrieving delivery datetime from message.")
106-
pattern = fr"(?:Delivery\stime:)(?:\sBetween)?(?:\s{{1,20}})(?P<start>{REGEX_TIME})\sand\s(?P<end>{REGEX_TIME})"
107+
pattern = fr"(?:Delivery\stime:)(?:\sBetween)?(?:\s{{1,20}})(?P<start>{REGEX_ISO_TIME})\sand\s(?P<end>{REGEX_ISO_TIME})"
107108
delivery_time_raw = re.search(pattern, message, re.MULTILINE)
108109
if delivery_time_raw:
109-
start_time = re.sub(r"pm",r"PM",re.sub(r"am",r"AM",delivery_time_raw.group('start')))
110-
end_time = re.sub(r"pm",r"PM",re.sub(r"am",r"AM",delivery_time_raw.group('end')))
111-
else:
112-
_LOGGER.error("Time not found when retrieving delivery datetime from message.")
113-
raise ValueError("Time not found when retrieving delivery datetime from message.")
114-
delivery_datetime_raw = year + '-' + month + '-' + day + ' ' + start_time
115-
delivery_datetime = datetime.strptime(delivery_datetime_raw,'%Y-%B-%d %I:%M%p')
116-
delivery_window_end_raw = year + '-' + month + '-' + day + ' ' + end_time
117-
delivery_window_end = datetime.strptime(delivery_window_end_raw,'%Y-%B-%d %I:%M%p')
110+
_LOGGER.debug("ISO time found")
111+
start_time = delivery_time_raw.group('start')
112+
end_time = delivery_time_raw.group('end')
113+
delivery_datetime_raw = year + '-' + month + '-' + day + ' ' + start_time
114+
delivery_datetime = datetime.strptime(delivery_datetime_raw,'%Y-%B-%d %H:%M')
115+
delivery_window_end_raw = year + '-' + month + '-' + day + ' ' + end_time
116+
delivery_window_end = datetime.strptime(delivery_window_end_raw,'%Y-%B-%d %H:%M')
117+
else:
118+
pattern = fr"(?:Delivery\stime:)(?:\sBetween)?(?:\s{{1,20}})(?P<start>{REGEX_APM_TIME})\sand\s(?P<end>{REGEX_APM_TIME})"
119+
delivery_time_raw = re.search(pattern, message, re.MULTILINE)
120+
if delivery_time_raw:
121+
_LOGGER.debug("ISO time found")
122+
start_time = re.sub(r"pm",r"PM",re.sub(r"am",r"AM",delivery_time_raw.group('start')))
123+
end_time = re.sub(r"pm",r"PM",re.sub(r"am",r"AM",delivery_time_raw.group('end')))
124+
delivery_datetime_raw = year + '-' + month + '-' + day + ' ' + start_time
125+
delivery_datetime = datetime.strptime(delivery_datetime_raw,'%Y-%B-%d %I:%M%p')
126+
delivery_window_end_raw = year + '-' + month + '-' + day + ' ' + end_time
127+
delivery_window_end = datetime.strptime(delivery_window_end_raw,'%Y-%B-%d %I:%M%p')
128+
else:
129+
_LOGGER.error("Time not found when retrieving delivery datetime from message.")
130+
raise ValueError("Time not found when retrieving delivery datetime from message.")
118131
return delivery_datetime, delivery_window_end
119132

120133

121134
def get_edit_datetime(message: str) -> datetime:
122135
"""Parse the edit deadline datetime."""
123-
pattern = fr"(?:You\scan\sedit\sthis\sorder\suntil:?\s)(?P<time>{REGEX_TIME})(?:\son\s)(?P<day>{REGEX_DATE})(?:{REGEX_ORDINALS})\s(?P<month>{REGEX_MONTH_FULL})\s(?P<year>{REGEX_YEAR})"
136+
pattern = fr"{REGEX_EDIT_UNTIL}(?P<time>{REGEX_ISO_TIME})(?:\son\s)(?P<day>{REGEX_DATE})(?:{REGEX_ORDINALS})\s(?P<month>{REGEX_MONTH_FULL})\s(?P<year>{REGEX_YEAR})"
124137
raw = re.search(pattern, message)
125138
_LOGGER.debug("Trying to get edit datetime")
126139
if raw:
127140
_LOGGER.debug("First attempt found datetime")
128141
edit_datetime_raw = raw.group('year') + '-' + raw.group('month') + '-' + raw.group('day') + ' ' + raw.group('time')
129142
return datetime.strptime(edit_datetime_raw,'%Y-%B-%d %H:%M')
130143
else:
131-
_LOGGER.debug("Trying backup pattern")
132-
pattern = fr"(?:You\scan\sedit\sthis\sorder\suntil:?\s)(?P<time>{REGEX_NOT_ISO_TIME})(?:\son\s|,\s)?(?P<day>{REGEX_DATE})(?:{REGEX_ORDINALS})?\s?(?P<month>{REGEX_MONTH_FULL})\s(?P<year>{REGEX_YEAR})"
144+
_LOGGER.debug("Trying backup pattern with non ISO time")
145+
pattern = fr"{REGEX_EDIT_UNTIL}(?P<time>{REGEX_APM_TIME})(?:\son\s|,\s)?(?P<day>{REGEX_DATE})(?:{REGEX_ORDINALS})?\s?(?P<month>{REGEX_MONTH_FULL})\s(?P<year>{REGEX_YEAR})"
133146
raw = re.search(pattern, message, re.MULTILINE)
134147
if raw:
135148
_LOGGER.debug("Second attempt found datetime")

0 commit comments

Comments
 (0)