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.
- {taskito-0.3.0 → taskito-0.5.0}/Cargo.lock +49 -14
- {taskito-0.3.0 → taskito-0.5.0}/Cargo.toml +2 -1
- {taskito-0.3.0 → taskito-0.5.0}/PKG-INFO +6 -3
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/Cargo.toml +2 -1
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/error.rs +3 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/lib.rs +1 -0
- taskito-0.5.0/crates/taskito-core/src/scheduler/maintenance.rs +139 -0
- taskito-0.3.0/crates/taskito-core/src/scheduler.rs → taskito-0.5.0/crates/taskito-core/src/scheduler/mod.rs +33 -308
- taskito-0.5.0/crates/taskito-core/src/scheduler/poller.rs +93 -0
- taskito-0.5.0/crates/taskito-core/src/scheduler/result_handler.rs +120 -0
- taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/jobs.rs +934 -0
- taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/locks.rs +93 -0
- taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/logs.rs +88 -0
- taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/metrics.rs +122 -0
- taskito-0.5.0/crates/taskito-core/src/storage/diesel_common/mod.rs +14 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/mod.rs +172 -7
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/models.rs +47 -2
- taskito-0.5.0/crates/taskito-core/src/storage/postgres/jobs.rs +13 -0
- taskito-0.5.0/crates/taskito-core/src/storage/postgres/locks.rs +86 -0
- taskito-0.5.0/crates/taskito-core/src/storage/postgres/logs.rs +9 -0
- taskito-0.5.0/crates/taskito-core/src/storage/postgres/metrics.rs +9 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/mod.rs +46 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/workers.rs +17 -3
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/jobs.rs +128 -0
- taskito-0.5.0/crates/taskito-core/src/storage/redis_backend/locks.rs +180 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/mod.rs +1 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/workers.rs +26 -10
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/schema.rs +20 -0
- taskito-0.5.0/crates/taskito-core/src/storage/sqlite/jobs.rs +13 -0
- taskito-0.5.0/crates/taskito-core/src/storage/sqlite/locks.rs +70 -0
- taskito-0.5.0/crates/taskito-core/src/storage/sqlite/logs.rs +9 -0
- taskito-0.5.0/crates/taskito-core/src/storage/sqlite/metrics.rs +9 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/mod.rs +43 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/workers.rs +17 -3
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/traits.rs +45 -2
- taskito-0.5.0/crates/taskito-core/src/worker.rs +16 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/tests/rust/storage_tests.rs +11 -2
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/Cargo.toml +5 -1
- taskito-0.5.0/crates/taskito-python/src/async_worker.rs +134 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/src/lib.rs +5 -1
- taskito-0.5.0/crates/taskito-python/src/py_queue/inspection.rs +456 -0
- taskito-0.5.0/crates/taskito-python/src/py_queue/mod.rs +513 -0
- taskito-0.5.0/crates/taskito-python/src/py_queue/worker.rs +311 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/src/py_worker.rs +9 -5
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/__init__.py +23 -1
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/_taskito.pyi +67 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/app.py +468 -191
- taskito-0.5.0/py_src/taskito/async_support/__init__.py +25 -0
- taskito-0.5.0/py_src/taskito/async_support/context.py +32 -0
- taskito-0.5.0/py_src/taskito/async_support/executor.py +218 -0
- taskito-0.5.0/py_src/taskito/async_support/helpers.py +17 -0
- taskito-0.5.0/py_src/taskito/async_support/locks.py +95 -0
- taskito-0.5.0/py_src/taskito/async_support/mixins.py +183 -0
- taskito-0.5.0/py_src/taskito/async_support/result.py +61 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/cli.py +111 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/context.py +10 -3
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/fastapi.py +41 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/prometheus.py +133 -3
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/dashboard.py +138 -19
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/exceptions.py +28 -0
- taskito-0.5.0/py_src/taskito/health.py +59 -0
- taskito-0.5.0/py_src/taskito/inject.py +42 -0
- taskito-0.5.0/py_src/taskito/interception/__init__.py +25 -0
- taskito-0.5.0/py_src/taskito/interception/built_in.py +363 -0
- taskito-0.5.0/py_src/taskito/interception/converters.py +243 -0
- taskito-0.5.0/py_src/taskito/interception/errors.py +45 -0
- taskito-0.5.0/py_src/taskito/interception/interceptor.py +207 -0
- taskito-0.5.0/py_src/taskito/interception/metrics.py +46 -0
- taskito-0.5.0/py_src/taskito/interception/reconstruct.py +69 -0
- taskito-0.5.0/py_src/taskito/interception/registry.py +86 -0
- taskito-0.5.0/py_src/taskito/interception/strategy.py +13 -0
- taskito-0.5.0/py_src/taskito/interception/walker.py +266 -0
- taskito-0.5.0/py_src/taskito/locks.py +151 -0
- taskito-0.5.0/py_src/taskito/mixins.py +358 -0
- taskito-0.5.0/py_src/taskito/proxies/__init__.py +14 -0
- taskito-0.5.0/py_src/taskito/proxies/built_in.py +77 -0
- taskito-0.5.0/py_src/taskito/proxies/handler.py +30 -0
- taskito-0.5.0/py_src/taskito/proxies/handlers/__init__.py +9 -0
- taskito-0.5.0/py_src/taskito/proxies/handlers/boto3_client.py +54 -0
- taskito-0.5.0/py_src/taskito/proxies/handlers/file.py +78 -0
- taskito-0.5.0/py_src/taskito/proxies/handlers/gcs_client.py +75 -0
- taskito-0.5.0/py_src/taskito/proxies/handlers/httpx_client.py +61 -0
- taskito-0.5.0/py_src/taskito/proxies/handlers/logger.py +32 -0
- taskito-0.5.0/py_src/taskito/proxies/handlers/requests_session.py +49 -0
- taskito-0.5.0/py_src/taskito/proxies/metrics.py +86 -0
- taskito-0.5.0/py_src/taskito/proxies/no_proxy.py +22 -0
- taskito-0.5.0/py_src/taskito/proxies/reconstruct.py +203 -0
- taskito-0.5.0/py_src/taskito/proxies/registry.py +32 -0
- taskito-0.5.0/py_src/taskito/proxies/schema.py +50 -0
- taskito-0.5.0/py_src/taskito/proxies/signing.py +35 -0
- taskito-0.5.0/py_src/taskito/resources/__init__.py +22 -0
- taskito-0.5.0/py_src/taskito/resources/definition.py +39 -0
- taskito-0.5.0/py_src/taskito/resources/frozen.py +40 -0
- taskito-0.5.0/py_src/taskito/resources/graph.py +76 -0
- taskito-0.5.0/py_src/taskito/resources/health.py +105 -0
- taskito-0.5.0/py_src/taskito/resources/pool.py +144 -0
- taskito-0.5.0/py_src/taskito/resources/runtime.py +266 -0
- taskito-0.5.0/py_src/taskito/resources/thread_local.py +61 -0
- taskito-0.5.0/py_src/taskito/resources/toml_config.py +117 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/result.py +3 -47
- taskito-0.5.0/py_src/taskito/scaler.py +121 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/task.py +21 -0
- taskito-0.5.0/py_src/taskito/templates/dashboard.css +368 -0
- taskito-0.5.0/py_src/taskito/templates/dashboard.html +40 -0
- taskito-0.5.0/py_src/taskito/templates/js/actions.js +34 -0
- taskito-0.5.0/py_src/taskito/templates/js/app.js +93 -0
- taskito-0.5.0/py_src/taskito/templates/js/chart.js +150 -0
- taskito-0.5.0/py_src/taskito/templates/js/components.js +58 -0
- taskito-0.5.0/py_src/taskito/templates/js/utils.js +19 -0
- taskito-0.5.0/py_src/taskito/templates/js/views.js +348 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/testing.py +73 -1
- {taskito-0.3.0 → taskito-0.5.0}/pyproject.toml +6 -5
- taskito-0.3.0/crates/taskito-core/src/storage/postgres/jobs.rs +0 -804
- taskito-0.3.0/crates/taskito-core/src/storage/postgres/logs.rs +0 -89
- taskito-0.3.0/crates/taskito-core/src/storage/postgres/metrics.rs +0 -115
- taskito-0.3.0/crates/taskito-core/src/storage/sqlite/jobs.rs +0 -808
- taskito-0.3.0/crates/taskito-core/src/storage/sqlite/logs.rs +0 -89
- taskito-0.3.0/crates/taskito-core/src/storage/sqlite/metrics.rs +0 -115
- taskito-0.3.0/crates/taskito-python/src/py_queue.rs +0 -1041
- taskito-0.3.0/py_src/taskito/mixins.py +0 -170
- taskito-0.3.0/py_src/taskito/templates/dashboard.html +0 -933
- {taskito-0.3.0 → taskito-0.5.0}/LICENSE +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/README.md +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/job.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/periodic.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/circuit_breaker.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/dlq.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/mod.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/rate_limiter.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/resilience/retry.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/archival.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/circuit_breakers.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/dead_letter.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/periodic.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/queue_state.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/rate_limits.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/postgres/trait_impl.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/archival.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/circuit_breakers.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/dead_letter.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/logs.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/metrics.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/periodic.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/queue_state.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/rate_limits.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/redis_backend/trait_impl.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/archival.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/circuit_breakers.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/dead_letter.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/periodic.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/queue_state.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/rate_limits.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/tests.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/src/storage/sqlite/trait_impl.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-core/tests/rust.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/src/py_config.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/crates/taskito-python/src/py_job.rs +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/canvas.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/__init__.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/__init__.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/admin.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/apps.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/__init__.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/commands/__init__.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/commands/taskito_dashboard.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/commands/taskito_info.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/management/commands/taskito_worker.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/django/settings.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/flask.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/otel.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/contrib/sentry.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/events.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/middleware.py +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/py.typed +0 -0
- {taskito-0.3.0 → taskito-0.5.0}/py_src/taskito/serializers.py +0 -0
- {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.
|
|
197
|
+
version = "2.3.7"
|
|
187
198
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
188
|
-
checksum = "
|
|
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.
|
|
696
|
+
version = "1.21.4"
|
|
677
697
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
678
|
-
checksum = "
|
|
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.
|
|
711
|
+
version = "0.9.112"
|
|
692
712
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
693
|
-
checksum = "
|
|
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.
|
|
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.
|
|
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.
|
|
1252
|
+
version = "3.27.0"
|
|
1218
1253
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1219
|
-
checksum = "
|
|
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.
|
|
1788
|
+
version = "0.8.42"
|
|
1754
1789
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1755
|
-
checksum = "
|
|
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.
|
|
1797
|
+
version = "0.8.42"
|
|
1763
1798
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1764
|
-
checksum = "
|
|
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 = ["
|
|
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
|
+
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.
|
|
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
|
+
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]
|
|
@@ -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
|
+
}
|