taskito 0.3.0__tar.gz → 0.5.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.
Files changed (176) hide show
  1. {taskito-0.3.0 → taskito-0.5.0}/Cargo.lock +49 -14
  2. {taskito-0.3.0 → taskito-0.5.0}/Cargo.toml +2 -1
  3. {taskito-0.3.0 → taskito-0.5.0}/PKG-INFO +6 -3
  4. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/Cargo.toml +2 -1
  5. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/error.rs +3 -0
  6. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/lib.rs +1 -0
  7. taskito-0.5.0/crates/taskito-core/src/scheduler/maintenance.rs +139 -0
  8. taskito-0.3.0/crates/taskito-core/src/scheduler.rs → taskito-0.5.0/crates/taskito-core/src/scheduler/mod.rs +33 -308
  9. taskito-0.5.0/crates/taskito-core/src/scheduler/poller.rs +93 -0
  10. taskito-0.5.0/crates/taskito-core/src/scheduler/result_handler.rs +120 -0
  11. taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/jobs.rs +934 -0
  12. taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/locks.rs +93 -0
  13. taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/logs.rs +88 -0
  14. taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/metrics.rs +122 -0
  15. taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/mod.rs +14 -0
  16. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/mod.rs +172 -7
  17. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/models.rs +47 -2
  18. taskito-0.5.0/crates/taskito-core/src/storage/postgres/jobs.rs +13 -0
  19. taskito-0.5.0/crates/taskito-core/src/storage/postgres/locks.rs +86 -0
  20. taskito-0.5.0/crates/taskito-core/src/storage/postgres/logs.rs +9 -0
  21. taskito-0.5.0/crates/taskito-core/src/storage/postgres/metrics.rs +9 -0
  22. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/mod.rs +46 -0
  23. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/workers.rs +17 -3
  24. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/jobs.rs +128 -0
  25. taskito-0.5.0/crates/taskito-core/src/storage/redis_backend/locks.rs +180 -0
  26. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/mod.rs +1 -0
  27. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/workers.rs +26 -10
  28. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/schema.rs +20 -0
  29. taskito-0.5.0/crates/taskito-core/src/storage/sqlite/jobs.rs +13 -0
  30. taskito-0.5.0/crates/taskito-core/src/storage/sqlite/locks.rs +70 -0
  31. taskito-0.5.0/crates/taskito-core/src/storage/sqlite/logs.rs +9 -0
  32. taskito-0.5.0/crates/taskito-core/src/storage/sqlite/metrics.rs +9 -0
  33. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/mod.rs +43 -0
  34. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/workers.rs +17 -3
  35. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/traits.rs +45 -2
  36. taskito-0.5.0/crates/taskito-core/src/worker.rs +16 -0
  37. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/tests/rust/storage_tests.rs +11 -2
  38. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/Cargo.toml +5 -1
  39. taskito-0.5.0/crates/taskito-python/src/async_worker.rs +134 -0
  40. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/src/lib.rs +5 -1
  41. taskito-0.5.0/crates/taskito-python/src/py_queue/inspection.rs +456 -0
  42. taskito-0.5.0/crates/taskito-python/src/py_queue/mod.rs +513 -0
  43. taskito-0.5.0/crates/taskito-python/src/py_queue/worker.rs +311 -0
  44. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/src/py_worker.rs +9 -5
  45. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/__init__.py +23 -1
  46. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/_taskito.pyi +67 -0
  47. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/app.py +468 -191
  48. taskito-0.5.0/py_src/taskito/async_support/__init__.py +25 -0
  49. taskito-0.5.0/py_src/taskito/async_support/context.py +32 -0
  50. taskito-0.5.0/py_src/taskito/async_support/executor.py +218 -0
  51. taskito-0.5.0/py_src/taskito/async_support/helpers.py +17 -0
  52. taskito-0.5.0/py_src/taskito/async_support/locks.py +95 -0
  53. taskito-0.5.0/py_src/taskito/async_support/mixins.py +183 -0
  54. taskito-0.5.0/py_src/taskito/async_support/result.py +61 -0
  55. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/cli.py +111 -0
  56. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/context.py +10 -3
  57. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/fastapi.py +41 -0
  58. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/prometheus.py +133 -3
  59. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/dashboard.py +138 -19
  60. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/exceptions.py +28 -0
  61. taskito-0.5.0/py_src/taskito/health.py +59 -0
  62. taskito-0.5.0/py_src/taskito/inject.py +42 -0
  63. taskito-0.5.0/py_src/taskito/interception/__init__.py +25 -0
  64. taskito-0.5.0/py_src/taskito/interception/built_in.py +363 -0
  65. taskito-0.5.0/py_src/taskito/interception/converters.py +243 -0
  66. taskito-0.5.0/py_src/taskito/interception/errors.py +45 -0
  67. taskito-0.5.0/py_src/taskito/interception/interceptor.py +207 -0
  68. taskito-0.5.0/py_src/taskito/interception/metrics.py +46 -0
  69. taskito-0.5.0/py_src/taskito/interception/reconstruct.py +69 -0
  70. taskito-0.5.0/py_src/taskito/interception/registry.py +86 -0
  71. taskito-0.5.0/py_src/taskito/interception/strategy.py +13 -0
  72. taskito-0.5.0/py_src/taskito/interception/walker.py +266 -0
  73. taskito-0.5.0/py_src/taskito/locks.py +151 -0
  74. taskito-0.5.0/py_src/taskito/mixins.py +358 -0
  75. taskito-0.5.0/py_src/taskito/proxies/__init__.py +14 -0
  76. taskito-0.5.0/py_src/taskito/proxies/built_in.py +77 -0
  77. taskito-0.5.0/py_src/taskito/proxies/handler.py +30 -0
  78. taskito-0.5.0/py_src/taskito/proxies/handlers/__init__.py +9 -0
  79. taskito-0.5.0/py_src/taskito/proxies/handlers/boto3_client.py +54 -0
  80. taskito-0.5.0/py_src/taskito/proxies/handlers/file.py +78 -0
  81. taskito-0.5.0/py_src/taskito/proxies/handlers/gcs_client.py +75 -0
  82. taskito-0.5.0/py_src/taskito/proxies/handlers/httpx_client.py +61 -0
  83. taskito-0.5.0/py_src/taskito/proxies/handlers/logger.py +32 -0
  84. taskito-0.5.0/py_src/taskito/proxies/handlers/requests_session.py +49 -0
  85. taskito-0.5.0/py_src/taskito/proxies/metrics.py +86 -0
  86. taskito-0.5.0/py_src/taskito/proxies/no_proxy.py +22 -0
  87. taskito-0.5.0/py_src/taskito/proxies/reconstruct.py +203 -0
  88. taskito-0.5.0/py_src/taskito/proxies/registry.py +32 -0
  89. taskito-0.5.0/py_src/taskito/proxies/schema.py +50 -0
  90. taskito-0.5.0/py_src/taskito/proxies/signing.py +35 -0
  91. taskito-0.5.0/py_src/taskito/resources/__init__.py +22 -0
  92. taskito-0.5.0/py_src/taskito/resources/definition.py +39 -0
  93. taskito-0.5.0/py_src/taskito/resources/frozen.py +40 -0
  94. taskito-0.5.0/py_src/taskito/resources/graph.py +76 -0
  95. taskito-0.5.0/py_src/taskito/resources/health.py +105 -0
  96. taskito-0.5.0/py_src/taskito/resources/pool.py +144 -0
  97. taskito-0.5.0/py_src/taskito/resources/runtime.py +266 -0
  98. taskito-0.5.0/py_src/taskito/resources/thread_local.py +61 -0
  99. taskito-0.5.0/py_src/taskito/resources/toml_config.py +117 -0
  100. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/result.py +3 -47
  101. taskito-0.5.0/py_src/taskito/scaler.py +121 -0
  102. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/task.py +21 -0
  103. taskito-0.5.0/py_src/taskito/templates/dashboard.css +368 -0
  104. taskito-0.5.0/py_src/taskito/templates/dashboard.html +40 -0
  105. taskito-0.5.0/py_src/taskito/templates/js/actions.js +34 -0
  106. taskito-0.5.0/py_src/taskito/templates/js/app.js +93 -0
  107. taskito-0.5.0/py_src/taskito/templates/js/chart.js +150 -0
  108. taskito-0.5.0/py_src/taskito/templates/js/components.js +58 -0
  109. taskito-0.5.0/py_src/taskito/templates/js/utils.js +19 -0
  110. taskito-0.5.0/py_src/taskito/templates/js/views.js +348 -0
  111. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/testing.py +73 -1
  112. {taskito-0.3.0 → taskito-0.5.0}/pyproject.toml +6 -5
  113. taskito-0.3.0/crates/taskito-core/src/storage/postgres/jobs.rs +0 -804
  114. taskito-0.3.0/crates/taskito-core/src/storage/postgres/logs.rs +0 -89
  115. taskito-0.3.0/crates/taskito-core/src/storage/postgres/metrics.rs +0 -115
  116. taskito-0.3.0/crates/taskito-core/src/storage/sqlite/jobs.rs +0 -808
  117. taskito-0.3.0/crates/taskito-core/src/storage/sqlite/logs.rs +0 -89
  118. taskito-0.3.0/crates/taskito-core/src/storage/sqlite/metrics.rs +0 -115
  119. taskito-0.3.0/crates/taskito-python/src/py_queue.rs +0 -1041
  120. taskito-0.3.0/py_src/taskito/mixins.py +0 -170
  121. taskito-0.3.0/py_src/taskito/templates/dashboard.html +0 -933
  122. {taskito-0.3.0 → taskito-0.5.0}/LICENSE +0 -0
  123. {taskito-0.3.0 → taskito-0.5.0}/README.md +0 -0
  124. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/job.rs +0 -0
  125. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/periodic.rs +0 -0
  126. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/circuit_breaker.rs +0 -0
  127. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/dlq.rs +0 -0
  128. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/mod.rs +0 -0
  129. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/rate_limiter.rs +0 -0
  130. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/retry.rs +0 -0
  131. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/archival.rs +0 -0
  132. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/circuit_breakers.rs +0 -0
  133. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/dead_letter.rs +0 -0
  134. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/periodic.rs +0 -0
  135. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/queue_state.rs +0 -0
  136. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/rate_limits.rs +0 -0
  137. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/trait_impl.rs +0 -0
  138. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/archival.rs +0 -0
  139. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/circuit_breakers.rs +0 -0
  140. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/dead_letter.rs +0 -0
  141. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/logs.rs +0 -0
  142. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/metrics.rs +0 -0
  143. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/periodic.rs +0 -0
  144. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/queue_state.rs +0 -0
  145. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/rate_limits.rs +0 -0
  146. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/trait_impl.rs +0 -0
  147. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/archival.rs +0 -0
  148. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/circuit_breakers.rs +0 -0
  149. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/dead_letter.rs +0 -0
  150. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/periodic.rs +0 -0
  151. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/queue_state.rs +0 -0
  152. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/rate_limits.rs +0 -0
  153. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/tests.rs +0 -0
  154. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/trait_impl.rs +0 -0
  155. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/tests/rust.rs +0 -0
  156. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/src/py_config.rs +0 -0
  157. {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/src/py_job.rs +0 -0
  158. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/canvas.py +0 -0
  159. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/__init__.py +0 -0
  160. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/__init__.py +0 -0
  161. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/admin.py +0 -0
  162. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/apps.py +0 -0
  163. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/__init__.py +0 -0
  164. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/commands/__init__.py +0 -0
  165. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/commands/taskito_dashboard.py +0 -0
  166. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/commands/taskito_info.py +0 -0
  167. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/commands/taskito_worker.py +0 -0
  168. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/settings.py +0 -0
  169. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/flask.py +0 -0
  170. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/otel.py +0 -0
  171. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/sentry.py +0 -0
  172. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/events.py +0 -0
  173. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/middleware.py +0 -0
  174. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/py.typed +0 -0
  175. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/serializers.py +0 -0
  176. {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/webhooks.py +0 -0
@@ -26,6 +26,17 @@ dependencies = [
26
26
  "rustversion",
27
27
  ]
28
28
 
29
+ [[package]]
30
+ name = "async-trait"
31
+ version = "0.1.89"
32
+ source = "registry+https://github.com/rust-lang/crates.io-index"
33
+ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
34
+ dependencies = [
35
+ "proc-macro2",
36
+ "quote",
37
+ "syn",
38
+ ]
39
+
29
40
  [[package]]
30
41
  name = "autocfg"
31
42
  version = "1.5.0"
@@ -183,9 +194,9 @@ dependencies = [
183
194
 
184
195
  [[package]]
185
196
  name = "diesel"
186
- version = "2.3.6"
197
+ version = "2.3.7"
187
198
  source = "registry+https://github.com/rust-lang/crates.io-index"
188
- checksum = "d9b6c2fc184a6fb6ebcf5f9a5e3bbfa84d8fd268cdfcce4ed508979a6259494d"
199
+ checksum = "f4ae09a41a4b89f94ec1e053623da8340d996bc32c6517d325a9daad9b239358"
189
200
  dependencies = [
190
201
  "bitflags",
191
202
  "byteorder",
@@ -520,6 +531,15 @@ dependencies = [
520
531
  "rustversion",
521
532
  ]
522
533
 
534
+ [[package]]
535
+ name = "inventory"
536
+ version = "0.3.22"
537
+ source = "registry+https://github.com/rust-lang/crates.io-index"
538
+ checksum = "009ae045c87e7082cb72dab0ccd01ae075dd00141ddc108f43a0ea150a9e7227"
539
+ dependencies = [
540
+ "rustversion",
541
+ ]
542
+
523
543
  [[package]]
524
544
  name = "itertools"
525
545
  version = "0.13.0"
@@ -673,9 +693,9 @@ dependencies = [
673
693
 
674
694
  [[package]]
675
695
  name = "once_cell"
676
- version = "1.21.3"
696
+ version = "1.21.4"
677
697
  source = "registry+https://github.com/rust-lang/crates.io-index"
678
- checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
698
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
679
699
 
680
700
  [[package]]
681
701
  name = "openssl-src"
@@ -688,9 +708,9 @@ dependencies = [
688
708
 
689
709
  [[package]]
690
710
  name = "openssl-sys"
691
- version = "0.9.111"
711
+ version = "0.9.112"
692
712
  source = "registry+https://github.com/rust-lang/crates.io-index"
693
- checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321"
713
+ checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb"
694
714
  dependencies = [
695
715
  "cc",
696
716
  "libc",
@@ -835,6 +855,7 @@ checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884"
835
855
  dependencies = [
836
856
  "cfg-if",
837
857
  "indoc",
858
+ "inventory",
838
859
  "libc",
839
860
  "memoffset",
840
861
  "once_cell",
@@ -1178,10 +1199,22 @@ version = "0.12.16"
1178
1199
  source = "registry+https://github.com/rust-lang/crates.io-index"
1179
1200
  checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
1180
1201
 
1202
+ [[package]]
1203
+ name = "taskito-async"
1204
+ version = "0.5.0"
1205
+ dependencies = [
1206
+ "async-trait",
1207
+ "crossbeam-channel",
1208
+ "pyo3",
1209
+ "taskito-core",
1210
+ "tokio",
1211
+ ]
1212
+
1181
1213
  [[package]]
1182
1214
  name = "taskito-core"
1183
- version = "0.3.0"
1215
+ version = "0.5.0"
1184
1216
  dependencies = [
1217
+ "async-trait",
1185
1218
  "chrono",
1186
1219
  "chrono-tz",
1187
1220
  "cron",
@@ -1203,10 +1236,12 @@ dependencies = [
1203
1236
 
1204
1237
  [[package]]
1205
1238
  name = "taskito-python"
1206
- version = "0.3.0"
1239
+ version = "0.5.0"
1207
1240
  dependencies = [
1241
+ "async-trait",
1208
1242
  "crossbeam-channel",
1209
1243
  "pyo3",
1244
+ "taskito-async",
1210
1245
  "taskito-core",
1211
1246
  "tokio",
1212
1247
  "uuid",
@@ -1214,9 +1249,9 @@ dependencies = [
1214
1249
 
1215
1250
  [[package]]
1216
1251
  name = "tempfile"
1217
- version = "3.26.0"
1252
+ version = "3.27.0"
1218
1253
  source = "registry+https://github.com/rust-lang/crates.io-index"
1219
- checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0"
1254
+ checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
1220
1255
  dependencies = [
1221
1256
  "fastrand",
1222
1257
  "getrandom 0.4.2",
@@ -1750,18 +1785,18 @@ dependencies = [
1750
1785
 
1751
1786
  [[package]]
1752
1787
  name = "zerocopy"
1753
- version = "0.8.40"
1788
+ version = "0.8.42"
1754
1789
  source = "registry+https://github.com/rust-lang/crates.io-index"
1755
- checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5"
1790
+ checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3"
1756
1791
  dependencies = [
1757
1792
  "zerocopy-derive",
1758
1793
  ]
1759
1794
 
1760
1795
  [[package]]
1761
1796
  name = "zerocopy-derive"
1762
- version = "0.8.40"
1797
+ version = "0.8.42"
1763
1798
  source = "registry+https://github.com/rust-lang/crates.io-index"
1764
- checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953"
1799
+ checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f"
1765
1800
  dependencies = [
1766
1801
  "proc-macro2",
1767
1802
  "quote",
@@ -19,4 +19,5 @@ chrono-tz = "0.10"
19
19
  log = "0.4"
20
20
  redis = { version = "0.27", features = ["script"] }
21
21
  openssl-sys = { version = "0.9", features = ["vendored"] }
22
- pyo3 = { version = "0.22", features = ["extension-module"] }
22
+ pyo3 = { version = "0.22", features = ["multiple-pymethods"] }
23
+ async-trait = "0.1"
@@ -1,11 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskito
3
- Version: 0.3.0
3
+ Version: 0.5.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
7
7
  Classifier: Programming Language :: Python :: 3
8
- Classifier: Programming Language :: Python :: 3.9
9
8
  Classifier: Programming Language :: Python :: 3.10
10
9
  Classifier: Programming Language :: Python :: 3.11
11
10
  Classifier: Programming Language :: Python :: 3.12
@@ -14,6 +13,7 @@ Classifier: Programming Language :: Rust
14
13
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
15
14
  Classifier: Topic :: System :: Distributed Computing
16
15
  Requires-Dist: cloudpickle>=3.0
16
+ Requires-Dist: boto3>=1.20 ; extra == 'aws'
17
17
  Requires-Dist: pytest>=7.0 ; extra == 'dev'
18
18
  Requires-Dist: pytest-asyncio>=0.21 ; extra == 'dev'
19
19
  Requires-Dist: pytest-cov>=4.0 ; extra == 'dev'
@@ -25,17 +25,20 @@ Requires-Dist: cryptography ; extra == 'encryption'
25
25
  Requires-Dist: fastapi>=0.100.0 ; extra == 'fastapi'
26
26
  Requires-Dist: pydantic>=2.0 ; extra == 'fastapi'
27
27
  Requires-Dist: flask>=2.0 ; extra == 'flask'
28
+ Requires-Dist: google-cloud-storage>=2.0 ; extra == 'gcs'
28
29
  Requires-Dist: msgpack ; extra == 'msgpack'
29
30
  Requires-Dist: opentelemetry-api ; extra == 'otel'
30
31
  Requires-Dist: opentelemetry-sdk ; extra == 'otel'
31
32
  Requires-Dist: prometheus-client ; extra == 'prometheus'
32
33
  Requires-Dist: sentry-sdk ; extra == 'sentry'
34
+ Provides-Extra: aws
33
35
  Provides-Extra: dev
34
36
  Provides-Extra: django
35
37
  Provides-Extra: docs
36
38
  Provides-Extra: encryption
37
39
  Provides-Extra: fastapi
38
40
  Provides-Extra: flask
41
+ Provides-Extra: gcs
39
42
  Provides-Extra: msgpack
40
43
  Provides-Extra: otel
41
44
  Provides-Extra: postgres
@@ -44,7 +47,7 @@ Provides-Extra: redis
44
47
  Provides-Extra: sentry
45
48
  License-File: LICENSE
46
49
  Summary: Rust-powered task queue for Python. No broker required.
47
- Requires-Python: >=3.9
50
+ Requires-Python: >=3.10
48
51
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
49
52
  Project-URL: Changelog, https://github.com/pratyush618/taskito/blob/master/docs/changelog.md
50
53
  Project-URL: Documentation, https://taskito.grigori.in
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "taskito-core"
3
- version = "0.3.0"
3
+ version = "0.5.0"
4
4
  edition = "2021"
5
5
 
6
6
  [features]
@@ -24,6 +24,7 @@ chrono = { workspace = true }
24
24
  cron = { workspace = true }
25
25
  chrono-tz = { workspace = true }
26
26
  log = { workspace = true }
27
+ async-trait = { workspace = true }
27
28
  redis = { workspace = true, optional = true }
28
29
 
29
30
  [dev-dependencies]
@@ -35,6 +35,9 @@ pub enum QueueError {
35
35
  #[error("dependency not found: {0}")]
36
36
  DependencyNotFound(String),
37
37
 
38
+ #[error("lock not acquired: {0}")]
39
+ LockNotAcquired(String),
40
+
38
41
  #[error("{0}")]
39
42
  Other(String),
40
43
  }
@@ -4,6 +4,7 @@ pub mod periodic;
4
4
  pub mod resilience;
5
5
  pub mod scheduler;
6
6
  pub mod storage;
7
+ pub mod worker;
7
8
 
8
9
  // Primary public API — the types most consumers need.
9
10
  pub use error::QueueError;
@@ -0,0 +1,139 @@
1
+ use log::{error, info, warn};
2
+
3
+ use crate::error::Result;
4
+ use crate::job::{now_millis, NewJob};
5
+ use crate::periodic::{next_cron_time, next_cron_time_tz};
6
+ use crate::storage::Storage;
7
+
8
+ use super::{JobResult, Scheduler};
9
+
10
+ /// Default max retries for periodic tasks.
11
+ const PERIODIC_DEFAULT_MAX_RETRIES: i32 = 3;
12
+
13
+ /// Default timeout for periodic tasks (ms).
14
+ const PERIODIC_DEFAULT_TIMEOUT_MS: i64 = 300_000;
15
+
16
+ impl Scheduler {
17
+ pub(super) fn reap_stale(&self) -> Result<()> {
18
+ let now = now_millis();
19
+ // Expire pending jobs that passed their TTL
20
+ if let Err(e) = self.storage.expire_pending_jobs(now) {
21
+ warn!("expire_pending_jobs error: {e}");
22
+ }
23
+ // Reap expired distributed locks
24
+ if let Err(e) = self.storage.reap_expired_locks(now) {
25
+ warn!("reap_expired_locks error: {e}");
26
+ }
27
+ // Purge stale execution claims (older than 1 hour)
28
+ let claim_cutoff = now.saturating_sub(3_600_000);
29
+ if let Err(e) = self.storage.purge_execution_claims(claim_cutoff) {
30
+ warn!("purge_execution_claims error: {e}");
31
+ }
32
+ let stale_jobs = self.storage.reap_stale_jobs(now)?;
33
+
34
+ for job in stale_jobs {
35
+ let error = format!("job timed out after {}ms", job.timeout_ms);
36
+ self.handle_result(JobResult::Failure {
37
+ job_id: job.id.clone(),
38
+ error,
39
+ retry_count: job.retry_count,
40
+ max_retries: job.max_retries,
41
+ task_name: job.task_name.clone(),
42
+ wall_time_ns: 0,
43
+ should_retry: true,
44
+ })?;
45
+ }
46
+
47
+ Ok(())
48
+ }
49
+
50
+ /// Purge old completed/dead jobs and their errors if result_ttl_ms is set.
51
+ pub(super) fn auto_cleanup(&self) -> Result<()> {
52
+ let ttl = match self.config.result_ttl_ms {
53
+ Some(t) => t,
54
+ None => return Ok(()),
55
+ };
56
+
57
+ let cutoff = now_millis().saturating_sub(ttl);
58
+
59
+ // Use per-job TTL aware cleanup
60
+ let completed = self.storage.purge_completed_with_ttl(cutoff)?;
61
+ let dead = self.storage.purge_dead(cutoff)?;
62
+ let errors = self.storage.purge_job_errors(cutoff)?;
63
+ let metrics = self.storage.purge_metrics(cutoff).unwrap_or_else(|e| {
64
+ warn!("purge_metrics failed: {e}");
65
+ 0
66
+ });
67
+ let logs = self.storage.purge_task_logs(cutoff).unwrap_or_else(|e| {
68
+ warn!("purge_task_logs failed: {e}");
69
+ 0
70
+ });
71
+
72
+ if completed + dead + errors + metrics + logs > 0 {
73
+ info!(
74
+ "auto-cleanup: purged {completed} completed, {dead} dead, {errors} errors, {metrics} metrics, {logs} logs"
75
+ );
76
+ }
77
+
78
+ Ok(())
79
+ }
80
+
81
+ /// Check for periodic tasks that are due and enqueue them.
82
+ pub(super) fn check_periodic(&self) -> Result<()> {
83
+ let now = now_millis();
84
+ let due_tasks = self.storage.get_due_periodic(now)?;
85
+
86
+ for task in due_tasks {
87
+ let unique_key = Some(format!("periodic:{}:{}", task.name, now));
88
+ let new_job = NewJob {
89
+ queue: task.queue.clone(),
90
+ task_name: task.task_name.clone(),
91
+ payload: Self::build_periodic_payload(&task.args),
92
+ priority: 0,
93
+ scheduled_at: now,
94
+ max_retries: PERIODIC_DEFAULT_MAX_RETRIES,
95
+ timeout_ms: PERIODIC_DEFAULT_TIMEOUT_MS,
96
+ unique_key,
97
+ metadata: None,
98
+ depends_on: vec![],
99
+ expires_at: None,
100
+ result_ttl_ms: None,
101
+ namespace: None,
102
+ };
103
+
104
+ if let Err(e) = self.storage.enqueue_unique(new_job) {
105
+ error!("failed to enqueue periodic task '{}': {e}", task.name);
106
+ continue;
107
+ }
108
+
109
+ let next_run = match if let Some(ref tz) = task.timezone {
110
+ next_cron_time_tz(&task.cron_expr, now, tz)
111
+ } else {
112
+ next_cron_time(&task.cron_expr, now)
113
+ } {
114
+ Ok(t) => t,
115
+ Err(e) => {
116
+ error!("failed to compute next run for '{}': {e}", task.name);
117
+ continue;
118
+ }
119
+ };
120
+
121
+ if let Err(e) = self
122
+ .storage
123
+ .update_periodic_schedule(&task.name, now, next_run)
124
+ {
125
+ error!("failed to update schedule for '{}': {e}", task.name);
126
+ }
127
+ }
128
+
129
+ Ok(())
130
+ }
131
+
132
+ /// Build a cloudpickle-compatible payload from stored args.
133
+ fn build_periodic_payload(args: &Option<Vec<u8>>) -> Vec<u8> {
134
+ match args {
135
+ Some(blob) => blob.clone(),
136
+ None => Vec::new(),
137
+ }
138
+ }
139
+ }