X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=dateparse%2Fdateparse_utils.py;h=21fdb832b5c556317989e4f9855dae8daae67552;hb=5f75cf834725ac26b289cc5f157af0cb71cd5f0e;hp=cd8bc3543513d147b030c5303424964aaa49b5b9;hpb=b843703134a166013518c707fa5a77373f1bf0bf;p=python_utils.git diff --git a/dateparse/dateparse_utils.py b/dateparse/dateparse_utils.py index cd8bc35..21fdb83 100755 --- a/dateparse/dateparse_utils.py +++ b/dateparse/dateparse_utils.py @@ -1,5 +1,10 @@ #!/usr/bin/env python3 +""" +Parse dates in a variety of formats. + +""" + import datetime import functools import holidays # type: ignore @@ -50,7 +55,6 @@ def debug_parse(enter_or_exit_f: Callable[[Any, Any], None]): class ParseException(Exception): """An exception thrown during parsing because of unrecognized input.""" def __init__(self, message: str) -> None: - logger.error(message) self.message = message @@ -59,7 +63,6 @@ class RaisingErrorListener(antlr4.DiagnosticErrorListener): def syntaxError( self, recognizer, offendingSymbol, line, column, msg, e ): - logger.error(msg) raise ParseException(msg) def reportAmbiguity( @@ -194,6 +197,8 @@ class DateParser(dateparse_utilsListener): This is the main entrypoint to this class for caller code. """ + date_string = date_string.strip() + date_string = re.sub('\s+', ' ', date_string) self._reset() listener = RaisingErrorListener() input_stream = antlr4.InputStream(date_string) @@ -249,6 +254,7 @@ class DateParser(dateparse_utilsListener): self.datetime: Optional[datetime.datetime] = None self.context: Dict[str, Any] = {} self.timedelta = datetime.timedelta(seconds=0) + self.saw_overt_year = False @staticmethod def _normalize_special_day_name(name: str) -> str: @@ -269,9 +275,9 @@ class DateParser(dateparse_utilsListener): return TimeUnit.MONTHS txt = orig.lower()[:3] if txt in self.day_name_to_number: - return(self.day_name_to_number[txt]) + return(TimeUnit(self.day_name_to_number[txt])) elif txt in self.delta_unit_to_constant: - return(self.delta_unit_to_constant[txt]) + return(TimeUnit(self.delta_unit_to_constant[txt])) raise ParseException(f'Invalid date unit: {orig}') def _figure_out_time_unit(self, orig: str) -> int: @@ -300,8 +306,10 @@ class DateParser(dateparse_utilsListener): next_last = self.context.get('special_next_last', '') if next_last == 'next': year += 1 + self.saw_overt_year = True elif next_last == 'last': year -= 1 + self.saw_overt_year = True # Holiday names if name == 'easte': @@ -360,6 +368,9 @@ class DateParser(dateparse_utilsListener): raise ParseException('Missing day') if 'year' not in self.context: self.context['year'] = self.today.year + self.saw_overt_year = False + else: + self.saw_overt_year = True # Handling "ides" and "nones" requires both the day and month. if ( @@ -507,7 +518,7 @@ class DateParser(dateparse_utilsListener): unit = self.context['delta_unit'] dt = n_timeunits_from_base( count, - unit, + TimeUnit(unit), date_to_datetime(self.date) ) self.date = datetime_to_date(dt) @@ -610,11 +621,13 @@ class DateParser(dateparse_utilsListener): self.context['day'] = self.now_datetime.day self.context['month'] = self.now_datetime.month self.context['year'] = self.now_datetime.year + self.saw_overt_year = True elif txt[:4] == 'last': self.context['delta_int'] = -1 self.context['day'] = self.now_datetime.day self.context['month'] = self.now_datetime.month self.context['year'] = self.now_datetime.year + self.saw_overt_year = True else: raise ParseException(f'Bad next/last: {ctx.getText()}') @@ -843,6 +856,7 @@ class DateParser(dateparse_utilsListener): except Exception: raise ParseException(f'Bad year expression: {ctx.getText()}') else: + self.saw_overt_year = True self.context['year'] = year def exitSpecialDateMaybeYearExpr( @@ -888,7 +902,7 @@ class DateParser(dateparse_utilsListener): unit = self._figure_out_date_unit(unit) d = n_timeunits_from_base( count, - unit, + TimeUnit(unit), d) self.context['year'] = d.year self.context['month'] = d.month @@ -918,7 +932,7 @@ class DateParser(dateparse_utilsListener): unit = self._figure_out_date_unit(unit) d = n_timeunits_from_base( count, - unit, + TimeUnit(unit), d) self.context['year'] = d.year self.context['month'] = d.month