prefect-client 3.4.3.dev2__py3-none-any.whl → 3.4.4__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.4.3.dev2"
3
- __build_date__ = "2025-05-21 08:09:05.236151+00:00"
4
- __git_commit__ = "7d4d41615e614b9f46eb317a2948a3d0643a07f5"
2
+ __version__ = "3.4.4"
3
+ __build_date__ = "2025-05-29 21:36:59.371770+00:00"
4
+ __git_commit__ = "0367d7aa7939aa1a26152a9db9997a75aadd6e3b"
5
5
  __dirty__ = False
@@ -222,7 +222,7 @@ class Future(concurrent.futures.Future[T]):
222
222
  self._cancel_scope = None
223
223
 
224
224
 
225
- @dataclasses.dataclass
225
+ @dataclasses.dataclass(eq=False)
226
226
  class Call(Generic[T]):
227
227
  """
228
228
  A deferred function call.
@@ -236,6 +236,42 @@ class Call(Generic[T]):
236
236
  timeout: Optional[float]
237
237
  runner: Optional["Portal"] = None
238
238
 
239
+ def __eq__(self, other: object) -> bool:
240
+ """this is to avoid attempts at invalid access of args/kwargs in <3.13 stemming from the
241
+ auto-generated __eq__ method on the dataclass.
242
+
243
+ this will no longer be required in 3.13+, see https://github.com/python/cpython/issues/128294
244
+ """
245
+ if self is other:
246
+ return True
247
+ if not isinstance(other, Call):
248
+ return NotImplemented
249
+
250
+ try:
251
+ # Attempt to access args/kwargs. If any are missing on self or other,
252
+ # an AttributeError will be raised by the access attempt on one of them.
253
+ s_args, s_kwargs = self.args, self.kwargs
254
+ o_args, o_kwargs = other.args, other.kwargs
255
+ except AttributeError:
256
+ # If args/kwargs are missing on self or other (and self is not other),
257
+ # they are considered not equal. This ensures that a Call with deleted
258
+ # args/kwargs compares as different from one that still has them
259
+ return False
260
+
261
+ # If all args/kwargs were accessible on both, proceed with full field comparison.
262
+ # Note: self.future == other.future will use Future's __eq__ (default is identity).
263
+ return (
264
+ (self.future == other.future)
265
+ and (self.fn == other.fn)
266
+ and (s_args == o_args)
267
+ and (s_kwargs == o_kwargs)
268
+ and (self.context == other.context)
269
+ and (self.timeout == other.timeout)
270
+ and (self.runner == other.runner)
271
+ )
272
+
273
+ __hash__ = None # type: ignore
274
+
239
275
  @classmethod
240
276
  def new(
241
277
  cls,
@@ -402,6 +402,18 @@ def validate_compressionlib(value: str) -> str:
402
402
 
403
403
 
404
404
  # TODO: if we use this elsewhere we can change the error message to be more generic
405
+ @overload
406
+ def list_length_50_or_less(v: int) -> int: ...
407
+
408
+
409
+ @overload
410
+ def list_length_50_or_less(v: float) -> float: ...
411
+
412
+
413
+ @overload
414
+ def list_length_50_or_less(v: list[int]) -> list[int]: ...
415
+
416
+
405
417
  @overload
406
418
  def list_length_50_or_less(v: list[float]) -> list[float]: ...
407
419
 
@@ -410,7 +422,9 @@ def list_length_50_or_less(v: list[float]) -> list[float]: ...
410
422
  def list_length_50_or_less(v: None) -> None: ...
411
423
 
412
424
 
413
- def list_length_50_or_less(v: Optional[list[float]]) -> Optional[list[float]]:
425
+ def list_length_50_or_less(
426
+ v: Optional[int | float | list[int] | list[float]],
427
+ ) -> Optional[int | float | list[int] | list[float]]:
414
428
  if isinstance(v, list) and (len(v) > 50):
415
429
  raise ValueError("Can not configure more than 50 retry delays per task.")
416
430
  return v
@@ -698,7 +698,7 @@ class TaskRunPolicy(PrefectBaseModel):
698
698
  deprecated=True,
699
699
  )
700
700
  retries: Optional[int] = Field(default=None, description="The number of retries.")
701
- retry_delay: Union[None, int, list[int]] = Field(
701
+ retry_delay: Union[None, int, float, list[int], list[float]] = Field(
702
702
  default=None,
703
703
  description="A delay time or list of delay times between retries, in seconds.",
704
704
  )
@@ -728,8 +728,8 @@ class TaskRunPolicy(PrefectBaseModel):
728
728
  @field_validator("retry_delay")
729
729
  @classmethod
730
730
  def validate_configured_retry_delays(
731
- cls, v: Optional[list[float]]
732
- ) -> Optional[list[float]]:
731
+ cls, v: Optional[int | float | list[int] | list[float]]
732
+ ) -> Optional[int | float | list[int] | list[float]]:
733
733
  return list_length_50_or_less(v)
734
734
 
735
735
  @field_validator("retry_jitter_factor")
@@ -18,7 +18,7 @@ from prefect.server.schemas.actions import DeploymentFlowRunCreate, StateCreate
18
18
  from prefect.server.schemas.core import WorkPool
19
19
  from prefect.server.schemas.filters import VariableFilter, VariableFilterName
20
20
  from prefect.server.schemas.responses import DeploymentResponse, OrchestrationResult
21
- from prefect.settings import PREFECT_SERVER_API_AUTH_STRING
21
+ from prefect.settings import get_current_settings
22
22
  from prefect.types import StrictVariableValue
23
23
 
24
24
  if TYPE_CHECKING:
@@ -39,18 +39,19 @@ class BaseClient:
39
39
  # will point it to the the currently running server instance
40
40
  api_app = create_app()
41
41
 
42
- # we pull the auth string from _server_ settings because this client is run on the server
43
- auth_string = PREFECT_SERVER_API_AUTH_STRING.value()
42
+ settings = get_current_settings()
44
43
 
45
- if auth_string:
46
- token = base64.b64encode(auth_string.encode("utf-8")).decode("utf-8")
47
- additional_headers.setdefault("Authorization", f"Basic {token}")
44
+ # we pull the auth string from _server_ settings because this client is run on the server
45
+ if auth_string_secret := settings.server.api.auth_string:
46
+ if auth_string := auth_string_secret.get_secret_value():
47
+ token = base64.b64encode(auth_string.encode("utf-8")).decode("utf-8")
48
+ additional_headers.setdefault("Authorization", f"Basic {token}")
48
49
 
49
50
  self._http_client = PrefectHttpxAsyncClient(
50
51
  transport=httpx.ASGITransport(app=api_app, raise_app_exceptions=False),
51
52
  headers={**additional_headers},
52
53
  base_url="http://prefect-in-memory/api",
53
- enable_csrf_support=False,
54
+ enable_csrf_support=settings.server.api.csrf_protection_enabled,
54
55
  raise_on_all_errors=False,
55
56
  )
56
57
 
@@ -63,6 +63,11 @@ class TasksSettings(PrefectBaseSettings):
63
63
  description="If `True`, sets the default cache policy on all tasks to `NO_CACHE`.",
64
64
  )
65
65
 
66
+ disable_caching: bool = Field(
67
+ default=False,
68
+ description="If `True`, disables caching on all tasks regardless of cache policy.",
69
+ )
70
+
66
71
  default_retries: int = Field(
67
72
  default=0,
68
73
  ge=0,
prefect/task_runners.py CHANGED
@@ -11,11 +11,8 @@ from typing import (
11
11
  TYPE_CHECKING,
12
12
  Any,
13
13
  Coroutine,
14
- Dict,
15
14
  Generic,
16
15
  Iterable,
17
- List,
18
- Optional,
19
16
  overload,
20
17
  )
21
18
 
@@ -110,7 +107,7 @@ class TaskRunner(abc.ABC, Generic[F]):
110
107
  self,
111
108
  task: "Task[P, R]",
112
109
  parameters: dict[str, Any | unmapped[Any] | allow_failure[Any]],
113
- wait_for: Optional[Iterable[PrefectFuture[R]]] = None,
110
+ wait_for: Iterable[PrefectFuture[R]] | None = None,
114
111
  ) -> PrefectFutureList[F]:
115
112
  """
116
113
  Submit multiple tasks to the task run engine.
@@ -183,7 +180,7 @@ class TaskRunner(abc.ABC, Generic[F]):
183
180
 
184
181
  map_length = list(lengths)[0]
185
182
 
186
- futures: List[PrefectFuture[Any]] = []
183
+ futures: list[PrefectFuture[Any]] = []
187
184
  for i in range(map_length):
188
185
  call_parameters: dict[str, Any] = {
189
186
  key: value[i] for key, value in iterable_parameters.items()
@@ -229,15 +226,32 @@ class TaskRunner(abc.ABC, Generic[F]):
229
226
 
230
227
 
231
228
  class ThreadPoolTaskRunner(TaskRunner[PrefectConcurrentFuture[R]]):
232
- def __init__(self, max_workers: Optional[int] = None):
229
+ """
230
+ A task runner that executes tasks in a separate thread pool.
231
+
232
+ Attributes:
233
+ max_workers: The maximum number of threads to use for executing tasks.
234
+ Defaults to `PREFECT_TASK_RUNNER_THREAD_POOL_MAX_WORKERS` or `sys.maxsize`.
235
+
236
+ Note:
237
+ This runner uses `contextvars.copy_context()` for thread-safe context propagation.
238
+ However, because contextvars are thread-local, frequent task submissions
239
+ that modify context (e.g., using `prefect.tags` in a loop) can lead to
240
+ new thread creation per task. This may cause an increase in threads and
241
+ file descriptors, potentially hitting OS limits (`OSError: Too many open files`).
242
+ If this occurs, consider minimizing context changes within looped tasks or
243
+ adjusting system limits for open file descriptors.
244
+ """
245
+
246
+ def __init__(self, max_workers: int | None = None):
233
247
  super().__init__()
234
- self._executor: Optional[ThreadPoolExecutor] = None
248
+ self._executor: ThreadPoolExecutor | None = None
235
249
  self._max_workers = (
236
250
  (PREFECT_TASK_RUNNER_THREAD_POOL_MAX_WORKERS.value() or sys.maxsize)
237
251
  if max_workers is None
238
252
  else max_workers
239
253
  )
240
- self._cancel_events: Dict[uuid.UUID, threading.Event] = {}
254
+ self._cancel_events: dict[uuid.UUID, threading.Event] = {}
241
255
 
242
256
  def duplicate(self) -> "ThreadPoolTaskRunner[R]":
243
257
  return type(self)(max_workers=self._max_workers)
prefect/tasks.py CHANGED
@@ -466,6 +466,10 @@ class Task(Generic[P, R]):
466
466
  ):
467
467
  persist_result = True
468
468
 
469
+ # Check for global cache disable setting
470
+ if settings.tasks.disable_caching:
471
+ cache_policy = NO_CACHE
472
+
469
473
  if persist_result is False:
470
474
  self.cache_policy = None if cache_policy is None else NO_CACHE
471
475
  if cache_policy and cache_policy is not NotSet and cache_policy != NO_CACHE:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect-client
3
- Version: 3.4.3.dev2
3
+ Version: 3.4.4
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
@@ -23,7 +23,7 @@ Classifier: Topic :: Software Development :: Libraries
23
23
  Requires-Python: <3.14,>=3.9
24
24
  Requires-Dist: anyio<5.0.0,>=4.4.0
25
25
  Requires-Dist: asgi-lifespan<3.0,>=1.0
26
- Requires-Dist: cachetools<6.0,>=5.3
26
+ Requires-Dist: cachetools<7.0,>=5.3
27
27
  Requires-Dist: cloudpickle<4.0,>=2.0
28
28
  Requires-Dist: coolname<3.0.0,>=1.0.4
29
29
  Requires-Dist: dateparser<2.0.0,>=1.1.1
@@ -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=3cVrM_qc7Q6Kdm1TIbmBwoGF5Kmc7_ptAVz6o6kphUs,185
4
+ prefect/_build_info.py,sha256=QmfdmWUQCGFBVn2mDWhjq7ccUFcw17pNoZ_Rjpq8ejo,180
5
5
  prefect/_result_records.py,sha256=S6QmsODkehGVSzbMm6ig022PYbI6gNKz671p_8kBYx4,7789
6
6
  prefect/_versioning.py,sha256=YqR5cxXrY4P6LM1Pmhd8iMo7v_G2KJpGNdsf4EvDFQ0,14132
7
7
  prefect/_waiters.py,sha256=Ia2ITaXdHzevtyWIgJoOg95lrEXQqNEOquHvw3T33UQ,9026
@@ -25,10 +25,10 @@ prefect/schedules.py,sha256=dhq4OhImRvcmtxF7UH1m8RbwYdHT5RQsp_FrxVXfODE,7289
25
25
  prefect/serializers.py,sha256=lU9A1rGEfAfhr8nTl3rf-K7ED78QNShXOrmRBhgNk3Y,9566
26
26
  prefect/states.py,sha256=rh7l1bnIYpTXdlXt5nnpz66y9KLjBWAJrN9Eo5RwgQs,26023
27
27
  prefect/task_engine.py,sha256=MIHEpg10imcltIRoUKjBnPKf9XuW_lh1gf5FGos_g3E,62819
28
- prefect/task_runners.py,sha256=PozMYXXjiy5pMStifjdBTnLRTtP9uRuBa86KgafpPkQ,16243
28
+ prefect/task_runners.py,sha256=ptgE5wuXg_IVHM0j7d6l7ELAVg3SXSy4vggnoHRF8dA,17040
29
29
  prefect/task_runs.py,sha256=7LIzfo3fondCyEUpU05sYFN5IfpZigBDXrhG5yc-8t0,9039
30
30
  prefect/task_worker.py,sha256=RifZ3bOl6ppoYPiOAd4TQp2_GEw9eDQoW483rq1q52Q,20805
31
- prefect/tasks.py,sha256=s8z5k_3KUC0FXzE10-VWH17Uc36a1GKbMOn3jYGbbjk,74954
31
+ prefect/tasks.py,sha256=f63tjtkXiZEiV7LUVMs5LByXDb1gLeT3UYPO6VgDzZA,75083
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
@@ -51,7 +51,7 @@ prefect/_internal/compatibility/deprecated.py,sha256=YUK1IGOgZrDh6dYRez-9IYTB1eq
51
51
  prefect/_internal/compatibility/migration.py,sha256=Z_r28B90ZQkSngXjr4I_9zA6P74_u48mtp2jYWB9zGg,6797
52
52
  prefect/_internal/concurrency/__init__.py,sha256=YlTwU9ryjPNwbJa45adLJY00t_DGCh1QrdtY9WdVFfw,2140
53
53
  prefect/_internal/concurrency/api.py,sha256=9MuQ0icQVTxwxChujn9mnv0WXRqwToysQy9GWC3sJRg,7352
54
- prefect/_internal/concurrency/calls.py,sha256=DkXNOpOrEM8IhFNE7E_ondwg1gcBeceLgoWPH3F2ExM,16596
54
+ prefect/_internal/concurrency/calls.py,sha256=e9eL7dmSairKdHg4KdRDWcM_L2CShZMtGyhp1JNxnpY,18176
55
55
  prefect/_internal/concurrency/cancellation.py,sha256=stCN22-S0f_kZPk50hCEEYzH35fBel3Nthq86FrW0MU,18675
56
56
  prefect/_internal/concurrency/event_loop.py,sha256=N6SyBV0vaSF5HD4_JM8zL7oBGd2nMuEKkeSPnBZdHw4,2136
57
57
  prefect/_internal/concurrency/inspection.py,sha256=wUWVbHi4G-BxuuYFWhTNmo5yc1C651lQrp5OMiHPU1E,3545
@@ -68,7 +68,7 @@ prefect/_internal/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
68
68
  prefect/_internal/schemas/bases.py,sha256=wYBIa5f5BwiKid7Rwp90gqxs7mt4qGBURdtv5dgWJxk,4583
69
69
  prefect/_internal/schemas/fields.py,sha256=m4LrFNz8rA9uBhMk9VyQT6FIXmV_EVAW92hdXeSvHbY,837
70
70
  prefect/_internal/schemas/serializers.py,sha256=G_RGHfObjisUiRvd29p-zc6W4bwt5rE1OdR6TXNrRhQ,825
71
- prefect/_internal/schemas/validators.py,sha256=bOtuOYHWfRo-i6zqkE-wvCMXQ3Yww-itj86QLp3yu3Y,16681
71
+ prefect/_internal/schemas/validators.py,sha256=h5LL6WuXf4rMmLHsYFflmJBlwqi5c7y0tYibMJzJANM,16933
72
72
  prefect/_vendor/croniter/__init__.py,sha256=NUFzdbyPcTQhIOFtzmFM0nbClAvBbKh2mlnTBa6NfHU,523
73
73
  prefect/_vendor/croniter/croniter.py,sha256=eJ2HzStNAYV-vNiLOgDXl4sYWWHOsSA0dgwbkQoguhY,53009
74
74
  prefect/blocks/__init__.py,sha256=D0hB72qMfgqnBB2EMZRxUxlX9yLfkab5zDChOwJZmkY,220
@@ -116,7 +116,7 @@ prefect/client/orchestration/_work_pools/client.py,sha256=s1DfUQQBgB2sLiVVPhLNTl
116
116
  prefect/client/schemas/__init__.py,sha256=InZcDzdeWA2oaV0TlyvoMcyLcbi_aaqU1U9D6Gx-eoU,2747
117
117
  prefect/client/schemas/actions.py,sha256=E46Mdq7vAq8hhYmMj6zqUF20uAPXZricViZcIYmgEf0,32443
118
118
  prefect/client/schemas/filters.py,sha256=qa--NNZduuSOcL1xw-YMd4FVIKMrDnBwPPY4m5Di0GA,35963
119
- prefect/client/schemas/objects.py,sha256=e5CMS6FhuYqTmxXK1U80eH5zEC0YkZ_vS_aJdr0VA5o,57912
119
+ prefect/client/schemas/objects.py,sha256=6rR9ccLJ4f1Hw0J8ywzgX2L3FRw8--XCQX9blBrE7R8,57984
120
120
  prefect/client/schemas/responses.py,sha256=Zdcx7jlIaluEa2uYIOE5mK1HsJvWPErRAcaWM20oY_I,17336
121
121
  prefect/client/schemas/schedules.py,sha256=sxLFk0SmFY7X1Y9R9HyGDqOS3U5NINBWTciUU7vTTic,14836
122
122
  prefect/client/schemas/sorting.py,sha256=L-2Mx-igZPtsUoRUguTcG3nIEstMEMPD97NwPM2Ox5s,2579
@@ -204,7 +204,7 @@ prefect/server/api/block_capabilities.py,sha256=7Z5kUIOs-ATKgrFI6r4es5YtuS56jnTW
204
204
  prefect/server/api/block_documents.py,sha256=zK9Tgo2FaEHDFvt9f9jLjGd4a7OEWT78IvJzHZaQQnE,5837
205
205
  prefect/server/api/block_schemas.py,sha256=9iYVsRHhswAlNxysoYa2UMeddzzltudecwwhC6hP9-Y,5497
206
206
  prefect/server/api/block_types.py,sha256=_fXzKFiWtuj4jvopQ_tHVbD0QKKngVshcR4tKM9Jqm0,8327
207
- prefect/server/api/clients.py,sha256=7Xr10JPj3FykLJ3v6Id251LgW6W-6xaWyqSU_RWcolA,8867
207
+ prefect/server/api/clients.py,sha256=IJWOatH4Bc9xOyxnMxbXEi9d1IychoMKzhXQ8_gtvZI,8995
208
208
  prefect/server/api/collections.py,sha256=RI7cjdM8RYFyAk2rgb35vqh06PWGXAamTvwThl83joY,2454
209
209
  prefect/server/api/concurrency_limits.py,sha256=E5TB2cJPIZjnxnm1pGxUJnwMDz5CS58gOGH-uGPmkes,10716
210
210
  prefect/server/api/concurrency_limits_v2.py,sha256=PGjG7W2Z65OojNTP0ezFu2z69plXo1N8paqwHlHAPj0,10183
@@ -257,7 +257,7 @@ prefect/settings/models/logging.py,sha256=Sj9GDNr5QMFaP6CN0WJyfpwhpOk4p1yhv45dyQ
257
257
  prefect/settings/models/results.py,sha256=VWFplQSSJyc0LXnziw1H5b3N_PDS32QBe_q2MWwYni0,1484
258
258
  prefect/settings/models/root.py,sha256=HpXt_I6T_kJw6QAxez4pCZl8p058etihzJbBNRylN3c,16767
259
259
  prefect/settings/models/runner.py,sha256=rD8OmNLwILmqnGe9YkM1dWKsulx3clYm4LI5N9vD5yM,1991
260
- prefect/settings/models/tasks.py,sha256=Rj3Tl8S04swCZIWgBCdn8sHct0B2IVgfPmM370Muj3E,3672
260
+ prefect/settings/models/tasks.py,sha256=Ky7SpSmm7Vamlf6qPFz2lIk72-5mSwzm9Dz1aVfYhV0,3829
261
261
  prefect/settings/models/testing.py,sha256=j9YH_WkB14iEzOjUtTmvY978qRSbgCypFSEi_cOs8no,1820
262
262
  prefect/settings/models/worker.py,sha256=zeDU71aR4CEvEOKyH-1jgEyol8XYe29PExjIC6a8Wv0,1378
263
263
  prefect/settings/models/server/__init__.py,sha256=KJmffmlHb8GYnClaeYcerae-IaeNsNMucKKRRS_zG9Q,33
@@ -322,7 +322,7 @@ prefect/workers/cloud.py,sha256=dPvG1jDGD5HSH7aM2utwtk6RaJ9qg13XjkA0lAIgQmY,287
322
322
  prefect/workers/process.py,sha256=Yi5D0U5AQ51wHT86GdwtImXSefe0gJf3LGq4r4z9zwM,11090
323
323
  prefect/workers/server.py,sha256=2pmVeJZiVbEK02SO6BEZaBIvHMsn6G8LzjW8BXyiTtk,1952
324
324
  prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
325
- prefect_client-3.4.3.dev2.dist-info/METADATA,sha256=GYvxuDRydy5zqbVwTPjmKp3rITtujoiWeu_-g8p_dnU,7472
326
- prefect_client-3.4.3.dev2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
327
- prefect_client-3.4.3.dev2.dist-info/licenses/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
328
- prefect_client-3.4.3.dev2.dist-info/RECORD,,
325
+ prefect_client-3.4.4.dist-info/METADATA,sha256=QQWXatVRk2TPpdV0K87UPewRvLZoli5XGyZBZjRuIzo,7467
326
+ prefect_client-3.4.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
327
+ prefect_client-3.4.4.dist-info/licenses/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
328
+ prefect_client-3.4.4.dist-info/RECORD,,