Skip to content

Commit 4d118cd

Browse files
author
NekoFanatic
authored
Merge pull request #123 from aridevelopment-de/feature/constant_relative_extansion_evaluator
added eval-method for constant_relatives
2 parents c642c46 + 55fff77 commit 4d118cd

3 files changed

Lines changed: 77 additions & 21 deletions

File tree

datetimeparser/enums.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -89,23 +89,28 @@ class Constants:
8989

9090

9191
class DatetimeDeltaConstants:
92-
MIDNIGHT = Constant('midnight', value=0, options=[ConstantOption.DATE_VARIABLE])
93-
NIGHT = Constant('night', value=0, options=[ConstantOption.DATE_VARIABLE])
94-
MORNING_NIGHT = Constant('morning night', value=0, options=[ConstantOption.DATE_VARIABLE])
92+
# time_value is a tuple containing (hours, minutes, seconds)
93+
MIDNIGHT = Constant('midnight', value=0, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (0, 0, 0))
94+
NIGHT = Constant('night', value=0, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (21, 0, 0))
95+
MORNING_NIGHT = Constant('morning night', value=0, options=[ConstantOption.DATE_VARIABLE],
96+
time_value=lambda _: (3, 0, 0))
9597
DAYLIGHT_CHANGE = Constant('daylight change', ['daylight saving', 'daylight saving time'], value=0,
96-
options=[ConstantOption.YEAR_VARIABLE, ConstantOption.DATE_VARIABLE])
97-
DAWN = Constant('dawn', value=0, options=[ConstantOption.DATE_VARIABLE])
98-
SUNRISE = Constant('sunrise', value=0, options=[ConstantOption.DATE_VARIABLE])
99-
MORNING = Constant('morning', value=0, options=[ConstantOption.DATE_VARIABLE])
100-
BREAKFAST = Constant('breakfast', value=0, options=[ConstantOption.DATE_VARIABLE])
101-
102-
MIDDAY = Constant('midday', value=12, options=[ConstantOption.DATE_VARIABLE])
103-
LUNCH = Constant('lunch', ['lunchtime'], value=12, options=[ConstantOption.DATE_VARIABLE])
104-
AFTERNOON = Constant('afternoon', value=12, options=[ConstantOption.DATE_VARIABLE])
105-
EVENING = Constant('evening', value=12, options=[ConstantOption.DATE_VARIABLE])
106-
DINNER = Constant('dinner', ['dinnertime'], value=12, options=[ConstantOption.DATE_VARIABLE])
107-
DUSK = Constant('dusk', value=12, options=[ConstantOption.DATE_VARIABLE])
108-
SUNSET = Constant('sunset', value=12, options=[ConstantOption.DATE_VARIABLE])
98+
options=[ConstantOption.YEAR_VARIABLE, ConstantOption.DATE_VARIABLE],
99+
time_value=lambda _: (6, 0, 0))
100+
SUNRISE = Constant('sunrise', value=0, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (7, 0, 0))
101+
MORNING = Constant('morning', value=0, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (6, 0, 0))
102+
BREAKFAST = Constant('breakfast', value=0, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (8, 0, 0))
103+
104+
MIDDAY = Constant('midday', value=12, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (12, 0, 0))
105+
LUNCH = Constant('lunch', ['lunchtime'], value=12, options=[ConstantOption.DATE_VARIABLE],
106+
time_value=lambda _: (12, 0, 0))
107+
AFTERNOON = Constant('afternoon', value=12, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (15, 0, 0))
108+
EVENING = Constant('evening', value=12, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (18, 0, 0))
109+
DINNER = Constant('dinner', ['dinnertime'], value=12, options=[ConstantOption.DATE_VARIABLE],
110+
time_value=lambda _: (19, 0, 0))
111+
DAWN = Constant('dawn', value=12, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (6, 0, 0))
112+
DUSK = Constant('dusk', value=12, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (20, 0, 0))
113+
SUNSET = Constant('sunset', value=12, options=[ConstantOption.DATE_VARIABLE], time_value=lambda _: (18, 30, 0))
109114

110115
ALL = [
111116
MORNING, AFTERNOON, EVENING, NIGHT, MORNING_NIGHT, DAYLIGHT_CHANGE, MIDNIGHT, MIDDAY, DAWN, DUSK,

datetimeparser/evaluator.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,13 @@ def evaluate(self) -> Union[datetime, int, None]:
3939
return ev_out
4040

4141
if self.parsed_object_type == Method.RELATIVE_DATETIMES:
42-
ev_out = evaluate_relative_datetimes(
42+
ev_out = evaluate_relative_datetime(
43+
self.current_datetime,
44+
self.parsed_object_content
45+
)
46+
47+
if self.parsed_object_type == Method.CONSTANTS_RELATIVE_EXTENSIONS:
48+
ev_out = evaluate_constant_relatives(
4349
self.current_datetime,
4450
self.parsed_object_content
4551
)

datetimeparser/evaluatormethods.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class AbsolutePrepositionsEvaluator:
99
@staticmethod
1010
def sanitize_input(parsed_list: list) -> list:
1111
"""removes useless keywords"""
12-
return [element for element in parsed_list if element not in Keywords.ALL]
12+
return [element for element in parsed_list if element not in Keywords.ALL and not isinstance(element, str)]
1313

1414
@staticmethod
1515
def get_base(sanitized_input: list, year: int) -> datetime:
@@ -58,8 +58,53 @@ def evaluate_absolute_date_formats(current_time: datetime, parsed: AbsoluteDateT
5858
return ev_out
5959

6060

61-
def evaluate_absolute_prepositions(current_time: datetime, parsed: list): # -> AbsoluteDateTime:
62-
ev = AbsolutePrepositionsEvaluator()
61+
def evaluate_constant_relatives(current_time: datetime, parsed: list) -> datetime:
62+
sanitized = AbsolutePrepositionsEvaluator.sanitize_input(parsed)
63+
base: datetime = current_time
64+
ev_out = None
65+
66+
if isinstance(sanitized[-1], Constant):
67+
base = sanitized[-1].time_value(current_time.year)
68+
hour, minute, sec = sanitized[-2].time_value(None)
69+
ev_out = datetime(base.year, base.month, base.day, hour, minute, sec)
70+
71+
elif isinstance(sanitized[-1], RelativeDateTime):
72+
base += relativedelta(
73+
years=sanitized[-1].years,
74+
months=sanitized[-1].months,
75+
weeks=sanitized[-1].weeks,
76+
days=sanitized[-1].days,
77+
hours=sanitized[-1].hours,
78+
minutes=sanitized[-1].minutes,
79+
seconds=sanitized[-1].seconds
80+
)
81+
if sanitized[-2] in WeekdayConstants.ALL:
82+
ev_out = datetime.strptime(
83+
sanitized[-2].time_value(base),
84+
"%Y-%m-%d %H:%M:%S"
85+
)
86+
elif sanitized[-2] in Constants.ALL_RELATIVE_CONSTANTS:
87+
base = sanitized[-2].time_value(None)
88+
hour, minute, sec = sanitized[-1].hours, sanitized[-1].minutes, sanitized[-1].seconds
89+
ev_out = datetime(base.year, base.month, base.day, hour, minute, sec)
90+
91+
elif isinstance(sanitized[-1], AbsoluteDateTime):
92+
base = datetime(
93+
year=current_time.year if sanitized[-1].year == 0 else sanitized[-1].year,
94+
month=current_time.month if sanitized[-1].month == 0 else sanitized[-1].month,
95+
day=current_time.day if sanitized[-1].day == 0 else sanitized[-1].day,
96+
hour=sanitized[-1].hour,
97+
minute=sanitized[-1].minute,
98+
second=sanitized[-1].second
99+
)
100+
hour, minute, sec = sanitized[-2].time_value(None)
101+
ev_out = datetime(base.year, base.month, base.day, hour, minute, sec)
102+
103+
return ev_out
104+
105+
106+
def evaluate_absolute_prepositions(current_time: datetime, parsed: list) -> datetime:
107+
ev = AbsolutePrepositionsEvaluator
63108
base_year = current_time.year
64109
sanitized = ev.sanitize_input(parsed)
65110
base = ev.get_base(sanitized, base_year)
@@ -113,7 +158,7 @@ def evaluate_constants(current_time: datetime, parsed_object) -> Union[AbsoluteD
113158
return ev_out
114159

115160

116-
def evaluate_relative_datetimes(current_time: datetime, parsed: RelativeDateTime) -> AbsoluteDateTime:
161+
def evaluate_relative_datetime(current_time: datetime, parsed: RelativeDateTime) -> AbsoluteDateTime:
117162
out: datetime = current_time
118163

119164
out += relativedelta(

0 commit comments

Comments
 (0)