diff --git a/aiogram/contrib/fsm_storage/redis.py b/aiogram/contrib/fsm_storage/redis.py index ce25ee07..87d76374 100644 --- a/aiogram/contrib/fsm_storage/redis.py +++ b/aiogram/contrib/fsm_storage/redis.py @@ -37,6 +37,7 @@ class RedisStorage(BaseStorage): await dp.storage.wait_closed() """ + @deprecated("`RedisStorage` will be removed in aiogram v3.0. " "Use `RedisStorage2` instead.", stacklevel=3) def __init__(self, host='localhost', port=6379, db=None, password=None, ssl=None, loop=None, **kwargs): @@ -45,11 +46,10 @@ class RedisStorage(BaseStorage): self._db = db self._password = password self._ssl = ssl - self._loop = loop or asyncio.get_event_loop() self._kwargs = kwargs self._redis: typing.Optional["aioredis.RedisConnection"] = None - self._connection_lock = asyncio.Lock(loop=self._loop) + self._connection_lock = asyncio.Lock() async def close(self): async with self._connection_lock: @@ -71,7 +71,6 @@ class RedisStorage(BaseStorage): if self._redis is None or self._redis.closed: self._redis = await aioredis.create_connection((self._host, self._port), db=self._db, password=self._password, ssl=self._ssl, - loop=self._loop, **self._kwargs) return self._redis @@ -210,20 +209,21 @@ class RedisStorage(BaseStorage): class AioRedisAdapterBase(ABC): """Base aioredis adapter class.""" + def __init__( - self, - host: str = "localhost", - port: int = 6379, - db: typing.Optional[int] = None, - password: typing.Optional[str] = None, - ssl: typing.Optional[bool] = None, - pool_size: int = 10, - loop: typing.Optional[asyncio.AbstractEventLoop] = None, - prefix: str = "fsm", - state_ttl: typing.Optional[int] = None, - data_ttl: typing.Optional[int] = None, - bucket_ttl: typing.Optional[int] = None, - **kwargs, + self, + host: str = "localhost", + port: int = 6379, + db: typing.Optional[int] = None, + password: typing.Optional[str] = None, + ssl: typing.Optional[bool] = None, + pool_size: int = 10, + loop: typing.Optional[asyncio.AbstractEventLoop] = None, + prefix: str = "fsm", + state_ttl: typing.Optional[int] = None, + data_ttl: typing.Optional[int] = None, + bucket_ttl: typing.Optional[int] = None, + **kwargs, ): self._host = host self._port = port @@ -231,7 +231,6 @@ class AioRedisAdapterBase(ABC): self._password = password self._ssl = ssl self._pool_size = pool_size - self._loop = loop or asyncio.get_event_loop() self._kwargs = kwargs self._prefix = (prefix,) @@ -240,7 +239,7 @@ class AioRedisAdapterBase(ABC): self._bucket_ttl = bucket_ttl self._redis: typing.Optional["aioredis.Redis"] = None - self._connection_lock = asyncio.Lock(loop=self._loop) + self._connection_lock = asyncio.Lock() @abstractmethod async def get_redis(self) -> aioredis.Redis: @@ -292,7 +291,6 @@ class AioRedisAdapterV1(AioRedisAdapterBase): ssl=self._ssl, minsize=1, maxsize=self._pool_size, - loop=self._loop, **self._kwargs, ) return self._redis @@ -363,19 +361,19 @@ class RedisStorage2(BaseStorage): """ def __init__( - self, - host: str = "localhost", - port: int = 6379, - db: typing.Optional[int] = None, - password: typing.Optional[str] = None, - ssl: typing.Optional[bool] = None, - pool_size: int = 10, - loop: typing.Optional[asyncio.AbstractEventLoop] = None, - prefix: str = "fsm", - state_ttl: typing.Optional[int] = None, - data_ttl: typing.Optional[int] = None, - bucket_ttl: typing.Optional[int] = None, - **kwargs, + self, + host: str = "localhost", + port: int = 6379, + db: typing.Optional[int] = None, + password: typing.Optional[str] = None, + ssl: typing.Optional[bool] = None, + pool_size: int = 10, + loop: typing.Optional[asyncio.AbstractEventLoop] = None, + prefix: str = "fsm", + state_ttl: typing.Optional[int] = None, + data_ttl: typing.Optional[int] = None, + bucket_ttl: typing.Optional[int] = None, + **kwargs, ): self._host = host self._port = port @@ -383,7 +381,6 @@ class RedisStorage2(BaseStorage): self._password = password self._ssl = ssl self._pool_size = pool_size - self._loop = loop or asyncio.get_event_loop() self._kwargs = kwargs self._prefix = (prefix,) @@ -392,7 +389,7 @@ class RedisStorage2(BaseStorage): self._bucket_ttl = bucket_ttl self._redis: typing.Optional[AioRedisAdapterBase] = None - self._connection_lock = asyncio.Lock(loop=self._loop) + self._connection_lock = asyncio.Lock() @deprecated("This method will be removed in aiogram v3.0. " "You should use your own instance of Redis.", stacklevel=3) @@ -411,7 +408,6 @@ class RedisStorage2(BaseStorage): password=self._password, ssl=self._ssl, pool_size=self._pool_size, - loop=self._loop, **self._kwargs, ) if redis_version == 1: diff --git a/aiogram/types/reply_keyboard.py b/aiogram/types/reply_keyboard.py index 47efdbbe..17b0a353 100644 --- a/aiogram/types/reply_keyboard.py +++ b/aiogram/types/reply_keyboard.py @@ -35,14 +35,17 @@ class ReplyKeyboardMarkup(base.TelegramObject): one_time_keyboard: base.Boolean = None, input_field_placeholder: base.String = None, selective: base.Boolean = None, - row_width: base.Integer = 3): + row_width: base.Integer = 3, + conf=None): + if conf is None: + conf = {} super().__init__( keyboard=keyboard, resize_keyboard=resize_keyboard, one_time_keyboard=one_time_keyboard, input_field_placeholder=input_field_placeholder, selective=selective, - conf={'row_width': row_width}, + conf={'row_width': row_width, **conf}, ) @property diff --git a/requirements.txt b/requirements.txt index b5fc1f77..396e9526 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -aiohttp>=3.8.2,<3.9.0 +aiohttp>=3.8.0,<3.9.0 Babel>=2.9.1,<2.10.0 certifi>=2021.10.8 diff --git a/tests/test_bot/test_session.py b/tests/test_bot/test_session.py index dec6379c..1f8417e7 100644 --- a/tests/test_bot/test_session.py +++ b/tests/test_bot/test_session.py @@ -23,7 +23,6 @@ class TestAiohttpSession: assert bot._session is None - assert isinstance(bot.session, aiohttp.ClientSession) assert bot.session == bot._session @pytest.mark.asyncio @@ -51,11 +50,11 @@ class TestAiohttpSession: @pytest.mark.asyncio async def test_close_session(self): bot = BaseBot(token="42:correct",) - aiohttp_client_0 = bot.session + aiohttp_client_0 = await bot.get_session() with patch("aiohttp.ClientSession.close", new=CoroutineMock()) as mocked_close: await aiohttp_client_0.close() mocked_close.assert_called_once() await aiohttp_client_0.close() - assert aiohttp_client_0 != bot.session # will create new session + assert aiohttp_client_0 != await bot.get_session() # will create new session