django-lambda-tasks 0.2.5__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/PKG-INFO +1 -1
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/admin.py +11 -0
- django_lambda_tasks-0.3.0/lambda_tasks/migrations/0002_alter_taskrecord_status.py +60 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/models.py +8 -8
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/pyproject.toml +1 -1
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_decorator.py +1 -1
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_models.py +23 -23
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_tasks.py +4 -4
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.github/workflows/ci.yml +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.github/workflows/release.yml +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.gitignore +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ignore-errors-decorator-option/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ignore-errors-decorator-option/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ignore-errors-decorator-option/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ignore-errors-decorator-option/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/import-string-task-resolution/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/import-string-task-resolution/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/import-string-task-resolution/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/import-string-task-resolution/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks-bugfix/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks-bugfix/bugfix.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks-bugfix/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks-bugfix/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/.config.kiro +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/design.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/requirements.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/tasks.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/steering/product.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/steering/structure.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/steering/tech.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.pre-commit-config.yaml +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.vscode/settings.json +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/README.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/README.md +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/__init__.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/apps.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/tasks.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/urls.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_app/views.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_project/__init__.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_project/settings.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_project/urls.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/example_project/wsgi.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/example/manage.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/__init__.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/apps.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/decorators.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/environment_loader.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/handler.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/logging.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/migrations/0001_initial.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/migrations/__init__.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/secret_loader.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/settings.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/tasks.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/timeouts.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/conftest.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/settings.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_admin.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_decorators.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_deferred_enqueue.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_environment_loader.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_handler.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_kwargs_only.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_logging.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_secret_loader.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_serializer.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_settings.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_timeout_validation.py +0 -0
- {django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/tests/test_timeouts.py +0 -0
|
@@ -22,6 +22,17 @@ class TaskRecordAdmin(admin.ModelAdmin):
|
|
|
22
22
|
list_filter = ("status", "task_name")
|
|
23
23
|
date_hierarchy = "start_time"
|
|
24
24
|
search_fields = ("pk", "kwargs")
|
|
25
|
+
readonly_fields = (
|
|
26
|
+
"pk",
|
|
27
|
+
"task_name",
|
|
28
|
+
"kwargs",
|
|
29
|
+
"n_retries",
|
|
30
|
+
"status",
|
|
31
|
+
"start_time",
|
|
32
|
+
"end_time",
|
|
33
|
+
"result",
|
|
34
|
+
"traceback",
|
|
35
|
+
)
|
|
25
36
|
|
|
26
37
|
def get_queryset(self, request: HttpRequest) -> QuerySet:
|
|
27
38
|
return (
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Rename SUCCESS → SUCCEEDED and RETRYING → RETRIED status values."""
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def rename_statuses_forward(apps, schema_editor):
|
|
7
|
+
TaskRecord = apps.get_model("lambda_tasks", "TaskRecord")
|
|
8
|
+
TaskRecord.objects.filter(status="SUCCESS").update(status="SUCCEEDED")
|
|
9
|
+
TaskRecord.objects.filter(status="RETRYING").update(status="RETRIED")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def rename_statuses_backward(apps, schema_editor):
|
|
13
|
+
TaskRecord = apps.get_model("lambda_tasks", "TaskRecord")
|
|
14
|
+
TaskRecord.objects.filter(status="SUCCEEDED").update(status="SUCCESS")
|
|
15
|
+
TaskRecord.objects.filter(status="RETRIED").update(status="RETRYING")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Migration(migrations.Migration):
|
|
19
|
+
|
|
20
|
+
dependencies = [
|
|
21
|
+
("lambda_tasks", "0001_initial"),
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
operations = [
|
|
25
|
+
# First, drop the existing check constraint so we can update data
|
|
26
|
+
migrations.RemoveConstraint(
|
|
27
|
+
model_name="taskrecord",
|
|
28
|
+
name="taskrecord_status_valid",
|
|
29
|
+
),
|
|
30
|
+
# Run data migration to rename existing rows
|
|
31
|
+
migrations.RunPython(
|
|
32
|
+
rename_statuses_forward,
|
|
33
|
+
rename_statuses_backward,
|
|
34
|
+
),
|
|
35
|
+
# Alter the field with new choices
|
|
36
|
+
migrations.AlterField(
|
|
37
|
+
model_name="taskrecord",
|
|
38
|
+
name="status",
|
|
39
|
+
field=models.CharField(
|
|
40
|
+
choices=[
|
|
41
|
+
("RUNNING", "Running"),
|
|
42
|
+
("SUCCEEDED", "Succeeded"),
|
|
43
|
+
("FAILED", "Failed"),
|
|
44
|
+
("RETRIED", "Retried"),
|
|
45
|
+
],
|
|
46
|
+
editable=False,
|
|
47
|
+
max_length=10,
|
|
48
|
+
),
|
|
49
|
+
),
|
|
50
|
+
# Re-add the check constraint with updated values
|
|
51
|
+
migrations.AddConstraint(
|
|
52
|
+
model_name="taskrecord",
|
|
53
|
+
constraint=models.CheckConstraint(
|
|
54
|
+
condition=models.Q(
|
|
55
|
+
("status__in", ["RUNNING", "SUCCEEDED", "FAILED", "RETRIED"])
|
|
56
|
+
),
|
|
57
|
+
name="taskrecord_status_valid",
|
|
58
|
+
),
|
|
59
|
+
),
|
|
60
|
+
]
|
|
@@ -30,9 +30,9 @@ class MaxRetriesExceededError(Exception):
|
|
|
30
30
|
|
|
31
31
|
class TaskStatus(models.TextChoices):
|
|
32
32
|
RUNNING = "RUNNING"
|
|
33
|
-
|
|
33
|
+
SUCCEEDED = "SUCCEEDED"
|
|
34
34
|
FAILED = "FAILED"
|
|
35
|
-
|
|
35
|
+
RETRIED = "RETRIED"
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
class TaskRecord(models.Model):
|
|
@@ -115,7 +115,7 @@ class SQSLambdaTaskMessage(BaseModel):
|
|
|
115
115
|
"task_name": self.task_name,
|
|
116
116
|
"kwargs": self.model_dump(mode="json")["kwargs"],
|
|
117
117
|
"n_retries": self.n_retries,
|
|
118
|
-
"status":
|
|
118
|
+
"status": TaskStatus.RUNNING,
|
|
119
119
|
"start_time": now(),
|
|
120
120
|
},
|
|
121
121
|
)
|
|
@@ -157,7 +157,7 @@ class SQSLambdaTaskMessage(BaseModel):
|
|
|
157
157
|
elif effective_retry_on and isinstance(error, effective_retry_on):
|
|
158
158
|
conf = LambdaTasksSettings()
|
|
159
159
|
if self.n_retries >= conf.MAX_RETRIES:
|
|
160
|
-
record.status =
|
|
160
|
+
record.status = TaskStatus.FAILED
|
|
161
161
|
record.traceback = traceback.format_exc()
|
|
162
162
|
record.end_time = now()
|
|
163
163
|
record.save(update_fields=["status", "traceback", "end_time"])
|
|
@@ -170,7 +170,7 @@ class SQSLambdaTaskMessage(BaseModel):
|
|
|
170
170
|
task_name=self.task_name, n_retries=self.n_retries
|
|
171
171
|
)
|
|
172
172
|
else:
|
|
173
|
-
record.status =
|
|
173
|
+
record.status = TaskStatus.RETRIED
|
|
174
174
|
record.traceback = traceback.format_exc()
|
|
175
175
|
record.end_time = now()
|
|
176
176
|
record.save(update_fields=["status", "traceback", "end_time"])
|
|
@@ -198,7 +198,7 @@ class SQSLambdaTaskMessage(BaseModel):
|
|
|
198
198
|
else:
|
|
199
199
|
task_logger.error(error, exc_info=True)
|
|
200
200
|
|
|
201
|
-
record.status =
|
|
201
|
+
record.status = TaskStatus.FAILED
|
|
202
202
|
record.traceback = traceback.format_exc()
|
|
203
203
|
record.end_time = now()
|
|
204
204
|
record.save(update_fields=["status", "traceback", "end_time"])
|
|
@@ -207,14 +207,14 @@ class SQSLambdaTaskMessage(BaseModel):
|
|
|
207
207
|
return
|
|
208
208
|
|
|
209
209
|
if ignored_exception is None:
|
|
210
|
-
record.status =
|
|
210
|
+
record.status = TaskStatus.SUCCEEDED
|
|
211
211
|
record.result = result
|
|
212
212
|
record.end_time = now()
|
|
213
213
|
record.save(update_fields=["status", "result", "end_time"])
|
|
214
214
|
|
|
215
215
|
task_logger.info(f"Succeeded in {record.duration}")
|
|
216
216
|
else:
|
|
217
|
-
record.status =
|
|
217
|
+
record.status = TaskStatus.SUCCEEDED
|
|
218
218
|
record.traceback = ignored_traceback
|
|
219
219
|
record.end_time = now()
|
|
220
220
|
record.save(update_fields=["status", "traceback", "end_time"])
|
|
@@ -666,7 +666,7 @@ def test_property_3_eager_mode_writes_task_record(value):
|
|
|
666
666
|
assert TaskRecord.objects.filter(
|
|
667
667
|
task_name=task_name,
|
|
668
668
|
kwargs={"n": value},
|
|
669
|
-
status__in=[TaskRecord.TaskStatus.
|
|
669
|
+
status__in=[TaskRecord.TaskStatus.SUCCEEDED, TaskRecord.TaskStatus.FAILED],
|
|
670
670
|
).exists()
|
|
671
671
|
|
|
672
672
|
|
|
@@ -66,9 +66,9 @@ class TestTaskRecordStatusChoices:
|
|
|
66
66
|
"status",
|
|
67
67
|
[
|
|
68
68
|
TaskRecord.TaskStatus.RUNNING,
|
|
69
|
-
TaskRecord.TaskStatus.
|
|
69
|
+
TaskRecord.TaskStatus.SUCCEEDED,
|
|
70
70
|
TaskRecord.TaskStatus.FAILED,
|
|
71
|
-
TaskRecord.TaskStatus.
|
|
71
|
+
TaskRecord.TaskStatus.RETRIED,
|
|
72
72
|
],
|
|
73
73
|
)
|
|
74
74
|
def test_valid_status_choices(self, status):
|
|
@@ -83,21 +83,20 @@ class TestTaskRecordStatusChoices:
|
|
|
83
83
|
|
|
84
84
|
def test_status_choice_values(self):
|
|
85
85
|
assert TaskRecord.TaskStatus.RUNNING == "RUNNING"
|
|
86
|
-
assert TaskRecord.TaskStatus.
|
|
86
|
+
assert TaskRecord.TaskStatus.SUCCEEDED == "SUCCEEDED"
|
|
87
87
|
assert TaskRecord.TaskStatus.FAILED == "FAILED"
|
|
88
|
-
assert TaskRecord.TaskStatus.
|
|
88
|
+
assert TaskRecord.TaskStatus.RETRIED == "RETRIED"
|
|
89
89
|
|
|
90
|
-
def
|
|
90
|
+
def test_retried_status_can_be_saved(self):
|
|
91
91
|
record = TaskRecord.objects.create(
|
|
92
92
|
task_name="myapp.tasks.job",
|
|
93
93
|
pk=uuid.uuid4(),
|
|
94
94
|
kwargs={},
|
|
95
95
|
n_retries=0,
|
|
96
|
-
status=TaskRecord.TaskStatus.
|
|
96
|
+
status=TaskRecord.TaskStatus.RETRIED,
|
|
97
97
|
)
|
|
98
98
|
assert (
|
|
99
|
-
TaskRecord.objects.get(pk=record.pk).status
|
|
100
|
-
== TaskRecord.TaskStatus.RETRYING
|
|
99
|
+
TaskRecord.objects.get(pk=record.pk).status == TaskRecord.TaskStatus.RETRIED
|
|
101
100
|
)
|
|
102
101
|
|
|
103
102
|
|
|
@@ -179,7 +178,7 @@ class TestTaskRecordOrmQueryable:
|
|
|
179
178
|
pk=uuid.uuid4(),
|
|
180
179
|
kwargs={},
|
|
181
180
|
n_retries=0,
|
|
182
|
-
status=TaskRecord.TaskStatus.
|
|
181
|
+
status=TaskRecord.TaskStatus.SUCCEEDED,
|
|
183
182
|
)
|
|
184
183
|
TaskRecord.objects.create(
|
|
185
184
|
task_name="myapp.tasks.job",
|
|
@@ -189,7 +188,8 @@ class TestTaskRecordOrmQueryable:
|
|
|
189
188
|
status=TaskRecord.TaskStatus.FAILED,
|
|
190
189
|
)
|
|
191
190
|
assert (
|
|
192
|
-
TaskRecord.objects.filter(status=TaskRecord.TaskStatus.
|
|
191
|
+
TaskRecord.objects.filter(status=TaskRecord.TaskStatus.SUCCEEDED).count()
|
|
192
|
+
== 1
|
|
193
193
|
)
|
|
194
194
|
assert (
|
|
195
195
|
TaskRecord.objects.filter(status=TaskRecord.TaskStatus.FAILED).count() == 1
|
|
@@ -359,7 +359,7 @@ class TestExecuteTaskSuccess:
|
|
|
359
359
|
with patch("lambda_tasks.models.TimeoutContext"):
|
|
360
360
|
msg.execute_immediately(message_id=message_id)
|
|
361
361
|
record = TaskRecord.objects.get(pk=message_id)
|
|
362
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
362
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
363
363
|
|
|
364
364
|
def test_successful_task_record_has_result(self):
|
|
365
365
|
msg = _make_message(_task_name(_task_returns_value), {"x": 7})
|
|
@@ -611,7 +611,7 @@ def test_property_13_task_record_lifecycle_success(return_value):
|
|
|
611
611
|
assert _lifecycle_captured[0]["status"] == TaskRecord.TaskStatus.RUNNING
|
|
612
612
|
assert _lifecycle_captured[0]["start_time"] is not None
|
|
613
613
|
record = TaskRecord.objects.get(pk=inv_id)
|
|
614
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
614
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
615
615
|
assert record.end_time is not None
|
|
616
616
|
assert record.result == return_value
|
|
617
617
|
|
|
@@ -649,7 +649,7 @@ class TestExecuteTaskDuplicateDelivery:
|
|
|
649
649
|
msg.execute_immediately(message_id=message_id) # duplicate
|
|
650
650
|
assert TaskRecord.objects.filter(pk=message_id).count() == 1
|
|
651
651
|
record = TaskRecord.objects.get(pk=message_id)
|
|
652
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
652
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
653
653
|
|
|
654
654
|
def test_duplicate_of_failed_is_skipped(self):
|
|
655
655
|
msg = _make_message(_task_name(_task_raises), {"msg": "boom"})
|
|
@@ -1081,7 +1081,7 @@ def test_property_ignored_exc_produces_success(exc_type_name):
|
|
|
1081
1081
|
with patch("lambda_tasks.models.TimeoutContext"):
|
|
1082
1082
|
msg.execute_immediately(message_id=message_id)
|
|
1083
1083
|
record = TaskRecord.objects.get(pk=message_id)
|
|
1084
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
1084
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
1085
1085
|
assert record.traceback is not None
|
|
1086
1086
|
assert exc_type_name in record.traceback
|
|
1087
1087
|
assert record.end_time is not None
|
|
@@ -1106,7 +1106,7 @@ def test_property_ignored_exc_commits_record(label):
|
|
|
1106
1106
|
).exists()
|
|
1107
1107
|
# TaskRecord itself must be committed as SUCCESS
|
|
1108
1108
|
record = TaskRecord.objects.get(pk=message_id)
|
|
1109
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
1109
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
1110
1110
|
|
|
1111
1111
|
|
|
1112
1112
|
# Feature: ignore-errors-decorator-option, Property 5: Subclass of ignored exception type is also ignored
|
|
@@ -1128,7 +1128,7 @@ def test_property_subclass_of_ignored_is_ignored(base_exc):
|
|
|
1128
1128
|
with patch("lambda_tasks.models.TimeoutContext"):
|
|
1129
1129
|
msg.execute_immediately(message_id=message_id)
|
|
1130
1130
|
record = TaskRecord.objects.get(pk=message_id)
|
|
1131
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
1131
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
1132
1132
|
|
|
1133
1133
|
|
|
1134
1134
|
# Feature: ignore-errors-decorator-option, Property 6: Non-ignored exception produces FAILED with rollback
|
|
@@ -1179,7 +1179,7 @@ class TestIgnoreErrorsRegressionGuard:
|
|
|
1179
1179
|
with patch("lambda_tasks.models.TimeoutContext"):
|
|
1180
1180
|
msg.execute_immediately(message_id=message_id)
|
|
1181
1181
|
record = TaskRecord.objects.get(pk=message_id)
|
|
1182
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
1182
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
1183
1183
|
assert record.traceback is None
|
|
1184
1184
|
|
|
1185
1185
|
def test_non_ignored_exception_produces_failed(self):
|
|
@@ -1227,7 +1227,7 @@ def test_property_eager_mode_ignore_errors_parity(exc_type_name):
|
|
|
1227
1227
|
with patch("lambda_tasks.models.import_string", return_value=_task_raises_ignored):
|
|
1228
1228
|
msg.execute_immediately(message_id=message_id)
|
|
1229
1229
|
record = TaskRecord.objects.get(pk=message_id)
|
|
1230
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
1230
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
1231
1231
|
assert record.traceback is not None
|
|
1232
1232
|
|
|
1233
1233
|
|
|
@@ -1379,7 +1379,7 @@ def test_property_6_retrying_status_and_traceback(exc_type_name):
|
|
|
1379
1379
|
with patch.object(SQSLambdaTask, "execute_on_commit"):
|
|
1380
1380
|
msg.execute_immediately(message_id=message_id)
|
|
1381
1381
|
record = TaskRecord.objects.get(pk=message_id)
|
|
1382
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
1382
|
+
assert record.status == TaskRecord.TaskStatus.RETRIED
|
|
1383
1383
|
assert record.traceback is not None
|
|
1384
1384
|
assert record.end_time is not None
|
|
1385
1385
|
|
|
@@ -1855,7 +1855,7 @@ def test_property_singleton_lockerror_retry(
|
|
|
1855
1855
|
|
|
1856
1856
|
# TaskRecord should be RETRYING with LockError in traceback
|
|
1857
1857
|
record = TaskRecord.objects.get(pk=message_id)
|
|
1858
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
1858
|
+
assert record.status == TaskRecord.TaskStatus.RETRIED
|
|
1859
1859
|
assert record.traceback is not None
|
|
1860
1860
|
assert "LockError" in record.traceback
|
|
1861
1861
|
|
|
@@ -1959,7 +1959,7 @@ class TestSingletonExecutionUnit:
|
|
|
1959
1959
|
mock_cache.lock.assert_not_called()
|
|
1960
1960
|
|
|
1961
1961
|
record = TaskRecord.objects.get(pk=message_id)
|
|
1962
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
1962
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
1963
1963
|
assert record.result == 42
|
|
1964
1964
|
|
|
1965
1965
|
def test_singleton_uses_singleton_cache_backend(self, settings: object) -> None:
|
|
@@ -2050,7 +2050,7 @@ class TestSingletonIgnoreErrorsPrecedence:
|
|
|
2050
2050
|
msg.execute_immediately(message_id=message_id)
|
|
2051
2051
|
|
|
2052
2052
|
record = TaskRecord.objects.get(pk=message_id)
|
|
2053
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
2053
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
2054
2054
|
assert record.traceback is not None
|
|
2055
2055
|
assert "LockError" in record.traceback
|
|
2056
2056
|
mock_eoc.assert_not_called()
|
|
@@ -2086,7 +2086,7 @@ class TestSingletonIgnoreErrorsPrecedence:
|
|
|
2086
2086
|
msg.execute_immediately(message_id=message_id)
|
|
2087
2087
|
|
|
2088
2088
|
record = TaskRecord.objects.get(pk=message_id)
|
|
2089
|
-
assert record.status == TaskRecord.TaskStatus.
|
|
2089
|
+
assert record.status == TaskRecord.TaskStatus.SUCCEEDED
|
|
2090
2090
|
assert record.traceback is not None
|
|
2091
2091
|
assert "SoftTimeLimitExceeded" in record.traceback
|
|
2092
2092
|
mock_eoc.assert_not_called()
|
|
@@ -13,7 +13,7 @@ from lambda_tasks.tasks import cleanup_task_records
|
|
|
13
13
|
@pytest.mark.django_db
|
|
14
14
|
class TestCleanupTaskRecordsDeletesOldRecords:
|
|
15
15
|
def _create_record(
|
|
16
|
-
self, *, age_days: int, status: str = TaskStatus.
|
|
16
|
+
self, *, age_days: int, status: str = TaskStatus.SUCCEEDED
|
|
17
17
|
) -> uuid.UUID:
|
|
18
18
|
record_id = uuid.uuid4()
|
|
19
19
|
TaskRecord.objects.create(
|
|
@@ -54,7 +54,7 @@ class TestCleanupTaskRecordsDeletesOldRecords:
|
|
|
54
54
|
task_name="some.task",
|
|
55
55
|
kwargs={},
|
|
56
56
|
n_retries=0,
|
|
57
|
-
status=TaskStatus.
|
|
57
|
+
status=TaskStatus.SUCCEEDED,
|
|
58
58
|
start_time=cutoff_time + timedelta(seconds=1),
|
|
59
59
|
end_time=cutoff_time + timedelta(seconds=2),
|
|
60
60
|
)
|
|
@@ -65,10 +65,10 @@ class TestCleanupTaskRecordsDeletesOldRecords:
|
|
|
65
65
|
|
|
66
66
|
def test_deletes_all_statuses(self) -> None:
|
|
67
67
|
ids = [
|
|
68
|
-
self._create_record(age_days=10, status=TaskStatus.
|
|
68
|
+
self._create_record(age_days=10, status=TaskStatus.SUCCEEDED),
|
|
69
69
|
self._create_record(age_days=10, status=TaskStatus.FAILED),
|
|
70
70
|
self._create_record(age_days=10, status=TaskStatus.RUNNING),
|
|
71
|
-
self._create_record(age_days=10, status=TaskStatus.
|
|
71
|
+
self._create_record(age_days=10, status=TaskStatus.RETRIED),
|
|
72
72
|
]
|
|
73
73
|
|
|
74
74
|
cleanup_task_records(retention_days=7)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/deferred-task-enqueue/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/eager-mode-example-app/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/.config.kiro
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/retry-delay/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/rse-background-tasks/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/.config.kiro
RENAMED
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/design.md
RENAMED
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/singleton-task/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/design.md
RENAMED
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/ssm-environment-loader/tasks.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/.kiro/specs/task-retry/requirements.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_lambda_tasks-0.2.5 → django_lambda_tasks-0.3.0}/lambda_tasks/migrations/0001_initial.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|