From 7826fcb662f5913fd374c2274f83a20fed69bc42 Mon Sep 17 00:00:00 2001 From: "alex.oleshkevich" Date: Mon, 9 Jan 2023 15:17:32 +0300 Subject: [PATCH] improve types format_time now accepts datetime.time --- pyproject.toml | 2 +- starlette_babel/formatters.py | 18 ++++++++++++++++-- starlette_babel/translator.py | 14 +++++++++++++- tests/test_formatters.py | 6 ++++++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5b73c48..d3157fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "starlette_babel" description = "Locale support for Starlette" -version = "0.2.3" +version = "0.2.4" authors = ["Alex Oleshkevich "] license = "MIT" readme = "README.md" diff --git a/starlette_babel/formatters.py b/starlette_babel/formatters.py index 003ad6b..2e91b15 100644 --- a/starlette_babel/formatters.py +++ b/starlette_babel/formatters.py @@ -35,14 +35,28 @@ def format_datetime( return dates.format_datetime(dt, format=format, locale=parse_locale(locale)) -def format_date(date: datetime.datetime, format: _DateTimeFormats = "medium", locale: str | None = None) -> str: +def format_date( + date: datetime.date | datetime.datetime, format: _DateTimeFormats = "medium", locale: str | None = None +) -> str: return dates.format_date(date, format=format, locale=parse_locale(locale)) def format_time( - time: datetime.datetime, format: _DateTimeFormats = "medium", rebase: bool = True, locale: str | None = None + time: datetime.time | datetime.datetime, + format: _DateTimeFormats = "medium", + rebase: bool = True, + locale: str | None = None, ) -> str: if rebase: + if isinstance(time, datetime.time): + time = datetime.datetime.utcnow().replace( + hour=time.hour, + minute=time.minute, + second=time.second, + microsecond=time.microsecond, + tzinfo=time.tzinfo, + fold=time.fold, + ) time = to_user_timezone(time) return dates.format_time(time, format=format, locale=parse_locale(locale)) diff --git a/starlette_babel/translator.py b/starlette_babel/translator.py index 8fe71d9..a92d244 100644 --- a/starlette_babel/translator.py +++ b/starlette_babel/translator.py @@ -69,7 +69,19 @@ def translate(self) -> str: return typing.cast(str, value) -gettext_lazy = typing.cast(typing.Callable[[str], str], LazyString) +class _GettextLazy(typing.Protocol): # pragma: nocover + def __call__( + self, + msgid: str, + msgid_plural: str | None = None, + count: int | None = None, + domain: str = "messages", + translator: Translator | None = None, + ) -> str: + ... + + +gettext_lazy = typing.cast(_GettextLazy, LazyString) def gettext( diff --git a/tests/test_formatters.py b/tests/test_formatters.py index 40bb08c..04be8d0 100644 --- a/tests/test_formatters.py +++ b/tests/test_formatters.py @@ -83,6 +83,9 @@ def test_format_time( assert format_time(christmas, "long", False) == "12:30:59 UTC" assert format_time(christmas, "full", False) == "12:30:59, Універсальны каардынаваны час" + naive_time = datetime.time(12, 30, 59) + assert format_time(naive_time, "medium", False) == "12:30:59" + def test_format_time_rebases_timezone( bel_tz: typing.Generator[None, None, None], bel_locale: typing.Generator[None, None, None] @@ -92,6 +95,9 @@ def test_format_time_rebases_timezone( assert format_time(christmas, "long", True) == "15:30:59 +0300" assert format_time(christmas, "full", True) == "15:30:59, Маскоўскі стандартны час" + naive_time = datetime.time(12, 30, 59) + assert format_time(naive_time, "medium", True) == "15:30:59" + def test_format_timedelta( bel_tz: typing.Generator[None, None, None], bel_locale: typing.Generator[None, None, None]