prefect-client 3.0.0rc3__py3-none-any.whl → 3.0.0rc4__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/tasks.py CHANGED
@@ -44,7 +44,7 @@ from prefect.context import (
44
44
  )
45
45
  from prefect.futures import PrefectDistributedFuture, PrefectFuture
46
46
  from prefect.logging.loggers import get_logger
47
- from prefect.records.cache_policies import DEFAULT, CachePolicy
47
+ from prefect.records.cache_policies import DEFAULT, NONE, CachePolicy
48
48
  from prefect.results import ResultFactory, ResultSerializer, ResultStorage
49
49
  from prefect.settings import (
50
50
  PREFECT_TASK_DEFAULT_RETRIES,
@@ -218,10 +218,8 @@ class Task(Generic[P, R]):
218
218
  cannot exceed 50.
219
219
  retry_jitter_factor: An optional factor that defines the factor to which a retry
220
220
  can be jittered in order to avoid a "thundering herd".
221
- persist_result: An optional toggle indicating whether the result of this task
222
- should be persisted to result storage. Defaults to `None`, which indicates
223
- that Prefect should choose whether the result should be persisted depending on
224
- the features being used.
221
+ persist_result: An toggle indicating whether the result of this task
222
+ should be persisted to result storage. Defaults to `True`.
225
223
  result_storage: An optional block to use to persist the result of this task.
226
224
  Defaults to the value set in the flow the task is called in.
227
225
  result_storage_key: An optional key to store the result in storage at when persisted.
@@ -273,7 +271,7 @@ class Task(Generic[P, R]):
273
271
  ]
274
272
  ] = None,
275
273
  retry_jitter_factor: Optional[float] = None,
276
- persist_result: Optional[bool] = None,
274
+ persist_result: bool = True,
277
275
  result_storage: Optional[ResultStorage] = None,
278
276
  result_serializer: Optional[ResultSerializer] = None,
279
277
  result_storage_key: Optional[str] = None,
@@ -368,7 +366,11 @@ class Task(Generic[P, R]):
368
366
 
369
367
  self.task_key = f"{self.fn.__qualname__}-{task_origin_hash}"
370
368
 
371
- # TODO: warn of precedence of cache policies and cache key fn if both provided?
369
+ if cache_policy is not NotSet and cache_key_fn is not None:
370
+ logger.warning(
371
+ f"Both `cache_policy` and `cache_key_fn` are set on task {self}. `cache_key_fn` will be used."
372
+ )
373
+
372
374
  if cache_key_fn:
373
375
  cache_policy = CachePolicy.from_cache_key_fn(cache_key_fn)
374
376
 
@@ -377,7 +379,13 @@ class Task(Generic[P, R]):
377
379
  self.cache_expiration = cache_expiration
378
380
  self.refresh_cache = refresh_cache
379
381
 
380
- if cache_policy is NotSet and result_storage_key is None:
382
+ if not persist_result:
383
+ self.cache_policy = None if cache_policy is None else NONE
384
+ if cache_policy and cache_policy is not NotSet and cache_policy != NONE:
385
+ logger.warning(
386
+ "Ignoring `cache_policy` because `persist_result` is False"
387
+ )
388
+ elif cache_policy is NotSet and result_storage_key is None:
381
389
  self.cache_policy = DEFAULT
382
390
  elif result_storage_key:
383
391
  # TODO: handle this situation with double storage
@@ -1326,7 +1334,7 @@ def task(
1326
1334
  Callable[[int], List[float]],
1327
1335
  ] = 0,
1328
1336
  retry_jitter_factor: Optional[float] = None,
1329
- persist_result: Optional[bool] = None,
1337
+ persist_result: bool = True,
1330
1338
  result_storage: Optional[ResultStorage] = None,
1331
1339
  result_storage_key: Optional[str] = None,
1332
1340
  result_serializer: Optional[ResultSerializer] = None,
@@ -1358,7 +1366,7 @@ def task(
1358
1366
  float, int, List[float], Callable[[int], List[float]], None
1359
1367
  ] = None,
1360
1368
  retry_jitter_factor: Optional[float] = None,
1361
- persist_result: Optional[bool] = None,
1369
+ persist_result: bool = True,
1362
1370
  result_storage: Optional[ResultStorage] = None,
1363
1371
  result_storage_key: Optional[str] = None,
1364
1372
  result_serializer: Optional[ResultSerializer] = None,
@@ -1404,10 +1412,8 @@ def task(
1404
1412
  cannot exceed 50.
1405
1413
  retry_jitter_factor: An optional factor that defines the factor to which a retry
1406
1414
  can be jittered in order to avoid a "thundering herd".
1407
- persist_result: An optional toggle indicating whether the result of this task
1408
- should be persisted to result storage. Defaults to `None`, which indicates
1409
- that Prefect should choose whether the result should be persisted depending on
1410
- the features being used.
1415
+ persist_result: An toggle indicating whether the result of this task
1416
+ should be persisted to result storage. Defaults to `True`.
1411
1417
  result_storage: An optional block to use to persist the result of this task.
1412
1418
  Defaults to the value set in the flow the task is called in.
1413
1419
  result_storage_key: An optional key to store the result in storage at when persisted.
prefect/transactions.py CHANGED
@@ -15,8 +15,11 @@ from typing_extensions import Self
15
15
  from prefect.context import ContextModel, FlowRunContext, TaskRunContext
16
16
  from prefect.records import RecordStore
17
17
  from prefect.records.result_store import ResultFactoryStore
18
- from prefect.results import BaseResult, ResultFactory, get_default_result_storage
19
- from prefect.settings import PREFECT_DEFAULT_RESULT_STORAGE_BLOCK
18
+ from prefect.results import (
19
+ BaseResult,
20
+ ResultFactory,
21
+ get_or_create_default_result_storage,
22
+ )
20
23
  from prefect.utilities.asyncutils import run_coro_as_sync
21
24
  from prefect.utilities.collections import AutoEnum
22
25
 
@@ -265,12 +268,7 @@ def transaction(
265
268
  }
266
269
  )
267
270
  else:
268
- default_storage = get_default_result_storage(_sync=True)
269
- if not default_storage._block_document_id:
270
- default_name = PREFECT_DEFAULT_RESULT_STORAGE_BLOCK.value().split("/")[
271
- -1
272
- ]
273
- default_storage.save(default_name, overwrite=True, _sync=True)
271
+ default_storage = get_or_create_default_result_storage(_sync=True)
274
272
  if existing_factory:
275
273
  new_factory = existing_factory.model_copy(
276
274
  update={
prefect/types/__init__.py CHANGED
@@ -15,12 +15,19 @@ from zoneinfo import available_timezones
15
15
  MAX_VARIABLE_NAME_LENGTH = 255
16
16
  MAX_VARIABLE_VALUE_LENGTH = 5000
17
17
 
18
- timezone_set = available_timezones()
19
-
20
18
  NonNegativeInteger = Annotated[int, Field(ge=0)]
21
19
  PositiveInteger = Annotated[int, Field(gt=0)]
22
20
  NonNegativeFloat = Annotated[float, Field(ge=0.0)]
23
- TimeZone = Annotated[str, Field(default="UTC", pattern="|".join(sorted(timezone_set)))]
21
+
22
+ TimeZone = Annotated[
23
+ str,
24
+ Field(
25
+ default="UTC",
26
+ pattern="|".join(
27
+ [z for z in sorted(available_timezones()) if "localtime" not in z]
28
+ ),
29
+ ),
30
+ ]
24
31
 
25
32
 
26
33
  BANNED_CHARACTERS = ["/", "%", "&", ">", "<"]
@@ -4,6 +4,7 @@ Utilities for extensions of and operations on Python collections.
4
4
 
5
5
  import io
6
6
  import itertools
7
+ import types
7
8
  import warnings
8
9
  from collections import OrderedDict, defaultdict
9
10
  from collections.abc import Iterator as IteratorABC
@@ -220,25 +221,31 @@ class StopVisiting(BaseException):
220
221
 
221
222
 
222
223
  def visit_collection(
223
- expr,
224
- visit_fn: Union[Callable[[Any, dict], Any], Callable[[Any], Any]],
224
+ expr: Any,
225
+ visit_fn: Union[Callable[[Any, Optional[dict]], Any], Callable[[Any], Any]],
225
226
  return_data: bool = False,
226
227
  max_depth: int = -1,
227
228
  context: Optional[dict] = None,
228
229
  remove_annotations: bool = False,
229
- ):
230
+ _seen: Optional[Set[int]] = None,
231
+ ) -> Any:
230
232
  """
231
- This function visits every element of an arbitrary Python collection. If an element
232
- is a Python collection, it will be visited recursively. If an element is not a
233
- collection, `visit_fn` will be called with the element. The return value of
234
- `visit_fn` can be used to alter the element if `return_data` is set.
233
+ Visits and potentially transforms every element of an arbitrary Python collection.
235
234
 
236
- Note that when using `return_data` a copy of each collection is created to avoid
237
- mutating the original object. This may have significant performance penalties and
238
- should only be used if you intend to transform the collection.
235
+ If an element is a Python collection, it will be visited recursively. If an element
236
+ is not a collection, `visit_fn` will be called with the element. The return value of
237
+ `visit_fn` can be used to alter the element if `return_data` is set to `True`.
238
+
239
+ Note:
240
+ - When `return_data` is `True`, a copy of each collection is created only if
241
+ `visit_fn` modifies an element within that collection. This approach minimizes
242
+ performance penalties by avoiding unnecessary copying.
243
+ - When `return_data` is `False`, no copies are created, and only side effects from
244
+ `visit_fn` are applied. This mode is faster and should be used when no transformation
245
+ of the collection is required, because it never has to copy any data.
239
246
 
240
247
  Supported types:
241
- - List
248
+ - List (including iterators)
242
249
  - Tuple
243
250
  - Set
244
251
  - Dict (note: keys are also visited recursively)
@@ -246,32 +253,41 @@ def visit_collection(
246
253
  - Pydantic model
247
254
  - Prefect annotations
248
255
 
256
+ Note that visit_collection will not consume generators or async generators, as it would prevent
257
+ the caller from iterating over them.
258
+
249
259
  Args:
250
- expr (Any): a Python object or expression
251
- visit_fn (Callable[[Any, Optional[dict]], Awaitable[Any]]): a function that
252
- will be applied to every non-collection element of expr. The function can
253
- accept one or two arguments. If two arguments are accepted, the second
254
- argument will be the context dictionary.
255
- return_data (bool): if `True`, a copy of `expr` containing data modified
256
- by `visit_fn` will be returned. This is slower than `return_data=False`
257
- (the default).
258
- max_depth: Controls the depth of recursive visitation. If set to zero, no
259
- recursion will occur. If set to a positive integer N, visitation will only
260
- descend to N layers deep. If set to any negative integer, no limit will be
260
+ expr (Any): A Python object or expression.
261
+ visit_fn (Callable[[Any, Optional[dict]], Any] or Callable[[Any], Any]): A function
262
+ that will be applied to every non-collection element of `expr`. The function can
263
+ accept one or two arguments. If two arguments are accepted, the second argument
264
+ will be the context dictionary.
265
+ return_data (bool): If `True`, a copy of `expr` containing data modified by `visit_fn`
266
+ will be returned. This is slower than `return_data=False` (the default).
267
+ max_depth (int): Controls the depth of recursive visitation. If set to zero, no
268
+ recursion will occur. If set to a positive integer `N`, visitation will only
269
+ descend to `N` layers deep. If set to any negative integer, no limit will be
261
270
  enforced and recursion will continue until terminal items are reached. By
262
271
  default, recursion is unlimited.
263
- context: An optional dictionary. If passed, the context will be sent to each
264
- call to the `visit_fn`. The context can be mutated by each visitor and will
265
- be available for later visits to expressions at the given depth. Values
272
+ context (Optional[dict]): An optional dictionary. If passed, the context will be sent
273
+ to each call to the `visit_fn`. The context can be mutated by each visitor and
274
+ will be available for later visits to expressions at the given depth. Values
266
275
  will not be available "up" a level from a given expression.
267
-
268
276
  The context will be automatically populated with an 'annotation' key when
269
- visiting collections within a `BaseAnnotation` type. This requires the
270
- caller to pass `context={}` and will not be activated by default.
271
- remove_annotations: If set, annotations will be replaced by their contents. By
277
+ visiting collections within a `BaseAnnotation` type. This requires the caller to
278
+ pass `context={}` and will not be activated by default.
279
+ remove_annotations (bool): If set, annotations will be replaced by their contents. By
272
280
  default, annotations are preserved but their contents are visited.
281
+ _seen (Optional[Set[int]]): A set of object ids that have already been visited. This
282
+ prevents infinite recursion when visiting recursive data structures.
283
+
284
+ Returns:
285
+ Any: The modified collection if `return_data` is `True`, otherwise `None`.
273
286
  """
274
287
 
288
+ if _seen is None:
289
+ _seen = set()
290
+
275
291
  def visit_nested(expr):
276
292
  # Utility for a recursive call, preserving options and updating the depth.
277
293
  return visit_collection(
@@ -282,6 +298,7 @@ def visit_collection(
282
298
  max_depth=max_depth - 1,
283
299
  # Copy the context on nested calls so it does not "propagate up"
284
300
  context=context.copy() if context is not None else None,
301
+ _seen=_seen,
285
302
  )
286
303
 
287
304
  def visit_expression(expr):
@@ -290,7 +307,7 @@ def visit_collection(
290
307
  else:
291
308
  return visit_fn(expr)
292
309
 
293
- # Visit every expression
310
+ # --- 1. Visit every expression
294
311
  try:
295
312
  result = visit_expression(expr)
296
313
  except StopVisiting:
@@ -298,47 +315,92 @@ def visit_collection(
298
315
  result = expr
299
316
 
300
317
  if return_data:
301
- # Only mutate the expression while returning data, otherwise it could be null
318
+ # Only mutate the root expression if the user indicated we're returning data,
319
+ # otherwise the function could return null and we have no collection to check
302
320
  expr = result
303
321
 
304
- # Then, visit every child of the expression recursively
322
+ # --- 2. Visit every child of the expression recursively
305
323
 
306
- # If we have reached the maximum depth, do not perform any recursion
307
- if max_depth == 0:
324
+ # If we have reached the maximum depth or we have already visited this object,
325
+ # return the result if we are returning data, otherwise return None
326
+ if max_depth == 0 or id(expr) in _seen:
308
327
  return result if return_data else None
328
+ else:
329
+ _seen.add(id(expr))
309
330
 
310
331
  # Get the expression type; treat iterators like lists
311
332
  typ = list if isinstance(expr, IteratorABC) and isiterable(expr) else type(expr)
312
333
  typ = cast(type, typ) # mypy treats this as 'object' otherwise and complains
313
334
 
314
335
  # Then visit every item in the expression if it is a collection
315
- if isinstance(expr, Mock):
336
+
337
+ # presume that the result is the original expression.
338
+ # in each of the following cases, we will update the result if we need to.
339
+ result = expr
340
+
341
+ # --- Generators
342
+
343
+ if isinstance(expr, (types.GeneratorType, types.AsyncGeneratorType)):
344
+ # Do not attempt to iterate over generators, as it will exhaust them
345
+ pass
346
+
347
+ # --- Mocks
348
+
349
+ elif isinstance(expr, Mock):
316
350
  # Do not attempt to recurse into mock objects
317
- result = expr
351
+ pass
352
+
353
+ # --- Annotations (unmapped, quote, etc.)
318
354
 
319
355
  elif isinstance(expr, BaseAnnotation):
320
356
  if context is not None:
321
357
  context["annotation"] = expr
322
- value = visit_nested(expr.unwrap())
358
+ unwrapped = expr.unwrap()
359
+ value = visit_nested(unwrapped)
323
360
 
324
- if remove_annotations:
325
- result = value if return_data else None
326
- else:
327
- result = expr.rewrap(value) if return_data else None
361
+ if return_data:
362
+ # if we are removing annotations, return the value
363
+ if remove_annotations:
364
+ result = value
365
+ # if the value was modified, rewrap it
366
+ elif value is not unwrapped:
367
+ result = expr.rewrap(value)
368
+ # otherwise return the expr
369
+
370
+ # --- Sequences
328
371
 
329
372
  elif typ in (list, tuple, set):
330
373
  items = [visit_nested(o) for o in expr]
331
- result = typ(items) if return_data else None
374
+ if return_data:
375
+ modified = any(item is not orig for item, orig in zip(items, expr))
376
+ if modified:
377
+ result = typ(items)
378
+
379
+ # --- Dictionaries
332
380
 
333
381
  elif typ in (dict, OrderedDict):
334
382
  assert isinstance(expr, (dict, OrderedDict)) # typecheck assertion
335
383
  items = [(visit_nested(k), visit_nested(v)) for k, v in expr.items()]
336
- result = typ(items) if return_data else None
384
+ if return_data:
385
+ modified = any(
386
+ k1 is not k2 or v1 is not v2
387
+ for (k1, v1), (k2, v2) in zip(items, expr.items())
388
+ )
389
+ if modified:
390
+ result = typ(items)
391
+
392
+ # --- Dataclasses
337
393
 
338
394
  elif is_dataclass(expr) and not isinstance(expr, type):
339
395
  values = [visit_nested(getattr(expr, f.name)) for f in fields(expr)]
340
- items = {field.name: value for field, value in zip(fields(expr), values)}
341
- result = typ(**items) if return_data else None
396
+ if return_data:
397
+ modified = any(
398
+ getattr(expr, f.name) is not v for f, v in zip(fields(expr), values)
399
+ )
400
+ if modified:
401
+ result = typ(**{f.name: v for f, v in zip(fields(expr), values)})
402
+
403
+ # --- Pydantic models
342
404
 
343
405
  elif isinstance(expr, pydantic.BaseModel):
344
406
  typ = cast(Type[pydantic.BaseModel], typ)
@@ -355,20 +417,21 @@ def visit_collection(
355
417
  }
356
418
 
357
419
  if return_data:
358
- # Use construct to avoid validation and handle immutability
359
- model_instance = typ.model_construct(
360
- _fields_set=expr.model_fields_set, **updated_data
420
+ modified = any(
421
+ getattr(expr, field) is not updated_data[field]
422
+ for field in model_fields
361
423
  )
362
- for private_attr in expr.__private_attributes__:
363
- setattr(model_instance, private_attr, getattr(expr, private_attr))
364
- result = model_instance
365
- else:
366
- result = None
424
+ if modified:
425
+ # Use construct to avoid validation and handle immutability
426
+ model_instance = typ.model_construct(
427
+ _fields_set=expr.model_fields_set, **updated_data
428
+ )
429
+ for private_attr in expr.__private_attributes__:
430
+ setattr(model_instance, private_attr, getattr(expr, private_attr))
431
+ result = model_instance
367
432
 
368
- else:
369
- result = result if return_data else None
370
-
371
- return result
433
+ if return_data:
434
+ return result
372
435
 
373
436
 
374
437
  def remove_nested_keys(keys_to_remove: List[Hashable], obj):
prefect/utilities/urls.py CHANGED
@@ -117,7 +117,7 @@ def url_for(
117
117
  if obj.id.startswith("prefect."):
118
118
  name = obj.id.split(".")[1]
119
119
  else:
120
- logger.warning(f"No URL known for resource with ID: {obj.id}")
120
+ logger.debug(f"No URL known for resource with ID: {obj.id}")
121
121
  return None
122
122
  elif isinstance(obj, str):
123
123
  name = obj
@@ -133,10 +133,10 @@ def url_for(
133
133
  raise ValueError(f"Invalid URL type: {url_type}. Use 'ui' or 'api'.")
134
134
 
135
135
  if url_type == "ui" and name not in UI_URL_FORMATS:
136
- logger.error("No UI URL known for this object: %s", name)
136
+ logger.debug("No UI URL known for this object: %s", name)
137
137
  return None
138
138
  elif url_type == "api" and name not in API_URL_FORMATS:
139
- logger.error("No API URL known for this object: %s", name)
139
+ logger.debug("No API URL known for this object: %s", name)
140
140
  return None
141
141
 
142
142
  if isinstance(obj, str) and not obj_id:
@@ -152,7 +152,7 @@ def url_for(
152
152
  base_url = base_url or default_base_url
153
153
 
154
154
  if not base_url:
155
- logger.warning(
155
+ logger.debug(
156
156
  f"No URL found for the Prefect {'UI' if url_type == 'ui' else 'API'}, "
157
157
  f"and no default base path provided."
158
158
  )
@@ -174,7 +174,7 @@ def url_for(
174
174
  else:
175
175
  obj_id = getattr(obj, "id", None)
176
176
  if not obj_id:
177
- logger.error(
177
+ logger.debug(
178
178
  "An ID is required to build a URL, but object did not have one: %s", obj
179
179
  )
180
180
  return ""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.0.0rc3
3
+ Version: 3.0.0rc4
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -46,7 +46,7 @@ Requires-Dist: pathspec >=0.8.0
46
46
  Requires-Dist: pendulum <4,>=3.0.0
47
47
  Requires-Dist: pydantic <3.0.0,>=2.7
48
48
  Requires-Dist: pydantic-core <3.0.0,>=2.12.0
49
- Requires-Dist: pydantic-extra-types !=2.8.1,<3.0.0,>2.7
49
+ Requires-Dist: pydantic-extra-types <3.0.0,>=2.8.2
50
50
  Requires-Dist: pydantic-settings
51
51
  Requires-Dist: python-dateutil <3.0.0,>=2.8.2
52
52
  Requires-Dist: python-slugify <9.0,>=5.0
@@ -1,5 +1,5 @@
1
1
  prefect/.prefectignore,sha256=awSprvKT0vI8a64mEOLrMxhxqcO-b0ERQeYpA2rNKVQ,390
2
- prefect/__init__.py,sha256=7U1KgTkcvbIuof0yse4_i181D98rih8y_SkZhPQStyA,2952
2
+ prefect/__init__.py,sha256=YdjT2cx1P0UBRlc6qUXxZrY1DB39YNPbJHqNvLr8wds,2919
3
3
  prefect/_version.py,sha256=I9JsXwt7BjAAbMEZgtmE3a6dJ2jqV-wqWto9D6msb3k,24597
4
4
  prefect/artifacts.py,sha256=G-jCyce3XGtTyQpCk_s3L7e-TWFyJY8Dcnk_i4_CsY4,12647
5
5
  prefect/automations.py,sha256=NlQ62GPJzy-gnWQqX7c6CQJKw7p60WLGDAFcy82vtg4,5613
@@ -7,24 +7,24 @@ prefect/context.py,sha256=1dGUGcVXbx6rd04cwtz7Oz1qVPCMlIrAkF-Xo5GtcVY,23196
7
7
  prefect/engine.py,sha256=asH7iMb1IfEOOIVIxM3ZalfvCe9PUp7f9ceKyT6isa8,2019
8
8
  prefect/exceptions.py,sha256=kRiEX6qpT9errs0SuYJDYG7ioMNddTvqK7gT8RVFajk,11076
9
9
  prefect/filesystems.py,sha256=HrPoehZKpuVxzWDXaTiuJqgVCgxlQ4lyTEZKSYKiZUc,17169
10
- prefect/flow_engine.py,sha256=4AekqZxCSrro_PL40jxdVELHby5YJ3QOaYbSFO0jjlI,23164
10
+ prefect/flow_engine.py,sha256=0Or0YtZcGVM4zYZtFWYB3qhUjzOP1ZI9KRqdqj-wEiY,26301
11
11
  prefect/flow_runs.py,sha256=7mHGjb3-6MfR4XKQjy9sJPS9dS0yTxVO6MYQ8YlGjGw,16071
12
- prefect/flows.py,sha256=XT-RPAsY4twN5hQOoM_8AsB5zfI_pLVuq7KL46hPr1A,81075
13
- prefect/futures.py,sha256=-ElpB4lcjJxMS1Jl-iHnUEofpgoSs2xCtMgR3_F4bTE,9139
12
+ prefect/flows.py,sha256=aHr_PLR_bmFUO09hMUC0J5LapJya3zppZXsMC95uBxo,81466
13
+ prefect/futures.py,sha256=I4yyicBo_kUxzzOV1mrSWqjvRzFm_8CD-JQf0Gchbos,9452
14
14
  prefect/manifests.py,sha256=477XcmfdC_yE81wT6zIAKnEUEJ0lH9ZLfOVSgX2FohE,676
15
15
  prefect/plugins.py,sha256=-IqPJvQGoMZBioHCF0s1IDNHYA7OxIRaUlkaGM2CgLY,4164
16
16
  prefect/profiles.toml,sha256=Fs8hD_BdWHZgAijgk8pK_Zx-Pm-YFixqDIfEP6fM-qU,38
17
17
  prefect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- prefect/results.py,sha256=oFJkqoZKXTvTdfDCY9Lz1pnCiTK_fZ74BwzUshf_pBg,25161
18
+ prefect/results.py,sha256=r9yPpvQcvKlnaoXvJfWPj8nbJZ9QiiyKDxtKRS-PxKQ,25061
19
19
  prefect/serializers.py,sha256=8ON--RmaLX3Td3Rpd1lshGcqWyjlCFkmO3sblxsdT_c,8699
20
- prefect/settings.py,sha256=7SQtJWmHdJl5iA0EY-Q_FC3WZ9fCTwgnFT6N34p4STA,74607
20
+ prefect/settings.py,sha256=JkCgcFO7Zw0Kv_azK9XLabx08ypVgL76E6r8nD-HZLM,74598
21
21
  prefect/states.py,sha256=GDpFM6UUMB5MkCDWyqo8F9ELnkskr1BTg4YdU_bnv7Q,20395
22
- prefect/task_engine.py,sha256=LnHRiEZKjZjsSodnO2996OerVj-V-ozV0mAm3yDeF34,32179
22
+ prefect/task_engine.py,sha256=cd68Rdy9Ihb0x1ngBcJ_eSH9E1BCUkoDHuesqfmlNjQ,32219
23
23
  prefect/task_runners.py,sha256=TQHyQATPkZE6BNVJ_JQBNmiL1kdgZRjY_Fjs3-N1UiE,11869
24
- prefect/task_runs.py,sha256=oeH1JKeg214UMpdEUoX1SOq1C2raGVOW-VwZLltzkK8,7175
25
- prefect/task_worker.py,sha256=Jw64k3Nigye3FgHvG4DM3z808YaTaLBneO4IB2wbBHc,13074
26
- prefect/tasks.py,sha256=fntgTe9X_XX1-i7X3ch45QVyMz2zOVV1e4oz5sSRCg8,60189
27
- prefect/transactions.py,sha256=gGf7La0AyhMZJoWIlmVxoHkFpcWb6roGrVf2DGlZfOE,9443
24
+ prefect/task_runs.py,sha256=eDWYH5H1K4SyduhKmn3GzO6vM3fZSwOZxAb8KhkMGsk,7798
25
+ prefect/task_worker.py,sha256=iawQZn4hNcrXR-CHtM4jzhlnotqeNHiRuHc-eumJ9Oc,16788
26
+ prefect/tasks.py,sha256=adECMEbsP32KPYzrSasBtfhdFs-gHUxCnS6PXxVsCek,60312
27
+ prefect/transactions.py,sha256=FwCrZfq3zVSiqgpNYNkAm1ihjFFauDAvzPYf-J5z26s,9151
28
28
  prefect/variables.py,sha256=-t5LVY0N-K4f0fa6YwruVVQqwnU3fGWBMYXXE32XPkA,4821
29
29
  prefect/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  prefect/_internal/_logging.py,sha256=HvNHY-8P469o5u4LYEDBTem69XZEt1QUeUaLToijpak,810
@@ -59,7 +59,6 @@ prefect/blocks/__init__.py,sha256=BUfh6gIwA6HEjRyVCAiv0he3M1zfM-oY-JrlBfeWeY8,18
59
59
  prefect/blocks/abstract.py,sha256=YLzCaf3yXv6wFCF5ZqCIHJNwH7fME1rLxC-SijARHzk,16319
60
60
  prefect/blocks/core.py,sha256=cgkPF1rpNl_4Asekh2RJ0RiMmjqtuQEbp52BDXgxdbY,46657
61
61
  prefect/blocks/fields.py,sha256=1m507VVmkpOnMF_7N-qboRjtw4_ceIuDneX3jZ3Jm54,63
62
- prefect/blocks/kubernetes.py,sha256=1AHzcI2hPeu5zOEKLC4FBjjv8VdZ8ianuv6oVEh4ou8,4016
63
62
  prefect/blocks/notifications.py,sha256=QV2ndeiERBbL9vNW2zR1LzH86llDY1sJVh2DN0sh1eo,28198
64
63
  prefect/blocks/redis.py,sha256=GUKYyx2QLtyNvgf5FT_dJxbgQcOzWCja3I23J1-AXhM,5629
65
64
  prefect/blocks/system.py,sha256=tkONKzDlaQgR6NtWXON0ZQm7nGuFKt0_Du3sj8ubs-M,3605
@@ -70,7 +69,7 @@ prefect/client/cloud.py,sha256=5T84QP9IRa_cqL7rmY3lR1wxFW6C41PajFZgelurhK0,4124
70
69
  prefect/client/collections.py,sha256=I9EgbTg4Fn57gn8vwP_WdDmgnATbx9gfkm2jjhCORjw,1037
71
70
  prefect/client/constants.py,sha256=Z_GG8KF70vbbXxpJuqW5pLnwzujTVeHbcYYRikNmGH0,29
72
71
  prefect/client/orchestration.py,sha256=0wK6LEWgKgsrgy6kF654EiweorId8nmX5nzXp-BtSgU,142641
73
- prefect/client/subscriptions.py,sha256=LGMxFO20fp4gRgGTIq62HZemTgVNHHSHzbpPn6syw0U,3374
72
+ prefect/client/subscriptions.py,sha256=J9uK9NGHO4VX4Y3NGgBJ4pIG_0cf-dJWPhF3f3PGYL4,3388
74
73
  prefect/client/utilities.py,sha256=Ni1DsFDhnvxpXWerlvZpK8tCg-uZ8UyZwOmDTKEb1DI,3269
75
74
  prefect/client/schemas/__init__.py,sha256=KlyqFV-hMulMkNstBn_0ijoHoIwJZaBj6B1r07UmgvE,607
76
75
  prefect/client/schemas/actions.py,sha256=t-JJCikwa_ZrTPu7VJDwkLQ2fgNQuYHUwAi_3PHpwoU,28113
@@ -141,12 +140,12 @@ prefect/runtime/flow_run.py,sha256=Fxbyc4r3kPj2m3AIJT8gud2PB5w9aKTwkI-g4dysikE,8
141
140
  prefect/runtime/task_run.py,sha256=B6v_nZiHy9nKZfnKFQF7izZjAjaiZOT0j80m-VcLxmY,3403
142
141
  prefect/server/api/collections_data/views/aggregate-worker-metadata.json,sha256=gqrwGyylzBEzlFSPOJcMuUwdoK_zojpU0SZaBDgK5FE,79748
143
142
  prefect/server/api/static/prefect-logo-mark-gradient.png,sha256=ylRjJkI_JHCw8VbQasNnXQHwZW-sH-IQiUGSD3aWP1E,73430
144
- prefect/types/__init__.py,sha256=SsjNhBX_O-z8gqtCm-ettrg481gqz1qVZUoxAY9fhrM,2169
143
+ prefect/types/__init__.py,sha256=SAHJDtWEGidTKXQACJ38nj6fq8r57Gj0Pwo4Gy7pVWs,2234
145
144
  prefect/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
145
  prefect/utilities/annotations.py,sha256=bXB43j5Zsq5gaBcJe9qnszBlnNwCTwqSTgcu2OkkRLo,2776
147
146
  prefect/utilities/asyncutils.py,sha256=GRDiA3S9vGRpM3aKSq6iZnNP9XNBcfUg0NBwbjUFeAw,19200
148
147
  prefect/utilities/callables.py,sha256=rkPPzwiVFRoVszSUq612s9S0v3nxcMC-rIwfXoJTn0E,24915
149
- prefect/utilities/collections.py,sha256=9vUZA8j_NAOcsRZ45UWGYpO1EuUErcpcPTyZap5q28I,14883
148
+ prefect/utilities/collections.py,sha256=2W7cgdB_c_LGMbHPmFSKJbwue_Ai8h5CukSmFoZ8svE,17248
150
149
  prefect/utilities/compat.py,sha256=mNQZDnzyKaOqy-OV-DnmH_dc7CNF5nQgW_EsA4xMr7g,906
151
150
  prefect/utilities/context.py,sha256=BThuUW94-IYgFYTeMIM9KMo8ShT3oiI7w5ajZHzU1j0,1377
152
151
  prefect/utilities/dispatch.py,sha256=c8G-gBo7hZlyoD7my9nO50Rzy8Retk-np5WGq9_E2AM,5856
@@ -165,7 +164,7 @@ prefect/utilities/slugify.py,sha256=57Vb14t13F3zm1P65KAu8nVeAz0iJCd1Qc5eMG-R5y8,
165
164
  prefect/utilities/templating.py,sha256=nAiOGMMHGbIDFkGYy-g-dzcbY311WfycdgAhsM3cLpY,13298
166
165
  prefect/utilities/text.py,sha256=eXGIsCcZ7h_6hy8T5GDQjL8GiKyktoOqavYub0QjgO4,445
167
166
  prefect/utilities/timeout.py,sha256=nxmuPxROIT-i8gPffpARuxnxu58H0vkmbjTVIgef0_0,805
168
- prefect/utilities/urls.py,sha256=Qw6IlI7CKAlA3t2Ii-b09fXRJTaHuqLFNM2KVhI_yQI,6400
167
+ prefect/utilities/urls.py,sha256=GuiV3mk-XfzXx139ySyNQNbNaolA3T-hUZvW3T_PhXU,6396
169
168
  prefect/utilities/visualization.py,sha256=Lum4IvLQ0nHsdLt6GGzS3Wwo-828u1rmOKc5mmWu994,6502
170
169
  prefect/utilities/schema_tools/__init__.py,sha256=KsFsTEHQqgp89TkDpjggkgBBywoHQPxbx-m6YQhiNEI,322
171
170
  prefect/utilities/schema_tools/hydration.py,sha256=Nitnmr35Mcn5z9NXIvh9DuZW5nCZxpjyMc9RFawMsgs,8376
@@ -175,8 +174,8 @@ prefect/workers/base.py,sha256=62E0Q41pPr3eQdSBSUBfiR4WYx01OfuqUp5INRqHGgo,46942
175
174
  prefect/workers/process.py,sha256=vylkSSswaSCew-V65YW0HcxIxyKI-uqWkbSKpkkLamQ,9372
176
175
  prefect/workers/server.py,sha256=EfPiMxI7TVgkqpHkdPwSaYG-ydi99sG7jwXhkAcACbI,1519
177
176
  prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
178
- prefect_client-3.0.0rc3.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
179
- prefect_client-3.0.0rc3.dist-info/METADATA,sha256=S_JWxgOm7Nj3tN3KKouc_NzXeAMLWBZMyYW6BqZwfFo,7397
180
- prefect_client-3.0.0rc3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
181
- prefect_client-3.0.0rc3.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
182
- prefect_client-3.0.0rc3.dist-info/RECORD,,
177
+ prefect_client-3.0.0rc4.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
178
+ prefect_client-3.0.0rc4.dist-info/METADATA,sha256=eFZ99z6jEN7BfrG1CodVrcYG7w13-pzn50J0ayzgO6I,7392
179
+ prefect_client-3.0.0rc4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
180
+ prefect_client-3.0.0rc4.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
181
+ prefect_client-3.0.0rc4.dist-info/RECORD,,