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 +3 -3
- prefect/_experimental/{bundles.py → bundles/__init__.py} +25 -9
- prefect/_experimental/bundles/execute.py +27 -0
- prefect/_internal/concurrency/threads.py +3 -3
- prefect/_versioning.py +10 -5
- prefect/flows.py +101 -1
- prefect/server/api/deployments.py +41 -3
- prefect/types/_datetime.py +26 -15
- prefect/workers/base.py +19 -1
- {prefect_client-3.3.6.dev3.dist-info → prefect_client-3.3.7.dist-info}/METADATA +1 -1
- {prefect_client-3.3.6.dev3.dist-info → prefect_client-3.3.7.dist-info}/RECORD +13 -12
- {prefect_client-3.3.6.dev3.dist-info → prefect_client-3.3.7.dist-info}/WHEEL +0 -0
- {prefect_client-3.3.6.dev3.dist-info → prefect_client-3.3.7.dist-info}/licenses/LICENSE +0 -0
prefect/_build_info.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Generated by versioningit
|
2
|
-
__version__ = "3.3.
|
3
|
-
__build_date__ = "2025-04-
|
4
|
-
__git_commit__ = "
|
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
|
-
|
26
|
-
import uv
|
25
|
+
from .execute import execute_bundle_from_file
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
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
|
-
[
|
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
|
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("
|
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(
|
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
|
-
|
108
|
-
repository =
|
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"},
|
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,
|
340
|
+
session=session,
|
341
|
+
deployment_id=deployment_id,
|
342
|
+
deployment=deployment,
|
305
343
|
)
|
306
344
|
|
307
345
|
for schedule in schedules_to_patch:
|
prefect/types/_datetime.py
CHANGED
@@ -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
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|
-
|
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
|
-
|
98
|
-
|
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,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=
|
4
|
+
prefect/_build_info.py,sha256=yFQx2GfGnZezTWU1rGjrvTOpehcZtB9Gm3FIGU3w33k,180
|
5
5
|
prefect/_result_records.py,sha256=S6QmsODkehGVSzbMm6ig022PYbI6gNKz671p_8kBYx4,7789
|
6
|
-
prefect/_versioning.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
322
|
-
prefect_client-3.3.
|
323
|
-
prefect_client-3.3.
|
324
|
-
prefect_client-3.3.
|
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,,
|
File without changes
|
File without changes
|