From a1a970bea53315c733da07eaa1b459b92a1d503f Mon Sep 17 00:00:00 2001 From: Marat Sharafutdinov Date: Thu, 28 Dec 2023 21:47:49 +0300 Subject: [PATCH 1/2] Do not use deprecated datetime.utcnow and datetime.utcfromtimestamp --- aio_pika/abc.py | 2 +- aio_pika/message.py | 8 ++++---- tests/test_message.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aio_pika/abc.py b/aio_pika/abc.py index 227356ea..94a91275 100644 --- a/aio_pika/abc.py +++ b/aio_pika/abc.py @@ -38,7 +38,7 @@ ConsumerTag = str MILLISECONDS = 1000 -ZERO_TIME = datetime.utcfromtimestamp(0) +ZERO_TIME = datetime(1970, 1, 1) class SSLOptions(TypedDict, total=False): diff --git a/aio_pika/message.py b/aio_pika/message.py index b4140752..58f441a8 100644 --- a/aio_pika/message.py +++ b/aio_pika/message.py @@ -1,6 +1,6 @@ import time import warnings -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from functools import singledispatch from pprint import pformat from types import TracebackType @@ -86,12 +86,12 @@ def encode_timestamp_datetime(value: datetime) -> datetime: @encode_timestamp.register(float) @encode_timestamp.register(int) def encode_timestamp_number(value: Union[int, float]) -> datetime: - return datetime.utcfromtimestamp(value) + return datetime.fromtimestamp(value, tz=timezone.utc) @encode_timestamp.register(timedelta) def encode_timestamp_timedelta(value: timedelta) -> datetime: - return datetime.utcnow() + value + return datetime.now(tz=timezone.utc) + value @encode_timestamp.register(NoneType) # type: ignore @@ -112,7 +112,7 @@ def decode_timestamp_datetime(value: datetime) -> datetime: @decode_timestamp.register(float) @decode_timestamp.register(int) def decode_timestamp_number(value: Union[float, int]) -> datetime: - return datetime.utcfromtimestamp(value) + return datetime.fromtimestamp(value, tz=timezone.utc) @decode_timestamp.register(time.struct_time) diff --git a/tests/test_message.py b/tests/test_message.py index 329a08e3..5488b285 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -1,6 +1,6 @@ import time from copy import copy -from datetime import datetime +from datetime import datetime, timezone from typing import List, Tuple import shortuuid @@ -45,7 +45,7 @@ def test_message_info(): redelivered=None, reply_to="test", routing_key=None, - timestamp=datetime.utcfromtimestamp(int(time.time())), + timestamp=datetime.fromtimestamp(int(time.time()), tz=timezone.utc), type="0", user_id="guest", ) From f0c7a813b98d6534390aef2ea063eac9d38e0f6d Mon Sep 17 00:00:00 2001 From: Marat Sharafutdinov Date: Sat, 10 Feb 2024 21:58:14 +0300 Subject: [PATCH 2/2] Remove unnecessary and add missing single-dispatch functions for message --- aio_pika/abc.py | 2 -- aio_pika/message.py | 39 ++++++++------------------------------- 2 files changed, 8 insertions(+), 33 deletions(-) diff --git a/aio_pika/abc.py b/aio_pika/abc.py index 94a91275..ff81e38f 100644 --- a/aio_pika/abc.py +++ b/aio_pika/abc.py @@ -38,7 +38,6 @@ ConsumerTag = str MILLISECONDS = 1000 -ZERO_TIME = datetime(1970, 1, 1) class SSLOptions(TypedDict, total=False): @@ -958,6 +957,5 @@ def _get_exchange_name_from_str(value: str) -> str: "TransactionState", "UnderlayChannel", "UnderlayConnection", - "ZERO_TIME", "get_exchange_name", ) diff --git a/aio_pika/message.py b/aio_pika/message.py index 58f441a8..1050a323 100644 --- a/aio_pika/message.py +++ b/aio_pika/message.py @@ -1,4 +1,3 @@ -import time import warnings from datetime import datetime, timedelta, timezone from functools import singledispatch @@ -11,7 +10,7 @@ from pamqp.common import FieldValue from .abc import ( - MILLISECONDS, ZERO_TIME, AbstractChannel, AbstractIncomingMessage, + MILLISECONDS, AbstractChannel, AbstractIncomingMessage, AbstractMessage, AbstractProcessContext, DateType, DeliveryMode, HeadersType, MessageInfo, NoneType, ) @@ -58,14 +57,14 @@ def decode_expiration(t: Any) -> Optional[float]: raise ValueError("Invalid expiration type: %r" % type(t), t) -@decode_expiration.register(time.struct_time) -def decode_expiration_struct_time(t: time.struct_time) -> float: - return (datetime(*t[:7]) - ZERO_TIME).total_seconds() - - @decode_expiration.register(str) def decode_expiration_str(t: str) -> float: - return float(t) + return float(t) / MILLISECONDS + + +@decode_expiration.register(NoneType) # type: ignore +def decode_expiration_none(_: Any) -> None: + return None @singledispatch @@ -73,11 +72,6 @@ def encode_timestamp(value: Any) -> Optional[datetime]: raise ValueError("Invalid timestamp type: %r" % type(value), value) -@encode_timestamp.register(time.struct_time) -def encode_timestamp_struct_time(value: time.struct_time) -> datetime: - return datetime(*value[:6]) - - @encode_timestamp.register(datetime) def encode_timestamp_datetime(value: datetime) -> datetime: return value @@ -109,17 +103,6 @@ def decode_timestamp_datetime(value: datetime) -> datetime: return value -@decode_timestamp.register(float) -@decode_timestamp.register(int) -def decode_timestamp_number(value: Union[float, int]) -> datetime: - return datetime.fromtimestamp(value, tz=timezone.utc) - - -@decode_timestamp.register(time.struct_time) -def decode_timestamp_struct_time(value: time.struct_time) -> datetime: - return datetime(*value[:6]) - - @decode_timestamp.register(NoneType) # type: ignore def decode_timestamp_none(_: Any) -> None: return None @@ -373,12 +356,6 @@ def __init__(self, message: DeliveredMessage, no_ack: bool = False): self.__no_ack = no_ack self.__processed = False - expiration = None - if message.header.properties.expiration: - expiration = decode_expiration( - message.header.properties.expiration, - ) - super().__init__( body=message.body, content_type=message.header.properties.content_type, @@ -388,7 +365,7 @@ def __init__(self, message: DeliveredMessage, no_ack: bool = False): priority=message.header.properties.priority, correlation_id=message.header.properties.correlation_id, reply_to=message.header.properties.reply_to, - expiration=expiration / 1000.0 if expiration else None, + expiration=decode_expiration(message.header.properties.expiration), message_id=message.header.properties.message_id, timestamp=decode_timestamp(message.header.properties.timestamp), type=message.header.properties.message_type,