django-qstash 0.1.0__tar.gz → 0.1.2__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.

Potentially problematic release.


This version of django-qstash might be problematic. Click here for more details.

Files changed (64) hide show
  1. {django_qstash-0.1.0 → django_qstash-0.1.2}/PKG-INFO +21 -5
  2. {django_qstash-0.1.0 → django_qstash-0.1.2}/README.md +17 -2
  3. {django_qstash-0.1.0 → django_qstash-0.1.2}/pyproject.toml +3 -2
  4. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/__init__.py +1 -1
  5. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/services.py +25 -8
  6. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash.egg-info/PKG-INFO +21 -5
  7. {django_qstash-0.1.0 → django_qstash-0.1.2}/setup.cfg +0 -0
  8. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/app/__init__.py +0 -0
  9. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/app/base.py +0 -0
  10. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/app/decorators.py +0 -0
  11. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/callbacks.py +0 -0
  12. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/client.py +0 -0
  13. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/cron.py +0 -0
  14. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/db/__init__.py +0 -0
  15. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/db/models.py +0 -0
  16. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/discovery/__init__.py +0 -0
  17. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/discovery/fields.py +0 -0
  18. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/discovery/models.py +0 -0
  19. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/discovery/utils.py +0 -0
  20. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/discovery/validators.py +0 -0
  21. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/exceptions.py +0 -0
  22. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/handlers.py +0 -0
  23. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/management/__init__.py +0 -0
  24. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/management/commands/__init__.py +0 -0
  25. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/management/commands/available_tasks.py +0 -0
  26. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/management/commands/clear_stale_results.py +0 -0
  27. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/management/commands/task_schedules.py +0 -0
  28. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/__init__.py +0 -0
  29. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/admin.py +0 -0
  30. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/apps.py +0 -0
  31. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/migrations/0001_initial.py +0 -0
  32. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/migrations/0002_taskresult_function_path_alter_taskresult_status_and_more.py +0 -0
  33. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/migrations/__init__.py +0 -0
  34. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/models.py +0 -0
  35. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/results/tasks.py +0 -0
  36. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/__init__.py +0 -0
  37. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/admin.py +0 -0
  38. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/apps.py +0 -0
  39. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/exceptions.py +0 -0
  40. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/formatters.py +0 -0
  41. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/forms.py +0 -0
  42. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/migrations/0001_initial.py +0 -0
  43. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/migrations/0002_taskschedule_updated_at.py +0 -0
  44. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/migrations/0003_alter_taskschedule_cron.py +0 -0
  45. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/migrations/__init__.py +0 -0
  46. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/models.py +0 -0
  47. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/services.py +0 -0
  48. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/signals.py +0 -0
  49. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/schedules/validators.py +0 -0
  50. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/settings.py +0 -0
  51. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/urls.py +0 -0
  52. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/utils.py +0 -0
  53. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash/views.py +0 -0
  54. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash.egg-info/SOURCES.txt +0 -0
  55. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash.egg-info/dependency_links.txt +0 -0
  56. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash.egg-info/requires.txt +0 -0
  57. {django_qstash-0.1.0 → django_qstash-0.1.2}/src/django_qstash.egg-info/top_level.txt +0 -0
  58. {django_qstash-0.1.0 → django_qstash-0.1.2}/tests/test_callbacks.py +0 -0
  59. {django_qstash-0.1.0 → django_qstash-0.1.2}/tests/test_exceptions.py +0 -0
  60. {django_qstash-0.1.0 → django_qstash-0.1.2}/tests/test_handlers.py +0 -0
  61. {django_qstash-0.1.0 → django_qstash-0.1.2}/tests/test_results_models.py +0 -0
  62. {django_qstash-0.1.0 → django_qstash-0.1.2}/tests/test_settings.py +0 -0
  63. {django_qstash-0.1.0 → django_qstash-0.1.2}/tests/test_utils.py +0 -0
  64. {django_qstash-0.1.0 → django_qstash-0.1.2}/tests/test_views.py +0 -0
@@ -1,16 +1,17 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: django-qstash
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: A drop-in replacement for Celery's shared_task with Upstash QStash.
5
5
  Author-email: Justin Mitchel <justin@codingforentrepreneurs.com>
6
6
  Project-URL: Changelog, https://github.com/jmitchel3/django-qstash
7
7
  Project-URL: Documentation, https://github.com/jmitchel3/django-qstash
8
8
  Project-URL: Funding, https://github.com/jmitchel3/django-qstash
9
9
  Project-URL: Repository, https://github.com/jmitchel3/django-qstash
10
- Classifier: Development Status :: 4 - Beta
10
+ Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Framework :: Django :: 4.2
12
12
  Classifier: Framework :: Django :: 5.0
13
13
  Classifier: Framework :: Django :: 5.1
14
+ Classifier: Framework :: Django :: 5.2
14
15
  Classifier: Intended Audience :: Developers
15
16
  Classifier: License :: OSI Approved :: MIT License
16
17
  Classifier: Natural Language :: English
@@ -64,10 +65,25 @@ This allows us to:
64
65
  - Trigger GitHub Actions Workflows or GitLab CI/CD pipelines for handling other kinds of background tasks based on our project's code.
65
66
 
66
67
 
68
+ ## Demo
69
+
70
+
71
+ ### Django QStash in 3 Minutes on YouTube
72
+
73
+ [![Django QStash Demo in 3 Minutes](https://img.youtube.com/vi/e-hloBp4eVQ/0.jpg)](https://www.youtube.com/watch?v=e-hloBp4eVQ)
74
+
75
+
76
+ ### Mini Course on YouTube
77
+
78
+ Step-by-Step [tutorial playlist on YouTube](https://www.youtube.com/playlist?list=PLEsfXFp6DpzQgNC8Q_ijgqxCVRtSC4_-L) on my [@CodingEntrepreneurs](https://cfe.sh/youtube) Youtube channel.
79
+
67
80
  ## Table of Contents
68
81
 
69
82
  - [django-qstash](#django-qstash)
70
83
  - [How it works](#how-it-works)
84
+ - [Demo](#demo)
85
+ - [Django QStash in 3 Minutes on YouTube](#django-qstash-in-3-minutes-on-youtube)
86
+ - [Mini Course on YouTube](#mini-course-on-youtube)
71
87
  - [Table of Contents](#table-of-contents)
72
88
  - [Installation](#installation)
73
89
  - [Using Pip](#using-pip)
@@ -450,8 +466,8 @@ desired_task = "django_qstash.results.clear_stale_results_task"
450
466
  # or desired_task = "example_app.tasks.my_task"
451
467
 
452
468
  task_to_use = desired_task
453
- if desired_task not in available_task_locations:
454
- task_to_use = available_task_locations[0]
469
+ if desired_task not in all_available_tasks:
470
+ task_to_use = all_available_tasks[0]
455
471
 
456
472
  print(f"Using task: {task_to_use}")
457
473
 
@@ -35,10 +35,25 @@ This allows us to:
35
35
  - Trigger GitHub Actions Workflows or GitLab CI/CD pipelines for handling other kinds of background tasks based on our project's code.
36
36
 
37
37
 
38
+ ## Demo
39
+
40
+
41
+ ### Django QStash in 3 Minutes on YouTube
42
+
43
+ [![Django QStash Demo in 3 Minutes](https://img.youtube.com/vi/e-hloBp4eVQ/0.jpg)](https://www.youtube.com/watch?v=e-hloBp4eVQ)
44
+
45
+
46
+ ### Mini Course on YouTube
47
+
48
+ Step-by-Step [tutorial playlist on YouTube](https://www.youtube.com/playlist?list=PLEsfXFp6DpzQgNC8Q_ijgqxCVRtSC4_-L) on my [@CodingEntrepreneurs](https://cfe.sh/youtube) Youtube channel.
49
+
38
50
  ## Table of Contents
39
51
 
40
52
  - [django-qstash](#django-qstash)
41
53
  - [How it works](#how-it-works)
54
+ - [Demo](#demo)
55
+ - [Django QStash in 3 Minutes on YouTube](#django-qstash-in-3-minutes-on-youtube)
56
+ - [Mini Course on YouTube](#mini-course-on-youtube)
42
57
  - [Table of Contents](#table-of-contents)
43
58
  - [Installation](#installation)
44
59
  - [Using Pip](#using-pip)
@@ -421,8 +436,8 @@ desired_task = "django_qstash.results.clear_stale_results_task"
421
436
  # or desired_task = "example_app.tasks.my_task"
422
437
 
423
438
  task_to_use = desired_task
424
- if desired_task not in available_task_locations:
425
- task_to_use = available_task_locations[0]
439
+ if desired_task not in all_available_tasks:
440
+ task_to_use = all_available_tasks[0]
426
441
 
427
442
  print(f"Using task: {task_to_use}")
428
443
 
@@ -6,7 +6,7 @@ requires = [
6
6
 
7
7
  [project]
8
8
  name = "django-qstash"
9
- version = "0.1.0"
9
+ version = "0.1.2"
10
10
  description = "A drop-in replacement for Celery's shared_task with Upstash QStash."
11
11
  readme = "README.md"
12
12
  license = { file = "LICENSE" }
@@ -15,10 +15,11 @@ authors = [
15
15
  ]
16
16
  requires-python = ">=3.10"
17
17
  classifiers = [
18
- "Development Status :: 4 - Beta",
18
+ "Development Status :: 5 - Production/Stable",
19
19
  "Framework :: Django :: 4.2",
20
20
  "Framework :: Django :: 5.0",
21
21
  "Framework :: Django :: 5.1",
22
+ "Framework :: Django :: 5.2",
22
23
  "Intended Audience :: Developers",
23
24
  "License :: OSI Approved :: MIT License",
24
25
  "Natural Language :: English",
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.1.0"
3
+ __version__ = "0.1.2"
4
4
 
5
5
  from django_qstash.app import shared_task
6
6
  from django_qstash.app import stashed_task
@@ -12,14 +12,31 @@ from django_qstash.db.models import TaskStatus
12
12
  logger = logging.getLogger(__name__)
13
13
 
14
14
 
15
- def function_result_to_json(result: Any) -> str:
16
- """Convert a function result to a JSON string"""
17
- try:
18
- data = {"result": result}
19
- return json.dumps(data)
20
- except Exception as e:
21
- logger.exception("Failed to convert function result to JSON: %s", str(e))
15
+ def function_result_to_dict(result: Any) -> dict | None:
16
+ """
17
+ Convert a task result to a Python dict for the result JSONField.
18
+
19
+ Args:
20
+ result: Any Python value to be converted
21
+
22
+ Returns:
23
+ dict: A dictionary representation of the result
24
+ None: If the input is None
25
+ """
26
+ if result is None:
22
27
  return None
28
+ elif isinstance(result, dict):
29
+ return result
30
+ elif isinstance(result, str):
31
+ try:
32
+ parsed = json.loads(result)
33
+ if isinstance(parsed, dict):
34
+ return parsed
35
+ return {"result": parsed}
36
+ except json.JSONDecodeError as e:
37
+ logger.info("Task result is not a JSON string: %s", str(e))
38
+ return {"result": result}
39
+ return {"result": result}
23
40
 
24
41
 
25
42
  def store_task_result(
@@ -44,7 +61,7 @@ def store_task_result(
44
61
  task_name=task_name,
45
62
  status=status,
46
63
  date_done=timezone.now(),
47
- result=function_result_to_json(result),
64
+ result=function_result_to_dict(result),
48
65
  traceback=traceback,
49
66
  args=args,
50
67
  kwargs=kwargs,
@@ -1,16 +1,17 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: django-qstash
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: A drop-in replacement for Celery's shared_task with Upstash QStash.
5
5
  Author-email: Justin Mitchel <justin@codingforentrepreneurs.com>
6
6
  Project-URL: Changelog, https://github.com/jmitchel3/django-qstash
7
7
  Project-URL: Documentation, https://github.com/jmitchel3/django-qstash
8
8
  Project-URL: Funding, https://github.com/jmitchel3/django-qstash
9
9
  Project-URL: Repository, https://github.com/jmitchel3/django-qstash
10
- Classifier: Development Status :: 4 - Beta
10
+ Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Framework :: Django :: 4.2
12
12
  Classifier: Framework :: Django :: 5.0
13
13
  Classifier: Framework :: Django :: 5.1
14
+ Classifier: Framework :: Django :: 5.2
14
15
  Classifier: Intended Audience :: Developers
15
16
  Classifier: License :: OSI Approved :: MIT License
16
17
  Classifier: Natural Language :: English
@@ -64,10 +65,25 @@ This allows us to:
64
65
  - Trigger GitHub Actions Workflows or GitLab CI/CD pipelines for handling other kinds of background tasks based on our project's code.
65
66
 
66
67
 
68
+ ## Demo
69
+
70
+
71
+ ### Django QStash in 3 Minutes on YouTube
72
+
73
+ [![Django QStash Demo in 3 Minutes](https://img.youtube.com/vi/e-hloBp4eVQ/0.jpg)](https://www.youtube.com/watch?v=e-hloBp4eVQ)
74
+
75
+
76
+ ### Mini Course on YouTube
77
+
78
+ Step-by-Step [tutorial playlist on YouTube](https://www.youtube.com/playlist?list=PLEsfXFp6DpzQgNC8Q_ijgqxCVRtSC4_-L) on my [@CodingEntrepreneurs](https://cfe.sh/youtube) Youtube channel.
79
+
67
80
  ## Table of Contents
68
81
 
69
82
  - [django-qstash](#django-qstash)
70
83
  - [How it works](#how-it-works)
84
+ - [Demo](#demo)
85
+ - [Django QStash in 3 Minutes on YouTube](#django-qstash-in-3-minutes-on-youtube)
86
+ - [Mini Course on YouTube](#mini-course-on-youtube)
71
87
  - [Table of Contents](#table-of-contents)
72
88
  - [Installation](#installation)
73
89
  - [Using Pip](#using-pip)
@@ -450,8 +466,8 @@ desired_task = "django_qstash.results.clear_stale_results_task"
450
466
  # or desired_task = "example_app.tasks.my_task"
451
467
 
452
468
  task_to_use = desired_task
453
- if desired_task not in available_task_locations:
454
- task_to_use = available_task_locations[0]
469
+ if desired_task not in all_available_tasks:
470
+ task_to_use = all_available_tasks[0]
455
471
 
456
472
  print(f"Using task: {task_to_use}")
457
473
 
File without changes