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 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
 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
 
 
         pass
 
 
-@decorator_utils.decorate_matching_methods_with(
+@decorate_matching_methods_with(
     debug_parse,
     acl=acl.StringWildcardBasedACL(
         allowed_patterns=[
     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.
         """
         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,
         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 = {
         # 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 = {
         }
         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()
         }
         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."""
 
     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
         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
                 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."""
 
     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:
         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])
         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."""
 
     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:
         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']
         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,
             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?
 
     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'],
         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']
             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)
                 self.timedelta += datetime.timedelta(seconds=count)
-            elif unit == datetime_utils.TimeUnit.MINUTES:
+            elif unit == TimeUnit.MINUTES:
                 self.timedelta = datetime.timedelta(minutes=count)
                 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()
                 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:
     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'
         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'
             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:
             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:
     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())
         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)
             count = -count
 
         unit = self._figure_out_date_unit(unit)
-        d = datetime_utils.n_timeunits_from_base(
+        d = n_timeunits_from_base(
             count,
             unit,
             d)
             count,
             unit,
             d)
@@ -892,6 +900,7 @@ class DateParser(dateparse_utilsListener):
     def exitDeltaRelativeToTodayExpr(
         self, ctx: dateparse_utilsParser.DeltaRelativeToTodayExprContext
     ) -> None:
     def exitDeltaRelativeToTodayExpr(
         self, ctx: dateparse_utilsParser.DeltaRelativeToTodayExprContext
     ) -> None:
+        from datetime_utils import n_timeunits_from_base
         d = self.now_datetime
         try:
             mod = ctx.thisNextLast()
         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)
                 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)
             count,
             unit,
             d)