Skip to content

Commit 879d35e

Browse files
authored
yatq adapted for python 3.11
yatq adapted for python 3.11
2 parents f875f21 + e7b87ea commit 879d35e

File tree

11 files changed

+131
-34
lines changed

11 files changed

+131
-34
lines changed

.github/workflows/python-tests.yml

+48-5
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,52 @@ on:
77
branches: [ master ]
88

99
jobs:
10-
test:
10+
test_with_aioredis:
1111

1212
runs-on: ubuntu-latest
1313
strategy:
1414
matrix:
15-
python-version: [3.7, 3.8, 3.9]
16-
aioredis-version: [1.2.0, 2.0.0]
15+
python-version: [ '3.7', '3.8', '3.9', '3.10']
16+
aioredis-version: [ 1.2.0, 2.0.0 ]
17+
exclude:
18+
- python-version: '3.10'
19+
aioredis-version: 1.2.0
20+
21+
steps:
22+
- uses: actions/checkout@v2
23+
24+
- name: Install redis
25+
run: sudo apt-get install redis-server
26+
27+
- name: Set up Python ${{ matrix.python-version }}
28+
uses: actions/setup-python@v2
29+
with:
30+
python-version: ${{ matrix.python-version }}
31+
32+
- name: Install common dependencies
33+
run: |
34+
python -m pip install --upgrade pip setuptools
35+
pip install -r requirements-test.txt
36+
37+
- name: Install aioredis
38+
run: |
39+
pip install "aioredis==${{ matrix.aioredis-version }}"
40+
41+
- name: Install yatq
42+
run: |
43+
pip install .
44+
45+
- name: Test with pytest
46+
run: |
47+
pytest
48+
49+
test_with_redis:
50+
51+
runs-on: ubuntu-latest
52+
strategy:
53+
matrix:
54+
python-version: ['3.11']
55+
redis-version: [4.5.5]
1756

1857
steps:
1958
- uses: actions/checkout@v2
@@ -26,10 +65,14 @@ jobs:
2665
with:
2766
python-version: ${{ matrix.python-version }}
2867

29-
- name: Install dependencies
68+
- name: Install common dependencies
3069
run: |
3170
python -m pip install --upgrade pip setuptools
32-
pip install -r requirements-test.txt "aioredis==${{ matrix.aioredis-version }}"
71+
pip install -r requirements-test.txt
72+
73+
- name: Install redis
74+
run: |
75+
pip install "redis==${{ matrix.redis-version }}"
3376
3477
- name: Install yatq
3578
run: |

setup.cfg

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
[metadata]
22
name = yatq
3-
version = 0.0.5
3+
version = 0.0.6
44

55
[options]
66
packages = find:
77
install_requires =
8-
aioredis >= 1.2.0
8+
aioredis >= 1.2.0;python_version<'3.11'
9+
redis >= 4.5.5;python_version>='3.11'
910

1011
[options.package_data]
1112
* = py.typed

tests/conftest.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
from typing import Any
22
from uuid import uuid4
33

4-
import aioredis
4+
from yatq.py_version import AIOREDIS_USE
5+
6+
if AIOREDIS_USE:
7+
import aioredis
8+
else: # pragma: no cover
9+
from redis import asyncio as aioredis
10+
511
import pytest
612

713
from yatq.dto import TaskState
814
from yatq.queue import Queue
915

10-
if aioredis.__version__ >= "2.0":
16+
if not AIOREDIS_USE or aioredis.__version__ >= "2.0":
1117

1218
async def create_redis_connection(redis_uri: str):
1319
return aioredis.from_url(redis_uri)
1420

1521
async def zadd_single(client: aioredis.Redis, set_name: str, key: str, value: Any):
1622
await client.zadd(set_name, {key: value})
1723

18-
else:
24+
else: # pragma: no cover
1925

2026
async def create_redis_connection(redis_uri: str):
2127
return await aioredis.create_redis(redis_uri)

tests/test_task_queue.py

-1
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,6 @@ async def test_task_retry_every_x_policy(task_queue, queue_checker, freezer):
478478
await queue_checker.assert_metric_requeued(3)
479479

480480

481-
482481
@pytest.mark.asyncio
483482
async def test_task_retry_forced(task_queue, queue_checker, freezer):
484483
task_1 = await task_queue.add_task(

tox.ini

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tox]
22
isolated_build = True
3-
envlist = py{37,38,39},aioredis_compat,coverage,mypy,black
3+
envlist = py{37,38,39,310,311},aioredis_compat,coverage,mypy,black
44

55
[testenv]
66
deps =
@@ -21,6 +21,16 @@ extras =
2121
commands =
2222
pytest tests
2323

24+
[testenv:redis]
25+
basepython = python3.11
26+
deps =
27+
-rrequirements-test.txt
28+
redis == 4.5.5
29+
extras =
30+
setuptools
31+
commands =
32+
pytest tests
33+
2434
[coverage:run]
2535
branch = True
2636

yatq/function.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
from string import Template
55
from typing import Any, Dict
66

7-
from aioredis import Redis
7+
from yatq.py_version import AIOREDIS_USE
8+
9+
if AIOREDIS_USE:
10+
from aioredis import Redis
11+
else:
12+
from redis.asyncio import Redis # type: ignore # pragma: no cover
813

914
from yatq.redis_compat import NoScriptError, eval_sha # type: ignore
1015

yatq/py_version.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import sys
2+
3+
AIOREDIS_USE = sys.version_info[0:2] < (3, 11)

yatq/queue.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
from typing import Any, Dict, Optional, Union
88
from uuid import uuid4
99

10-
from aioredis import Redis
10+
from yatq.py_version import AIOREDIS_USE
11+
12+
if AIOREDIS_USE:
13+
from aioredis import Redis
14+
else:
15+
from redis.asyncio import Redis # type: ignore # pragma: no cover
1116

1217
from .defaults import (
1318
DEFAULT_QUEUE_NAME,

yatq/redis_compat.py

+28-17
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,39 @@
11
# type: ignore
22
from typing import Any, Tuple
3+
from yatq.py_version import AIOREDIS_USE
34

4-
import aioredis
5+
if AIOREDIS_USE:
6+
import aioredis
57

6-
if aioredis.__version__ >= "2.0": # pragma: no cover
7-
from aioredis.exceptions import NoScriptError
8+
if aioredis.__version__ >= "2.0":
9+
from aioredis.exceptions import NoScriptError
810

9-
async def eval_sha(
10-
client: aioredis.Redis, digest: str, args: Tuple[Any]
11-
): # pragma: no cover
12-
return await client.evalsha(digest, 0, *args)
11+
async def eval_sha(
12+
client: aioredis.Redis, digest: str, args: Tuple[Any]
13+
): # pragma: no cover
14+
return await client.evalsha(digest, 0, *args)
1315

14-
else: # pragma: no cover
15-
from aioredis.errors import ReplyError
16+
else: # pragma: no cover
17+
from aioredis.errors import ReplyError
1618

17-
class NoScriptError(ReplyError):
18-
...
19+
class NoScriptError(ReplyError):
20+
...
21+
22+
async def eval_sha(
23+
client: aioredis.Redis, digest: str, args: Tuple[Any]
24+
): # pragma: no cover
25+
try:
26+
return await client.evalsha(digest, keys=[], args=list(args))
27+
except ReplyError as error:
28+
if error.args[0].startswith("NOSCRIPT"):
29+
raise NoScriptError(error.args[0])
30+
raise
31+
32+
else: # pragma: no cover
33+
from redis import asyncio as aioredis
34+
from redis.exceptions import NoScriptError
1935

2036
async def eval_sha(
2137
client: aioredis.Redis, digest: str, args: Tuple[Any]
2238
): # pragma: no cover
23-
try:
24-
return await client.evalsha(digest, keys=[], args=list(args))
25-
except ReplyError as error:
26-
if error.args[0].startswith("NOSCRIPT"):
27-
raise NoScriptError(error.args[0])
28-
raise
39+
return await client.execute_command("EVALSHA", digest, 0, *args)

yatq/worker/runner.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
import traceback
55
from typing import Dict, List, Optional, Set, Type, cast
66

7-
import aioredis
7+
from yatq.py_version import AIOREDIS_USE
8+
9+
if AIOREDIS_USE:
10+
import aioredis
11+
else: # pragma: no cover
12+
from redis import asyncio as aioredis # type: ignore
13+
814

915
from yatq.defaults import DEFAULT_MAX_JOBS, DEFAULT_QUEUE_NAMESPACE
1016
from yatq.dto import TaskWrapper
@@ -61,7 +67,10 @@ async def _periodic_poll(self) -> None:
6167

6268
async def _wait_poll(self) -> None:
6369
_, pending = await asyncio.wait(
64-
{self._poll_event.wait(), self._stop_event.wait()},
70+
{
71+
asyncio.create_task(self._poll_event.wait()),
72+
asyncio.create_task(self._stop_event.wait()),
73+
},
6574
return_when=asyncio.FIRST_COMPLETED,
6675
)
6776

yatq/worker/worker_settings.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22
from typing import Awaitable, Callable, Dict, Optional, Tuple, Type
33
from abc import ABC, abstractmethod
44

5-
import aioredis
5+
from yatq.py_version import AIOREDIS_USE
6+
7+
if AIOREDIS_USE:
8+
import aioredis
9+
else: # pragma: no cover
10+
from redis import asyncio as aioredis # type: ignore
611

712
from yatq.worker.factory.base import BaseJobFactory
813
from yatq.worker.factory.simple import SimpleJobFactory

0 commit comments

Comments
 (0)