Skip to content

Commit 27380da

Browse files
akxDenverCoder1
andauthored
Unify datetime imports (#945)
Co-authored-by: Jonah Lawrence <[email protected]>
1 parent 14216ed commit 27380da

File tree

9 files changed

+223
-150
lines changed

9 files changed

+223
-150
lines changed

babel/dates.py

Lines changed: 157 additions & 90 deletions
Large diffs are not rendered by default.

babel/localtime/__init__.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import sys
1313
import time
14-
from datetime import datetime, timedelta, tzinfo
14+
import datetime
1515
from threading import RLock
1616

1717
if sys.platform == 'win32':
@@ -23,34 +23,34 @@
2323
_cached_tz = None
2424
_cache_lock = RLock()
2525

26-
STDOFFSET = timedelta(seconds=-time.timezone)
26+
STDOFFSET = datetime.timedelta(seconds=-time.timezone)
2727
if time.daylight:
28-
DSTOFFSET = timedelta(seconds=-time.altzone)
28+
DSTOFFSET = datetime.timedelta(seconds=-time.altzone)
2929
else:
3030
DSTOFFSET = STDOFFSET
3131

3232
DSTDIFF = DSTOFFSET - STDOFFSET
33-
ZERO = timedelta(0)
33+
ZERO = datetime.timedelta(0)
3434

3535

36-
class _FallbackLocalTimezone(tzinfo):
36+
class _FallbackLocalTimezone(datetime.tzinfo):
3737

38-
def utcoffset(self, dt: datetime) -> timedelta:
38+
def utcoffset(self, dt: datetime.datetime) -> datetime.timedelta:
3939
if self._isdst(dt):
4040
return DSTOFFSET
4141
else:
4242
return STDOFFSET
4343

44-
def dst(self, dt: datetime) -> timedelta:
44+
def dst(self, dt: datetime.datetime) -> datetime.timedelta:
4545
if self._isdst(dt):
4646
return DSTDIFF
4747
else:
4848
return ZERO
4949

50-
def tzname(self, dt: datetime) -> str:
50+
def tzname(self, dt: datetime.datetime) -> str:
5151
return time.tzname[self._isdst(dt)]
5252

53-
def _isdst(self, dt: datetime) -> bool:
53+
def _isdst(self, dt: datetime.datetime) -> bool:
5454
tt = (dt.year, dt.month, dt.day,
5555
dt.hour, dt.minute, dt.second,
5656
dt.weekday(), 0, -1)
@@ -59,7 +59,7 @@ def _isdst(self, dt: datetime) -> bool:
5959
return tt.tm_isdst > 0
6060

6161

62-
def get_localzone() -> tzinfo:
62+
def get_localzone() -> datetime.tzinfo:
6363
"""Returns the current underlying local timezone object.
6464
Generally this function does not need to be used, it's a
6565
better idea to use the :data:`LOCALTZ` singleton instead.

babel/localtime/_unix.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import os
22
import re
33

4-
from datetime import tzinfo
4+
import datetime
55

66
from babel.localtime._helpers import (
77
_get_tzinfo_from_file,
88
_get_tzinfo_or_raise,
99
_get_tzinfo,
1010
)
1111

12-
def _tz_from_env(tzenv: str) -> tzinfo:
12+
def _tz_from_env(tzenv: str) -> datetime.tzinfo:
1313
if tzenv[0] == ':':
1414
tzenv = tzenv[1:]
1515

@@ -21,7 +21,7 @@ def _tz_from_env(tzenv: str) -> tzinfo:
2121
return _get_tzinfo_or_raise(tzenv)
2222

2323

24-
def _get_localzone(_root: str = '/') -> tzinfo:
24+
def _get_localzone(_root: str = '/') -> datetime.tzinfo:
2525
"""Tries to find the local timezone configuration.
2626
This method prefers finding the timezone name and passing that to
2727
zoneinfo or pytz, over passing in the localtime file, as in the later

babel/localtime/_win32.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
except ImportError:
66
winreg = None
77

8-
from datetime import tzinfo
8+
import datetime
99
from babel.core import get_global
1010
from babel.localtime._helpers import _get_tzinfo_or_raise
1111
from typing import Any, Dict, cast
@@ -89,7 +89,7 @@ def get_localzone_name() -> str:
8989
return timezone
9090

9191

92-
def _get_localzone() -> tzinfo:
92+
def _get_localzone() -> datetime.tzinfo:
9393
if winreg is None:
9494
raise LookupError(
9595
'Runtime support not available')

babel/messages/catalog.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from collections import OrderedDict
1515
from collections.abc import Generator, Iterable, Iterator
16-
from datetime import datetime, time as time_
16+
import datetime
1717
from difflib import get_close_matches
1818
from email import message_from_string
1919
from copy import copy
@@ -45,10 +45,10 @@
4545
''', re.VERBOSE)
4646

4747

48-
def _parse_datetime_header(value: str) -> datetime:
48+
def _parse_datetime_header(value: str) -> datetime.datetime:
4949
match = re.match(r'^(?P<datetime>.*?)(?P<tzoffset>[+-]\d{4})?$', value)
5050

51-
dt = datetime.strptime(match.group('datetime'), '%Y-%m-%d %H:%M')
51+
dt = datetime.datetime.strptime(match.group('datetime'), '%Y-%m-%d %H:%M')
5252

5353
# Separate the offset into a sign component, hours, and # minutes
5454
tzoffset = match.group('tzoffset')
@@ -261,8 +261,8 @@ def __init__(
261261
version: str | None = None,
262262
copyright_holder: str | None = None,
263263
msgid_bugs_address: str | None = None,
264-
creation_date: datetime | str | None = None,
265-
revision_date: datetime | time_ | float | str | None = None,
264+
creation_date: datetime.datetime | str | None = None,
265+
revision_date: datetime.datetime | datetime.time | float | str | None = None,
266266
last_translator: str | None = None,
267267
language_team: str | None = None,
268268
charset: str | None = None,
@@ -306,13 +306,13 @@ def __init__(
306306
self.charset = charset or 'utf-8'
307307

308308
if creation_date is None:
309-
creation_date = datetime.now(LOCALTZ)
310-
elif isinstance(creation_date, datetime) and not creation_date.tzinfo:
309+
creation_date = datetime.datetime.now(LOCALTZ)
310+
elif isinstance(creation_date, datetime.datetime) and not creation_date.tzinfo:
311311
creation_date = creation_date.replace(tzinfo=LOCALTZ)
312312
self.creation_date = creation_date
313313
if revision_date is None:
314314
revision_date = 'YEAR-MO-DA HO:MI+ZONE'
315-
elif isinstance(revision_date, datetime) and not revision_date.tzinfo:
315+
elif isinstance(revision_date, datetime.datetime) and not revision_date.tzinfo:
316316
revision_date = revision_date.replace(tzinfo=LOCALTZ)
317317
self.revision_date = revision_date
318318
self.fuzzy = fuzzy
@@ -354,7 +354,7 @@ def _get_locale_identifier(self) -> str | None:
354354

355355
def _get_header_comment(self) -> str:
356356
comment = self._header_comment
357-
year = datetime.now(LOCALTZ).strftime('%Y')
357+
year = datetime.datetime.now(LOCALTZ).strftime('%Y')
358358
if hasattr(self.revision_date, 'strftime'):
359359
year = self.revision_date.strftime('%Y')
360360
comment = comment.replace('PROJECT', self.project) \
@@ -409,7 +409,7 @@ def _get_mime_headers(self) -> list[tuple[str, str]]:
409409
headers.append(('POT-Creation-Date',
410410
format_datetime(self.creation_date, 'yyyy-MM-dd HH:mmZ',
411411
locale='en')))
412-
if isinstance(self.revision_date, (datetime, time_, int, float)):
412+
if isinstance(self.revision_date, (datetime.datetime, datetime.time, int, float)):
413413
headers.append(('PO-Revision-Date',
414414
format_datetime(self.revision_date,
415415
'yyyy-MM-dd HH:mmZ', locale='en')))
@@ -481,6 +481,7 @@ def _set_mime_headers(self, headers: Iterable[tuple[str, str]]) -> None:
481481
Here's an example of the output for such a catalog template:
482482
483483
>>> from babel.dates import UTC
484+
>>> from datetime import datetime
484485
>>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC)
485486
>>> catalog = Catalog(project='Foobar', version='1.0',
486487
... creation_date=created)

babel/messages/frontend.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import tempfile
1919
from collections import OrderedDict
2020
from configparser import RawConfigParser
21-
from datetime import datetime
21+
import datetime
2222
from io import StringIO
2323

2424
from babel import __version__ as VERSION
@@ -662,7 +662,7 @@ def run(self):
662662
catalog = read_po(infile, locale=self.locale)
663663

664664
catalog.locale = self._locale
665-
catalog.revision_date = datetime.now(LOCALTZ)
665+
catalog.revision_date = datetime.datetime.now(LOCALTZ)
666666
catalog.fuzzy = False
667667

668668
with open(self.output_file, 'wb') as outfile:
@@ -818,7 +818,7 @@ def run(self):
818818
catalog = read_po(infile, locale=self.locale)
819819

820820
catalog.locale = self._locale
821-
catalog.revision_date = datetime.now(LOCALTZ)
821+
catalog.revision_date = datetime.datetime.now(LOCALTZ)
822822
catalog.fuzzy = False
823823

824824
with open(filename, 'wb') as outfile:

babel/numbers.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import re
2424
from typing import TYPE_CHECKING, Any, overload
2525
import warnings
26-
from datetime import date as date_, datetime as datetime_
26+
import datetime
2727

2828
from babel.core import Locale, default_locale, get_global
2929
from babel.localedata import LocaleDataDict
@@ -200,8 +200,8 @@ def get_currency_unit_pattern(
200200
@overload
201201
def get_territory_currencies(
202202
territory: str,
203-
start_date: date_ | None = ...,
204-
end_date: date_ | None = ...,
203+
start_date: datetime.date | None = ...,
204+
end_date: datetime.date | None = ...,
205205
tender: bool = ...,
206206
non_tender: bool = ...,
207207
include_details: Literal[False] = ...,
@@ -212,8 +212,8 @@ def get_territory_currencies(
212212
@overload
213213
def get_territory_currencies(
214214
territory: str,
215-
start_date: date_ | None = ...,
216-
end_date: date_ | None = ...,
215+
start_date: datetime.date | None = ...,
216+
end_date: datetime.date | None = ...,
217217
tender: bool = ...,
218218
non_tender: bool = ...,
219219
include_details: Literal[True] = ...,
@@ -223,8 +223,8 @@ def get_territory_currencies(
223223

224224
def get_territory_currencies(
225225
territory: str,
226-
start_date: date_ | None = None,
227-
end_date: date_ | None = None,
226+
start_date: datetime.date | None = None,
227+
end_date: datetime.date | None = None,
228228
tender: bool = True,
229229
non_tender: bool = False,
230230
include_details: bool = False,
@@ -280,12 +280,12 @@ def get_territory_currencies(
280280
"""
281281
currencies = get_global('territory_currencies')
282282
if start_date is None:
283-
start_date = date_.today()
284-
elif isinstance(start_date, datetime_):
283+
start_date = datetime.date.today()
284+
elif isinstance(start_date, datetime.datetime):
285285
start_date = start_date.date()
286286
if end_date is None:
287287
end_date = start_date
288-
elif isinstance(end_date, datetime_):
288+
elif isinstance(end_date, datetime.datetime):
289289
end_date = end_date.date()
290290

291291
curs = currencies.get(territory.upper(), ())
@@ -298,9 +298,9 @@ def _is_active(start, end):
298298
result = []
299299
for currency_code, start, end, is_tender in curs:
300300
if start:
301-
start = date_(*start)
301+
start = datetime.date(*start)
302302
if end:
303-
end = date_(*end)
303+
end = datetime.date(*end)
304304
if ((is_tender and tender) or
305305
(not is_tender and non_tender)) and _is_active(start, end):
306306
if include_details:

babel/support.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,8 @@
1616
import gettext
1717
import locale
1818
import os
19+
import datetime
1920
from collections.abc import Iterator
20-
from datetime import (
21-
date as _date,
22-
datetime as _datetime,
23-
time as _time,
24-
timedelta as _timedelta,
25-
tzinfo
26-
)
2721
from typing import TYPE_CHECKING, Any, Callable
2822

2923
from babel.core import Locale
@@ -52,7 +46,7 @@ class Format:
5246
u'1.234'
5347
"""
5448

55-
def __init__(self, locale: Locale | str, tzinfo: tzinfo | None = None) -> None:
49+
def __init__(self, locale: Locale | str, tzinfo: datetime.tzinfo | None = None) -> None:
5650
"""Initialize the formatter.
5751
5852
:param locale: the locale identifier or `Locale` instance
@@ -61,7 +55,11 @@ def __init__(self, locale: Locale | str, tzinfo: tzinfo | None = None) -> None:
6155
self.locale = Locale.parse(locale)
6256
self.tzinfo = tzinfo
6357

64-
def date(self, date: _date | None = None, format: _PredefinedTimeFormat | str = 'medium') -> str:
58+
def date(
59+
self,
60+
date: datetime.date | None = None,
61+
format: _PredefinedTimeFormat | str = 'medium',
62+
) -> str:
6563
"""Return a date formatted according to the given pattern.
6664
6765
>>> from datetime import date
@@ -71,18 +69,25 @@ def date(self, date: _date | None = None, format: _PredefinedTimeFormat | str =
7169
"""
7270
return format_date(date, format, locale=self.locale)
7371

74-
def datetime(self, datetime: _date | None = None, format: _PredefinedTimeFormat | str = 'medium') -> str:
72+
def datetime(
73+
self,
74+
datetime: datetime.date | None = None,
75+
format: _PredefinedTimeFormat | str = 'medium',
76+
) -> str:
7577
"""Return a date and time formatted according to the given pattern.
7678
7779
>>> from datetime import datetime
7880
>>> fmt = Format('en_US', tzinfo=get_timezone('US/Eastern'))
7981
>>> fmt.datetime(datetime(2007, 4, 1, 15, 30))
8082
u'Apr 1, 2007, 11:30:00 AM'
8183
"""
82-
return format_datetime(datetime, format, tzinfo=self.tzinfo,
83-
locale=self.locale)
84+
return format_datetime(datetime, format, tzinfo=self.tzinfo, locale=self.locale)
8485

85-
def time(self, time: _time | _datetime | None = None, format: _PredefinedTimeFormat | str = 'medium') -> str:
86+
def time(
87+
self,
88+
time: datetime.time | datetime.datetime | None = None,
89+
format: _PredefinedTimeFormat | str = 'medium',
90+
) -> str:
8691
"""Return a time formatted according to the given pattern.
8792
8893
>>> from datetime import datetime
@@ -94,7 +99,7 @@ def time(self, time: _time | _datetime | None = None, format: _PredefinedTimeFor
9499

95100
def timedelta(
96101
self,
97-
delta: _timedelta | int,
102+
delta: datetime.timedelta | int,
98103
granularity: Literal["year", "month", "week", "day", "hour", "minute", "second"] = "second",
99104
threshold: float = 0.85,
100105
format: Literal["narrow", "short", "medium", "long"] = "long",

babel/util.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from babel import localtime, dates
1818

1919
from collections.abc import Generator, Iterable
20-
from datetime import datetime as datetime_, timedelta, tzinfo
20+
import datetime
2121
from typing import IO, Any, TypeVar
2222

2323
missing = object()
@@ -225,12 +225,12 @@ def wraptext(text: str, width: int = 70, initial_indent: str = '', subsequent_in
225225
odict = collections.OrderedDict
226226

227227

228-
class FixedOffsetTimezone(tzinfo):
228+
class FixedOffsetTimezone(datetime.tzinfo):
229229
"""Fixed offset in minutes east from UTC."""
230230

231231
def __init__(self, offset: float, name: str | None = None) -> None:
232232

233-
self._offset = timedelta(minutes=offset)
233+
self._offset = datetime.timedelta(minutes=offset)
234234
if name is None:
235235
name = 'Etc/GMT%+d' % offset
236236
self.zone = name
@@ -241,13 +241,13 @@ def __str__(self) -> str:
241241
def __repr__(self) -> str:
242242
return f'<FixedOffset "{self.zone}" {self._offset}>'
243243

244-
def utcoffset(self, dt: datetime_) -> timedelta:
244+
def utcoffset(self, dt: datetime.datetime) -> datetime.timedelta:
245245
return self._offset
246246

247-
def tzname(self, dt: datetime_) -> str:
247+
def tzname(self, dt: datetime.datetime) -> str:
248248
return self.zone
249249

250-
def dst(self, dt: datetime_) -> timedelta:
250+
def dst(self, dt: datetime.datetime) -> datetime.timedelta:
251251
return ZERO
252252

253253

0 commit comments

Comments
 (0)