-
Notifications
You must be signed in to change notification settings - Fork 1
/
evaluator.py
60 lines (47 loc) · 2.66 KB
/
evaluator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from datetime import datetime
from pytz import timezone, UnknownTimeZoneError
from typing import Optional, Union
from datetimeparser.utils.baseclasses import AbsoluteDateTime, RelativeDateTime
from datetimeparser.utils.enums import Method
from datetimeparser.evaluator.evaluatormethods import EvaluatorMethods
from datetimeparser.utils.exceptions import FailedEvaluation, InvalidValue
from datetimeparser.utils.geometry import TimeZoneManager
class Evaluator:
def __init__(self, parsed_object, tz="Europe/Berlin", coordinates: Optional[tuple[float, float]] = None):
"""
:param parsed_object: the parsed object from parser
:param tz: the timezone for the datetime
:param coordinates: longitude and latitude for timezone calculation and for sunrise and sunset
"""
if coordinates:
tz = TimeZoneManager().timezone_at(lng=coordinates[0], lat=coordinates[1])
try:
tiz = timezone(tz)
except UnknownTimeZoneError:
raise InvalidValue(f"Unknown timezone: '{tz}'")
self.parsed_object_type = parsed_object[0]
self.parsed_object_content: Union[list, AbsoluteDateTime, RelativeDateTime] = parsed_object[1]
self.current_datetime: datetime = datetime.strptime(datetime.strftime(datetime.now(tz=tiz), "%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S")
self.offset = tiz.utcoffset(self.current_datetime)
self.timezone = tiz
self.coordinates = coordinates
def evaluate(self) -> Union[tuple[datetime, str, tuple[float, float]], None]:
ev_out: Optional[datetime] = None
coordinates: Optional[tuple[float, float]] = None
ev = EvaluatorMethods(self.parsed_object_content, self.current_datetime, self.timezone.zone, self.coordinates, self.offset)
if self.parsed_object_type == Method.ABSOLUTE_DATE_FORMATS:
ev_out = ev.evaluate_absolute_date_formats()
if self.parsed_object_type == Method.ABSOLUTE_PREPOSITIONS:
ev_out = ev.evaluate_absolute_prepositions()
if self.parsed_object_type == Method.CONSTANTS:
ev_out, coordinates = ev.evaluate_constants()
if self.parsed_object_type == Method.RELATIVE_DATETIMES:
ev_out = ev.evaluate_relative_datetime()
if self.parsed_object_type == Method.CONSTANTS_RELATIVE_EXTENSIONS:
ev_out = ev.evaluate_constant_relatives()
if self.parsed_object_type == Method.DATETIME_DELTA_CONSTANTS:
ev_out = ev.evaluate_datetime_delta_constants()
if ev_out:
return ev_out, self.timezone.zone, self.coordinates or coordinates
else:
raise FailedEvaluation(self.parsed_object_content)