From 7c7966dbd40a743af1af52e5ed6d0af99aa4755a Mon Sep 17 00:00:00 2001 From: Harry Lees Date: Fri, 20 Dec 2024 14:32:35 +0000 Subject: [PATCH 1/4] Add type annotations to `kombu/utils/encoding.py` The initial annotations provided aim to annotate the current implementation opposed to potentially refactoring to narrow down the original intention of the provided implementations. --- kombu/utils/encoding.py | 48 ++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/kombu/utils/encoding.py b/kombu/utils/encoding.py index 42bf2ce9f..e15ac9cf5 100644 --- a/kombu/utils/encoding.py +++ b/kombu/utils/encoding.py @@ -9,69 +9,84 @@ import sys import traceback +from typing import Any, Union, Literal, overload, TypeVar + + +T = TypeVar("T") #: safe_str takes encoding from this file by default. #: :func:`set_default_encoding_file` can used to set the #: default output file. -default_encoding_file = None +default_encoding_file: Union[str, None] = None -def set_default_encoding_file(file): +def set_default_encoding_file(file: str) -> None: """Set file used to get codec information.""" global default_encoding_file default_encoding_file = file -def get_default_encoding_file(): +def get_default_encoding_file() -> str | None: """Get file used to get codec information.""" return default_encoding_file if sys.platform.startswith('java'): # pragma: no cover - def default_encoding(file=None): + def default_encoding(file: object = None) -> Literal['utf-8']: """Get default encoding.""" return 'utf-8' else: - def default_encoding(file=None): + def default_encoding(file: object = None) -> str: """Get default encoding.""" file = file or get_default_encoding_file() return getattr(file, 'encoding', None) or sys.getfilesystemencoding() -def str_to_bytes(s): +@overload +def str_to_bytes(s: str) -> bytes: ... +@overload +def str_to_bytes(s: T) -> T: ... +def str_to_bytes(s: Any) -> Any: """Convert str to bytes.""" if isinstance(s, str): return s.encode() return s -def bytes_to_str(s): +@overload +def bytes_to_str(s: bytes) -> str: ... +@overload +def bytes_to_str(s: T) -> T: ... +def bytes_to_str(s: Any) -> Any: """Convert bytes to str.""" if isinstance(s, bytes): return s.decode(errors='replace') return s -def from_utf8(s, *args, **kwargs): +def from_utf8(s: str, *args: Any, **kwargs: Any) -> str: """Get str from utf-8 encoding.""" return s -def ensure_bytes(s): +def ensure_bytes(s: Union[str, bytes]) -> bytes: """Ensure s is bytes, not str.""" if not isinstance(s, bytes): return str_to_bytes(s) return s -def default_encode(obj): +def default_encode(obj: T) -> T: """Encode using default encoding.""" return obj -def safe_str(s, errors='replace'): +def safe_str( + s: object, + errors: str = 'replace', +) -> str: """Safe form of str(), void of unicode errors.""" s = bytes_to_str(s) if not isinstance(s, (str, bytes)): @@ -79,7 +94,11 @@ def safe_str(s, errors='replace'): return _safe_str(s, errors) -def _safe_str(s, errors='replace', file=None): +def _safe_str( + s: object, + errors: str = 'replace', + file: Any = None +) -> str: if isinstance(s, str): return s try: @@ -89,7 +108,10 @@ def _safe_str(s, errors='replace', file=None): type(s), exc, '\n'.join(traceback.format_stack())) -def safe_repr(o, errors='replace'): +def safe_repr( + o: object, + errors: str = 'replace', +) -> str: """Safe form of repr, void of Unicode errors.""" try: return repr(o) From b7dbcb81331f17403e66a24cd03c616550819e0d Mon Sep 17 00:00:00 2001 From: Harry Lees Date: Fri, 20 Dec 2024 14:35:22 +0000 Subject: [PATCH 2/4] Enable mypy for `kombu/utils/encoding.py` --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index 488d782fa..c52c0cdbb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -52,6 +52,7 @@ ignore_missing_imports = True files = kombu/abstract.py, kombu/utils/debug.py, + kombu/utils/encoding.py, kombu/utils/time.py, kombu/utils/uuid.py, t/unit/utils/test_uuid.py, From a7ee27356932f2e73e1e24b9fb0b0413a7048a56 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 14:41:27 +0000 Subject: [PATCH 3/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- kombu/utils/encoding.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/kombu/utils/encoding.py b/kombu/utils/encoding.py index e15ac9cf5..32eb9941c 100644 --- a/kombu/utils/encoding.py +++ b/kombu/utils/encoding.py @@ -9,15 +9,14 @@ import sys import traceback -from typing import Any, Union, Literal, overload, TypeVar - +from typing import Any, Literal, TypeVar, overload T = TypeVar("T") #: safe_str takes encoding from this file by default. #: :func:`set_default_encoding_file` can used to set the #: default output file. -default_encoding_file: Union[str, None] = None +default_encoding_file: str | None = None def set_default_encoding_file(file: str) -> None: @@ -71,7 +70,7 @@ def from_utf8(s: str, *args: Any, **kwargs: Any) -> str: return s -def ensure_bytes(s: Union[str, bytes]) -> bytes: +def ensure_bytes(s: str | bytes) -> bytes: """Ensure s is bytes, not str.""" if not isinstance(s, bytes): return str_to_bytes(s) From 4f51694275613416c26fd8f8cdf386f22f2ae2c7 Mon Sep 17 00:00:00 2001 From: Harry Lees Date: Fri, 20 Dec 2024 14:43:18 +0000 Subject: [PATCH 4/4] Add spacing between `@overload`'ed functions to fix E302 errors --- kombu/utils/encoding.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/kombu/utils/encoding.py b/kombu/utils/encoding.py index 32eb9941c..2487e6f5f 100644 --- a/kombu/utils/encoding.py +++ b/kombu/utils/encoding.py @@ -45,8 +45,12 @@ def default_encoding(file: object = None) -> str: @overload def str_to_bytes(s: str) -> bytes: ... + + @overload def str_to_bytes(s: T) -> T: ... + + def str_to_bytes(s: Any) -> Any: """Convert str to bytes.""" if isinstance(s, str): @@ -56,8 +60,12 @@ def str_to_bytes(s: Any) -> Any: @overload def bytes_to_str(s: bytes) -> str: ... + + @overload def bytes_to_str(s: T) -> T: ... + + def bytes_to_str(s: Any) -> Any: """Convert bytes to str.""" if isinstance(s, bytes):