X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=dateparse%2Fdateparse_utils.py;h=6ba647c847e48931017292947bfe36cb423f772f;hb=f2600f30801c849fc1d139386e3ddc3c9eb43e30;hp=be5e1b5312a7beb83fea7dc7b0137f08059879a3;hpb=e70297b7e29a07457d6c7195425e734a1290abeb;p=python_utils.git diff --git a/dateparse/dateparse_utils.py b/dateparse/dateparse_utils.py index be5e1b5..6ba647c 100755 --- a/dateparse/dateparse_utils.py +++ b/dateparse/dateparse_utils.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +# type: ignore """ Parse dates in a variety of formats. @@ -7,7 +8,6 @@ Parse dates in a variety of formats. import datetime import functools -import holidays # type: ignore import logging import re import sys @@ -16,21 +16,21 @@ from typing import Any, Callable, Dict, Optional import antlr4 # type: ignore import dateutil.easter import dateutil.tz +import holidays # type: ignore import pytz import acl import bootstrap +import decorator_utils +from dateparse.dateparse_utilsLexer import dateparse_utilsLexer # type: ignore +from dateparse.dateparse_utilsListener import dateparse_utilsListener # type: ignore +from dateparse.dateparse_utilsParser import dateparse_utilsParser # type: ignore from datetime_utils import ( TimeUnit, - n_timeunits_from_base, - datetime_to_date, date_to_datetime, + datetime_to_date, + n_timeunits_from_base, ) -from dateparse.dateparse_utilsLexer import dateparse_utilsLexer # type: ignore -from dateparse.dateparse_utilsListener import dateparse_utilsListener # type: ignore -from dateparse.dateparse_utilsParser import dateparse_utilsParser # type: ignore -import decorator_utils - logger = logging.getLogger(__name__) @@ -66,9 +66,7 @@ class RaisingErrorListener(antlr4.DiagnosticErrorListener): def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e): raise ParseException(msg) - def reportAmbiguity( - self, recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs - ): + def reportAmbiguity(self, recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs): pass def reportAttemptingFullContext( @@ -76,9 +74,7 @@ class RaisingErrorListener(antlr4.DiagnosticErrorListener): ): pass - def reportContextSensitivity( - self, recognizer, dfa, startIndex, stopIndex, prediction, configs - ): + def reportContextSensitivity(self, recognizer, dfa, startIndex, stopIndex, prediction, configs): pass @@ -225,8 +221,9 @@ class DateParser(dateparse_utilsListener): to timezone naive (i.e. tzinfo = None). """ dt = self.datetime - if tz is not None: - dt = dt.replace(tzinfo=None).astimezone(tz=tz) + if dt is not None: + if tz is not None: + dt = dt.replace(tzinfo=None).astimezone(tz=tz) return dt # -- helpers -- @@ -376,25 +373,25 @@ class DateParser(dateparse_utilsListener): # Try pytz try: - tz = pytz.timezone(txt) - if tz is not None: - return tz + tz1 = pytz.timezone(txt) + if tz1 is not None: + return tz1 except Exception: pass # Try dateutil try: - tz = dateutil.tz.gettz(txt) - if tz is not None: - return tz + tz2 = dateutil.tz.gettz(txt) + if tz2 is not None: + return tz2 except Exception: pass # Try constructing an offset in seconds try: - sign = txt[0] - if sign == '-' or sign == '+': - sign = +1 if sign == '+' else -1 + txt_sign = txt[0] + if txt_sign == '-' or txt_sign == '+': + sign = +1 if txt_sign == '+' else -1 hour = int(txt[1:3]) minute = int(txt[-2:]) offset = sign * (hour * 60 * 60) + sign * (minute * 60) @@ -435,12 +432,20 @@ class DateParser(dateparse_utilsListener): micros = self.time.microsecond self.datetime = datetime.datetime( - year, month, day, hour, minute, second, micros, tzinfo=self.time.tzinfo + year, + month, + day, + hour, + minute, + second, + micros, + tzinfo=self.time.tzinfo, ) # Apply resudual adjustments to times here when we have a # datetime. self.datetime = self.datetime + self.timedelta + assert self.datetime is not None self.time = datetime.time( self.datetime.hour, self.datetime.minute, @@ -547,11 +552,9 @@ class DateParser(dateparse_utilsListener): elif unit == TimeUnit.HOURS: self.timedelta = datetime.timedelta(hours=count) else: - raise ParseException() + raise ParseException(f'Invalid Unit: "{unit}"') - def exitDeltaPlusMinusExpr( - self, ctx: dateparse_utilsParser.DeltaPlusMinusExprContext - ) -> None: + def exitDeltaPlusMinusExpr(self, ctx: dateparse_utilsParser.DeltaPlusMinusExprContext) -> None: try: n = ctx.nth() if n is None: @@ -573,17 +576,13 @@ class DateParser(dateparse_utilsListener): else: self.context['delta_unit'] = unit - def exitDeltaNextLast( - self, ctx: dateparse_utilsParser.DeltaNextLastContext - ) -> None: + def exitDeltaNextLast(self, ctx: dateparse_utilsParser.DeltaNextLastContext) -> None: try: txt = ctx.getText().lower() except Exception: raise ParseException(f'Bad next/last: {ctx.getText()}') if 'month' in self.context or 'day' in self.context or 'year' in self.context: - raise ParseException( - 'Next/last expression expected to be relative to today.' - ) + raise ParseException('Next/last expression expected to be relative to today.') if txt[:4] == 'next': self.context['delta_int'] = +1 self.context['day'] = self.now_datetime.day @@ -612,9 +611,7 @@ class DateParser(dateparse_utilsListener): if 'time_delta_before_after' not in self.context: raise ParseException(f'Bad Before/After: {ctx.getText()}') - def exitDeltaTimeFraction( - self, ctx: dateparse_utilsParser.DeltaTimeFractionContext - ) -> None: + def exitDeltaTimeFraction(self, ctx: dateparse_utilsParser.DeltaTimeFractionContext) -> None: try: txt = ctx.getText().lower()[:4] if txt == 'quar': @@ -628,9 +625,7 @@ class DateParser(dateparse_utilsListener): except Exception: raise ParseException(f'Bad time fraction {ctx.getText()}') - def exitDeltaBeforeAfter( - self, ctx: dateparse_utilsParser.DeltaBeforeAfterContext - ) -> None: + def exitDeltaBeforeAfter(self, ctx: dateparse_utilsParser.DeltaBeforeAfterContext) -> None: try: txt = ctx.getText().lower() except Exception: @@ -638,9 +633,7 @@ class DateParser(dateparse_utilsListener): else: self.context['delta_before_after'] = txt - def exitDeltaTimeBeforeAfter( - self, ctx: dateparse_utilsParser.DeltaBeforeAfterContext - ) -> None: + def exitDeltaTimeBeforeAfter(self, ctx: dateparse_utilsParser.DeltaBeforeAfterContext) -> None: try: txt = ctx.getText().lower() except Exception: @@ -802,9 +795,7 @@ class DateParser(dateparse_utilsListener): special = ctx.specialDate().getText().lower() self.context['special'] = special except Exception: - raise ParseException( - f'Bad specialDate expression: {ctx.specialDate().getText()}' - ) + raise ParseException(f'Bad specialDate expression: {ctx.specialDate().getText()}') try: mod = ctx.thisNextLast() if mod is not None: @@ -888,9 +879,7 @@ class DateParser(dateparse_utilsListener): self.context['month'] = d.month self.context['day'] = d.day - def exitSpecialTimeExpr( - self, ctx: dateparse_utilsParser.SpecialTimeExprContext - ) -> None: + def exitSpecialTimeExpr(self, ctx: dateparse_utilsParser.SpecialTimeExprContext) -> None: try: txt = ctx.specialTime().getText().lower() except Exception: @@ -915,9 +904,7 @@ class DateParser(dateparse_utilsListener): except Exception: pass - def exitTwelveHourTimeExpr( - self, ctx: dateparse_utilsParser.TwelveHourTimeExprContext - ) -> None: + def exitTwelveHourTimeExpr(self, ctx: dateparse_utilsParser.TwelveHourTimeExprContext) -> None: try: hour = ctx.hour().getText() while not hour[-1].isdigit(): @@ -1027,6 +1014,7 @@ def main() -> None: logger.exception(e) print("Unrecognized.") else: + assert dt is not None print(dt.strftime('%A %Y/%m/%d %H:%M:%S.%f %Z(%z)')) sys.exit(0)