Skip to content

Commit 63fcda1

Browse files
committed
Improve typing of default_task_backend to fix mypy issues
`mypy` issues were caused by typeddjango/django-stubs#2311, but this improves the types further.
1 parent 39ceb97 commit 63fcda1

File tree

5 files changed

+45
-38
lines changed

5 files changed

+45
-38
lines changed

django_tasks/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
django_stubs_ext.monkeypatch()
55

66
import importlib.metadata
7-
from typing import Mapping, Optional, cast
7+
from typing import Optional
88

99
from django.utils.connection import BaseConnectionHandler, ConnectionProxy
1010
from django.utils.module_loading import import_string
@@ -67,4 +67,6 @@ def create_connection(self, alias: str) -> BaseTaskBackend:
6767

6868
tasks = TasksHandler()
6969

70-
default_task_backend = ConnectionProxy(cast(Mapping, tasks), DEFAULT_TASK_BACKEND_ALIAS)
70+
default_task_backend: BaseTaskBackend = ConnectionProxy( # type:ignore[assignment]
71+
tasks, DEFAULT_TASK_BACKEND_ALIAS
72+
)

tests/tests/test_database_backend.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from django.urls import reverse
1717
from django.utils import timezone
1818

19-
from django_tasks import ResultStatus, default_task_backend, tasks
19+
from django_tasks import ResultStatus, Task, default_task_backend, tasks
2020
from django_tasks.backends.database import DatabaseBackend
2121
from django_tasks.backends.database.management.commands.db_worker import (
2222
logger as db_worker_logger,
@@ -43,7 +43,7 @@ def test_using_correct_backend(self) -> None:
4343
def test_enqueue_task(self) -> None:
4444
for task in [test_tasks.noop_task, test_tasks.noop_task_async]:
4545
with self.subTest(task), self.assertNumQueries(1):
46-
result = default_task_backend.enqueue(task, (1,), {"two": 3})
46+
result = cast(Task, task).enqueue(1, two=3)
4747

4848
self.assertEqual(result.status, ResultStatus.NEW)
4949
self.assertIsNone(result.started_at)
@@ -58,7 +58,7 @@ def test_enqueue_task(self) -> None:
5858
async def test_enqueue_task_async(self) -> None:
5959
for task in [test_tasks.noop_task, test_tasks.noop_task_async]:
6060
with self.subTest(task):
61-
result = await default_task_backend.aenqueue(task, [], {})
61+
result = await cast(Task, task).aenqueue()
6262

6363
self.assertEqual(result.status, ResultStatus.NEW)
6464
self.assertIsNone(result.started_at)
@@ -127,11 +127,11 @@ async def test_refresh_result_async(self) -> None:
127127

128128
def test_get_missing_result(self) -> None:
129129
with self.assertRaises(ResultDoesNotExist):
130-
default_task_backend.get_result(uuid.uuid4())
130+
default_task_backend.get_result(str(uuid.uuid4()))
131131

132132
async def test_async_get_missing_result(self) -> None:
133133
with self.assertRaises(ResultDoesNotExist):
134-
await default_task_backend.aget_result(uuid.uuid4())
134+
await default_task_backend.aget_result(str(uuid.uuid4()))
135135

136136
def test_invalid_uuid(self) -> None:
137137
with self.assertRaises(ResultDoesNotExist):
@@ -208,7 +208,7 @@ def test_database_backend_app_missing(self) -> None:
208208
errors = list(default_task_backend.check())
209209

210210
self.assertEqual(len(errors), 1)
211-
self.assertIn("django_tasks.backends.database", errors[0].hint)
211+
self.assertIn("django_tasks.backends.database", errors[0].hint) # type:ignore[arg-type]
212212

213213
def test_priority_range_check(self) -> None:
214214
with self.assertRaises(IntegrityError):
@@ -262,7 +262,7 @@ def test_run_enqueued_task(self) -> None:
262262
test_tasks.noop_task_async,
263263
]:
264264
with self.subTest(task):
265-
result = default_task_backend.enqueue(task, [], {})
265+
result = cast(Task, task).enqueue()
266266
self.assertEqual(DBTaskResult.objects.ready().count(), 1)
267267

268268
self.assertEqual(result.status, ResultStatus.NEW)
@@ -274,8 +274,8 @@ def test_run_enqueued_task(self) -> None:
274274
result.refresh()
275275
self.assertIsNotNone(result.started_at)
276276
self.assertIsNotNone(result.finished_at)
277-
self.assertGreaterEqual(result.started_at, result.enqueued_at)
278-
self.assertGreaterEqual(result.finished_at, result.started_at)
277+
self.assertGreaterEqual(result.started_at, result.enqueued_at) # type:ignore[arg-type]
278+
self.assertGreaterEqual(result.finished_at, result.started_at) # type:ignore[arg-type,misc]
279279
self.assertEqual(result.status, ResultStatus.COMPLETE)
280280

281281
self.assertEqual(DBTaskResult.objects.ready().count(), 0)
@@ -777,7 +777,7 @@ def test_get_locked_with_locked_rows(self) -> None:
777777
normalize_uuid(result_2.id),
778778
)
779779
self.assertEqual(
780-
normalize_uuid(DBTaskResult.objects.get_locked().id), # type:ignore[union-attr, arg-type]
780+
normalize_uuid(DBTaskResult.objects.get_locked().id), # type:ignore[union-attr]
781781
normalize_uuid(result_2.id),
782782
)
783783
finally:

tests/tests/test_dummy_backend.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import json
2+
from typing import cast
23

34
from django.test import SimpleTestCase, override_settings
45
from django.urls import reverse
56

6-
from django_tasks import ResultStatus, default_task_backend, tasks
7+
from django_tasks import ResultStatus, Task, default_task_backend, tasks
78
from django_tasks.backends.dummy import DummyBackend
89
from django_tasks.exceptions import ResultDoesNotExist
910
from tests import tasks as test_tasks
@@ -14,7 +15,7 @@
1415
)
1516
class DummyBackendTestCase(SimpleTestCase):
1617
def setUp(self) -> None:
17-
default_task_backend.clear()
18+
default_task_backend.clear() # type:ignore[attr-defined]
1819

1920
def test_using_correct_backend(self) -> None:
2021
self.assertEqual(default_task_backend, tasks["default"])
@@ -23,7 +24,7 @@ def test_using_correct_backend(self) -> None:
2324
def test_enqueue_task(self) -> None:
2425
for task in [test_tasks.noop_task, test_tasks.noop_task_async]:
2526
with self.subTest(task):
26-
result = default_task_backend.enqueue(task, (1,), {"two": 3})
27+
result = cast(Task, task).enqueue(1, two=3)
2728

2829
self.assertEqual(result.status, ResultStatus.NEW)
2930
self.assertIsNone(result.started_at)
@@ -34,12 +35,12 @@ def test_enqueue_task(self) -> None:
3435
self.assertEqual(result.args, [1])
3536
self.assertEqual(result.kwargs, {"two": 3})
3637

37-
self.assertIn(result, default_task_backend.results)
38+
self.assertIn(result, default_task_backend.results) # type:ignore[attr-defined]
3839

3940
async def test_enqueue_task_async(self) -> None:
4041
for task in [test_tasks.noop_task, test_tasks.noop_task_async]:
4142
with self.subTest(task):
42-
result = await default_task_backend.aenqueue(task, (), {})
43+
result = await cast(Task, task).aenqueue()
4344

4445
self.assertEqual(result.status, ResultStatus.NEW)
4546
self.assertIsNone(result.started_at)
@@ -50,7 +51,7 @@ async def test_enqueue_task_async(self) -> None:
5051
self.assertEqual(result.args, [])
5152
self.assertEqual(result.kwargs, {})
5253

53-
self.assertIn(result, default_task_backend.results)
54+
self.assertIn(result, default_task_backend.results) # type:ignore[attr-defined]
5455

5556
def test_get_result(self) -> None:
5657
result = default_task_backend.enqueue(test_tasks.noop_task, (), {})
@@ -71,7 +72,8 @@ def test_refresh_result(self) -> None:
7172
test_tasks.calculate_meaning_of_life, (), {}
7273
)
7374

74-
default_task_backend.results[0].status = ResultStatus.COMPLETE
75+
enqueued_result = default_task_backend.results[0] # type:ignore[attr-defined]
76+
enqueued_result.status = ResultStatus.COMPLETE
7577

7678
self.assertEqual(result.status, ResultStatus.NEW)
7779
result.refresh()
@@ -82,7 +84,8 @@ async def test_refresh_result_async(self) -> None:
8284
test_tasks.calculate_meaning_of_life, (), {}
8385
)
8486

85-
default_task_backend.results[0].status = ResultStatus.COMPLETE
87+
enqueued_result = default_task_backend.results[0] # type:ignore[attr-defined]
88+
enqueued_result.status = ResultStatus.COMPLETE
8689

8790
self.assertEqual(result.status, ResultStatus.NEW)
8891
await result.arefresh()

tests/tests/test_immediate_backend.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import json
2+
from typing import cast
23

34
from django.test import SimpleTestCase, override_settings
45
from django.urls import reverse
56
from django.utils import timezone
67

7-
from django_tasks import ResultStatus, default_task_backend, tasks
8+
from django_tasks import ResultStatus, Task, default_task_backend, tasks
89
from django_tasks.backends.immediate import ImmediateBackend
910
from django_tasks.exceptions import InvalidTaskError
1011
from tests import tasks as test_tasks
@@ -21,13 +22,13 @@ def test_using_correct_backend(self) -> None:
2122
def test_enqueue_task(self) -> None:
2223
for task in [test_tasks.noop_task, test_tasks.noop_task_async]:
2324
with self.subTest(task):
24-
result = default_task_backend.enqueue(task, (1,), {"two": 3})
25+
result = cast(Task, task).enqueue(1, two=3)
2526

2627
self.assertEqual(result.status, ResultStatus.COMPLETE)
2728
self.assertIsNotNone(result.started_at)
2829
self.assertIsNotNone(result.finished_at)
29-
self.assertGreaterEqual(result.started_at, result.enqueued_at)
30-
self.assertGreaterEqual(result.finished_at, result.started_at)
30+
self.assertGreaterEqual(result.started_at, result.enqueued_at) # type:ignore[arg-type]
31+
self.assertGreaterEqual(result.finished_at, result.started_at) # type:ignore[arg-type, misc]
3132
self.assertIsNone(result.result)
3233
self.assertEqual(result.task, task)
3334
self.assertEqual(result.args, [1])
@@ -36,13 +37,13 @@ def test_enqueue_task(self) -> None:
3637
async def test_enqueue_task_async(self) -> None:
3738
for task in [test_tasks.noop_task, test_tasks.noop_task_async]:
3839
with self.subTest(task):
39-
result = await default_task_backend.aenqueue(task, (), {})
40+
result = await cast(Task, task).aenqueue()
4041

4142
self.assertEqual(result.status, ResultStatus.COMPLETE)
4243
self.assertIsNotNone(result.started_at)
4344
self.assertIsNotNone(result.finished_at)
44-
self.assertGreaterEqual(result.started_at, result.enqueued_at)
45-
self.assertGreaterEqual(result.finished_at, result.started_at)
45+
self.assertGreaterEqual(result.started_at, result.enqueued_at) # type:ignore[arg-type]
46+
self.assertGreaterEqual(result.finished_at, result.started_at) # type:ignore[arg-type, misc]
4647
self.assertIsNone(result.result)
4748
self.assertIsNone(result.get_result())
4849
self.assertEqual(result.task, task)
@@ -66,7 +67,7 @@ def test_catches_exception(self) -> None:
6667
with self.subTest(task), self.assertLogs(
6768
"django_tasks.backends.immediate", level="ERROR"
6869
) as captured_logs:
69-
result = default_task_backend.enqueue(task, [], {})
70+
result = task.enqueue()
7071

7172
# assert logging
7273
self.assertEqual(len(captured_logs.output), 1)
@@ -76,11 +77,12 @@ def test_catches_exception(self) -> None:
7677
self.assertEqual(result.status, ResultStatus.FAILED)
7778
self.assertIsNotNone(result.started_at)
7879
self.assertIsNotNone(result.finished_at)
79-
self.assertGreaterEqual(result.started_at, result.enqueued_at)
80-
self.assertGreaterEqual(result.finished_at, result.started_at)
80+
self.assertGreaterEqual(result.started_at, result.enqueued_at) # type:ignore[arg-type]
81+
self.assertGreaterEqual(result.finished_at, result.started_at) # type:ignore[arg-type, misc]
8182
self.assertIsInstance(result.result, exception)
8283
self.assertTrue(
83-
result.traceback.endswith(f"{exception.__name__}: {message}\n")
84+
result.traceback
85+
and result.traceback.endswith(f"{exception.__name__}: {message}\n")
8486
)
8587
self.assertIsNone(result.get_result())
8688
self.assertEqual(result.task, task)
@@ -104,13 +106,13 @@ def test_throws_keyboard_interrupt(self) -> None:
104106

105107
def test_complex_exception(self) -> None:
106108
with self.assertLogs("django_tasks.backends.immediate", level="ERROR"):
107-
result = default_task_backend.enqueue(test_tasks.complex_exception, [], {})
109+
result = test_tasks.complex_exception.enqueue()
108110

109111
self.assertEqual(result.status, ResultStatus.FAILED)
110112
self.assertIsNotNone(result.started_at)
111113
self.assertIsNotNone(result.finished_at)
112-
self.assertGreaterEqual(result.started_at, result.enqueued_at)
113-
self.assertGreaterEqual(result.finished_at, result.started_at)
114+
self.assertGreaterEqual(result.started_at, result.enqueued_at) # type:ignore[arg-type]
115+
self.assertGreaterEqual(result.finished_at, result.started_at) # type:ignore[arg-type,misc]
114116

115117
self.assertIsNone(result.result)
116118
self.assertIsNone(result.traceback)
@@ -147,7 +149,7 @@ async def test_cannot_get_result(self) -> None:
147149
NotImplementedError,
148150
"This backend does not support retrieving or refreshing results.",
149151
):
150-
await default_task_backend.get_result(123)
152+
await default_task_backend.aget_result(123) # type:ignore[arg-type]
151153

152154
async def test_cannot_refresh_result(self) -> None:
153155
result = default_task_backend.enqueue(

tests/tests/test_tasks.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
)
3737
class TaskTestCase(SimpleTestCase):
3838
def setUp(self) -> None:
39-
default_task_backend.clear()
39+
default_task_backend.clear() # type:ignore[attr-defined]
4040

4141
def test_using_correct_backend(self) -> None:
4242
self.assertEqual(default_task_backend, tasks["default"])
@@ -55,7 +55,7 @@ def test_enqueue_task(self) -> None:
5555
self.assertEqual(result.args, [])
5656
self.assertEqual(result.kwargs, {})
5757

58-
self.assertEqual(default_task_backend.results, [result])
58+
self.assertEqual(default_task_backend.results, [result]) # type:ignore[attr-defined]
5959

6060
async def test_enqueue_task_async(self) -> None:
6161
result = await test_tasks.noop_task.aenqueue()
@@ -65,7 +65,7 @@ async def test_enqueue_task_async(self) -> None:
6565
self.assertEqual(result.args, [])
6666
self.assertEqual(result.kwargs, {})
6767

68-
self.assertEqual(default_task_backend.results, [result])
68+
self.assertEqual(default_task_backend.results, [result]) # type:ignore[attr-defined]
6969

7070
def test_using_priority(self) -> None:
7171
self.assertEqual(test_tasks.noop_task.priority, 0)

0 commit comments

Comments
 (0)