Reduce import scopes, remove cycles.
[python_utils.git] / dateparse / dateparse_utils.py
index 00e7b9dbb393c4c40be60e0079e0b8377e071ea2..ad92ccd5d8d3e672bc0adc55ff2197912a833455 100755 (executable)
@@ -15,8 +15,7 @@ import pytz
 
 import acl
 import bootstrap
-import datetime_utils
-import decorator_utils
+from decorator_utils import decorate_matching_methods_with
 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
@@ -78,7 +77,7 @@ class RaisingErrorListener(antlr4.DiagnosticErrorListener):
         pass
 
 
-@decorator_utils.decorate_matching_methods_with(
+@decorate_matching_methods_with(
     debug_parse,
     acl=acl.StringWildcardBasedACL(
         allowed_patterns=[
@@ -106,6 +105,7 @@ class DateParser(dateparse_utilsListener):
         idea of "now" so that the code can be more easily unittested.
         Leave as None for real use cases.
         """
+        from datetime_utils import TimeUnit
         self.month_name_to_number = {
             'jan': 1,
             'feb': 2,
@@ -152,16 +152,16 @@ class DateParser(dateparse_utilsListener):
         # These TimeUnits are defined in datetime_utils and are used as params
         # to datetime_utils.n_timeunits_from_base.
         self.time_delta_unit_to_constant = {
-            'hou': datetime_utils.TimeUnit.HOURS,
-            'min': datetime_utils.TimeUnit.MINUTES,
-            'sec': datetime_utils.TimeUnit.SECONDS,
+            'hou': TimeUnit.HOURS,
+            'min': TimeUnit.MINUTES,
+            'sec': TimeUnit.SECONDS,
         }
         self.delta_unit_to_constant = {
-            'day': datetime_utils.TimeUnit.DAYS,
-            'wor': datetime_utils.TimeUnit.WORKDAYS,
-            'wee': datetime_utils.TimeUnit.WEEKS,
-            'mon': datetime_utils.TimeUnit.MONTHS,
-            'yea': datetime_utils.TimeUnit.YEARS,
+            'day': TimeUnit.DAYS,
+            'wor': TimeUnit.WORKDAYS,
+            'wee': TimeUnit.WEEKS,
+            'mon': TimeUnit.MONTHS,
+            'yea': TimeUnit.YEARS,
         }
         self.override_now_for_test_purposes = override_now_for_test_purposes
         self._reset()
@@ -231,12 +231,13 @@ class DateParser(dateparse_utilsListener):
 
     def _reset(self):
         """Reset at init and between parses."""
+        from datetime_utils import datetime_to_date
         if self.override_now_for_test_purposes is None:
             self.now_datetime = datetime.datetime.now()
             self.today = datetime.date.today()
         else:
             self.now_datetime = self.override_now_for_test_purposes
-            self.today = datetime_utils.datetime_to_date(
+            self.today = datetime_to_date(
                 self.override_now_for_test_purposes
             )
         self.date: Optional[datetime.date] = None
@@ -260,8 +261,9 @@ class DateParser(dateparse_utilsListener):
 
     def _figure_out_date_unit(self, orig: str) -> int:
         """Figure out what unit a date expression piece is talking about."""
+        from datetime_utils import TimeUnit
         if 'month' in orig:
-            return datetime_utils.TimeUnit.MONTHS
+            return TimeUnit.MONTHS
         txt = orig.lower()[:3]
         if txt in self.day_name_to_number:
             return(self.day_name_to_number[txt])
@@ -467,6 +469,9 @@ class DateParser(dateparse_utilsListener):
 
     def exitDateExpr(self, ctx: dateparse_utilsParser.DateExprContext) -> None:
         """When we leave the date expression, populate self.date."""
+        from datetime_utils import (
+            n_timeunits_from_base, datetime_to_date, date_to_datetime
+        )
         if 'special' in self.context:
             self.date = self._parse_special_date(self.context['special'])
         else:
@@ -500,15 +505,16 @@ class DateParser(dateparse_utilsListener):
         if 'delta_unit' not in self.context:
             raise ParseException('Missing delta_unit?!')
         unit = self.context['delta_unit']
-        dt = datetime_utils.n_timeunits_from_base(
+        dt = n_timeunits_from_base(
             count,
             unit,
-            datetime_utils.date_to_datetime(self.date)
+            date_to_datetime(self.date)
         )
-        self.date = datetime_utils.datetime_to_date(dt)
+        self.date = datetime_to_date(dt)
 
     def exitTimeExpr(self, ctx: dateparse_utilsParser.TimeExprContext) -> None:
         # Simple time?
+        from datetime_utils import TimeUnit
         self.time = datetime.time(
             self.context['hour'],
             self.context['minute'],
@@ -546,11 +552,11 @@ class DateParser(dateparse_utilsListener):
             self.timedelta += datetime.timedelta(minutes=count)
         else:
             unit = self.context['time_delta_unit']
-            if unit == datetime_utils.TimeUnit.SECONDS:
+            if unit == TimeUnit.SECONDS:
                 self.timedelta += datetime.timedelta(seconds=count)
-            elif unit == datetime_utils.TimeUnit.MINUTES:
+            elif unit == TimeUnit.MINUTES:
                 self.timedelta = datetime.timedelta(minutes=count)
-            elif unit == datetime_utils.TimeUnit.HOURS:
+            elif unit == TimeUnit.HOURS:
                 self.timedelta = datetime.timedelta(hours=count)
             else:
                 raise ParseException()
@@ -635,18 +641,19 @@ class DateParser(dateparse_utilsListener):
     def exitDeltaTimeFraction(
             self, ctx: dateparse_utilsParser.DeltaTimeFractionContext
     ) -> None:
+        from datetime_utils import TimeUnit
         try:
             txt = ctx.getText().lower()[:4]
             if txt == 'quar':
                 self.context['time_delta_int'] = 15
                 self.context[
                     'time_delta_unit'
-                ] = datetime_utils.TimeUnit.MINUTES
+                ] = TimeUnit.MINUTES
             elif txt == 'half':
                 self.context['time_delta_int'] = 30
                 self.context[
                     'time_delta_unit'
-                ] = datetime_utils.TimeUnit.MINUTES
+                ] = TimeUnit.MINUTES
             else:
                 raise ParseException(f'Bad time fraction {ctx.getText()}')
         except:
@@ -867,6 +874,7 @@ class DateParser(dateparse_utilsListener):
     def exitNFoosFromTodayAgoExpr(
         self, ctx: dateparse_utilsParser.NFoosFromTodayAgoExprContext
     ) -> None:
+        from datetime_utils import n_timeunits_from_base
         d = self.now_datetime
         try:
             count = self._get_int(ctx.unsignedInt().getText())
@@ -881,7 +889,7 @@ class DateParser(dateparse_utilsListener):
             count = -count
 
         unit = self._figure_out_date_unit(unit)
-        d = datetime_utils.n_timeunits_from_base(
+        d = n_timeunits_from_base(
             count,
             unit,
             d)
@@ -892,6 +900,7 @@ class DateParser(dateparse_utilsListener):
     def exitDeltaRelativeToTodayExpr(
         self, ctx: dateparse_utilsParser.DeltaRelativeToTodayExprContext
     ) -> None:
+        from datetime_utils import n_timeunits_from_base
         d = self.now_datetime
         try:
             mod = ctx.thisNextLast()
@@ -911,7 +920,7 @@ class DateParser(dateparse_utilsListener):
                 f'Bad DeltaRelativeToTodayExpr: {ctx.getText()}'
             )
         unit = self._figure_out_date_unit(unit)
-        d = datetime_utils.n_timeunits_from_base(
+        d = n_timeunits_from_base(
             count,
             unit,
             d)