prefect-client 3.3.6.dev3__py3-none-any.whl → 3.3.7__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/_build_info.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # Generated by versioningit
2
- __version__ = "3.3.6.dev3"
3
- __build_date__ = "2025-04-23 08:08:36.059139+00:00"
4
- __git_commit__ = "093237bfa0681dfcb1baeaee9b96da9803b6a879"
2
+ __version__ = "3.3.7"
3
+ __build_date__ = "2025-04-28 15:03:08.716974+00:00"
4
+ __git_commit__ = "8f86aaeee460bab1184336bf2f9cf62fef73d7bb"
5
5
  __dirty__ = False
@@ -11,7 +11,7 @@ import sys
11
11
  from pathlib import Path
12
12
  from typing import Any, TypedDict
13
13
 
14
- import cloudpickle
14
+ import cloudpickle # pyright: ignore[reportMissingTypeStubs]
15
15
 
16
16
  from prefect.client.schemas.objects import FlowRun
17
17
  from prefect.context import SettingsContext, get_settings_context, serialize_context
@@ -22,12 +22,18 @@ from prefect.settings.context import get_current_settings
22
22
  from prefect.settings.models.root import Settings
23
23
  from prefect.utilities.slugify import slugify
24
24
 
25
- try:
26
- import uv
25
+ from .execute import execute_bundle_from_file
27
26
 
28
- uv_path = uv.find_uv_bin()
29
- except (ImportError, ModuleNotFoundError):
30
- uv_path = "uv"
27
+
28
+ def _get_uv_path() -> str:
29
+ try:
30
+ import uv
31
+
32
+ uv_path = uv.find_uv_bin()
33
+ except (ImportError, ModuleNotFoundError):
34
+ uv_path = "uv"
35
+
36
+ return uv_path
31
37
 
32
38
 
33
39
  class SerializedBundle(TypedDict):
@@ -46,7 +52,7 @@ def _serialize_bundle_object(obj: Any) -> str:
46
52
  """
47
53
  Serializes an object to a string.
48
54
  """
49
- return base64.b64encode(gzip.compress(cloudpickle.dumps(obj))).decode()
55
+ return base64.b64encode(gzip.compress(cloudpickle.dumps(obj))).decode() # pyright: ignore[reportUnknownMemberType]
50
56
 
51
57
 
52
58
  def _deserialize_bundle_object(serialized_obj: str) -> Any:
@@ -80,7 +86,7 @@ def create_bundle_for_flow_run(
80
86
  "flow_run": flow_run.model_dump(mode="json"),
81
87
  "dependencies": subprocess.check_output(
82
88
  [
83
- uv_path,
89
+ _get_uv_path(),
84
90
  "pip",
85
91
  "freeze",
86
92
  # Exclude editable installs because we won't be able to install them in the execution environment
@@ -164,7 +170,7 @@ def execute_bundle_in_subprocess(
164
170
  # Install dependencies if necessary
165
171
  if dependencies := bundle.get("dependencies"):
166
172
  subprocess.check_call(
167
- [uv_path, "pip", "install", *dependencies.split("\n")],
173
+ [_get_uv_path(), "pip", "install", *dependencies.split("\n")],
168
174
  # Copy the current environment to ensure we install into the correct venv
169
175
  env=os.environ,
170
176
  )
@@ -238,3 +244,13 @@ def convert_step_to_command(
238
244
  command.extend(["--key", key])
239
245
 
240
246
  return command
247
+
248
+
249
+ __all__ = [
250
+ "execute_bundle_from_file",
251
+ "convert_step_to_command",
252
+ "create_bundle_for_flow_run",
253
+ "extract_flow_from_bundle",
254
+ "execute_bundle_in_subprocess",
255
+ "SerializedBundle",
256
+ ]
@@ -0,0 +1,27 @@
1
+ import json
2
+ import sys
3
+
4
+ from prefect.utilities.asyncutils import run_coro_as_sync
5
+
6
+
7
+ def execute_bundle_from_file(key: str):
8
+ """
9
+ Loads a bundle from a file and executes it.
10
+
11
+ Args:
12
+ key: The key of the bundle to execute.
13
+ """
14
+ with open(key, "r") as f:
15
+ bundle = json.load(f)
16
+
17
+ from prefect.runner.runner import Runner
18
+
19
+ run_coro_as_sync(Runner().execute_bundle(bundle))
20
+
21
+
22
+ if __name__ == "__main__":
23
+ if len(sys.argv) < 3 and sys.argv[1] != "--key":
24
+ print("Please provide a key representing a path to a bundle")
25
+ sys.exit(1)
26
+ key = sys.argv[2]
27
+ execute_bundle_from_file(key)
@@ -174,13 +174,13 @@ class EventLoopThread(Portal):
174
174
  # Track the portal running the call
175
175
  call.set_runner(self)
176
176
 
177
+ if self._run_once:
178
+ call.future.add_done_callback(lambda _: self.shutdown())
179
+
177
180
  # Submit the call to the event loop
178
181
  assert self._loop is not None
179
182
  asyncio.run_coroutine_threadsafe(self._run_call(call), self._loop)
180
-
181
183
  self._submitted_count += 1
182
- if self._run_once:
183
- call.future.add_done_callback(lambda _: self.shutdown())
184
184
 
185
185
  return call
186
186
 
prefect/_versioning.py CHANGED
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import os
4
4
  from enum import Enum
5
5
  from typing import Any, Callable, Coroutine, Dict, Literal, Optional
6
+ from urllib.parse import urlparse
6
7
 
7
8
  from anyio import run_process
8
9
  from pydantic import Field, model_validator
@@ -49,7 +50,7 @@ async def get_github_version_info(
49
50
 
50
51
  Args:
51
52
  version: The commit SHA, falls back to GITHUB_SHA env var
52
- branch: The git branch, falls back to GITHUB_REF env var
53
+ branch: The git branch, falls back to GITHUB_REF_NAME env var
53
54
  repository: The repository name, falls back to GITHUB_REPOSITORY env var
54
55
  url: The repository URL, constructed from GITHUB_SERVER_URL/GITHUB_REPOSITORY if not provided
55
56
 
@@ -60,14 +61,16 @@ async def get_github_version_info(
60
61
  ValueError: If any required fields cannot be determined
61
62
  """
62
63
  version = version or os.getenv("GITHUB_SHA")
63
- branch = branch or os.getenv("GITHUB_REF")
64
+ branch = branch or os.getenv("GITHUB_REF_NAME")
64
65
  repository = repository or os.getenv("GITHUB_REPOSITORY")
65
66
  url = url or f"{os.getenv('GITHUB_SERVER_URL')}/{repository}"
66
67
 
67
68
  if not version:
68
69
  raise ValueError("version is required - must be provided or set in GITHUB_SHA")
69
70
  if not branch:
70
- raise ValueError("branch is required - must be provided or set in GITHUB_REF")
71
+ raise ValueError(
72
+ "branch is required - must be provided or set in GITHUB_REF_NAME"
73
+ )
71
74
  if not repository:
72
75
  raise ValueError(
73
76
  "repository is required - must be provided or set in GITHUB_REPOSITORY"
@@ -104,8 +107,10 @@ async def get_git_version_info(
104
107
  remote_url = result.stdout.decode().strip()
105
108
 
106
109
  # Extract just the repository name (last part of the path)
107
- repo_name = os.path.basename(remote_url.split(":")[1].rstrip(".git"))
108
- repository = repo_name
110
+ repo_url = urlparse(remote_url)
111
+ repository = repo_url.path.strip("/")
112
+ if repository.endswith(".git"):
113
+ repository = repository[:-4]
109
114
 
110
115
  if not url and repository:
111
116
  # Use the full remote URL as the URL
prefect/flows.py CHANGED
@@ -65,7 +65,7 @@ from prefect.exceptions import (
65
65
  UnspecifiedFlowError,
66
66
  )
67
67
  from prefect.filesystems import LocalFileSystem, ReadableDeploymentStorage
68
- from prefect.futures import PrefectFuture
68
+ from prefect.futures import PrefectFlowRunFuture, PrefectFuture
69
69
  from prefect.logging import get_logger
70
70
  from prefect.logging.loggers import flow_run_logger
71
71
  from prefect.results import ResultSerializer, ResultStorage
@@ -2104,6 +2104,106 @@ class InfrastructureBoundFlow(Flow[P, R]):
2104
2104
  )
2105
2105
  )
2106
2106
 
2107
+ def submit(self, *args: P.args, **kwargs: P.kwargs) -> PrefectFlowRunFuture[R]:
2108
+ """
2109
+ EXPERIMENTAL: This method is experimental and may be removed or changed in future
2110
+ releases.
2111
+
2112
+ Submit the flow to run on remote infrastructure.
2113
+
2114
+ Args:
2115
+ *args: Positional arguments to pass to the flow.
2116
+ **kwargs: Keyword arguments to pass to the flow.
2117
+
2118
+ Returns:
2119
+ A `PrefectFlowRunFuture` that can be used to retrieve the result of the flow run.
2120
+
2121
+ Examples:
2122
+ Submit a flow to run on Kubernetes:
2123
+
2124
+ ```python
2125
+ from prefect import flow
2126
+ from prefect_kubernetes.experimental import kubernetes
2127
+
2128
+ @kubernetes(work_pool="my-kubernetes-work-pool")
2129
+ @flow
2130
+ def my_flow(x: int, y: int):
2131
+ return x + y
2132
+
2133
+ future = my_flow.submit(x=1, y=2)
2134
+ result = future.result()
2135
+ print(result)
2136
+ ```
2137
+ """
2138
+
2139
+ async def submit_func():
2140
+ async with self.worker_cls(work_pool_name=self.work_pool) as worker:
2141
+ parameters = get_call_parameters(self, args, kwargs)
2142
+ return await worker.submit(
2143
+ flow=self,
2144
+ parameters=parameters,
2145
+ job_variables=self.job_variables,
2146
+ )
2147
+
2148
+ return run_coro_as_sync(submit_func())
2149
+
2150
+ def with_options(
2151
+ self,
2152
+ *,
2153
+ name: Optional[str] = None,
2154
+ version: Optional[str] = None,
2155
+ retries: Optional[int] = None,
2156
+ retry_delay_seconds: Optional[Union[int, float]] = None,
2157
+ description: Optional[str] = None,
2158
+ flow_run_name: Optional[Union[Callable[[], str], str]] = None,
2159
+ task_runner: Union[
2160
+ Type[TaskRunner[PrefectFuture[Any]]], TaskRunner[PrefectFuture[Any]], None
2161
+ ] = None,
2162
+ timeout_seconds: Union[int, float, None] = None,
2163
+ validate_parameters: Optional[bool] = None,
2164
+ persist_result: Optional[bool] = NotSet, # type: ignore
2165
+ result_storage: Optional[ResultStorage] = NotSet, # type: ignore
2166
+ result_serializer: Optional[ResultSerializer] = NotSet, # type: ignore
2167
+ cache_result_in_memory: Optional[bool] = None,
2168
+ log_prints: Optional[bool] = NotSet, # type: ignore
2169
+ on_completion: Optional[list[FlowStateHook[P, R]]] = None,
2170
+ on_failure: Optional[list[FlowStateHook[P, R]]] = None,
2171
+ on_cancellation: Optional[list[FlowStateHook[P, R]]] = None,
2172
+ on_crashed: Optional[list[FlowStateHook[P, R]]] = None,
2173
+ on_running: Optional[list[FlowStateHook[P, R]]] = None,
2174
+ job_variables: Optional[dict[str, Any]] = None,
2175
+ ) -> "InfrastructureBoundFlow[P, R]":
2176
+ new_flow = super().with_options(
2177
+ name=name,
2178
+ version=version,
2179
+ retries=retries,
2180
+ retry_delay_seconds=retry_delay_seconds,
2181
+ description=description,
2182
+ flow_run_name=flow_run_name,
2183
+ task_runner=task_runner,
2184
+ timeout_seconds=timeout_seconds,
2185
+ validate_parameters=validate_parameters,
2186
+ persist_result=persist_result,
2187
+ result_storage=result_storage,
2188
+ result_serializer=result_serializer,
2189
+ cache_result_in_memory=cache_result_in_memory,
2190
+ log_prints=log_prints,
2191
+ on_completion=on_completion,
2192
+ on_failure=on_failure,
2193
+ on_cancellation=on_cancellation,
2194
+ on_crashed=on_crashed,
2195
+ on_running=on_running,
2196
+ )
2197
+ new_infrastructure_bound_flow = bind_flow_to_infrastructure(
2198
+ new_flow,
2199
+ self.work_pool,
2200
+ self.worker_cls,
2201
+ job_variables=job_variables
2202
+ if job_variables is not None
2203
+ else self.job_variables,
2204
+ )
2205
+ return new_infrastructure_bound_flow
2206
+
2107
2207
 
2108
2208
  def bind_flow_to_infrastructure(
2109
2209
  flow: Flow[P, R],
@@ -98,9 +98,31 @@ async def create_deployment(
98
98
  )
99
99
 
100
100
  # hydrate the input model into a full model
101
- deployment_dict = deployment.model_dump(
102
- exclude={"work_pool_name"}, exclude_unset=True
101
+ deployment_dict: dict = deployment.model_dump(
102
+ exclude={"work_pool_name"},
103
+ exclude_unset=True,
103
104
  )
105
+
106
+ requested_concurrency_limit = deployment_dict.pop(
107
+ "global_concurrency_limit_id", "unset"
108
+ )
109
+ if requested_concurrency_limit != "unset":
110
+ if requested_concurrency_limit:
111
+ concurrency_limit = (
112
+ await models.concurrency_limits_v2.read_concurrency_limit(
113
+ session=session,
114
+ concurrency_limit_id=requested_concurrency_limit,
115
+ )
116
+ )
117
+
118
+ if not concurrency_limit:
119
+ raise HTTPException(
120
+ status_code=status.HTTP_404_NOT_FOUND,
121
+ detail="Concurrency limit not found",
122
+ )
123
+
124
+ deployment_dict["concurrency_limit_id"] = requested_concurrency_limit
125
+
104
126
  if deployment.work_pool_name and deployment.work_queue_name:
105
127
  # If a specific pool name/queue name combination was provided, get the
106
128
  # ID for that work pool queue.
@@ -300,8 +322,24 @@ async def update_deployment(
300
322
  detail="Invalid schema: Unable to validate schema with circular references.",
301
323
  )
302
324
 
325
+ if deployment.global_concurrency_limit_id:
326
+ concurrency_limit = (
327
+ await models.concurrency_limits_v2.read_concurrency_limit(
328
+ session=session,
329
+ concurrency_limit_id=deployment.global_concurrency_limit_id,
330
+ )
331
+ )
332
+
333
+ if not concurrency_limit:
334
+ raise HTTPException(
335
+ status_code=status.HTTP_404_NOT_FOUND,
336
+ detail="Concurrency limit not found",
337
+ )
338
+
303
339
  result = await models.deployments.update_deployment(
304
- session=session, deployment_id=deployment_id, deployment=deployment
340
+ session=session,
341
+ deployment_id=deployment_id,
342
+ deployment=deployment,
305
343
  )
306
344
 
307
345
  for schedule in schedules_to_patch:
@@ -5,7 +5,7 @@ import sys
5
5
  from contextlib import contextmanager
6
6
  from typing import Any, cast
7
7
  from unittest import mock
8
- from zoneinfo import ZoneInfo, available_timezones
8
+ from zoneinfo import ZoneInfo, ZoneInfoNotFoundError, available_timezones
9
9
 
10
10
  import humanize
11
11
  from dateutil.parser import parse
@@ -76,27 +76,38 @@ def human_friendly_diff(
76
76
  if dt is None:
77
77
  return ""
78
78
 
79
- # Handle naive datetimes consistently across Python versions
80
- if dt.tzinfo is None:
81
- local_tz = datetime.datetime.now().astimezone().tzinfo
82
- dt = dt.replace(tzinfo=local_tz).astimezone(ZoneInfo("UTC"))
83
- elif hasattr(dt.tzinfo, "name"):
84
- dt = dt.replace(tzinfo=ZoneInfo(getattr(dt.tzinfo, "name")))
79
+ def _normalize(ts: datetime.datetime) -> datetime.datetime:
80
+ """Return *ts* with a valid ZoneInfo; fall back to UTC if needed."""
81
+ if ts.tzinfo is None:
82
+ local_tz = datetime.datetime.now().astimezone().tzinfo
83
+ return ts.replace(tzinfo=local_tz).astimezone(ZoneInfo("UTC"))
84
+
85
+ if isinstance(ts.tzinfo, ZoneInfo):
86
+ return ts # already valid
87
+
88
+ if tz_name := getattr(ts.tzinfo, "name", None):
89
+ try:
90
+ return ts.replace(tzinfo=ZoneInfo(tz_name))
91
+ except ZoneInfoNotFoundError:
92
+ pass
93
+
94
+ return ts.astimezone(ZoneInfo("UTC"))
95
+
96
+ dt = _normalize(dt)
85
97
 
86
- # Handle other parameter if provided
87
98
  if other is not None:
88
- if other.tzinfo is None:
89
- local_tz = datetime.datetime.now().astimezone().tzinfo
90
- other = other.replace(tzinfo=local_tz).astimezone(ZoneInfo("UTC"))
91
- elif hasattr(other.tzinfo, "name"):
92
- other = other.replace(tzinfo=ZoneInfo(getattr(other.tzinfo, "name")))
99
+ other = _normalize(other)
93
100
 
94
101
  if sys.version_info >= (3, 13):
102
+ # humanize expects ZoneInfo or None
95
103
  return humanize.naturaltime(dt, when=other)
96
104
 
97
- return DateTime.instance(dt).diff_for_humans(
98
- other=DateTime.instance(other) if other else None
105
+ # Ensure consistency for pendulum path by using UTC
106
+ pendulum_dt = DateTime.instance(dt.astimezone(ZoneInfo("UTC")))
107
+ pendulum_other = (
108
+ DateTime.instance(other.astimezone(ZoneInfo("UTC"))) if other else None
99
109
  )
110
+ return pendulum_dt.diff_for_humans(other=pendulum_other)
100
111
 
101
112
 
102
113
  def now(
prefect/workers/base.py CHANGED
@@ -48,6 +48,7 @@ from prefect.client.schemas.objects import (
48
48
  WorkPool,
49
49
  )
50
50
  from prefect.client.utilities import inject_client
51
+ from prefect.context import FlowRunContext, TagsContext
51
52
  from prefect.events import Event, RelatedResource, emit_event
52
53
  from prefect.events.related import object_as_related_resource, tags_as_related_resources
53
54
  from prefect.exceptions import (
@@ -75,6 +76,7 @@ from prefect.states import (
75
76
  Pending,
76
77
  exception_to_failed_state,
77
78
  )
79
+ from prefect.tasks import Task
78
80
  from prefect.types import KeyValueLabels
79
81
  from prefect.utilities.dispatch import get_registry_for_type, register_base_type
80
82
  from prefect.utilities.engine import propose_state
@@ -775,12 +777,28 @@ class BaseWorker(abc.ABC, Generic[C, V, R]):
775
777
  )
776
778
 
777
779
  job_variables = (job_variables or {}) | {"command": " ".join(execute_command)}
780
+ parameters = parameters or {}
781
+ parent_task_run = None
782
+
783
+ if flow_run_ctx := FlowRunContext.get():
784
+ parent_task = Task[Any, Any](
785
+ name=flow.name,
786
+ fn=flow.fn,
787
+ version=flow.version,
788
+ )
789
+ parent_task_run = await parent_task.create_run(
790
+ flow_run_context=flow_run_ctx,
791
+ parameters=parameters,
792
+ )
793
+
778
794
  flow_run = await self.client.create_flow_run(
779
795
  flow,
780
- parameters=parameters,
796
+ parameters=flow.serialize_parameters(parameters),
781
797
  state=Pending(),
782
798
  job_variables=job_variables,
783
799
  work_pool_name=self.work_pool.name,
800
+ tags=TagsContext.get().current_tags,
801
+ parent_task_run_id=getattr(parent_task_run, "id", None),
784
802
  )
785
803
  if task_status is not None:
786
804
  # Emit the flow run object to .submit to allow it to return a future as soon as possible
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect-client
3
- Version: 3.3.6.dev3
3
+ Version: 3.3.7
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io
@@ -1,9 +1,9 @@
1
1
  prefect/.prefectignore,sha256=awSprvKT0vI8a64mEOLrMxhxqcO-b0ERQeYpA2rNKVQ,390
2
2
  prefect/__init__.py,sha256=iCdcC5ZmeewikCdnPEP6YBAjPNV5dvfxpYCTpw30Hkw,3685
3
3
  prefect/__main__.py,sha256=WFjw3kaYJY6pOTA7WDOgqjsz8zUEUZHCcj3P5wyVa-g,66
4
- prefect/_build_info.py,sha256=F2YAuWqa_cJqxuGkhaAz5fIexdkNGcMj0zohhfmWD4s,185
4
+ prefect/_build_info.py,sha256=yFQx2GfGnZezTWU1rGjrvTOpehcZtB9Gm3FIGU3w33k,180
5
5
  prefect/_result_records.py,sha256=S6QmsODkehGVSzbMm6ig022PYbI6gNKz671p_8kBYx4,7789
6
- prefect/_versioning.py,sha256=4zp4Dl9dJWsoItj4AAhRxYtP3CMdo-7nG0dyv3Xz4nU,5361
6
+ prefect/_versioning.py,sha256=Bm2EwEODvMe_kLkeVXy32BaTA_4ijBZl9eFbdtXEV4w,5498
7
7
  prefect/_waiters.py,sha256=Ia2ITaXdHzevtyWIgJoOg95lrEXQqNEOquHvw3T33UQ,9026
8
8
  prefect/agent.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
9
9
  prefect/artifacts.py,sha256=dMBUOAWnUamzjb5HSqwB5-GR2Qb-Gxee26XG5NDCUuw,22720
@@ -15,7 +15,7 @@ prefect/exceptions.py,sha256=wZLQQMRB_DyiYkeEdIC5OKwbba5A94Dlnics-lrWI7A,11581
15
15
  prefect/filesystems.py,sha256=v5YqGB4uXf9Ew2VuB9VCSkawvYMMVvEtZf7w1VmAmr8,18036
16
16
  prefect/flow_engine.py,sha256=hZpTYEtwTPMtwVoTCrfD93igN7rlKeG_0kyCvdU4aYE,58876
17
17
  prefect/flow_runs.py,sha256=dbHcXsOq1UsNM7vyJV9gboCTylmdUwQ_-W4NQt4R4ds,17267
18
- prefect/flows.py,sha256=8gWWoZB8S8j8Iwz0TTc5F-f_8sTFucGm53aaue5vUi4,114116
18
+ prefect/flows.py,sha256=UCBwsb99wtPTGPu2PneKCfAMlMBA2GhXJb5rzMBxw1s,118041
19
19
  prefect/futures.py,sha256=F4eplqRcqw5-aMNKu6-lOFOWdDNr0RGrPso4C4G02bU,24248
20
20
  prefect/main.py,sha256=8V-qLB4GjEVCkGRgGXeaIk-JIXY8Z9FozcNluj4Sm9E,2589
21
21
  prefect/plugins.py,sha256=FPRLR2mWVBMuOnlzeiTD9krlHONZH2rtYLD753JQDNQ,2516
@@ -32,8 +32,9 @@ prefect/tasks.py,sha256=EpMw5O1B9pAFVraC0KzytMOKi8iy7ZYnKWRs7WtvogU,74742
32
32
  prefect/transactions.py,sha256=uIoPNudzJzH6NrMJhrgr5lyh6JxOJQqT1GvrXt69yNw,26068
33
33
  prefect/variables.py,sha256=dCK3vX7TbkqXZhnNT_v7rcGh3ISRqoR6pJVLpoll3Js,8342
34
34
  prefect/_experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- prefect/_experimental/bundles.py,sha256=E5nRaLVTbYCrACXZcRJCd4ssOcQU-Z26ewCb_7tPeTM,6687
36
35
  prefect/_experimental/lineage.py,sha256=8LssReoq7eLtQScUCu-7FCtrWoRZstXKRdpO0PxgbKg,9958
36
+ prefect/_experimental/bundles/__init__.py,sha256=9e7L7drTpHG82fnr6kuABkpk3SdqUNF-8HB2y6vD5U4,7108
37
+ prefect/_experimental/bundles/execute.py,sha256=1_v3tGFQlQEj9eOLsGG5EHtNcwyxmOU-LYYoK1LP9pA,635
37
38
  prefect/_experimental/sla/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
39
  prefect/_experimental/sla/client.py,sha256=XTkYHFZiBy_O7RgUyGEdl9MxaHP-6fEAKBk3ksNQobU,3611
39
40
  prefect/_experimental/sla/objects.py,sha256=Ja1z2XUgkklvtNTumKWWjojEM5I0L_RjdGv61sRbVP0,2834
@@ -54,7 +55,7 @@ prefect/_internal/concurrency/event_loop.py,sha256=N6SyBV0vaSF5HD4_JM8zL7oBGd2nM
54
55
  prefect/_internal/concurrency/inspection.py,sha256=wUWVbHi4G-BxuuYFWhTNmo5yc1C651lQrp5OMiHPU1E,3545
55
56
  prefect/_internal/concurrency/primitives.py,sha256=Wuht4GwJCgts_uAZFUt9c-InPssnXcelRQc1dGdOplk,2672
56
57
  prefect/_internal/concurrency/services.py,sha256=w2J5Q5Pep19Ignx-TLEw27wf3fS26HVw-eeR4xMeTxQ,16174
57
- prefect/_internal/concurrency/threads.py,sha256=9sIDBdVFmvY4qqdkz3p1eqs4se7Ua2lJ-CPnhTSPRs4,9288
58
+ prefect/_internal/concurrency/threads.py,sha256=id4T2Jc0K1yLL8dOoh6bqV_-8tZEa1w58WXGn0X7efk,9288
58
59
  prefect/_internal/concurrency/waiters.py,sha256=mhXpQk8swcUAxBk7f7kGn1fqy44XcFyneog_zEYecr0,9442
59
60
  prefect/_internal/pydantic/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
60
61
  prefect/_internal/pydantic/schemas.py,sha256=tsRKq5yEIgiRbWMl3BPnbfNaKyDN6pq8WSs0M8SQMm4,452
@@ -206,7 +207,7 @@ prefect/server/api/concurrency_limits.py,sha256=E5TB2cJPIZjnxnm1pGxUJnwMDz5CS58g
206
207
  prefect/server/api/concurrency_limits_v2.py,sha256=PGjG7W2Z65OojNTP0ezFu2z69plXo1N8paqwHlHAPj0,10183
207
208
  prefect/server/api/csrf_token.py,sha256=BwysSjQAhre7O0OY_LF3ZcIiO53FdMQroNT11Q6OcOM,1344
208
209
  prefect/server/api/dependencies.py,sha256=VujfcIGn41TGJxUunFHVabY5hE-6nY6uSHyhNFj8PdI,6634
209
- prefect/server/api/deployments.py,sha256=HQwgiFQXHJ0bpNFRrhW6cY0rQFua0JJfcsMnPyj1H8I,37963
210
+ prefect/server/api/deployments.py,sha256=ppYA3b2csnw32-SbOXz5Dm_IsnmPKczNiSbqCzusFKI,39332
210
211
  prefect/server/api/events.py,sha256=3-Qdt6ORxFv3nLoogQqvd72zEulJSoAmcqZto2OULuk,9907
211
212
  prefect/server/api/flow_run_notification_policies.py,sha256=F8xNm6bgZTC3nFe9xCUJS4NlU9tLXZ8fShtJqmhT2m4,4828
212
213
  prefect/server/api/flow_run_states.py,sha256=lIdxVE9CqLgtDCuH9bTaKkzHNL81FPrr11liPzvONrw,1661
@@ -276,7 +277,7 @@ prefect/telemetry/processors.py,sha256=jw6j6LviOVxw3IBJe7cSjsxFk0zzY43jUmy6C9pcf
276
277
  prefect/telemetry/run_telemetry.py,sha256=_FbjiPqPemu4xvZuI2YBPwXeRJ2BcKRJ6qgO4UMzKKE,8571
277
278
  prefect/telemetry/services.py,sha256=DxgNNDTeWNtHBtioX8cjua4IrCbTiJJdYecx-gugg-w,2358
278
279
  prefect/types/__init__.py,sha256=yBjKxiQmSC7jXoo0UNmM3KZil1NBFS-BWGPfwSEaoJo,4621
279
- prefect/types/_datetime.py,sha256=Cy6z7MxPDV_-jH2vxqC3PNA2G74IdUDIB07Jaakdj5w,7294
280
+ prefect/types/_datetime.py,sha256=ZE-4YK5XJuyxnp5pqldZwtIjkxCpxDGnCSfZiTl7-TU,7566
280
281
  prefect/types/entrypoint.py,sha256=2FF03-wLPgtnqR_bKJDB2BsXXINPdu8ptY9ZYEZnXg8,328
281
282
  prefect/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
282
283
  prefect/utilities/_ast.py,sha256=sgEPUWElih-3cp4PoAy1IOyPtu8E27lL0Dldf3ijnYY,4905
@@ -312,13 +313,13 @@ prefect/utilities/schema_tools/__init__.py,sha256=At3rMHd2g_Em2P3_dFQlFgqR_EpBwr
312
313
  prefect/utilities/schema_tools/hydration.py,sha256=NkRhWkNfxxFmVGhNDfmxdK_xeKaEhs3a42q83Sg9cT4,9436
313
314
  prefect/utilities/schema_tools/validation.py,sha256=Wix26IVR-ZJ32-6MX2pHhrwm3reB-Q4iB6_phn85OKE,10743
314
315
  prefect/workers/__init__.py,sha256=EaM1F0RZ-XIJaGeTKLsXDnfOPHzVWk5bk0_c4BVS44M,64
315
- prefect/workers/base.py,sha256=TpGj8laGPQoCS_OiE__oSaNWOgN1REUzwedy-G0E8yQ,59601
316
+ prefect/workers/base.py,sha256=B3K80V-bZ1oI-5iwM2jw93is9srTSCLNN2lvVtlmB7g,60267
316
317
  prefect/workers/block.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
317
318
  prefect/workers/cloud.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
318
319
  prefect/workers/process.py,sha256=Yi5D0U5AQ51wHT86GdwtImXSefe0gJf3LGq4r4z9zwM,11090
319
320
  prefect/workers/server.py,sha256=2pmVeJZiVbEK02SO6BEZaBIvHMsn6G8LzjW8BXyiTtk,1952
320
321
  prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
321
- prefect_client-3.3.6.dev3.dist-info/METADATA,sha256=BTogX-QjhTZkFVfTFe00RyeaKFsJdyDChxWSZxjgfCQ,7471
322
- prefect_client-3.3.6.dev3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
323
- prefect_client-3.3.6.dev3.dist-info/licenses/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
324
- prefect_client-3.3.6.dev3.dist-info/RECORD,,
322
+ prefect_client-3.3.7.dist-info/METADATA,sha256=YBJhkMhcGJYgPdGEvAUr6sKNdBQOcX6-tSiShqqj2H0,7466
323
+ prefect_client-3.3.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
324
+ prefect_client-3.3.7.dist-info/licenses/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
325
+ prefect_client-3.3.7.dist-info/RECORD,,