prefect-client 3.2.16.dev1__py3-none-any.whl → 3.3.1__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/_internal/compatibility/deprecated.py +29 -18
- prefect/_internal/concurrency/calls.py +5 -2
- prefect/client/base.py +16 -2
- prefect/events/utilities.py +40 -30
- prefect/flows.py +17 -17
- prefect/server/api/server.py +2 -2
- prefect/tasks.py +8 -9
- prefect/types/_datetime.py +2 -2
- prefect/utilities/callables.py +1 -1
- {prefect_client-3.2.16.dev1.dist-info → prefect_client-3.3.1.dist-info}/METADATA +3 -2
- {prefect_client-3.2.16.dev1.dist-info → prefect_client-3.3.1.dist-info}/RECORD +14 -14
- {prefect_client-3.2.16.dev1.dist-info → prefect_client-3.3.1.dist-info}/WHEEL +0 -0
- {prefect_client-3.2.16.dev1.dist-info → prefect_client-3.3.1.dist-info}/licenses/LICENSE +0 -0
prefect/_build_info.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Generated by versioningit
|
2
|
-
__version__ = "3.
|
3
|
-
__build_date__ = "2025-
|
4
|
-
__git_commit__ = "
|
2
|
+
__version__ = "3.3.1"
|
3
|
+
__build_date__ = "2025-04-01 02:38:39.208039+00:00"
|
4
|
+
__git_commit__ = "6a1646202888ea59a3493f30ee9eaed6aea07960"
|
5
5
|
__dirty__ = False
|
@@ -10,12 +10,15 @@ will be calculated 6 months later. Start and end dates are always in the format
|
|
10
10
|
e.g. Jan 2023.
|
11
11
|
"""
|
12
12
|
|
13
|
+
from __future__ import annotations
|
14
|
+
|
13
15
|
import datetime
|
14
16
|
import functools
|
15
17
|
import sys
|
16
18
|
import warnings
|
17
19
|
from typing import TYPE_CHECKING, Any, Callable, Optional, Union
|
18
20
|
|
21
|
+
import dateparser
|
19
22
|
from pydantic import BaseModel
|
20
23
|
from typing_extensions import ParamSpec, TypeAlias, TypeVar
|
21
24
|
|
@@ -32,6 +35,9 @@ R = TypeVar("R", infer_variance=True)
|
|
32
35
|
M = TypeVar("M", bound=BaseModel)
|
33
36
|
T = TypeVar("T")
|
34
37
|
|
38
|
+
# Note: A datetime is strongly preferred over a string, but a string is acceptable for
|
39
|
+
# backwards compatibility until support is dropped from dateparser in Python 3.15.
|
40
|
+
_AcceptableDate: TypeAlias = Optional[Union[datetime.datetime, str]]
|
35
41
|
|
36
42
|
DEPRECATED_WARNING = (
|
37
43
|
"{name} has been deprecated{when}. It will not be available in new releases after {end_date}."
|
@@ -51,18 +57,25 @@ class PrefectDeprecationWarning(DeprecationWarning):
|
|
51
57
|
"""
|
52
58
|
|
53
59
|
|
60
|
+
def _coerce_datetime(
|
61
|
+
dt: Optional[_AcceptableDate],
|
62
|
+
) -> Optional[datetime.datetime]:
|
63
|
+
if dt is None or isinstance(dt, datetime.datetime):
|
64
|
+
return dt
|
65
|
+
with warnings.catch_warnings():
|
66
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
67
|
+
return dateparser.parse(dt)
|
68
|
+
|
69
|
+
|
54
70
|
def generate_deprecation_message(
|
55
71
|
name: str,
|
56
|
-
start_date: Optional[
|
57
|
-
end_date: Optional[
|
72
|
+
start_date: Optional[_AcceptableDate] = None,
|
73
|
+
end_date: Optional[_AcceptableDate] = None,
|
58
74
|
help: str = "",
|
59
75
|
when: str = "",
|
60
76
|
) -> str:
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
if end_date is not None and not isinstance(end_date, datetime.datetime):
|
65
|
-
raise ValueError("Must provide end_date as a datetime")
|
77
|
+
start_date = _coerce_datetime(start_date)
|
78
|
+
end_date = _coerce_datetime(end_date)
|
66
79
|
|
67
80
|
if start_date is None and end_date is None:
|
68
81
|
raise ValueError(
|
@@ -87,8 +100,8 @@ def generate_deprecation_message(
|
|
87
100
|
|
88
101
|
def deprecated_callable(
|
89
102
|
*,
|
90
|
-
start_date: Optional[
|
91
|
-
end_date: Optional[
|
103
|
+
start_date: Optional[_AcceptableDate] = None,
|
104
|
+
end_date: Optional[_AcceptableDate] = None,
|
92
105
|
stacklevel: int = 2,
|
93
106
|
help: str = "",
|
94
107
|
) -> Callable[[Callable[P, R]], Callable[P, R]]:
|
@@ -112,8 +125,8 @@ def deprecated_callable(
|
|
112
125
|
|
113
126
|
def deprecated_class(
|
114
127
|
*,
|
115
|
-
start_date: Optional[
|
116
|
-
end_date: Optional[
|
128
|
+
start_date: Optional[_AcceptableDate] = None,
|
129
|
+
end_date: Optional[_AcceptableDate] = None,
|
117
130
|
stacklevel: int = 2,
|
118
131
|
help: str = "",
|
119
132
|
) -> Callable[[type[T]], type[T]]:
|
@@ -141,8 +154,8 @@ def deprecated_class(
|
|
141
154
|
def deprecated_parameter(
|
142
155
|
name: str,
|
143
156
|
*,
|
144
|
-
start_date: Optional[
|
145
|
-
end_date: Optional[
|
157
|
+
start_date: Optional[_AcceptableDate] = None,
|
158
|
+
end_date: Optional[_AcceptableDate] = None,
|
146
159
|
stacklevel: int = 2,
|
147
160
|
help: str = "",
|
148
161
|
when: Optional[Callable[[Any], bool]] = None,
|
@@ -197,8 +210,8 @@ JsonDict: TypeAlias = dict[str, JsonValue]
|
|
197
210
|
def deprecated_field(
|
198
211
|
name: str,
|
199
212
|
*,
|
200
|
-
start_date: Optional[
|
201
|
-
end_date: Optional[
|
213
|
+
start_date: Optional[_AcceptableDate] = None,
|
214
|
+
end_date: Optional[_AcceptableDate] = None,
|
202
215
|
when_message: str = "",
|
203
216
|
help: str = "",
|
204
217
|
when: Optional[Callable[[Any], bool]] = None,
|
@@ -279,9 +292,7 @@ def inject_renamed_module_alias_finder():
|
|
279
292
|
sys.meta_path.insert(0, AliasedModuleFinder(DEPRECATED_MODULE_ALIASES))
|
280
293
|
|
281
294
|
|
282
|
-
def register_renamed_module(
|
283
|
-
old_name: str, new_name: str, start_date: datetime.datetime
|
284
|
-
):
|
295
|
+
def register_renamed_module(old_name: str, new_name: str, start_date: _AcceptableDate):
|
285
296
|
"""
|
286
297
|
Register a renamed module.
|
287
298
|
|
@@ -374,8 +374,11 @@ class Call(Generic[T]):
|
|
374
374
|
|
375
375
|
except CancelledError:
|
376
376
|
# Report cancellation
|
377
|
-
|
378
|
-
|
377
|
+
# in rare cases, enforce_sync_deadline raises CancelledError
|
378
|
+
# prior to yielding
|
379
|
+
if cancel_scope is None:
|
380
|
+
self.future.cancel()
|
381
|
+
return None
|
379
382
|
if cancel_scope.timedout():
|
380
383
|
setattr(self.future, "_timed_out", True)
|
381
384
|
self.future.cancel()
|
prefect/client/base.py
CHANGED
@@ -222,6 +222,10 @@ class PrefectHttpxAsyncClient(httpx.AsyncClient):
|
|
222
222
|
if the request either raises an exception listed in `retry_exceptions` or
|
223
223
|
receives a response with a status code listed in `retry_codes`.
|
224
224
|
|
225
|
+
Retries are not counted against the limit if the response headers contains
|
226
|
+
a reserved value, indicating that the server is undergoing maintenance. These
|
227
|
+
requests will retry indefinitely until the header is no longer returned.
|
228
|
+
|
225
229
|
Retries will be delayed based on either the retry header (preferred) or
|
226
230
|
exponential backoff if a retry header is not provided.
|
227
231
|
"""
|
@@ -239,18 +243,21 @@ class PrefectHttpxAsyncClient(httpx.AsyncClient):
|
|
239
243
|
await self._add_csrf_headers(request=request)
|
240
244
|
|
241
245
|
while try_count <= PREFECT_CLIENT_MAX_RETRIES.value():
|
242
|
-
try_count += 1
|
243
246
|
retry_seconds = None
|
244
247
|
exc_info = None
|
245
248
|
|
246
249
|
try:
|
247
250
|
response = await send(request, *send_args, **send_kwargs)
|
248
251
|
except retry_exceptions: # type: ignore
|
252
|
+
try_count += 1
|
249
253
|
if try_count > PREFECT_CLIENT_MAX_RETRIES.value():
|
250
254
|
raise
|
251
255
|
# Otherwise, we will ignore this error but capture the info for logging
|
252
256
|
exc_info = sys.exc_info()
|
253
257
|
else:
|
258
|
+
if response.headers.get("Prefect-Maintenance") != "true":
|
259
|
+
try_count += 1
|
260
|
+
|
254
261
|
# We got a response; check if it's a CSRF error, otherwise
|
255
262
|
# return immediately if it is not retryable
|
256
263
|
if (
|
@@ -441,6 +448,10 @@ class PrefectHttpxSyncClient(httpx.Client):
|
|
441
448
|
if the request either raises an exception listed in `retry_exceptions` or
|
442
449
|
receives a response with a status code listed in `retry_codes`.
|
443
450
|
|
451
|
+
Retries are not counted against the limit if the response headers contains
|
452
|
+
a reserved value, indicating that the server is undergoing maintenance. These
|
453
|
+
requests will retry indefinitely until the header is no longer returned.
|
454
|
+
|
444
455
|
Retries will be delayed based on either the retry header (preferred) or
|
445
456
|
exponential backoff if a retry header is not provided.
|
446
457
|
"""
|
@@ -458,18 +469,21 @@ class PrefectHttpxSyncClient(httpx.Client):
|
|
458
469
|
self._add_csrf_headers(request=request)
|
459
470
|
|
460
471
|
while try_count <= PREFECT_CLIENT_MAX_RETRIES.value():
|
461
|
-
try_count += 1
|
462
472
|
retry_seconds = None
|
463
473
|
exc_info = None
|
464
474
|
|
465
475
|
try:
|
466
476
|
response = send(request, *send_args, **send_kwargs)
|
467
477
|
except retry_exceptions: # type: ignore
|
478
|
+
try_count += 1
|
468
479
|
if try_count > PREFECT_CLIENT_MAX_RETRIES.value():
|
469
480
|
raise
|
470
481
|
# Otherwise, we will ignore this error but capture the info for logging
|
471
482
|
exc_info = sys.exc_info()
|
472
483
|
else:
|
484
|
+
if response.headers.get("Prefect-Maintenance") != "true":
|
485
|
+
try_count += 1
|
486
|
+
|
473
487
|
# We got a response; check if it's a CSRF error, otherwise
|
474
488
|
# return immediately if it is not retryable
|
475
489
|
if (
|
prefect/events/utilities.py
CHANGED
@@ -2,10 +2,11 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
import datetime
|
4
4
|
from datetime import timedelta
|
5
|
-
from typing import Any
|
5
|
+
from typing import TYPE_CHECKING, Any
|
6
6
|
from uuid import UUID
|
7
7
|
|
8
8
|
import prefect.types._datetime
|
9
|
+
from prefect.logging.loggers import get_logger
|
9
10
|
|
10
11
|
from .clients import (
|
11
12
|
AssertingEventsClient,
|
@@ -16,8 +17,13 @@ from .clients import (
|
|
16
17
|
from .schemas.events import Event, RelatedResource
|
17
18
|
from .worker import EventsWorker, should_emit_events
|
18
19
|
|
20
|
+
if TYPE_CHECKING:
|
21
|
+
import logging
|
22
|
+
|
19
23
|
TIGHT_TIMING = timedelta(minutes=5)
|
20
24
|
|
25
|
+
logger: "logging.Logger" = get_logger(__name__)
|
26
|
+
|
21
27
|
|
22
28
|
def emit_event(
|
23
29
|
event: str,
|
@@ -52,41 +58,45 @@ def emit_event(
|
|
52
58
|
if not should_emit_events():
|
53
59
|
return None
|
54
60
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
61
|
+
try:
|
62
|
+
operational_clients = [
|
63
|
+
AssertingPassthroughEventsClient,
|
64
|
+
AssertingEventsClient,
|
65
|
+
PrefectCloudEventsClient,
|
66
|
+
PrefectEventsClient,
|
67
|
+
]
|
68
|
+
worker_instance = EventsWorker.instance()
|
62
69
|
|
63
|
-
|
64
|
-
|
70
|
+
if worker_instance.client_type not in operational_clients:
|
71
|
+
return None
|
65
72
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
73
|
+
event_kwargs: dict[str, Any] = {
|
74
|
+
"event": event,
|
75
|
+
"resource": resource,
|
76
|
+
**kwargs,
|
77
|
+
}
|
71
78
|
|
72
|
-
|
73
|
-
|
74
|
-
|
79
|
+
if occurred is None:
|
80
|
+
occurred = prefect.types._datetime.now("UTC")
|
81
|
+
event_kwargs["occurred"] = occurred
|
75
82
|
|
76
|
-
|
77
|
-
|
83
|
+
if related is not None:
|
84
|
+
event_kwargs["related"] = related
|
78
85
|
|
79
|
-
|
80
|
-
|
86
|
+
if payload is not None:
|
87
|
+
event_kwargs["payload"] = payload
|
81
88
|
|
82
|
-
|
83
|
-
|
89
|
+
if id is not None:
|
90
|
+
event_kwargs["id"] = id
|
84
91
|
|
85
|
-
|
86
|
-
|
87
|
-
|
92
|
+
if follows is not None:
|
93
|
+
if -TIGHT_TIMING < (occurred - follows.occurred) < TIGHT_TIMING:
|
94
|
+
event_kwargs["follows"] = follows.id
|
88
95
|
|
89
|
-
|
90
|
-
|
96
|
+
event_obj = Event(**event_kwargs)
|
97
|
+
worker_instance.send(event_obj)
|
91
98
|
|
92
|
-
|
99
|
+
return event_obj
|
100
|
+
except Exception:
|
101
|
+
logger.exception(f"Error emitting event: {event}")
|
102
|
+
return None
|
prefect/flows.py
CHANGED
@@ -272,10 +272,11 @@ class Flow(Generic[P, R]):
|
|
272
272
|
|
273
273
|
if isinstance(fn, classmethod):
|
274
274
|
fn = cast(Callable[P, R], fn.__func__)
|
275
|
+
self._isclassmethod = True
|
275
276
|
|
276
277
|
if isinstance(fn, staticmethod):
|
277
278
|
fn = cast(Callable[P, R], fn.__func__)
|
278
|
-
|
279
|
+
self._isstaticmethod = True
|
279
280
|
|
280
281
|
if not callable(fn):
|
281
282
|
raise TypeError("'fn' must be callable")
|
@@ -405,11 +406,11 @@ class Flow(Generic[P, R]):
|
|
405
406
|
|
406
407
|
@property
|
407
408
|
def isclassmethod(self) -> bool:
|
408
|
-
return
|
409
|
+
return getattr(self, "_isclassmethod", False)
|
409
410
|
|
410
411
|
@property
|
411
412
|
def isstaticmethod(self) -> bool:
|
412
|
-
return getattr(self
|
413
|
+
return getattr(self, "_isstaticmethod", False)
|
413
414
|
|
414
415
|
def __get__(self, instance: Any, owner: Any) -> "Flow[P, R]":
|
415
416
|
"""
|
@@ -417,21 +418,20 @@ class Flow(Generic[P, R]):
|
|
417
418
|
When an instance method is loaded, this method is called with the "self" instance as
|
418
419
|
an argument. We return a copy of the flow with that instance bound to the flow's function.
|
419
420
|
"""
|
420
|
-
if self.isstaticmethod:
|
421
|
-
return self
|
422
|
-
|
423
421
|
# wrapped function is a classmethod
|
424
|
-
if
|
425
|
-
|
426
|
-
setattr(
|
427
|
-
return
|
428
|
-
|
429
|
-
# if the
|
430
|
-
# of the
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
return
|
422
|
+
if self.isclassmethod:
|
423
|
+
bound_task = copy(self)
|
424
|
+
setattr(bound_task.fn, "__prefect_cls__", owner)
|
425
|
+
return bound_task
|
426
|
+
|
427
|
+
# if the task is being accessed on an instance, bind the instance to the __prefect_self__ attribute
|
428
|
+
# of the task's function. This will allow it to be automatically added to the task's parameters
|
429
|
+
if instance:
|
430
|
+
bound_task = copy(self)
|
431
|
+
bound_task.fn.__prefect_self__ = instance # type: ignore[attr-defined]
|
432
|
+
return bound_task
|
433
|
+
|
434
|
+
return self
|
435
435
|
|
436
436
|
def with_options(
|
437
437
|
self,
|
prefect/server/api/server.py
CHANGED
@@ -253,11 +253,11 @@ def copy_directory(directory: str, path: str) -> None:
|
|
253
253
|
# ensure copied files are writeable
|
254
254
|
for root, dirs, files in os.walk(destination):
|
255
255
|
for f in files:
|
256
|
-
os.chmod(os.path.join(root, f),
|
256
|
+
os.chmod(os.path.join(root, f), 0o700)
|
257
257
|
else:
|
258
258
|
shutil.copy2(source, destination)
|
259
259
|
# Ensure copied file is writeable
|
260
|
-
os.chmod(destination,
|
260
|
+
os.chmod(destination, 0o700)
|
261
261
|
|
262
262
|
|
263
263
|
async def custom_internal_exception_handler(
|
prefect/tasks.py
CHANGED
@@ -382,10 +382,11 @@ class Task(Generic[P, R]):
|
|
382
382
|
|
383
383
|
if isinstance(fn, classmethod):
|
384
384
|
fn = cast(Callable[P, R], fn.__func__)
|
385
|
+
self._isclassmethod = True
|
385
386
|
|
386
387
|
if isinstance(fn, staticmethod):
|
387
388
|
fn = cast(Callable[P, R], fn.__func__)
|
388
|
-
|
389
|
+
self._isstaticmethod = True
|
389
390
|
|
390
391
|
if not callable(fn):
|
391
392
|
raise TypeError("'fn' must be callable")
|
@@ -547,11 +548,11 @@ class Task(Generic[P, R]):
|
|
547
548
|
|
548
549
|
@property
|
549
550
|
def isclassmethod(self) -> bool:
|
550
|
-
return
|
551
|
+
return getattr(self, "_isclassmethod", False)
|
551
552
|
|
552
553
|
@property
|
553
554
|
def isstaticmethod(self) -> bool:
|
554
|
-
return getattr(self
|
555
|
+
return getattr(self, "_isstaticmethod", False)
|
555
556
|
|
556
557
|
def __get__(self, instance: Any, owner: Any) -> "Task[P, R]":
|
557
558
|
"""
|
@@ -559,23 +560,21 @@ class Task(Generic[P, R]):
|
|
559
560
|
When an instance method is loaded, this method is called with the "self" instance as
|
560
561
|
an argument. We return a copy of the task with that instance bound to the task's function.
|
561
562
|
"""
|
562
|
-
|
563
|
-
if self.isstaticmethod:
|
564
|
-
return self
|
565
|
-
|
566
563
|
# wrapped function is a classmethod
|
567
|
-
if
|
564
|
+
if self.isclassmethod:
|
568
565
|
bound_task = copy(self)
|
569
566
|
setattr(bound_task.fn, "__prefect_cls__", owner)
|
570
567
|
return bound_task
|
571
568
|
|
572
569
|
# if the task is being accessed on an instance, bind the instance to the __prefect_self__ attribute
|
573
570
|
# of the task's function. This will allow it to be automatically added to the task's parameters
|
574
|
-
|
571
|
+
if instance:
|
575
572
|
bound_task = copy(self)
|
576
573
|
bound_task.fn.__prefect_self__ = instance # type: ignore[attr-defined]
|
577
574
|
return bound_task
|
578
575
|
|
576
|
+
return self
|
577
|
+
|
579
578
|
def with_options(
|
580
579
|
self,
|
581
580
|
*,
|
prefect/types/_datetime.py
CHANGED
@@ -130,7 +130,7 @@ def end_of_period(dt: datetime.datetime, period: str) -> datetime.datetime:
|
|
130
130
|
ValueError: If an invalid unit is specified.
|
131
131
|
"""
|
132
132
|
if sys.version_info >= (3, 13):
|
133
|
-
from whenever import Weekday, ZonedDateTime
|
133
|
+
from whenever import Weekday, ZonedDateTime, days
|
134
134
|
|
135
135
|
if not isinstance(dt.tzinfo, ZoneInfo):
|
136
136
|
zdt = ZonedDateTime.from_py_datetime(
|
@@ -150,8 +150,8 @@ def end_of_period(dt: datetime.datetime, period: str) -> datetime.datetime:
|
|
150
150
|
days_till_end_of_week: int = (
|
151
151
|
Weekday.SUNDAY.value - zdt.date().day_of_week().value
|
152
152
|
)
|
153
|
+
zdt = zdt + days(days_till_end_of_week)
|
153
154
|
zdt = zdt.replace(
|
154
|
-
day=zdt.day + days_till_end_of_week,
|
155
155
|
hour=23,
|
156
156
|
minute=59,
|
157
157
|
second=59,
|
prefect/utilities/callables.py
CHANGED
@@ -63,7 +63,7 @@ def get_call_parameters(
|
|
63
63
|
"""
|
64
64
|
if hasattr(fn, "__prefect_self__"):
|
65
65
|
call_args = (getattr(fn, "__prefect_self__"), *call_args)
|
66
|
-
|
66
|
+
elif hasattr(fn, "__prefect_cls__"):
|
67
67
|
call_args = (getattr(fn, "__prefect_cls__"), *call_args)
|
68
68
|
|
69
69
|
try:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: prefect-client
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.3.1
|
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
|
@@ -26,6 +26,7 @@ Requires-Dist: asgi-lifespan<3.0,>=1.0
|
|
26
26
|
Requires-Dist: cachetools<6.0,>=5.3
|
27
27
|
Requires-Dist: cloudpickle<4.0,>=2.0
|
28
28
|
Requires-Dist: coolname<3.0.0,>=1.0.4
|
29
|
+
Requires-Dist: dateparser<2.0.0,>=1.1.1
|
29
30
|
Requires-Dist: exceptiongroup>=1.0.0
|
30
31
|
Requires-Dist: fastapi<1.0.0,>=0.111.0
|
31
32
|
Requires-Dist: fsspec>=2022.5.0
|
@@ -53,7 +54,7 @@ Requires-Dist: python-socks[asyncio]<3.0,>=2.5.3
|
|
53
54
|
Requires-Dist: pytz<2026,>=2021.1
|
54
55
|
Requires-Dist: pyyaml<7.0.0,>=5.4.1
|
55
56
|
Requires-Dist: rfc3339-validator<0.2.0,>=0.1.4
|
56
|
-
Requires-Dist: rich<
|
57
|
+
Requires-Dist: rich<15.0,>=11.0
|
57
58
|
Requires-Dist: ruamel-yaml>=0.17.0
|
58
59
|
Requires-Dist: sniffio<2.0.0,>=1.3.0
|
59
60
|
Requires-Dist: toml>=0.10.0
|
@@ -1,7 +1,7 @@
|
|
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=aq88tx9EspO9wVO7jcfP9g3zfGGDQb7ZJ1zWWEP6QV0,180
|
5
5
|
prefect/_result_records.py,sha256=S6QmsODkehGVSzbMm6ig022PYbI6gNKz671p_8kBYx4,7789
|
6
6
|
prefect/_waiters.py,sha256=Ia2ITaXdHzevtyWIgJoOg95lrEXQqNEOquHvw3T33UQ,9026
|
7
7
|
prefect/agent.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
|
@@ -14,7 +14,7 @@ prefect/exceptions.py,sha256=wZLQQMRB_DyiYkeEdIC5OKwbba5A94Dlnics-lrWI7A,11581
|
|
14
14
|
prefect/filesystems.py,sha256=v5YqGB4uXf9Ew2VuB9VCSkawvYMMVvEtZf7w1VmAmr8,18036
|
15
15
|
prefect/flow_engine.py,sha256=hZpTYEtwTPMtwVoTCrfD93igN7rlKeG_0kyCvdU4aYE,58876
|
16
16
|
prefect/flow_runs.py,sha256=dbHcXsOq1UsNM7vyJV9gboCTylmdUwQ_-W4NQt4R4ds,17267
|
17
|
-
prefect/flows.py,sha256=
|
17
|
+
prefect/flows.py,sha256=FXAZZvRVEAzjJ87LOPXM8oO1qlkyJdiydMukfQGddPo,109511
|
18
18
|
prefect/futures.py,sha256=ZD5rdgUHA4sfxwHaPToumOUKlyn4d989JHR7eI97-Hs,23271
|
19
19
|
prefect/main.py,sha256=8V-qLB4GjEVCkGRgGXeaIk-JIXY8Z9FozcNluj4Sm9E,2589
|
20
20
|
prefect/plugins.py,sha256=FPRLR2mWVBMuOnlzeiTD9krlHONZH2rtYLD753JQDNQ,2516
|
@@ -27,7 +27,7 @@ prefect/task_engine.py,sha256=IIvDRl2bnnO3aKXTmtWsz0pnV8kL7xjOaUyJTlL6LaM,61491
|
|
27
27
|
prefect/task_runners.py,sha256=Ce_ngocfq_X-NA5zhPj13IdVmzZ5h6gXlmfxYWs2AXA,15828
|
28
28
|
prefect/task_runs.py,sha256=7LIzfo3fondCyEUpU05sYFN5IfpZigBDXrhG5yc-8t0,9039
|
29
29
|
prefect/task_worker.py,sha256=gMj_rl4EjTrnJ5YSOXinC6y-7KSK7fRQt_UYbZbrrV8,17879
|
30
|
-
prefect/tasks.py,sha256=
|
30
|
+
prefect/tasks.py,sha256=X83KIVowu-c-EDFbmh4ZurEVtEKTyUSkQ8Elo0nWy4k,74946
|
31
31
|
prefect/transactions.py,sha256=BYvxr4ZSFmYDCODPhH8DO1_51inH35oJ75ZZOd_GI_w,16341
|
32
32
|
prefect/variables.py,sha256=dCK3vX7TbkqXZhnNT_v7rcGh3ISRqoR6pJVLpoll3Js,8342
|
33
33
|
prefect/_experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -43,11 +43,11 @@ prefect/_internal/pytz.py,sha256=Sy_cD-Hkmo_Yrhx2Jucy7DgTRhvO8ZD0whW1ywbSg_U,137
|
|
43
43
|
prefect/_internal/retries.py,sha256=pMHofrTQPDSxbVWclDwXbfhFKaDC6sxe1DkUOWugV6k,3040
|
44
44
|
prefect/_internal/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
45
|
prefect/_internal/compatibility/async_dispatch.py,sha256=cUXOqSeseMUaje9oYUzasVPtNttyiHvrqfJl0zK66XI,2949
|
46
|
-
prefect/_internal/compatibility/deprecated.py,sha256=
|
46
|
+
prefect/_internal/compatibility/deprecated.py,sha256=IWu4k1GvIF_vdIcBnsD0UkDYBuf5PxBfDPv3RLO8_FU,9295
|
47
47
|
prefect/_internal/compatibility/migration.py,sha256=Z_r28B90ZQkSngXjr4I_9zA6P74_u48mtp2jYWB9zGg,6797
|
48
48
|
prefect/_internal/concurrency/__init__.py,sha256=YlTwU9ryjPNwbJa45adLJY00t_DGCh1QrdtY9WdVFfw,2140
|
49
49
|
prefect/_internal/concurrency/api.py,sha256=9MuQ0icQVTxwxChujn9mnv0WXRqwToysQy9GWC3sJRg,7352
|
50
|
-
prefect/_internal/concurrency/calls.py,sha256=
|
50
|
+
prefect/_internal/concurrency/calls.py,sha256=DkXNOpOrEM8IhFNE7E_ondwg1gcBeceLgoWPH3F2ExM,16596
|
51
51
|
prefect/_internal/concurrency/cancellation.py,sha256=stCN22-S0f_kZPk50hCEEYzH35fBel3Nthq86FrW0MU,18675
|
52
52
|
prefect/_internal/concurrency/event_loop.py,sha256=N6SyBV0vaSF5HD4_JM8zL7oBGd2nMuEKkeSPnBZdHw4,2136
|
53
53
|
prefect/_internal/concurrency/inspection.py,sha256=wUWVbHi4G-BxuuYFWhTNmo5yc1C651lQrp5OMiHPU1E,3545
|
@@ -76,7 +76,7 @@ prefect/blocks/redis.py,sha256=lt_f1SIcS5OVvthCY6KRWiy5DyUZNRlHqkKhKF25P8c,5770
|
|
76
76
|
prefect/blocks/system.py,sha256=4KiUIy5zizMqfGJrxvi9GLRLcMj4BjAXARxCUEmgbKI,5041
|
77
77
|
prefect/blocks/webhook.py,sha256=hRpMGamOpS2HSM0iPU2ylVGnDWtWUPo6sIU3O24lIa0,2558
|
78
78
|
prefect/client/__init__.py,sha256=bDeOC_I8_la5dwCAfxKzYSTSAr2tlq5HpxJgVoCCdAs,675
|
79
|
-
prefect/client/base.py,sha256=
|
79
|
+
prefect/client/base.py,sha256=7VAMyoy8KtmtI-H8KYsI16_uw9TlrXSrcxChFuMp65Q,26269
|
80
80
|
prefect/client/cloud.py,sha256=jnFgg0osMVDGbLjdWkDX3rQg_0pI_zvfSlU480XCWGQ,6523
|
81
81
|
prefect/client/collections.py,sha256=t9XkVU_onQMZ871L21F1oZnAiPSQeeVfd_MuDEBS3iM,1050
|
82
82
|
prefect/client/constants.py,sha256=Z_GG8KF70vbbXxpJuqW5pLnwzujTVeHbcYYRikNmGH0,29
|
@@ -149,7 +149,7 @@ prefect/events/actions.py,sha256=A7jS8bo4zWGnrt3QfSoQs0uYC1xfKXio3IfU0XtTb5s,912
|
|
149
149
|
prefect/events/clients.py,sha256=XA33NpeRdgVglt7J47uFdpASa1bCvcKWyxsxQt3vEPQ,27290
|
150
150
|
prefect/events/filters.py,sha256=cZ9KnQyWpIHshpAJ95nF5JosCag48enI5cBfKd2JNXA,8227
|
151
151
|
prefect/events/related.py,sha256=nthW3toCPacIL1xkWeV_BG30X6hF4vF2rJHAgqtDXXU,6580
|
152
|
-
prefect/events/utilities.py,sha256=
|
152
|
+
prefect/events/utilities.py,sha256=ww34bTMENCNwcp6RhhgzG0KgXOvKGe0MKmBdSJ8NpZY,3043
|
153
153
|
prefect/events/worker.py,sha256=HjbibR0_J1W1nnNMZDFTXAbB0cl_cFGaFI87DvNGcnI,4557
|
154
154
|
prefect/events/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
155
155
|
prefect/events/cli/automations.py,sha256=uCX3NnypoI25TmyAoyL6qYhanWjZbJ2watwv1nfQMxs,11513
|
@@ -216,7 +216,7 @@ prefect/server/api/middleware.py,sha256=WkyuyeJIfo9Q0GAIVU5gO6yIGNVwoHwuBah5AB5o
|
|
216
216
|
prefect/server/api/root.py,sha256=CeumFYIM_BDvPicJH9ry5PO_02PZTLeMqbLMGGTh90o,942
|
217
217
|
prefect/server/api/run_history.py,sha256=FHepAgo1AYFeuh7rrAVzo_o3hu8Uc8-4DeH5aD5VGgw,5995
|
218
218
|
prefect/server/api/saved_searches.py,sha256=UjoqLLe245QVIs6q5Vk4vdODCOoYzciEEjhi7B8sYCE,3233
|
219
|
-
prefect/server/api/server.py,sha256=
|
219
|
+
prefect/server/api/server.py,sha256=CIpLoiRUCuW345trzwr_Z8v53Kw_2RBqe3ppGvkjSx0,32940
|
220
220
|
prefect/server/api/task_run_states.py,sha256=e63OPpxPudv_CIB5oKr8Z8rfQ-Osjm9Zq0iHe8obnMo,1647
|
221
221
|
prefect/server/api/task_runs.py,sha256=86lXKGUJJSElhkVcxX-kbjctrNe98nUe3U0McDCfTMw,13904
|
222
222
|
prefect/server/api/task_workers.py,sha256=cFP9M8tsApDL_JpySn-x6fOYy9RnOeOgKiqOl_UVVQM,1042
|
@@ -275,7 +275,7 @@ prefect/telemetry/processors.py,sha256=jw6j6LviOVxw3IBJe7cSjsxFk0zzY43jUmy6C9pcf
|
|
275
275
|
prefect/telemetry/run_telemetry.py,sha256=_FbjiPqPemu4xvZuI2YBPwXeRJ2BcKRJ6qgO4UMzKKE,8571
|
276
276
|
prefect/telemetry/services.py,sha256=DxgNNDTeWNtHBtioX8cjua4IrCbTiJJdYecx-gugg-w,2358
|
277
277
|
prefect/types/__init__.py,sha256=yBjKxiQmSC7jXoo0UNmM3KZil1NBFS-BWGPfwSEaoJo,4621
|
278
|
-
prefect/types/_datetime.py,sha256=
|
278
|
+
prefect/types/_datetime.py,sha256=Cy6z7MxPDV_-jH2vxqC3PNA2G74IdUDIB07Jaakdj5w,7294
|
279
279
|
prefect/types/entrypoint.py,sha256=2FF03-wLPgtnqR_bKJDB2BsXXINPdu8ptY9ZYEZnXg8,328
|
280
280
|
prefect/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
281
281
|
prefect/utilities/_deprecated.py,sha256=b3pqRSoFANdVJAc8TJkygBcP-VjZtLJUxVIWC7kwspI,1303
|
@@ -283,7 +283,7 @@ prefect/utilities/_engine.py,sha256=9GW4X1lyAbmPwCuXXIubVJ7Z0DMT3dykkEUtp9tm5hI,
|
|
283
283
|
prefect/utilities/_git.py,sha256=bPYWQdr9xvH0BqxR1ll1RkaSb3x0vhwylhYD5EilkKU,863
|
284
284
|
prefect/utilities/annotations.py,sha256=0Elqgq6LR7pQqezNqT5wb6U_0e2pDO_zx6VseVL6kL8,4396
|
285
285
|
prefect/utilities/asyncutils.py,sha256=xcfeNym2j3WH4gKXznON2hI1PpUTcwr_BGc16IQS3C4,19789
|
286
|
-
prefect/utilities/callables.py,sha256=
|
286
|
+
prefect/utilities/callables.py,sha256=xK1zWWcNPkFM4a0Yq8MaMyx9p_4F74DnDYoQ8zEkzZI,25835
|
287
287
|
prefect/utilities/collections.py,sha256=c3nPLPWqIZQQdNuHs_nrbQJwuhQSX4ivUl-h9LtzXto,23243
|
288
288
|
prefect/utilities/compat.py,sha256=nnPA3lf2f4Y-l645tYFFNmj5NDPaYvjqa9pbGKZ3WKE,582
|
289
289
|
prefect/utilities/context.py,sha256=23SDMgdt07SjmB1qShiykHfGgiv55NBzdbMXM3fE9CI,1447
|
@@ -316,7 +316,7 @@ prefect/workers/cloud.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
|
|
316
316
|
prefect/workers/process.py,sha256=uxOwcqA2Ps-V-W6WeSdKCQMINrCxBEVx1K1Un8pb7vs,8973
|
317
317
|
prefect/workers/server.py,sha256=2pmVeJZiVbEK02SO6BEZaBIvHMsn6G8LzjW8BXyiTtk,1952
|
318
318
|
prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
|
319
|
-
prefect_client-3.
|
320
|
-
prefect_client-3.
|
321
|
-
prefect_client-3.
|
322
|
-
prefect_client-3.
|
319
|
+
prefect_client-3.3.1.dist-info/METADATA,sha256=9BhTmI_YUGkHMg1tfFGbQJ5knHqPNxlT4mTUpcsX6vI,7451
|
320
|
+
prefect_client-3.3.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
321
|
+
prefect_client-3.3.1.dist-info/licenses/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
|
322
|
+
prefect_client-3.3.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|