Skip to content

Commit e147532

Browse files
committed
Freeze Task class
1 parent d631bbf commit e147532

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

django_tasks/task.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from copy import deepcopy
2-
from dataclasses import dataclass, field
1+
from dataclasses import dataclass, field, replace
32
from datetime import datetime, timedelta
43
from inspect import iscoroutinefunction
54
from typing import (
@@ -53,7 +52,7 @@ class ResultStatus(TextChoices):
5352
P = ParamSpec("P")
5453

5554

56-
@dataclass
55+
@dataclass(frozen=True)
5756
class Task(Generic[P, T]):
5857
priority: int
5958
"""The priority of the task"""
@@ -98,22 +97,21 @@ def using(
9897
Create a new task with modified defaults
9998
"""
10099

101-
task = deepcopy(self)
100+
changes: Dict[str, Any] = {}
101+
102102
if priority is not None:
103-
task.priority = priority
103+
changes["priority"] = priority
104104
if queue_name is not None:
105-
task.queue_name = queue_name
105+
changes["queue_name"] = queue_name
106106
if run_after is not None:
107107
if isinstance(run_after, timedelta):
108-
task.run_after = timezone.now() + run_after
108+
changes["run_after"] = timezone.now() + run_after
109109
else:
110-
task.run_after = run_after
110+
changes["run_after"] = run_after
111111
if backend is not None:
112-
task.backend = backend
113-
114-
task.get_backend().validate_task(task)
112+
changes["backend"] = backend
115113

116-
return task
114+
return replace(self, **changes)
117115

118116
def enqueue(self, *args: P.args, **kwargs: P.kwargs) -> "TaskResult[T]":
119117
"""

tests/tests/test_tasks.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,18 @@ def test_using_creates_new_instance(self) -> None:
113113
self.assertEqual(new_task, test_tasks.noop_task)
114114
self.assertIsNot(new_task, test_tasks.noop_task)
115115

116+
def test_chained_using(self) -> None:
117+
now = timezone.now()
118+
119+
run_after_task = test_tasks.noop_task.using(run_after=now)
120+
self.assertEqual(run_after_task.run_after, now)
121+
122+
priority_task = run_after_task.using(priority=10)
123+
self.assertEqual(priority_task.priority, 10)
124+
self.assertEqual(priority_task.run_after, now)
125+
126+
self.assertEqual(run_after_task.priority, 0)
127+
116128
async def test_refresh_result(self) -> None:
117129
result = await test_tasks.noop_task.aenqueue()
118130

0 commit comments

Comments
 (0)