Make subdirs type clean too.
[python_utils.git] / dateparse / dateparse_utils.py
index be5e1b5312a7beb83fea7dc7b0137f08059879a3..7ca3cf3123a2a460c375a2ef811575d656c0d572 100755 (executable)
@@ -7,7 +7,6 @@ Parse dates in a variety of formats.
 
 import datetime
 import functools
-import holidays  # type: ignore
 import logging
 import re
 import sys
@@ -16,21 +15,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__)
 
@@ -225,8 +224,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 +376,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)
@@ -441,6 +441,7 @@ class DateParser(dateparse_utilsListener):
         # Apply resudual adjustments to times here when we have a
         # datetime.
         self.datetime = self.datetime + self.timedelta
+        assert self.datetime
         self.time = datetime.time(
             self.datetime.hour,
             self.datetime.minute,
@@ -547,7 +548,7 @@ 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
@@ -1027,6 +1028,7 @@ def main() -> None:
             logger.exception(e)
             print("Unrecognized.")
         else:
+            assert dt
             print(dt.strftime('%A %Y/%m/%d %H:%M:%S.%f %Z(%z)'))
     sys.exit(0)