Skip to content

Commit 1f64479

Browse files
Upgrade to aioredis 2 (#611)
1 parent 93d058d commit 1f64479

File tree

5 files changed

+55
-72
lines changed

5 files changed

+55
-72
lines changed

aiohttp_session/redis_storage.py

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import json
22
import uuid
3-
import warnings
43
from distutils.version import StrictVersion
54
from typing import Any, Callable, Optional
65

@@ -11,15 +10,15 @@
1110
try:
1211
import aioredis
1312
except ImportError: # pragma: no cover
14-
aioredis = None
13+
aioredis = None # type: ignore[assignment]
1514

1615

1716
class RedisStorage(AbstractStorage):
1817
"""Redis storage"""
1918

20-
def __init__( # type: ignore[no-any-unimported] # TODO: aioredis
19+
def __init__(
2120
self,
22-
redis_pool: 'aioredis.commands.Redis', *,
21+
redis_pool: "aioredis.Redis", *,
2322
cookie_name: str = "AIOHTTP_SESSION",
2423
domain: Optional[str] = None,
2524
max_age: Optional[int] = None,
@@ -39,15 +38,8 @@ def __init__( # type: ignore[no-any-unimported] # TODO: aioredis
3938
if StrictVersion(aioredis.__version__).version < (1, 0):
4039
raise RuntimeError("aioredis<1.0 is not supported")
4140
self._key_factory = key_factory
42-
if isinstance(redis_pool, aioredis.pool.ConnectionsPool):
43-
warnings.warn(
44-
"using a pool created with aioredis.create_pool is deprecated"
45-
"please use a pool created with aioredis.create_redis_pool",
46-
DeprecationWarning
47-
)
48-
redis_pool = aioredis.commands.Redis(redis_pool)
49-
elif not isinstance(redis_pool, aioredis.commands.Redis):
50-
raise TypeError("Expected aioredis.commands.Redis got {}".format(type(redis_pool)))
41+
if not isinstance(redis_pool, aioredis.Redis):
42+
raise TypeError("Expected aioredis.Redis got {}".format(type(redis_pool)))
5143
self._redis = redis_pool
5244

5345
async def load_session(self, request: web.Request) -> Session:
@@ -88,8 +80,4 @@ async def save_session(
8880
max_age=session.max_age)
8981

9082
data = self._encoder(self._get_session_data(session))
91-
max_age = session.max_age
92-
expire = max_age if max_age is not None else 0
93-
await self._redis.set(self.cookie_name + '_' + key,
94-
data,
95-
expire=expire)
83+
await self._redis.set(self.cookie_name + '_' + key, data, ex=session.max_age) # type: ignore[arg-type] # noqa: B950

demo/redis_storage.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ async def handler(request: web.Request) -> web.Response:
1515
return web.Response(text=text)
1616

1717

18-
async def redis_pool(app: web.Application) -> AsyncIterator[aioredis.commands.Redis]: # type: ignore[no-any-unimported] # noqa: B950
19-
redis_address = ('127.0.0.1', '6379')
20-
async with await aioredis.create_redis_pool(redis_address, timeout=1) as redis:
18+
async def redis_pool(app: web.Application) -> AsyncIterator[None]:
19+
redis_address = "redis://127.0.0.1:6379"
20+
async with aioredis.from_url(redis_address, timeout=1) as redis: # type: ignore[no-untyped-call] # noqa: B950
2121
storage = RedisStorage(redis)
2222
setup(app, storage)
2323
yield

requirements-dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ flake8-requirements==1.5.1
77
sphinx==4.1.2
88
pep257==0.7.0
99
-e .
10-
aioredis==1.2
10+
aioredis==2.0.0
1111
cryptography==3.4.8
1212
docker==5.0.0
1313
pynacl==1.4.0

tests/conftest.py

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import sys
55
import time
66
import uuid
7-
from typing import Generator, Tuple
7+
from typing import Iterator
88

99
import aiomcache
1010
import aioredis
@@ -23,10 +23,6 @@ class _ContainerInfo(TypedDict):
2323
container: docker_models.containers.Container
2424

2525

26-
class _RedisParams(TypedDict):
27-
address: Tuple[str, int]
28-
29-
3026
class _MemcachedParams(TypedDict):
3127
host: str
3228
port: int
@@ -41,8 +37,8 @@ def unused_port() -> int:
4137
return port
4238

4339

44-
@pytest.fixture(scope='session')
45-
def loop() -> Generator[asyncio.AbstractEventLoop, None, None]:
40+
@pytest.fixture(scope="session")
41+
def loop() -> Iterator[asyncio.AbstractEventLoop]:
4642
loop = asyncio.new_event_loop()
4743
asyncio.set_event_loop(None)
4844

@@ -73,8 +69,9 @@ def redis_server( # type: ignore[misc] # No docker types.
7369
docker: DockerClient,
7470
session_id: str,
7571
loop: asyncio.AbstractEventLoop,
76-
) -> Generator[_ContainerInfo, None, None]:
72+
) -> Iterator[_ContainerInfo]:
7773
image = 'redis:{}'.format('latest')
74+
asyncio.set_event_loop(loop)
7875

7976
if sys.platform.startswith('darwin'):
8077
port = unused_port()
@@ -104,10 +101,8 @@ def redis_server( # type: ignore[misc] # No docker types.
104101
delay = 0.1
105102
for _i in range(20):
106103
try:
107-
conn = loop.run_until_complete(
108-
aioredis.create_connection((host, port), loop=loop)
109-
)
110-
loop.run_until_complete(conn.execute('SET', 'foo', 'bar'))
104+
conn = aioredis.from_url("redis://{}:{}".format(host, port)) # type: ignore[no-untyped-call] # noqa: B950
105+
loop.run_until_complete(conn.set("foo", "bar"))
111106
break
112107
except ConnectionRefusedError:
113108
time.sleep(delay)
@@ -122,30 +117,32 @@ def redis_server( # type: ignore[misc] # No docker types.
122117

123118

124119
@pytest.fixture
125-
def redis_params(redis_server: _ContainerInfo) -> _RedisParams: # type: ignore[misc]
126-
return dict(address=(redis_server['host'], redis_server['port']))
120+
def redis_url(redis_server: _ContainerInfo) -> str: # type: ignore[misc]
121+
return "redis://{}:{}".format(redis_server["host"], redis_server["port"])
127122

128123

129124
@pytest.fixture
130-
def redis( # type: ignore[misc] # TODO: aioredis
125+
def redis(
131126
loop: asyncio.AbstractEventLoop,
132-
redis_params: _RedisParams,
133-
) -> Generator[aioredis.commands.Redis, None, None]:
134-
async def start() -> aioredis.commands.Redis:
135-
return await aioredis.create_redis_pool(loop=loop, **redis_params)
127+
redis_url: str,
128+
) -> Iterator[aioredis.Redis]:
129+
async def start(pool: aioredis.ConnectionPool) -> aioredis.Redis:
130+
return aioredis.Redis(connection_pool=pool)
136131

137-
pool = loop.run_until_complete(start())
138-
yield pool
139-
if pool is not None:
140-
pool.close()
141-
loop.run_until_complete(pool.wait_closed())
132+
asyncio.set_event_loop(loop)
133+
pool = aioredis.ConnectionPool.from_url(redis_url)
134+
redis = loop.run_until_complete(start(pool))
135+
yield redis
136+
if redis is not None:
137+
redis.close() # type: ignore[no-untyped-call]
138+
loop.run_until_complete(pool.disconnect())
142139

143140

144141
@pytest.fixture(scope='session')
145142
def memcached_server( # type: ignore[misc] # No docker types.
146143
docker: DockerClient,
147144
session_id: str, loop: asyncio.AbstractEventLoop,
148-
) -> Generator[_ContainerInfo, None, None]:
145+
) -> Iterator[_ContainerInfo]:
149146

150147
image = 'memcached:{}'.format('latest')
151148

@@ -201,7 +198,7 @@ def memcached_params(memcached_server: _ContainerInfo) -> _MemcachedParams: # t
201198
def memcached( # type: ignore[misc]
202199
loop: asyncio.AbstractEventLoop,
203200
memcached_params: _MemcachedParams
204-
) -> Generator[aiomcache.Client, None, None]:
201+
) -> Iterator[aiomcache.Client]:
205202
conn = aiomcache.Client(loop=loop, **memcached_params)
206203
yield conn
207204
conn.close()

tests/test_redis_storage.py

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import json
33
import time
44
import uuid
5-
from typing import Any, Callable, Dict, MutableMapping, Optional, Tuple, cast
5+
from typing import Any, Callable, Dict, MutableMapping, Optional, cast
66

77
import aioredis
88
import pytest
@@ -18,7 +18,7 @@
1818

1919
def create_app(
2020
handler: _Handler,
21-
redis: aioredis.commands.Redis,
21+
redis: aioredis.Redis,
2222
max_age: Optional[int] = None,
2323
key_factory: Callable[[], str] = lambda: uuid.uuid4().hex
2424
) -> web.Application:
@@ -31,7 +31,7 @@ def create_app(
3131

3232
async def make_cookie(
3333
client: TestClient,
34-
redis: aioredis.commands.Redis,
34+
redis: aioredis.Redis,
3535
data: Dict[Any, Any]
3636
) -> None:
3737
session_data = {
@@ -49,7 +49,7 @@ async def make_cookie(
4949

5050
async def make_cookie_with_bad_value(
5151
client: TestClient,
52-
redis: aioredis.commands.Redis
52+
redis: aioredis.Redis
5353
) -> None:
5454
key = uuid.uuid4().hex
5555
await redis.set('AIOHTTP_SESSION_' + key, '')
@@ -61,7 +61,7 @@ async def make_cookie_with_bad_value(
6161

6262
async def load_cookie(
6363
client: TestClient,
64-
redis: aioredis.commands.Redis
64+
redis: aioredis.Redis
6565
) -> Any:
6666
cookies = client.session.cookie_jar.filter_cookies(client.make_url('/'))
6767
key = cookies['AIOHTTP_SESSION']
@@ -73,7 +73,7 @@ async def load_cookie(
7373

7474
async def test_create_new_session(
7575
aiohttp_client: AiohttpClient,
76-
redis: aioredis.commands.Redis
76+
redis: aioredis.Redis
7777
) -> None:
7878

7979
async def handler(request: web.Request) -> web.StreamResponse:
@@ -91,7 +91,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
9191

9292
async def test_load_existing_session(
9393
aiohttp_client: AiohttpClient,
94-
redis: aioredis.commands.Redis
94+
redis: aioredis.Redis
9595
) -> None:
9696

9797
async def handler(request: web.Request) -> web.StreamResponse:
@@ -110,7 +110,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
110110

111111
async def test_load_bad_session(
112112
aiohttp_client: AiohttpClient,
113-
redis: aioredis.commands.Redis
113+
redis: aioredis.Redis
114114
) -> None:
115115

116116
async def handler(request: web.Request) -> web.StreamResponse:
@@ -129,7 +129,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
129129

130130
async def test_change_session(
131131
aiohttp_client: AiohttpClient,
132-
redis: aioredis.commands.Redis
132+
redis: aioredis.Redis
133133
) -> None:
134134

135135
async def handler(request: web.Request) -> web.StreamResponse:
@@ -158,7 +158,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
158158

159159
async def test_clear_cookie_on_session_invalidation(
160160
aiohttp_client: AiohttpClient,
161-
redis: aioredis.commands.Redis
161+
redis: aioredis.Redis
162162
) -> None:
163163

164164
async def handler(request: web.Request) -> web.StreamResponse:
@@ -181,7 +181,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
181181

182182
async def test_create_cookie_in_handler(
183183
aiohttp_client: AiohttpClient,
184-
redis: aioredis.commands.Redis
184+
redis: aioredis.Redis
185185
) -> None:
186186

187187
async def handler(request: web.Request) -> web.StreamResponse:
@@ -210,7 +210,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
210210

211211
async def test_set_ttl_on_session_saving(
212212
aiohttp_client: AiohttpClient,
213-
redis: aioredis.commands.Redis
213+
redis: aioredis.Redis
214214
) -> None:
215215

216216
async def handler(request: web.Request) -> web.StreamResponse:
@@ -232,7 +232,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
232232

233233
async def test_set_ttl_manually_set(
234234
aiohttp_client: AiohttpClient,
235-
redis: aioredis.commands.Redis
235+
redis: aioredis.Redis
236236
) -> None:
237237

238238
async def handler(request: web.Request) -> web.StreamResponse:
@@ -255,7 +255,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
255255

256256
async def test_create_new_session_if_key_doesnt_exists_in_redis(
257257
aiohttp_client: AiohttpClient,
258-
redis: aioredis.commands.Redis
258+
redis: aioredis.Redis
259259
) -> None:
260260

261261
async def handler(request: web.Request) -> web.StreamResponse:
@@ -274,7 +274,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
274274

275275
async def test_create_storage_with_custom_key_factory(
276276
aiohttp_client: AiohttpClient,
277-
redis: aioredis.commands.Redis
277+
redis: aioredis.Redis
278278
) -> None:
279279

280280
async def handler(request: web.Request) -> web.StreamResponse:
@@ -299,7 +299,7 @@ def key_factory() -> str:
299299

300300
async def test_redis_session_fixation(
301301
aiohttp_client: AiohttpClient,
302-
redis: aioredis.commands.Redis
302+
redis: aioredis.Redis
303303
) -> None:
304304

305305
async def login(request: web.Request) -> web.StreamResponse:
@@ -328,14 +328,12 @@ async def logout(request: web.Request) -> web.StreamResponse:
328328
assert resp.cookies['AIOHTTP_SESSION'].value != evil_cookie
329329

330330

331-
async def test_redis_from_create_pool(
332-
redis_params: Dict[str, Tuple[str, int]]
333-
) -> None:
331+
async def test_redis_from_create_pool(redis_url: str) -> None:
334332

335333
async def handler(request: web.Request) -> web.StreamResponse:
336334
pass
337335

338-
redis = await aioredis.create_redis(**redis_params)
336+
redis = aioredis.from_url(redis_url) # type: ignore[no-untyped-call]
339337
create_app(handler=handler, redis=redis)
340338

341339

@@ -345,7 +343,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
345343
pass
346344

347345
with pytest.raises(TypeError):
348-
create_app(handler=handler, redis=None)
346+
create_app(handler=handler, redis=None) # type: ignore[arg-type]
349347

350348

351349
async def test_no_aioredis_installed(mocker: MockFixture) -> None:
@@ -355,7 +353,7 @@ async def handler(request: web.Request) -> web.StreamResponse:
355353

356354
mocker.patch('aiohttp_session.redis_storage.aioredis', None)
357355
with pytest.raises(RuntimeError):
358-
create_app(handler=handler, redis=None)
356+
create_app(handler=handler, redis=None) # type: ignore[arg-type]
359357

360358

361359
async def test_old_aioredis_version(mocker: MockFixture) -> None:
@@ -369,12 +367,12 @@ def __init__(self, *args: object, **kwargs: object) -> None:
369367

370368
mocker.patch('aiohttp_session.redis_storage.StrictVersion', Dummy)
371369
with pytest.raises(RuntimeError):
372-
create_app(handler=handler, redis=None)
370+
create_app(handler=handler, redis=None) # type: ignore[arg-type]
373371

374372

375373
async def test_load_session_dont_load_expired_session(
376374
aiohttp_client: AiohttpClient,
377-
redis: aioredis.commands.Redis
375+
redis: aioredis.Redis
378376
) -> None:
379377

380378
async def handler(request: web.Request) -> web.StreamResponse:

0 commit comments

Comments
 (0)