prefect-client 3.1.12__py3-none-any.whl → 3.1.13__py3-none-any.whl
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.
- prefect/_experimental/sla/client.py +53 -27
- prefect/_experimental/sla/objects.py +10 -2
- prefect/_internal/concurrency/services.py +2 -2
- prefect/_internal/concurrency/threads.py +6 -0
- prefect/_internal/retries.py +6 -3
- prefect/_internal/schemas/validators.py +6 -4
- prefect/_version.py +3 -3
- prefect/artifacts.py +4 -1
- prefect/automations.py +1 -1
- prefect/blocks/abstract.py +5 -2
- prefect/blocks/notifications.py +1 -0
- prefect/cache_policies.py +20 -20
- prefect/client/utilities.py +3 -3
- prefect/deployments/base.py +7 -4
- prefect/deployments/flow_runs.py +5 -1
- prefect/deployments/runner.py +6 -11
- prefect/deployments/steps/core.py +1 -1
- prefect/deployments/steps/pull.py +8 -3
- prefect/deployments/steps/utility.py +2 -2
- prefect/docker/docker_image.py +13 -9
- prefect/engine.py +19 -10
- prefect/events/cli/automations.py +4 -4
- prefect/events/clients.py +17 -14
- prefect/events/schemas/automations.py +12 -8
- prefect/events/schemas/events.py +5 -1
- prefect/events/worker.py +1 -1
- prefect/filesystems.py +1 -1
- prefect/flow_engine.py +17 -9
- prefect/flows.py +118 -73
- prefect/futures.py +14 -7
- prefect/infrastructure/provisioners/__init__.py +2 -0
- prefect/infrastructure/provisioners/cloud_run.py +4 -4
- prefect/infrastructure/provisioners/coiled.py +249 -0
- prefect/infrastructure/provisioners/container_instance.py +4 -3
- prefect/infrastructure/provisioners/ecs.py +55 -43
- prefect/infrastructure/provisioners/modal.py +5 -4
- prefect/input/actions.py +5 -1
- prefect/input/run_input.py +157 -43
- prefect/logging/configuration.py +3 -3
- prefect/logging/filters.py +2 -2
- prefect/logging/formatters.py +15 -11
- prefect/logging/handlers.py +24 -14
- prefect/logging/highlighters.py +5 -5
- prefect/logging/loggers.py +28 -18
- prefect/main.py +3 -1
- prefect/results.py +166 -86
- prefect/runner/runner.py +34 -27
- prefect/runner/server.py +3 -1
- prefect/runner/storage.py +18 -18
- prefect/runner/submit.py +19 -12
- prefect/runtime/deployment.py +15 -8
- prefect/runtime/flow_run.py +19 -6
- prefect/runtime/task_run.py +7 -3
- prefect/settings/base.py +17 -7
- prefect/settings/legacy.py +4 -4
- prefect/settings/models/api.py +4 -3
- prefect/settings/models/cli.py +4 -3
- prefect/settings/models/client.py +7 -4
- prefect/settings/models/cloud.py +4 -3
- prefect/settings/models/deployments.py +4 -3
- prefect/settings/models/experiments.py +4 -3
- prefect/settings/models/flows.py +4 -3
- prefect/settings/models/internal.py +4 -3
- prefect/settings/models/logging.py +8 -6
- prefect/settings/models/results.py +4 -3
- prefect/settings/models/root.py +11 -16
- prefect/settings/models/runner.py +8 -5
- prefect/settings/models/server/api.py +6 -3
- prefect/settings/models/server/database.py +120 -25
- prefect/settings/models/server/deployments.py +4 -3
- prefect/settings/models/server/ephemeral.py +7 -4
- prefect/settings/models/server/events.py +6 -3
- prefect/settings/models/server/flow_run_graph.py +4 -3
- prefect/settings/models/server/root.py +4 -3
- prefect/settings/models/server/services.py +15 -12
- prefect/settings/models/server/tasks.py +7 -4
- prefect/settings/models/server/ui.py +4 -3
- prefect/settings/models/tasks.py +10 -5
- prefect/settings/models/testing.py +4 -3
- prefect/settings/models/worker.py +7 -4
- prefect/settings/profiles.py +13 -12
- prefect/settings/sources.py +20 -19
- prefect/states.py +17 -13
- prefect/task_engine.py +43 -33
- prefect/task_runners.py +35 -23
- prefect/task_runs.py +20 -11
- prefect/task_worker.py +12 -7
- prefect/tasks.py +30 -24
- prefect/telemetry/bootstrap.py +4 -1
- prefect/telemetry/run_telemetry.py +15 -13
- prefect/transactions.py +3 -3
- prefect/types/__init__.py +3 -1
- prefect/utilities/_deprecated.py +38 -0
- prefect/utilities/engine.py +11 -4
- prefect/utilities/filesystem.py +2 -2
- prefect/utilities/generics.py +1 -1
- prefect/utilities/pydantic.py +21 -36
- prefect/workers/base.py +52 -30
- prefect/workers/process.py +20 -15
- prefect/workers/server.py +4 -5
- {prefect_client-3.1.12.dist-info → prefect_client-3.1.13.dist-info}/METADATA +2 -2
- {prefect_client-3.1.12.dist-info → prefect_client-3.1.13.dist-info}/RECORD +105 -103
- {prefect_client-3.1.12.dist-info → prefect_client-3.1.13.dist-info}/LICENSE +0 -0
- {prefect_client-3.1.12.dist-info → prefect_client-3.1.13.dist-info}/WHEEL +0 -0
- {prefect_client-3.1.12.dist-info → prefect_client-3.1.13.dist-info}/top_level.txt +0 -0
prefect/workers/base.py
CHANGED
@@ -1,9 +1,22 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import abc
|
2
4
|
import asyncio
|
3
5
|
import threading
|
4
6
|
from contextlib import AsyncExitStack
|
5
7
|
from functools import partial
|
6
|
-
from typing import
|
8
|
+
from typing import (
|
9
|
+
TYPE_CHECKING,
|
10
|
+
Any,
|
11
|
+
Callable,
|
12
|
+
Dict,
|
13
|
+
Generic,
|
14
|
+
List,
|
15
|
+
Optional,
|
16
|
+
Set,
|
17
|
+
Type,
|
18
|
+
Union,
|
19
|
+
)
|
7
20
|
from uuid import UUID, uuid4
|
8
21
|
|
9
22
|
import anyio
|
@@ -13,7 +26,7 @@ import pendulum
|
|
13
26
|
from importlib_metadata import distributions
|
14
27
|
from pydantic import BaseModel, Field, PrivateAttr, field_validator
|
15
28
|
from pydantic.json_schema import GenerateJsonSchema
|
16
|
-
from typing_extensions import Literal
|
29
|
+
from typing_extensions import Literal, Self, TypeVar
|
17
30
|
|
18
31
|
import prefect
|
19
32
|
from prefect._internal.schemas.validators import return_v_or_none
|
@@ -104,7 +117,7 @@ class BaseJobConfiguration(BaseModel):
|
|
104
117
|
_related_objects: Dict[str, Any] = PrivateAttr(default_factory=dict)
|
105
118
|
|
106
119
|
@property
|
107
|
-
def is_using_a_runner(self):
|
120
|
+
def is_using_a_runner(self) -> bool:
|
108
121
|
return self.command is not None and "prefect flow-run execute" in self.command
|
109
122
|
|
110
123
|
@field_validator("command")
|
@@ -175,7 +188,7 @@ class BaseJobConfiguration(BaseModel):
|
|
175
188
|
return cls(**populated_configuration)
|
176
189
|
|
177
190
|
@classmethod
|
178
|
-
def json_template(cls) -> dict:
|
191
|
+
def json_template(cls) -> dict[str, Any]:
|
179
192
|
"""Returns a dict with job configuration as keys and the corresponding templates as values
|
180
193
|
|
181
194
|
Defaults to using the job configuration parameter name as the template variable name.
|
@@ -186,7 +199,7 @@ class BaseJobConfiguration(BaseModel):
|
|
186
199
|
key2: '{{ template2 }}', # `template2` specifically provide as template
|
187
200
|
}
|
188
201
|
"""
|
189
|
-
configuration = {}
|
202
|
+
configuration: dict[str, Any] = {}
|
190
203
|
properties = cls.model_json_schema()["properties"]
|
191
204
|
for k, v in properties.items():
|
192
205
|
if v.get("template"):
|
@@ -202,7 +215,7 @@ class BaseJobConfiguration(BaseModel):
|
|
202
215
|
flow_run: "FlowRun",
|
203
216
|
deployment: Optional["DeploymentResponse"] = None,
|
204
217
|
flow: Optional["Flow"] = None,
|
205
|
-
):
|
218
|
+
) -> None:
|
206
219
|
"""
|
207
220
|
Prepare the job configuration for a flow run.
|
208
221
|
|
@@ -368,15 +381,20 @@ class BaseWorkerResult(BaseModel, abc.ABC):
|
|
368
381
|
identifier: str
|
369
382
|
status_code: int
|
370
383
|
|
371
|
-
def __bool__(self):
|
384
|
+
def __bool__(self) -> bool:
|
372
385
|
return self.status_code == 0
|
373
386
|
|
374
387
|
|
388
|
+
C = TypeVar("C", bound=BaseJobConfiguration)
|
389
|
+
V = TypeVar("V", bound=BaseVariables)
|
390
|
+
R = TypeVar("R", bound=BaseWorkerResult)
|
391
|
+
|
392
|
+
|
375
393
|
@register_base_type
|
376
|
-
class BaseWorker(abc.ABC):
|
394
|
+
class BaseWorker(abc.ABC, Generic[C, V, R]):
|
377
395
|
type: str
|
378
|
-
job_configuration: Type[
|
379
|
-
job_configuration_variables: Optional[Type[
|
396
|
+
job_configuration: Type[C] = BaseJobConfiguration # type: ignore
|
397
|
+
job_configuration_variables: Optional[Type[V]] = None
|
380
398
|
|
381
399
|
_documentation_url = ""
|
382
400
|
_logo_url = ""
|
@@ -418,7 +436,7 @@ class BaseWorker(abc.ABC):
|
|
418
436
|
"""
|
419
437
|
if name and ("/" in name or "%" in name):
|
420
438
|
raise ValueError("Worker name cannot contain '/' or '%'")
|
421
|
-
self.name = name or f"{self.__class__.__name__} {uuid4()}"
|
439
|
+
self.name: str = name or f"{self.__class__.__name__} {uuid4()}"
|
422
440
|
self._started_event: Optional[Event] = None
|
423
441
|
self.backend_id: Optional[UUID] = None
|
424
442
|
self._logger = get_worker_logger(self)
|
@@ -432,7 +450,7 @@ class BaseWorker(abc.ABC):
|
|
432
450
|
self._prefetch_seconds: float = (
|
433
451
|
prefetch_seconds or PREFECT_WORKER_PREFETCH_SECONDS.value()
|
434
452
|
)
|
435
|
-
self.heartbeat_interval_seconds = (
|
453
|
+
self.heartbeat_interval_seconds: int = (
|
436
454
|
heartbeat_interval_seconds or PREFECT_WORKER_HEARTBEAT_SECONDS.value()
|
437
455
|
)
|
438
456
|
|
@@ -461,7 +479,7 @@ class BaseWorker(abc.ABC):
|
|
461
479
|
return cls._description
|
462
480
|
|
463
481
|
@classmethod
|
464
|
-
def get_default_base_job_template(cls) ->
|
482
|
+
def get_default_base_job_template(cls) -> dict[str, Any]:
|
465
483
|
if cls.job_configuration_variables is None:
|
466
484
|
schema = cls.job_configuration.model_json_schema()
|
467
485
|
# remove "template" key from all dicts in schema['properties'] because it is not a
|
@@ -479,7 +497,9 @@ class BaseWorker(abc.ABC):
|
|
479
497
|
}
|
480
498
|
|
481
499
|
@staticmethod
|
482
|
-
def get_worker_class_from_type(
|
500
|
+
def get_worker_class_from_type(
|
501
|
+
type: str,
|
502
|
+
) -> Optional[Type["BaseWorker[Any, Any, Any]"]]:
|
483
503
|
"""
|
484
504
|
Returns the worker class for a given worker type. If the worker type
|
485
505
|
is not recognized, returns None.
|
@@ -500,7 +520,7 @@ class BaseWorker(abc.ABC):
|
|
500
520
|
return list(worker_registry.keys())
|
501
521
|
return []
|
502
522
|
|
503
|
-
def get_name_slug(self):
|
523
|
+
def get_name_slug(self) -> str:
|
504
524
|
return slugify(self.name)
|
505
525
|
|
506
526
|
def get_flow_run_logger(self, flow_run: "FlowRun") -> PrefectLogAdapter:
|
@@ -524,7 +544,7 @@ class BaseWorker(abc.ABC):
|
|
524
544
|
run_once: bool = False,
|
525
545
|
with_healthcheck: bool = False,
|
526
546
|
printer: Callable[..., None] = print,
|
527
|
-
):
|
547
|
+
) -> None:
|
528
548
|
"""
|
529
549
|
Starts the worker and runs the main worker loops.
|
530
550
|
|
@@ -603,9 +623,9 @@ class BaseWorker(abc.ABC):
|
|
603
623
|
async def run(
|
604
624
|
self,
|
605
625
|
flow_run: "FlowRun",
|
606
|
-
configuration:
|
607
|
-
task_status: Optional[anyio.abc.TaskStatus] = None,
|
608
|
-
) ->
|
626
|
+
configuration: C,
|
627
|
+
task_status: Optional[anyio.abc.TaskStatus[int]] = None,
|
628
|
+
) -> R:
|
609
629
|
"""
|
610
630
|
Runs a given flow run on the current worker.
|
611
631
|
"""
|
@@ -614,12 +634,12 @@ class BaseWorker(abc.ABC):
|
|
614
634
|
)
|
615
635
|
|
616
636
|
@classmethod
|
617
|
-
def __dispatch_key__(cls):
|
637
|
+
def __dispatch_key__(cls) -> str | None:
|
618
638
|
if cls.__name__ == "BaseWorker":
|
619
639
|
return None # The base class is abstract
|
620
640
|
return cls.type
|
621
641
|
|
622
|
-
async def setup(self):
|
642
|
+
async def setup(self) -> None:
|
623
643
|
"""Prepares the worker to run."""
|
624
644
|
self._logger.debug("Setting up worker...")
|
625
645
|
self._runs_task_group = anyio.create_task_group()
|
@@ -637,10 +657,10 @@ class BaseWorker(abc.ABC):
|
|
637
657
|
|
638
658
|
self.is_setup = True
|
639
659
|
|
640
|
-
async def teardown(self, *exc_info):
|
660
|
+
async def teardown(self, *exc_info: Any) -> None:
|
641
661
|
"""Cleans up resources after the worker is stopped."""
|
642
662
|
self._logger.debug("Tearing down worker...")
|
643
|
-
self.is_setup = False
|
663
|
+
self.is_setup: bool = False
|
644
664
|
for scope in self._scheduled_task_scopes:
|
645
665
|
scope.cancel()
|
646
666
|
|
@@ -684,14 +704,16 @@ class BaseWorker(abc.ABC):
|
|
684
704
|
|
685
705
|
return is_still_polling
|
686
706
|
|
687
|
-
async def get_and_submit_flow_runs(self):
|
707
|
+
async def get_and_submit_flow_runs(self) -> list["FlowRun"]:
|
688
708
|
runs_response = await self._get_scheduled_flow_runs()
|
689
709
|
|
690
710
|
self._last_polled_time = pendulum.now("utc")
|
691
711
|
|
692
712
|
return await self._submit_scheduled_flow_runs(flow_run_response=runs_response)
|
693
713
|
|
694
|
-
async def _update_local_work_pool_info(self):
|
714
|
+
async def _update_local_work_pool_info(self) -> None:
|
715
|
+
if TYPE_CHECKING:
|
716
|
+
assert self._client is not None
|
695
717
|
try:
|
696
718
|
work_pool = await self._client.read_work_pool(
|
697
719
|
work_pool_name=self._work_pool_name
|
@@ -803,7 +825,7 @@ class BaseWorker(abc.ABC):
|
|
803
825
|
|
804
826
|
return worker_id
|
805
827
|
|
806
|
-
async def sync_with_backend(self):
|
828
|
+
async def sync_with_backend(self) -> None:
|
807
829
|
"""
|
808
830
|
Updates the worker's local information about it's current work pool and
|
809
831
|
queues. Sends a worker heartbeat to the API.
|
@@ -1042,7 +1064,7 @@ class BaseWorker(abc.ABC):
|
|
1042
1064
|
self._limiter.release_on_behalf_of(flow_run_id)
|
1043
1065
|
self._logger.debug("Limit slot released for flow run '%s'", flow_run_id)
|
1044
1066
|
|
1045
|
-
def get_status(self):
|
1067
|
+
def get_status(self) -> dict[str, Any]:
|
1046
1068
|
"""
|
1047
1069
|
Retrieves the status of the current worker including its name, current worker
|
1048
1070
|
pool, the work pool queues it is polling, and its local settings.
|
@@ -1234,17 +1256,17 @@ class BaseWorker(abc.ABC):
|
|
1234
1256
|
|
1235
1257
|
await self._client.update_flow_run_labels(flow_run_id, labels)
|
1236
1258
|
|
1237
|
-
async def __aenter__(self):
|
1259
|
+
async def __aenter__(self) -> Self:
|
1238
1260
|
self._logger.debug("Entering worker context...")
|
1239
1261
|
await self.setup()
|
1240
1262
|
|
1241
1263
|
return self
|
1242
1264
|
|
1243
|
-
async def __aexit__(self, *exc_info):
|
1265
|
+
async def __aexit__(self, *exc_info: Any) -> None:
|
1244
1266
|
self._logger.debug("Exiting worker context...")
|
1245
1267
|
await self.teardown(*exc_info)
|
1246
1268
|
|
1247
|
-
def __repr__(self):
|
1269
|
+
def __repr__(self) -> str:
|
1248
1270
|
return f"Worker(pool={self._work_pool_name!r}, name={self.name!r})"
|
1249
1271
|
|
1250
1272
|
def _event_resource(self):
|
prefect/workers/process.py
CHANGED
@@ -13,6 +13,7 @@ to poll for flow runs.
|
|
13
13
|
For more information about work pools and workers,
|
14
14
|
checkout out the [Prefect docs](/concepts/work-pools/).
|
15
15
|
"""
|
16
|
+
from __future__ import annotations
|
16
17
|
|
17
18
|
import contextlib
|
18
19
|
import os
|
@@ -30,7 +31,7 @@ import anyio
|
|
30
31
|
import anyio.abc
|
31
32
|
from pydantic import Field, field_validator
|
32
33
|
|
33
|
-
from prefect._internal.schemas.validators import
|
34
|
+
from prefect._internal.schemas.validators import validate_working_dir
|
34
35
|
from prefect.client.schemas import FlowRun
|
35
36
|
from prefect.client.schemas.filters import (
|
36
37
|
FlowRunFilter,
|
@@ -85,19 +86,21 @@ class ProcessJobConfiguration(BaseJobConfiguration):
|
|
85
86
|
|
86
87
|
@field_validator("working_dir")
|
87
88
|
@classmethod
|
88
|
-
def
|
89
|
-
|
89
|
+
def validate_working_dir(cls, v: Path | str | None) -> Path | None:
|
90
|
+
if isinstance(v, str):
|
91
|
+
return validate_working_dir(v)
|
92
|
+
return v
|
90
93
|
|
91
94
|
def prepare_for_flow_run(
|
92
95
|
self,
|
93
96
|
flow_run: "FlowRun",
|
94
97
|
deployment: Optional["DeploymentResponse"] = None,
|
95
98
|
flow: Optional["Flow"] = None,
|
96
|
-
):
|
99
|
+
) -> None:
|
97
100
|
super().prepare_for_flow_run(flow_run, deployment, flow)
|
98
101
|
|
99
|
-
self.env = {**os.environ, **self.env}
|
100
|
-
self.command = (
|
102
|
+
self.env: dict[str, str | None] = {**os.environ, **self.env}
|
103
|
+
self.command: str | None = (
|
101
104
|
f"{get_sys_executable()} -m prefect.engine"
|
102
105
|
if self.command == self._base_flow_run_command()
|
103
106
|
else self.command
|
@@ -134,10 +137,12 @@ class ProcessWorkerResult(BaseWorkerResult):
|
|
134
137
|
"""Contains information about the final state of a completed process"""
|
135
138
|
|
136
139
|
|
137
|
-
class ProcessWorker(
|
140
|
+
class ProcessWorker(
|
141
|
+
BaseWorker[ProcessJobConfiguration, ProcessVariables, ProcessWorkerResult]
|
142
|
+
):
|
138
143
|
type = "process"
|
139
|
-
job_configuration = ProcessJobConfiguration
|
140
|
-
job_configuration_variables = ProcessVariables
|
144
|
+
job_configuration: type[ProcessJobConfiguration] = ProcessJobConfiguration
|
145
|
+
job_configuration_variables: type[ProcessVariables] | None = ProcessVariables
|
141
146
|
|
142
147
|
_description = (
|
143
148
|
"Execute flow runs as subprocesses on a worker. Works well for local execution"
|
@@ -152,7 +157,7 @@ class ProcessWorker(BaseWorker):
|
|
152
157
|
run_once: bool = False,
|
153
158
|
with_healthcheck: bool = False,
|
154
159
|
printer: Callable[..., None] = print,
|
155
|
-
):
|
160
|
+
) -> None:
|
156
161
|
"""
|
157
162
|
Starts the worker and runs the main worker loops.
|
158
163
|
|
@@ -241,8 +246,8 @@ class ProcessWorker(BaseWorker):
|
|
241
246
|
self,
|
242
247
|
flow_run: FlowRun,
|
243
248
|
configuration: ProcessJobConfiguration,
|
244
|
-
task_status: Optional[anyio.abc.TaskStatus] = None,
|
245
|
-
):
|
249
|
+
task_status: Optional[anyio.abc.TaskStatus[int]] = None,
|
250
|
+
) -> ProcessWorkerResult:
|
246
251
|
command = configuration.command
|
247
252
|
if not command:
|
248
253
|
command = f"{get_sys_executable()} -m prefect.engine"
|
@@ -322,7 +327,7 @@ class ProcessWorker(BaseWorker):
|
|
322
327
|
self,
|
323
328
|
infrastructure_pid: str,
|
324
329
|
grace_seconds: int = 30,
|
325
|
-
):
|
330
|
+
) -> None:
|
326
331
|
hostname, pid = _parse_infrastructure_pid(infrastructure_pid)
|
327
332
|
|
328
333
|
if hostname != socket.gethostname():
|
@@ -372,7 +377,7 @@ class ProcessWorker(BaseWorker):
|
|
372
377
|
# process ended right after the check above.
|
373
378
|
return
|
374
379
|
|
375
|
-
async def check_for_cancelled_flow_runs(self):
|
380
|
+
async def check_for_cancelled_flow_runs(self) -> list["FlowRun"]:
|
376
381
|
if not self.is_setup:
|
377
382
|
raise RuntimeError(
|
378
383
|
"Worker is not set up. Please make sure you are running this worker "
|
@@ -429,7 +434,7 @@ class ProcessWorker(BaseWorker):
|
|
429
434
|
|
430
435
|
return cancelling_flow_runs
|
431
436
|
|
432
|
-
async def cancel_run(self, flow_run: "FlowRun"):
|
437
|
+
async def cancel_run(self, flow_run: "FlowRun") -> None:
|
433
438
|
run_logger = self.get_flow_run_logger(flow_run)
|
434
439
|
|
435
440
|
try:
|
prefect/workers/server.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import Any
|
2
2
|
|
3
3
|
import uvicorn
|
4
4
|
import uvicorn.server
|
@@ -10,14 +10,13 @@ from prefect.settings import (
|
|
10
10
|
PREFECT_WORKER_WEBSERVER_PORT,
|
11
11
|
)
|
12
12
|
from prefect.workers.base import BaseWorker
|
13
|
-
from prefect.workers.process import ProcessWorker
|
14
13
|
|
15
14
|
|
16
15
|
def build_healthcheck_server(
|
17
|
-
worker:
|
16
|
+
worker: BaseWorker[Any, Any, Any],
|
18
17
|
query_interval_seconds: float,
|
19
18
|
log_level: str = "error",
|
20
|
-
):
|
19
|
+
) -> uvicorn.Server:
|
21
20
|
"""
|
22
21
|
Build a healthcheck FastAPI server for a worker.
|
23
22
|
|
@@ -54,7 +53,7 @@ def build_healthcheck_server(
|
|
54
53
|
|
55
54
|
|
56
55
|
def start_healthcheck_server(
|
57
|
-
worker:
|
56
|
+
worker: BaseWorker[Any, Any, Any],
|
58
57
|
query_interval_seconds: float,
|
59
58
|
log_level: str = "error",
|
60
59
|
) -> None:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: prefect-client
|
3
|
-
Version: 3.1.
|
3
|
+
Version: 3.1.13
|
4
4
|
Summary: Workflow orchestration and management.
|
5
5
|
Home-page: https://www.prefect.io
|
6
6
|
Author: Prefect Technologies, Inc.
|
@@ -45,7 +45,7 @@ Requires-Dist: packaging<24.3,>=21.3
|
|
45
45
|
Requires-Dist: pathspec>=0.8.0
|
46
46
|
Requires-Dist: pendulum<4,>=3.0.0
|
47
47
|
Requires-Dist: prometheus-client>=0.20.0
|
48
|
-
Requires-Dist: pydantic!=2.10.0,<3.0.0,>=2.
|
48
|
+
Requires-Dist: pydantic!=2.10.0,<3.0.0,>=2.9
|
49
49
|
Requires-Dist: pydantic-core<3.0.0,>=2.12.0
|
50
50
|
Requires-Dist: pydantic-extra-types<3.0.0,>=2.8.2
|
51
51
|
Requires-Dist: pydantic-settings>2.2.1
|