Skip to content

Commit 90546c0

Browse files
committed
Remove django-tasks dependency
1 parent d7d3cd5 commit 90546c0

9 files changed

Lines changed: 136 additions & 64 deletions

File tree

.github/workflows/ci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ jobs:
4343
pip install --upgrade pip
4444
pip install -e . --group dev
4545
pip install Django~=${{ matrix.django-version }}
46+
- name: Install django-tasks
47+
run: pip install django-tasks
48+
if: matrix.django-version != '6.0'
4649
- name: Lint
4750
run: just lint
4851
- name: Run fast tests

django_tasks_db/backend.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,32 @@
99
from django.db.models import Expression
1010
from django.utils.module_loading import import_string
1111
from django.utils.version import PY311
12-
from django_tasks.backends.base import BaseTaskBackend
13-
from django_tasks.base import Task
14-
from django_tasks.base import TaskResult as BaseTaskResult
15-
from django_tasks.exceptions import TaskResultDoesNotExist
16-
from django_tasks.signals import task_enqueued
17-
from django_tasks.utils import normalize_json
1812
from typing_extensions import ParamSpec
1913

14+
try:
15+
from django.tasks.backends.base import BaseTaskBackend
16+
from django.tasks.base import Task
17+
from django.tasks.base import TaskResult as BaseTaskResult
18+
from django.tasks.exceptions import TaskResultDoesNotExist
19+
from django.tasks.signals import task_enqueued
20+
from django.utils.json import normalize_json
21+
except ImportError:
22+
from django_tasks.backends.base import BaseTaskBackend # type: ignore[no-redef]
23+
from django_tasks.base import Task # type: ignore[no-redef]
24+
from django_tasks.base import TaskResult as BaseTaskResult # type: ignore[no-redef]
25+
from django_tasks.exceptions import TaskResultDoesNotExist # type: ignore[no-redef]
26+
from django_tasks.signals import task_enqueued # type: ignore[no-redef]
27+
from django_tasks.utils import normalize_json # type: ignore[no-redef]
28+
29+
2030
if TYPE_CHECKING:
2131
from .models import DBTaskResult
2232

2333
T = TypeVar("T")
2434
P = ParamSpec("P")
2535

2636

27-
@dataclass(frozen=True, slots=PY311, kw_only=True) # type: ignore[literal-required]
37+
@dataclass(frozen=True, slots=PY311, kw_only=True) # type: ignore[literal-required,misc]
2838
class TaskResult(BaseTaskResult[T]):
2939
db_result: "DBTaskResult"
3040

django_tasks_db/compat.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1+
_task_classes = []
2+
13
try:
24
from django.tasks.base import Task as DjangoTask
5+
6+
_task_classes.append(DjangoTask)
37
except ImportError:
4-
DjangoTask = None # type: ignore[misc,assignment]
8+
pass
59

6-
from django_tasks.base import Task
10+
try:
11+
from django_tasks.base import Task
12+
13+
_task_classes.append(Task)
14+
except ImportError:
15+
pass
716

817
__all__ = ["TASK_CLASSES"]
918

10-
TASK_CLASSES = (Task, DjangoTask) if DjangoTask is not None else (Task,)
19+
TASK_CLASSES = tuple(_task_classes)

django_tasks_db/management/commands/db_worker.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,20 @@
1414
from django.db import close_old_connections
1515
from django.db.utils import OperationalError
1616
from django.utils.autoreload import DJANGO_AUTORELOAD_ENV, run_with_reloader
17-
from django_tasks import DEFAULT_TASK_BACKEND_ALIAS, task_backends
18-
from django_tasks.base import DEFAULT_TASK_QUEUE_NAME, TaskContext
19-
from django_tasks.exceptions import InvalidTaskBackendError
20-
from django_tasks.signals import task_finished, task_started
21-
from django_tasks.utils import get_random_id
17+
from django.utils.crypto import get_random_string
18+
19+
try:
20+
from django.tasks import DEFAULT_TASK_BACKEND_ALIAS, task_backends
21+
from django.tasks.base import DEFAULT_TASK_QUEUE_NAME, TaskContext
22+
from django.tasks.exceptions import InvalidTaskBackend
23+
from django.tasks.signals import task_finished, task_started
24+
TASKS_LOGGER = "django.tasks"
25+
except ImportError:
26+
from django_tasks import DEFAULT_TASK_BACKEND_ALIAS, task_backends
27+
from django_tasks.base import DEFAULT_TASK_QUEUE_NAME, TaskContext
28+
from django_tasks.exceptions import InvalidTaskBackendError as InvalidTaskBackend
29+
from django_tasks.signals import task_finished, task_started
30+
TASKS_LOGGER = "django_tasks"
2231

2332
from django_tasks_db.backend import DatabaseBackend
2433
from django_tasks_db.models import DBTaskResult
@@ -197,7 +206,7 @@ def run_task(self, db_task_result: DBTaskResult) -> None:
197206
def valid_backend_name(val: str) -> str:
198207
try:
199208
backend = task_backends[val]
200-
except InvalidTaskBackendError as e:
209+
except InvalidTaskBackend as e:
201210
raise ArgumentTypeError(e.args[0]) from e
202211
if not isinstance(backend, DatabaseBackend):
203212
raise ArgumentTypeError(f"Backend '{val}' is not a database backend")
@@ -283,11 +292,11 @@ def add_arguments(self, parser: ArgumentParser) -> None:
283292
nargs="?",
284293
type=validate_worker_id,
285294
help="Worker id. MUST be unique across worker pool (default: auto-generate)",
286-
default=get_random_id(),
295+
default=get_random_string(32),
287296
)
288297

289298
def configure_logging(self, verbosity: int) -> None:
290-
tasks_logger = logging.getLogger("django_tasks")
299+
tasks_logger = logging.getLogger(TASKS_LOGGER)
291300

292301
if verbosity == 0:
293302
tasks_logger.setLevel(logging.CRITICAL)

django_tasks_db/management/commands/prune_db_task_results.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,23 @@
55
from django.core.management.base import BaseCommand
66
from django.db.models import Q
77
from django.utils import timezone
8-
from django_tasks import (
9-
DEFAULT_TASK_BACKEND_ALIAS,
10-
DEFAULT_TASK_QUEUE_NAME,
11-
task_backends,
12-
)
13-
from django_tasks.base import TaskResultStatus
14-
from django_tasks.exceptions import InvalidTaskBackendError
8+
9+
try:
10+
from django.tasks import (
11+
DEFAULT_TASK_BACKEND_ALIAS,
12+
DEFAULT_TASK_QUEUE_NAME,
13+
task_backends,
14+
)
15+
from django.tasks.base import TaskResultStatus
16+
from django.tasks.exceptions import InvalidTaskBackend
17+
except ImportError:
18+
from django_tasks import (
19+
DEFAULT_TASK_BACKEND_ALIAS,
20+
DEFAULT_TASK_QUEUE_NAME,
21+
task_backends,
22+
)
23+
from django_tasks.base import TaskResultStatus
24+
from django_tasks.exceptions import InvalidTaskBackendError as InvalidTaskBackend
1525

1626
from django_tasks_db.backend import DatabaseBackend
1727
from django_tasks_db.models import DBTaskResult
@@ -22,7 +32,7 @@
2232
def valid_backend_name(val: str) -> DatabaseBackend:
2333
try:
2434
backend = task_backends[val]
25-
except InvalidTaskBackendError as e:
35+
except InvalidTaskBackend as e:
2636
raise ArgumentTypeError(e.args[0]) from e
2737
if not isinstance(backend, DatabaseBackend):
2838
raise ArgumentTypeError(f"Backend '{val}' is not a database backend")

django_tasks_db/models.py

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
import logging
33
import uuid
4+
from traceback import format_exception
45
from typing import TYPE_CHECKING, Any, Generic, Optional, TypeVar
56

67
import django
@@ -12,21 +13,30 @@
1213
from django.utils import timezone
1314
from django.utils.module_loading import import_string
1415
from django.utils.translation import gettext_lazy as _
15-
from django_tasks.base import (
16-
DEFAULT_TASK_PRIORITY,
17-
DEFAULT_TASK_QUEUE_NAME,
18-
TASK_MAX_PRIORITY,
19-
TASK_MIN_PRIORITY,
20-
Task,
21-
TaskError,
22-
TaskResultStatus,
23-
)
24-
from django_tasks.utils import (
25-
get_exception_traceback,
26-
get_module_path,
27-
)
2816
from typing_extensions import ParamSpec
2917

18+
try:
19+
from django.tasks.base import (
20+
DEFAULT_TASK_PRIORITY,
21+
DEFAULT_TASK_QUEUE_NAME,
22+
TASK_MAX_PRIORITY,
23+
TASK_MIN_PRIORITY,
24+
Task,
25+
TaskError,
26+
TaskResultStatus,
27+
)
28+
except ImportError:
29+
from django_tasks.base import ( # type: ignore[no-redef]
30+
DEFAULT_TASK_PRIORITY,
31+
DEFAULT_TASK_QUEUE_NAME,
32+
TASK_MAX_PRIORITY,
33+
TASK_MIN_PRIORITY,
34+
Task,
35+
TaskError,
36+
TaskResultStatus,
37+
)
38+
39+
3040
from .compat import TASK_CLASSES
3141
from .utils import normalize_uuid, retry
3242

@@ -168,7 +178,7 @@ def task(self) -> Task[P, T]:
168178
queue_name=self.queue_name,
169179
run_after=None if self.run_after == get_date_max() else self.run_after,
170180
backend=self.backend_name,
171-
) # type: ignore[return-value]
181+
)
172182

173183
@property
174184
def task_result(self) -> "TaskResult[T]":
@@ -248,8 +258,8 @@ def set_successful(self, return_value: Any) -> None:
248258
def set_failed(self, exc: BaseException) -> None:
249259
self.status = TaskResultStatus.FAILED
250260
self.finished_at = timezone.now()
251-
self.exception_class_path = get_module_path(type(exc))
252-
self.traceback = get_exception_traceback(exc)
261+
self.exception_class_path = f"{type(exc).__module__}.{type(exc).__qualname__}"
262+
self.traceback = "".join(format_exception(exc))
253263
self.return_value = None
254264

255265
self.save(

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ dependencies = [
4242
"Django>=4.2",
4343
"typing_extensions",
4444
"django-stubs-ext",
45-
"django-tasks>=0.12.0"
4645
]
4746

4847
[project.urls]

tests/tasks.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import time
22
from typing import Any
33

4-
from django_tasks import TaskContext, task
4+
try:
5+
from django.tasks import TaskContext, task
6+
except ImportError:
7+
from django_tasks import TaskContext, task # type:ignore[no-redef]
58

69

710
@task()

tests/tests.py

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,34 @@
2828
from django.test import SimpleTestCase, TestCase, TransactionTestCase, override_settings
2929
from django.test.testcases import _deferredSkip # type:ignore[attr-defined]
3030
from django.utils import timezone
31-
from django_tasks import (
32-
TaskResultStatus,
33-
default_task_backend,
34-
task_backends,
35-
)
36-
from django_tasks.base import Task
37-
from django_tasks.exceptions import InvalidTaskError, TaskResultDoesNotExist
38-
from django_tasks.signals import task_enqueued
39-
from django_tasks.utils import get_random_id
31+
from django.utils.crypto import get_random_string
32+
33+
try:
34+
from django.tasks import (
35+
TaskResultStatus,
36+
default_task_backend,
37+
task_backends,
38+
)
39+
from django.tasks.base import Task
40+
from django.tasks.exceptions import InvalidTask, TaskResultDoesNotExist
41+
from django.tasks.signals import task_enqueued
42+
43+
DUMMY_BACKEND = "django.tasks.backends.dummy.DummyBackend"
44+
LOGGER = "django.tasks"
45+
except ImportError:
46+
from django_tasks import (
47+
TaskResultStatus,
48+
default_task_backend,
49+
task_backends,
50+
)
51+
from django_tasks.base import Task
52+
from django_tasks.exceptions import InvalidTaskError as InvalidTask
53+
from django_tasks.exceptions import TaskResultDoesNotExist
54+
from django_tasks.signals import task_enqueued
55+
56+
DUMMY_BACKEND = "django_tasks.backends.dummy.DummyBackend"
57+
LOGGER = "django_tasks"
58+
4059

4160
from django_tasks_db import DatabaseBackend, compat
4261
from django_tasks_db.admin import DBTaskResultAdmin
@@ -166,7 +185,7 @@ def test_refresh_result(self) -> None:
166185
started_at=timezone.now(),
167186
finished_at=timezone.now(),
168187
return_value=42,
169-
worker_ids=[get_random_id()],
188+
worker_ids=[get_random_string(32)],
170189
)
171190

172191
self.assertEqual(result.status, TaskResultStatus.READY)
@@ -197,7 +216,7 @@ async def test_refresh_result_async(self) -> None:
197216
started_at=timezone.now(),
198217
finished_at=timezone.now(),
199218
return_value=42,
200-
worker_ids=[get_random_id()],
219+
worker_ids=[get_random_string(32)],
201220
)
202221

203222
self.assertEqual(result.status, TaskResultStatus.READY)
@@ -335,7 +354,7 @@ def test_doesnt_wait_until_transaction_commit(self) -> None:
335354
self.assertEqual(self.get_task_count_in_new_connection(), 1)
336355

337356
def test_enqueue_logs(self) -> None:
338-
with self.assertLogs("django_tasks", level="DEBUG") as captured_logs:
357+
with self.assertLogs(LOGGER, level="DEBUG") as captured_logs:
339358
result = test_tasks.noop_task.enqueue()
340359

341360
self.assertEqual(len(captured_logs.output), 1)
@@ -421,7 +440,7 @@ def test_validate_on_enqueue(self) -> None:
421440
)
422441

423442
with self.assertRaisesMessage(
424-
InvalidTaskError, "Queue 'unknown_queue' is not valid for backend"
443+
InvalidTask, "Queue 'unknown_queue' is not valid for backend"
425444
):
426445
task_with_custom_queue_name.enqueue()
427446

@@ -439,7 +458,7 @@ async def test_validate_on_aenqueue(self) -> None:
439458
)
440459

441460
with self.assertRaisesMessage(
442-
InvalidTaskError, "Queue 'unknown_queue' is not valid for backend"
461+
InvalidTask, "Queue 'unknown_queue' is not valid for backend"
443462
):
444463
await task_with_custom_queue_name.aenqueue()
445464

@@ -511,11 +530,11 @@ def test_postgres_id_function_expression(self) -> None:
511530
"BACKEND": "django_tasks_db.DatabaseBackend",
512531
"QUEUES": ["default", "queue-1"],
513532
},
514-
"dummy": {"BACKEND": "django_tasks.backends.dummy.DummyBackend"},
533+
"dummy": {"BACKEND": DUMMY_BACKEND},
515534
}
516535
)
517536
class DatabaseBackendWorkerTestCase(TransactionTestCase):
518-
worker_id = get_random_id()
537+
worker_id = get_random_string(32)
519538

520539
run_worker = staticmethod(
521540
partial(
@@ -531,7 +550,7 @@ class DatabaseBackendWorkerTestCase(TransactionTestCase):
531550

532551
def tearDown(self) -> None:
533552
logger = logging.getLogger("django_tasks_db")
534-
tasks_logger = logging.getLogger("django_tasks")
553+
tasks_logger = logging.getLogger(LOGGER)
535554

536555
# Reset the logger after every run, to ensure the correct `stdout` is used
537556
for handler in logger.handlers:
@@ -1240,7 +1259,7 @@ def test_exclusive_transaction(self) -> None:
12401259
"BACKEND": "django_tasks_db.DatabaseBackend",
12411260
"QUEUES": ["default", "queue-1"],
12421261
},
1243-
"dummy": {"BACKEND": "django_tasks.backends.dummy.DummyBackend"},
1262+
"dummy": {"BACKEND": DUMMY_BACKEND},
12441263
}
12451264
)
12461265
class DatabaseBackendPruneTaskResultsTestCase(TransactionTestCase):
@@ -1518,7 +1537,7 @@ def start_worker(
15181537
args = []
15191538

15201539
if worker_id is None:
1521-
worker_id = get_random_id()
1540+
worker_id = get_random_string(32)
15221541

15231542
p = subprocess.Popen(
15241543
[
@@ -1606,7 +1625,7 @@ def test_repeat_ctrl_c(self) -> None:
16061625
result = test_tasks.hang.enqueue()
16071626
self.assertEqual(DBTaskResult.objects.get(id=result.id).worker_ids, [])
16081627

1609-
worker_id = get_random_id()
1628+
worker_id = get_random_string(32)
16101629

16111630
process = self.start_worker(worker_id=worker_id)
16121631

0 commit comments

Comments
 (0)