More cleanup.
[python_utils.git] / dateparse / dateparse_utils.py
index be5e1b5312a7beb83fea7dc7b0137f08059879a3..6ba647c847e48931017292947bfe36cb423f772f 100755 (executable)
@@ -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)