|
6 | 6 | import re |
7 | 7 | from datetime import datetime, timezone |
8 | 8 | from os import path |
9 | | -from typing import TYPE_CHECKING, Callable, NamedTuple |
| 9 | +from typing import TYPE_CHECKING, NamedTuple |
10 | 10 |
|
11 | 11 | import babel.dates |
12 | 12 | from babel.messages.mofile import write_mo |
|
18 | 18 | from sphinx.util.osutil import SEP, canon_path, relpath |
19 | 19 |
|
20 | 20 | if TYPE_CHECKING: |
| 21 | + import datetime as dt |
21 | 22 | from collections.abc import Generator |
| 23 | + from typing import Protocol, Union |
| 24 | + |
| 25 | + from babel.core import Locale |
22 | 26 |
|
23 | 27 | from sphinx.environment import BuildEnvironment |
24 | 28 |
|
| 29 | + class DateFormatter(Protocol): |
| 30 | + def __call__( # NoQA: E704 |
| 31 | + self, |
| 32 | + date: dt.date | None = ..., |
| 33 | + format: str = ..., |
| 34 | + locale: str | Locale | None = ..., |
| 35 | + ) -> str: ... |
| 36 | + |
| 37 | + class TimeFormatter(Protocol): |
| 38 | + def __call__( # NoQA: E704 |
| 39 | + self, |
| 40 | + time: dt.time | dt.datetime | float | None = ..., |
| 41 | + format: str = ..., |
| 42 | + tzinfo: dt.tzinfo | None = ..., |
| 43 | + locale: str | Locale | None = ..., |
| 44 | + ) -> str: ... |
| 45 | + |
| 46 | + class DatetimeFormatter(Protocol): |
| 47 | + def __call__( # NoQA: E704 |
| 48 | + self, |
| 49 | + datetime: dt.date | dt.time | float | None = ..., |
| 50 | + format: str = ..., |
| 51 | + tzinfo: dt.tzinfo | None = ..., |
| 52 | + locale: str | Locale | None = ..., |
| 53 | + ) -> str: ... |
| 54 | + |
| 55 | + Formatter = Union[DateFormatter, TimeFormatter, DatetimeFormatter] |
25 | 56 |
|
26 | 57 | logger = logging.getLogger(__name__) |
27 | 58 |
|
@@ -169,7 +200,7 @@ def docname_to_domain(docname: str, compaction: bool | str) -> str: |
169 | 200 |
|
170 | 201 |
|
171 | 202 | def babel_format_date(date: datetime, format: str, locale: str, |
172 | | - formatter: Callable = babel.dates.format_date) -> str: |
| 203 | + formatter: Formatter = babel.dates.format_date) -> str: |
173 | 204 | # Check if we have the tzinfo attribute. If not we cannot do any time |
174 | 205 | # related formats. |
175 | 206 | if not hasattr(date, 'tzinfo'): |
@@ -207,6 +238,7 @@ def format_date( |
207 | 238 | # Check if we have to use a different babel formatter then |
208 | 239 | # format_datetime, because we only want to format a date |
209 | 240 | # or a time. |
| 241 | + function: Formatter |
210 | 242 | if token == '%x': |
211 | 243 | function = babel.dates.format_date |
212 | 244 | elif token == '%X': |
|
0 commit comments