prefect-client 3.0.0rc13__py3-none-any.whl → 3.0.0rc14__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/task_runs.py CHANGED
@@ -2,7 +2,7 @@ import asyncio
2
2
  import atexit
3
3
  import threading
4
4
  import uuid
5
- from typing import Dict, Optional
5
+ from typing import Callable, Dict, Optional
6
6
 
7
7
  import anyio
8
8
  from cachetools import TTLCache
@@ -74,6 +74,7 @@ class TaskRunWaiter:
74
74
  maxsize=10000, ttl=600
75
75
  )
76
76
  self._completion_events: Dict[uuid.UUID, asyncio.Event] = {}
77
+ self._completion_callbacks: Dict[uuid.UUID, Callable] = {}
77
78
  self._loop: Optional[asyncio.AbstractEventLoop] = None
78
79
  self._observed_completed_task_runs_lock = threading.Lock()
79
80
  self._completion_events_lock = threading.Lock()
@@ -135,6 +136,8 @@ class TaskRunWaiter:
135
136
  # so the waiter can wake up the waiting coroutine
136
137
  if task_run_id in self._completion_events:
137
138
  self._completion_events[task_run_id].set()
139
+ if task_run_id in self._completion_callbacks:
140
+ self._completion_callbacks[task_run_id]()
138
141
  except Exception as exc:
139
142
  self.logger.error(f"Error processing event: {exc}")
140
143
 
@@ -195,6 +198,26 @@ class TaskRunWaiter:
195
198
  # Remove the event from the cache after it has been waited on
196
199
  instance._completion_events.pop(task_run_id, None)
197
200
 
201
+ @classmethod
202
+ def add_done_callback(cls, task_run_id: uuid.UUID, callback):
203
+ """
204
+ Add a callback to be called when a task run finishes.
205
+
206
+ Args:
207
+ task_run_id: The ID of the task run to wait for.
208
+ callback: The callback to call when the task run finishes.
209
+ """
210
+ instance = cls.instance()
211
+ with instance._observed_completed_task_runs_lock:
212
+ if task_run_id in instance._observed_completed_task_runs:
213
+ callback()
214
+ return
215
+
216
+ with instance._completion_events_lock:
217
+ # Cache the event for the task run ID so the consumer can set it
218
+ # when the event is received
219
+ instance._completion_callbacks[task_run_id] = callback
220
+
198
221
  @classmethod
199
222
  def instance(cls):
200
223
  """
prefect/task_worker.py CHANGED
@@ -38,6 +38,7 @@ from prefect.utilities.annotations import NotSet
38
38
  from prefect.utilities.asyncutils import asyncnullcontext, sync_compatible
39
39
  from prefect.utilities.engine import emit_task_run_state_change_event, propose_state
40
40
  from prefect.utilities.processutils import _register_signal
41
+ from prefect.utilities.services import start_client_metrics_server
41
42
  from prefect.utilities.urls import url_for
42
43
 
43
44
  logger = get_logger("task_worker")
@@ -158,6 +159,8 @@ class TaskWorker:
158
159
  """
159
160
  _register_signal(signal.SIGTERM, self.handle_sigterm)
160
161
 
162
+ start_client_metrics_server()
163
+
161
164
  async with asyncnullcontext() if self.started else self:
162
165
  logger.info("Starting task worker...")
163
166
  try:
@@ -364,17 +364,19 @@ def parameter_schema_from_entrypoint(entrypoint: str) -> ParameterSchema:
364
364
  Returns:
365
365
  ParameterSchema: The parameter schema for the function.
366
366
  """
367
+ filepath = None
367
368
  if ":" in entrypoint:
368
369
  # split by the last colon once to handle Windows paths with drive letters i.e C:\path\to\file.py:do_stuff
369
370
  path, func_name = entrypoint.rsplit(":", maxsplit=1)
370
371
  source_code = Path(path).read_text()
372
+ filepath = path
371
373
  else:
372
374
  path, func_name = entrypoint.rsplit(".", maxsplit=1)
373
375
  spec = importlib.util.find_spec(path)
374
376
  if not spec or not spec.origin:
375
377
  raise ValueError(f"Could not find module {path!r}")
376
378
  source_code = Path(spec.origin).read_text()
377
- signature = _generate_signature_from_source(source_code, func_name)
379
+ signature = _generate_signature_from_source(source_code, func_name, filepath)
378
380
  docstring = _get_docstring_from_source(source_code, func_name)
379
381
  return generate_parameter_schema(signature, parameter_docstrings(docstring))
380
382
 
@@ -444,7 +446,7 @@ def raise_for_reserved_arguments(fn: Callable, reserved_arguments: Iterable[str]
444
446
 
445
447
 
446
448
  def _generate_signature_from_source(
447
- source_code: str, func_name: str
449
+ source_code: str, func_name: str, filepath: Optional[str] = None
448
450
  ) -> inspect.Signature:
449
451
  """
450
452
  Extract the signature of a function from its source code.
@@ -460,7 +462,7 @@ def _generate_signature_from_source(
460
462
  """
461
463
  # Load the namespace from the source code. Missing imports and exceptions while
462
464
  # loading local class definitions are ignored.
463
- namespace = safe_load_namespace(source_code)
465
+ namespace = safe_load_namespace(source_code, filepath=filepath)
464
466
  # Parse the source code into an AST
465
467
  parsed_code = ast.parse(source_code)
466
468
 
@@ -361,79 +361,159 @@ class AliasedModuleLoader(Loader):
361
361
  sys.modules[self.alias] = root_module
362
362
 
363
363
 
364
- def safe_load_namespace(source_code: str):
364
+ def safe_load_namespace(
365
+ source_code: str, filepath: Optional[str] = None
366
+ ) -> Dict[str, Any]:
365
367
  """
366
- Safely load a namespace from source code.
368
+ Safely load a namespace from source code, optionally handling relative imports.
367
369
 
368
- This function will attempt to import all modules and classes defined in the source
369
- code. If an import fails, the error is caught and the import is skipped. This function
370
- will also attempt to compile and evaluate class and function definitions locally.
370
+ If a `filepath` is provided, `sys.path` is modified to support relative imports.
371
+ Changes to `sys.path` are reverted after completion, but this function is not thread safe
372
+ and use of it in threaded contexts may result in undesirable behavior.
371
373
 
372
374
  Args:
373
375
  source_code: The source code to load
376
+ filepath: Optional file path of the source code. If provided, enables relative imports.
374
377
 
375
378
  Returns:
376
- The namespace loaded from the source code. Can be used when evaluating source
377
- code.
379
+ The namespace loaded from the source code.
378
380
  """
379
381
  parsed_code = ast.parse(source_code)
380
382
 
381
- namespace = {"__name__": "prefect_safe_namespace_loader"}
383
+ namespace: Dict[str, Any] = {"__name__": "prefect_safe_namespace_loader"}
382
384
 
383
- # Remove the body of the if __name__ == "__main__": block from the AST to prevent
384
- # execution of guarded code
385
- new_body = []
386
- for node in parsed_code.body:
387
- if _is_main_block(node):
388
- continue
389
- new_body.append(node)
385
+ # Remove the body of the if __name__ == "__main__": block
386
+ new_body = [node for node in parsed_code.body if not _is_main_block(node)]
390
387
  parsed_code.body = new_body
391
388
 
392
- # Walk through the AST and find all import statements
393
- for node in ast.walk(parsed_code):
394
- if isinstance(node, ast.Import):
395
- for alias in node.names:
396
- module_name = alias.name
397
- as_name = alias.asname if alias.asname else module_name
398
- try:
399
- # Attempt to import the module
400
- namespace[as_name] = importlib.import_module(module_name)
401
- logger.debug("Successfully imported %s", module_name)
402
- except ImportError as e:
403
- logger.debug(f"Failed to import {module_name}: {e}")
404
- elif isinstance(node, ast.ImportFrom):
405
- module_name = node.module
406
- if module_name is None:
407
- continue
408
- try:
409
- module = importlib.import_module(module_name)
389
+ temp_module = None
390
+ original_sys_path = None
391
+
392
+ if filepath:
393
+ # Setup for relative imports
394
+ file_dir = os.path.dirname(os.path.abspath(filepath))
395
+ package_name = os.path.basename(file_dir)
396
+ parent_dir = os.path.dirname(file_dir)
397
+
398
+ # Save original sys.path and modify it
399
+ original_sys_path = sys.path.copy()
400
+ sys.path.insert(0, parent_dir)
401
+
402
+ # Create a temporary module for import context
403
+ temp_module = ModuleType(package_name)
404
+ temp_module.__file__ = filepath
405
+ temp_module.__package__ = package_name
406
+
407
+ # Create a spec for the module
408
+ temp_module.__spec__ = ModuleSpec(package_name, None)
409
+ temp_module.__spec__.loader = None
410
+ temp_module.__spec__.submodule_search_locations = [file_dir]
411
+
412
+ try:
413
+ for node in parsed_code.body:
414
+ if isinstance(node, ast.Import):
410
415
  for alias in node.names:
411
- name = alias.name
412
- asname = alias.asname if alias.asname else name
416
+ module_name = alias.name
417
+ as_name = alias.asname or module_name
413
418
  try:
414
- # Get the specific attribute from the module
415
- attribute = getattr(module, name)
416
- namespace[asname] = attribute
417
- except AttributeError as e:
418
- logger.debug(
419
- "Failed to retrieve %s from %s: %s", name, module_name, e
420
- )
421
- except ImportError as e:
422
- logger.debug("Failed to import from %s: %s", node.module, e)
423
-
424
- # Handle local definitions
425
- for node in parsed_code.body:
426
- if isinstance(node, (ast.ClassDef, ast.FunctionDef, ast.Assign)):
427
- try:
428
- # Compile and execute each class and function definition and assignment
429
- code = compile(
430
- ast.Module(body=[node], type_ignores=[]),
431
- filename="<ast>",
432
- mode="exec",
433
- )
434
- exec(code, namespace)
435
- except Exception as e:
436
- logger.debug("Failed to compile: %s", e)
419
+ namespace[as_name] = importlib.import_module(module_name)
420
+ logger.debug("Successfully imported %s", module_name)
421
+ except ImportError as e:
422
+ logger.debug(f"Failed to import {module_name}: {e}")
423
+ elif isinstance(node, ast.ImportFrom):
424
+ module_name = node.module or ""
425
+ if filepath:
426
+ try:
427
+ if node.level > 0:
428
+ # For relative imports, use the parent package to inform the import
429
+ package_parts = temp_module.__package__.split(".")
430
+ if len(package_parts) < node.level:
431
+ raise ImportError(
432
+ "Attempted relative import beyond top-level package"
433
+ )
434
+ parent_package = ".".join(
435
+ package_parts[: (1 - node.level)]
436
+ if node.level > 1
437
+ else package_parts
438
+ )
439
+ module = importlib.import_module(
440
+ f".{module_name}" if module_name else "",
441
+ package=parent_package,
442
+ )
443
+ else:
444
+ # Absolute imports are handled as normal
445
+ module = importlib.import_module(module_name)
446
+
447
+ for alias in node.names:
448
+ name = alias.name
449
+ asname = alias.asname or name
450
+ if name == "*":
451
+ # Handle 'from module import *'
452
+ module_dict = {
453
+ k: v
454
+ for k, v in module.__dict__.items()
455
+ if not k.startswith("_")
456
+ }
457
+ namespace.update(module_dict)
458
+ else:
459
+ try:
460
+ attribute = getattr(module, name)
461
+ namespace[asname] = attribute
462
+ except AttributeError as e:
463
+ logger.debug(
464
+ "Failed to retrieve %s from %s: %s",
465
+ name,
466
+ module_name,
467
+ e,
468
+ )
469
+ except ImportError as e:
470
+ logger.debug("Failed to import from %s: %s", module_name, e)
471
+ else:
472
+ # Handle as absolute import when no filepath is provided
473
+ try:
474
+ module = importlib.import_module(module_name)
475
+ for alias in node.names:
476
+ name = alias.name
477
+ asname = alias.asname or name
478
+ if name == "*":
479
+ # Handle 'from module import *'
480
+ module_dict = {
481
+ k: v
482
+ for k, v in module.__dict__.items()
483
+ if not k.startswith("_")
484
+ }
485
+ namespace.update(module_dict)
486
+ else:
487
+ try:
488
+ attribute = getattr(module, name)
489
+ namespace[asname] = attribute
490
+ except AttributeError as e:
491
+ logger.debug(
492
+ "Failed to retrieve %s from %s: %s",
493
+ name,
494
+ module_name,
495
+ e,
496
+ )
497
+ except ImportError as e:
498
+ logger.debug("Failed to import from %s: %s", module_name, e)
499
+ # Handle local definitions
500
+ for node in parsed_code.body:
501
+ if isinstance(node, (ast.ClassDef, ast.FunctionDef, ast.Assign)):
502
+ try:
503
+ code = compile(
504
+ ast.Module(body=[node], type_ignores=[]),
505
+ filename="<ast>",
506
+ mode="exec",
507
+ )
508
+ exec(code, namespace)
509
+ except Exception as e:
510
+ logger.debug("Failed to compile: %s", e)
511
+
512
+ finally:
513
+ # Restore original sys.path if it was modified
514
+ if original_sys_path:
515
+ sys.path[:] = original_sys_path
516
+
437
517
  return namespace
438
518
 
439
519
 
@@ -253,5 +253,35 @@ def preprocess_schema(
253
253
  process_properties(
254
254
  definition["properties"], required_fields, allow_none_with_default
255
255
  )
256
+ # Allow block types to be referenced by their id
257
+ if "block_type_slug" in definition:
258
+ schema["definitions"][definition["title"]] = {
259
+ "oneOf": [
260
+ definition,
261
+ {
262
+ "type": "object",
263
+ "properties": {
264
+ "$ref": {
265
+ "oneOf": [
266
+ {
267
+ "type": "string",
268
+ "format": "uuid",
269
+ },
270
+ {
271
+ "type": "object",
272
+ "additionalProperties": {
273
+ "type": "string",
274
+ },
275
+ "minProperties": 1,
276
+ },
277
+ ]
278
+ }
279
+ },
280
+ "required": [
281
+ "$ref",
282
+ ],
283
+ },
284
+ ]
285
+ }
256
286
 
257
287
  return schema
@@ -1,13 +1,16 @@
1
1
  import sys
2
+ import threading
2
3
  from collections import deque
3
4
  from traceback import format_exception
4
5
  from types import TracebackType
5
6
  from typing import Callable, Coroutine, Deque, Optional, Tuple
7
+ from wsgiref.simple_server import WSGIServer
6
8
 
7
9
  import anyio
8
10
  import httpx
9
11
 
10
12
  from prefect.logging.loggers import get_logger
13
+ from prefect.settings import PREFECT_CLIENT_ENABLE_METRICS, PREFECT_CLIENT_METRICS_PORT
11
14
  from prefect.utilities.collections import distinct
12
15
  from prefect.utilities.math import clamped_poisson_interval
13
16
 
@@ -150,3 +153,32 @@ async def critical_service_loop(
150
153
  sleep = interval * 2**backoff_count
151
154
 
152
155
  await anyio.sleep(sleep)
156
+
157
+
158
+ _metrics_server: Optional[Tuple[WSGIServer, threading.Thread]] = None
159
+
160
+
161
+ def start_client_metrics_server():
162
+ """Start the process-wide Prometheus metrics server for client metrics (if enabled
163
+ with `PREFECT_CLIENT_ENABLE_METRICS`) on the port `PREFECT_CLIENT_METRICS_PORT`."""
164
+ if not PREFECT_CLIENT_ENABLE_METRICS:
165
+ return
166
+
167
+ global _metrics_server
168
+ if _metrics_server:
169
+ return
170
+
171
+ from prometheus_client import start_http_server
172
+
173
+ _metrics_server = start_http_server(port=PREFECT_CLIENT_METRICS_PORT.value())
174
+
175
+
176
+ def stop_client_metrics_server():
177
+ """Start the process-wide Prometheus metrics server for client metrics, if it has
178
+ previously been started"""
179
+ global _metrics_server
180
+ if _metrics_server:
181
+ server, thread = _metrics_server
182
+ server.shutdown()
183
+ thread.join()
184
+ _metrics_server = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.0.0rc13
3
+ Version: 3.0.0rc14
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -44,6 +44,7 @@ Requires-Dist: orjson <4.0,>=3.7
44
44
  Requires-Dist: packaging <24.3,>=21.3
45
45
  Requires-Dist: pathspec >=0.8.0
46
46
  Requires-Dist: pendulum <4,>=3.0.0
47
+ Requires-Dist: prometheus-client >=0.20.0
47
48
  Requires-Dist: pydantic <3.0.0,>=2.7
48
49
  Requires-Dist: pydantic-core <3.0.0,>=2.12.0
49
50
  Requires-Dist: pydantic-extra-types <3.0.0,>=2.8.2
@@ -5,27 +5,27 @@ prefect/agent.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
5
5
  prefect/artifacts.py,sha256=wet3coxBtqK0914uTf-slYpXRVP0mjbZn804hXB-RS4,13011
6
6
  prefect/automations.py,sha256=NlQ62GPJzy-gnWQqX7c6CQJKw7p60WLGDAFcy82vtg4,5613
7
7
  prefect/cache_policies.py,sha256=uEKNGO-PJ3N35B2tjhRDtQULN6ok72D9raIoJaUyXk0,6365
8
- prefect/context.py,sha256=40FLSXI3Qd9dMwP8nQ7fGZFKpQIuEkjTpekT4V1MvF8,19942
8
+ prefect/context.py,sha256=qX9NSMO4dsxwEkR5FnddSdtcZ-5gJ-0rLz02uWkwGCc,21796
9
9
  prefect/engine.py,sha256=BpmDbe6miZcTl1vRkxfCPYcWSXADLigGPCagFwucMz0,1976
10
10
  prefect/exceptions.py,sha256=3s69Z_IC3HKF6BKxcHrMPXkKdYwfbEfaTjy4-5LOtQ0,11132
11
11
  prefect/filesystems.py,sha256=rbFvlqHXeeo71nK1Y5I0-ucmGOYUcdkbb6N2vpsRcWE,17229
12
- prefect/flow_engine.py,sha256=oNsRxLIZjjf-PyYl5m2cxWk1iRONI-U_KBZESfS4EAw,29328
12
+ prefect/flow_engine.py,sha256=c8mIffc57zLtHFRo4sVtQOXGihVA_y2mZiXYzjJlOHY,29445
13
13
  prefect/flow_runs.py,sha256=EaXRIQTOnwnA0fO7_EjwafFRmS57K_CRy0Xsz3JDIhc,16070
14
- prefect/flows.py,sha256=jskTdjUxH7Le1n3ME3TbkytRXrWs_B1LVRUy2-xOixk,84721
15
- prefect/futures.py,sha256=w5M_iZwt5aI0AUfia0JC1FkitRmQ6Oxtc_L7g_INTOM,13695
14
+ prefect/flows.py,sha256=MMlHqts-yZA6rMRa5xPHLo_yeaSZ7LjDBJ8dYVS0vCo,90248
15
+ prefect/futures.py,sha256=vDSDt5Kc7EVJQTxfA0r4Ul7sy6qOxwz4lkys0tpdngU,16403
16
16
  prefect/main.py,sha256=bab5nBn37a6gmxdPbTlRS2a9Cf0KY0GaCotDOSbcQ7M,1930
17
17
  prefect/manifests.py,sha256=477XcmfdC_yE81wT6zIAKnEUEJ0lH9ZLfOVSgX2FohE,676
18
18
  prefect/plugins.py,sha256=7AICJzHIu8iAeF9vl9wAYm28pR_k7dkdnm3OyJRfCv4,2229
19
- prefect/profiles.toml,sha256=Fs8hD_BdWHZgAijgk8pK_Zx-Pm-YFixqDIfEP6fM-qU,38
19
+ prefect/profiles.toml,sha256=7hwFMmUjLkoUxDj1Ggw0MPxViK9zMjMXmmUFtXLeijU,392
20
20
  prefect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  prefect/results.py,sha256=3mVkVWZn_VSQ9Pik79StNy113rB_SEiP83SdoUsFvTM,24635
22
22
  prefect/serializers.py,sha256=Lo41EM0_qGzcfB_63390Izeo3DdK6cY6VZfxa9hpSGQ,8712
23
- prefect/settings.py,sha256=gBn4DPcXLpIEIyH3TiyKBI1_PUZc4RuMKpYWF0Bo6mQ,68927
23
+ prefect/settings.py,sha256=ANN3aaQdLZUWBy1UpDvSwxpU-_4c3VL81gG0v3JGjpA,69794
24
24
  prefect/states.py,sha256=lw22xucH46cN9stkxiV9ByIvq689mH5iL3gErri-Y18,22207
25
- prefect/task_engine.py,sha256=W7P_FkWUD_YZXpqDoa5abZJMH0UvvBt4Tdw4wfyypmY,39989
25
+ prefect/task_engine.py,sha256=KVkGjD9kcNw4j0YYiVmBGkfb8TpGatEF4qiZDoFDz9c,63227
26
26
  prefect/task_runners.py,sha256=W1n0yMwbDIqnvffFVJADo9MGEbLaYkzWk52rqgnkMY4,15019
27
- prefect/task_runs.py,sha256=eDWYH5H1K4SyduhKmn3GzO6vM3fZSwOZxAb8KhkMGsk,7798
28
- prefect/task_worker.py,sha256=SJaetUGQQDOQItLPnQ7vDgAX7lAIsOcm5zSV0jmYA3M,17812
27
+ prefect/task_runs.py,sha256=jkaQOkRKOHS8fgHUijteriFpjMSKv4zldn1D8tZHkUI,8777
28
+ prefect/task_worker.py,sha256=LKyJI5iZueGR7sw_bJIn013PVoRr1aab26F5DYChRGo,17918
29
29
  prefect/tasks.py,sha256=A-sQB8S5dxcLtl10crDThsfdKpMzm9Rknfwhu27rnvY,68085
30
30
  prefect/transactions.py,sha256=XBbOjAUnDWw9QcxVwEamRaWxvRA_Ao-MkIN5dFL7h54,10008
31
31
  prefect/variables.py,sha256=-t5LVY0N-K4f0fa6YwruVVQqwnU3fGWBMYXXE32XPkA,4821
@@ -62,20 +62,20 @@ prefect/_internal/schemas/serializers.py,sha256=G_RGHfObjisUiRvd29p-zc6W4bwt5rE1
62
62
  prefect/_internal/schemas/validators.py,sha256=McSijrOcrqQpE-fvp4WRMoxsVn5fWIyBIXdYys1YRhk,29690
63
63
  prefect/blocks/__init__.py,sha256=BUfh6gIwA6HEjRyVCAiv0he3M1zfM-oY-JrlBfeWeY8,182
64
64
  prefect/blocks/abstract.py,sha256=YLzCaf3yXv6wFCF5ZqCIHJNwH7fME1rLxC-SijARHzk,16319
65
- prefect/blocks/core.py,sha256=zB0A0824u3MclXYd9Nt82uARbrDEi-onAtYmCi-XNCk,46667
65
+ prefect/blocks/core.py,sha256=EAvmPga9fyUfK9QW_HFLSit0dn6Szh_KbDK3n8HX4q0,52155
66
66
  prefect/blocks/fields.py,sha256=1m507VVmkpOnMF_7N-qboRjtw4_ceIuDneX3jZ3Jm54,63
67
- prefect/blocks/notifications.py,sha256=QV2ndeiERBbL9vNW2zR1LzH86llDY1sJVh2DN0sh1eo,28198
67
+ prefect/blocks/notifications.py,sha256=_ARWqq0NHFPxaaW27W6VieBVBwAKELeHtAkHXXP3R_g,29076
68
68
  prefect/blocks/redis.py,sha256=GUKYyx2QLtyNvgf5FT_dJxbgQcOzWCja3I23J1-AXhM,5629
69
69
  prefect/blocks/system.py,sha256=tkONKzDlaQgR6NtWXON0ZQm7nGuFKt0_Du3sj8ubs-M,3605
70
70
  prefect/blocks/webhook.py,sha256=mnAfGF64WyjH55BKkTbC1AP9FETNcrm_PEjiqJNpigA,1867
71
71
  prefect/client/__init__.py,sha256=fFtCXsGIsBCsAMFKlUPgRVUoIeqq_CsGtFE1knhbHlU,593
72
- prefect/client/base.py,sha256=laxz64IEhbetMIcRh67_YDYd5ThCmUK9fgUgco8WyXQ,24647
72
+ prefect/client/base.py,sha256=2K8UiWzorZNNM4c8c-OiGeZ5i5ViUfZ_Q31oPobbOO0,24956
73
73
  prefect/client/cloud.py,sha256=7iHff1YDABdzBW5BZFlyzmwgCMWUwbgVv2zTNlqW7lw,4132
74
74
  prefect/client/collections.py,sha256=I9EgbTg4Fn57gn8vwP_WdDmgnATbx9gfkm2jjhCORjw,1037
75
75
  prefect/client/constants.py,sha256=Z_GG8KF70vbbXxpJuqW5pLnwzujTVeHbcYYRikNmGH0,29
76
- prefect/client/orchestration.py,sha256=W3tiqjND1lf0GtunLBayMRrUD5ykAcW0GfwxqT9fT-A,142479
76
+ prefect/client/orchestration.py,sha256=5wCUmG_BQ5e1HWmU9z9RNYnrT3zs4PSn4e_Yq75FhLI,145170
77
77
  prefect/client/subscriptions.py,sha256=J9uK9NGHO4VX4Y3NGgBJ4pIG_0cf-dJWPhF3f3PGYL4,3388
78
- prefect/client/utilities.py,sha256=Qh1WdKLs8F_GuA04FeZ1GJsPYtiCN4DjKmLEaMfKmpQ,3264
78
+ prefect/client/utilities.py,sha256=89fmza0cRMOayxgXRdO51TKb11TczJ0ByOZmcZVrt44,3286
79
79
  prefect/client/schemas/__init__.py,sha256=KlyqFV-hMulMkNstBn_0ijoHoIwJZaBj6B1r07UmgvE,607
80
80
  prefect/client/schemas/actions.py,sha256=sZFVfN-Xks7x-sfp0kX97lSzHDbMx99E-rzIngOUU6A,28184
81
81
  prefect/client/schemas/filters.py,sha256=HyIYZQowhkHa_D6syj83zUp5uFEzA8UADLaS9mt1MTo,35305
@@ -86,10 +86,11 @@ prefect/client/schemas/sorting.py,sha256=EIQ6FUjUWMwk6fn6ckVLQLXOP-GI5kce7ftjUkD
86
86
  prefect/client/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  prefect/client/types/flexible_schedule_list.py,sha256=F1VFAXGLM89dJRBLnVsxwAMGLmrRF2i81FirEMpbB5s,368
88
88
  prefect/concurrency/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
- prefect/concurrency/asyncio.py,sha256=cCpjhq7z9hHpXUFLYp4fiGw_GcSfxOphhkOR4Xkf-4g,4738
89
+ prefect/concurrency/asyncio.py,sha256=2oUSur7OBXLrLrMFfEY9Pg5lp9-Rjk9mlyej1yRyCL0,6070
90
+ prefect/concurrency/context.py,sha256=hXt_QDXvj6hidP63k7AnoOUNI1-ZKd6EIrTuopQyzHU,942
90
91
  prefect/concurrency/events.py,sha256=EjZwUbbtP-N-u8rk8nbyMIi-BnkshoLkHRYh913jUWU,1810
91
- prefect/concurrency/services.py,sha256=akKoelFn6w70uYqGLIn2JcD5iCLy2CHPTnOz4XYrmOo,3039
92
- prefect/concurrency/sync.py,sha256=tjAcMj9mtgGeCQNmHTk35jCvqoI9CEGQNyeHG8j1B3k,3496
92
+ prefect/concurrency/services.py,sha256=wKW9dJzzZkTcS2Wk4IsNPfMOuXle2qSz50Qk0MxrOJc,3438
93
+ prefect/concurrency/sync.py,sha256=uGomOknZ_ET_wW0LcuOJBzbcYSNcaQZqH0bh1mOkmu8,4261
93
94
  prefect/deployments/__init__.py,sha256=_wb7NxDKhq11z9MjYsPckmT3o6MRhGLRgCV9TmvYtew,1002
94
95
  prefect/deployments/base.py,sha256=j2VUHkghXCqbfYJD8Joeh12Ejh4KCzr2DgVPRpDpbLw,16600
95
96
  prefect/deployments/deployments.py,sha256=EvC9qBdvJRc8CHJqRjFTqtzx75SE8bpZOl5C-2eULyA,109
@@ -104,11 +105,11 @@ prefect/docker/__init__.py,sha256=jumlacz2HY9l1ee0L9_kE0PFi9NO3l3pWINm9T5N9hs,52
104
105
  prefect/docker/docker_image.py,sha256=Y84_ooCYA9NGl6FElJul9-FaW3teT-eia2SiNtZ1LG8,2999
105
106
  prefect/events/__init__.py,sha256=GtKl2bE--pJduTxelH2xy7SadlLJmmis8WR1EYixhuA,2094
106
107
  prefect/events/actions.py,sha256=4kBV2NwFlC6oXVeMp9Qb2HMNqv1IZ7FcOqeXz1zlRf0,8983
107
- prefect/events/clients.py,sha256=52jXK9MD8OGy9vFB74I0efAk7IGtlbiE0n5iADD-b7g,19978
108
+ prefect/events/clients.py,sha256=U3NrU8lqQv_tbkhOa9yq9lo_f082RYt19Pehjnc97Vk,21605
108
109
  prefect/events/filters.py,sha256=IJ1TF-TCC7Wk2nJsbYW-HyAANToDQ6z1MdD63qE-lfw,8186
109
110
  prefect/events/related.py,sha256=1rUnQ7tg_UtNfSAkKdRo-rD2W93EKKB9xafPxyusFj8,6841
110
111
  prefect/events/utilities.py,sha256=gia_jGwxykxRTzS6FAp-gVEP9d7gH8S_hTd3-RQNJVQ,2627
111
- prefect/events/worker.py,sha256=UGwqnoOHmtvAh_Y9yJlEB6RfKmYRu4Xsc5l9LolHV_0,3434
112
+ prefect/events/worker.py,sha256=JAgPZjvOShWLpym-N4DeUIBQDlaAaqqG_Kkx7BcxAGY,3759
112
113
  prefect/events/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
114
  prefect/events/cli/automations.py,sha256=WIZ3-EcDibjQB5BrMEx7OZ7UfOqP8VjCI1dNh64Nmg0,11425
114
115
  prefect/events/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -138,7 +139,7 @@ prefect/records/__init__.py,sha256=7q-lwyevfVgb5S7K9frzawmiJmpZ5ET0m5yXIHBYcVA,3
138
139
  prefect/records/result_store.py,sha256=6Yh9zqqXMWjn0qWSfcjQBSfXCM7jVg9pve5TVsOodDc,1734
139
140
  prefect/records/store.py,sha256=eQM1p2vZDshXZYg6SkJwL-DP3kUehL_Zgs8xa2-0DZs,224
140
141
  prefect/runner/__init__.py,sha256=7U-vAOXFkzMfRz1q8Uv6Otsvc0OrPYLLP44srwkJ_8s,89
141
- prefect/runner/runner.py,sha256=zoW90-rYm6NLSVqmdXdQe7_aIBu6HuICe0gkz8FsKJc,47998
142
+ prefect/runner/runner.py,sha256=Lv9XeDziPgGMGFS7h4Pry4QcsXPHwuDirEJiFakq80Y,48079
142
143
  prefect/runner/server.py,sha256=2o5vhrL7Zbn-HBStWhCjqqViex5Ye9GiQ1EW9RSEzdo,10500
143
144
  prefect/runner/storage.py,sha256=FFHk28iF_OLw-cnXQtJIgGXUV4xecxF70mobiszP8C4,24557
144
145
  prefect/runner/submit.py,sha256=RuyDr-ved9wjYYarXiehY5oJVFf_HE3XKKACNWpxpPc,8131
@@ -154,7 +155,7 @@ prefect/types/entrypoint.py,sha256=2FF03-wLPgtnqR_bKJDB2BsXXINPdu8ptY9ZYEZnXg8,3
154
155
  prefect/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
156
  prefect/utilities/annotations.py,sha256=bXB43j5Zsq5gaBcJe9qnszBlnNwCTwqSTgcu2OkkRLo,2776
156
157
  prefect/utilities/asyncutils.py,sha256=8bOtYljRoOn-LKaMhaQWx80MM2KwUQQC0jzOuO--ZX4,20123
157
- prefect/utilities/callables.py,sha256=rkPPzwiVFRoVszSUq612s9S0v3nxcMC-rIwfXoJTn0E,24915
158
+ prefect/utilities/callables.py,sha256=agTY0XU0XWifH5SBsWLflAhNvIxOfc8Z0RRRAbCxrxk,25020
158
159
  prefect/utilities/collections.py,sha256=pPa_SZZq80cja6l99b3TV7hRQy366WnuWpOW_FnutMI,17259
159
160
  prefect/utilities/compat.py,sha256=mNQZDnzyKaOqy-OV-DnmH_dc7CNF5nQgW_EsA4xMr7g,906
160
161
  prefect/utilities/context.py,sha256=BThuUW94-IYgFYTeMIM9KMo8ShT3oiI7w5ajZHzU1j0,1377
@@ -163,13 +164,13 @@ prefect/utilities/dockerutils.py,sha256=kRozGQ7JO6Uxl-ljWtDryzxhf96rHL78aHYDh255
163
164
  prefect/utilities/engine.py,sha256=jqE8RqixSbobaB9IxTGKIT2siv9zjT_w_99Y8dDeVVU,31518
164
165
  prefect/utilities/filesystem.py,sha256=frAyy6qOeYa7c-jVbEUGZQEe6J1yF8I_SvUepPd59gI,4415
165
166
  prefect/utilities/hashing.py,sha256=EOwZLmoIZImuSTxAvVqInabxJ-4RpEfYeg9e2EDQF8o,1752
166
- prefect/utilities/importtools.py,sha256=YKmfib0_fYK_TaVjy8Ru1yxBI1OPH_Jh-utxlLpu2y8,15406
167
+ prefect/utilities/importtools.py,sha256=Wo4Tj9hSf7gghP83MxW3w9FK3jkaGKPEobDYjabPqT0,19389
167
168
  prefect/utilities/math.py,sha256=wLwcKVidpNeWQi1TUIWWLHGjlz9UgboX9FUGhx_CQzo,2821
168
169
  prefect/utilities/names.py,sha256=x-stHcF7_tebJPvB1dz-5FvdXJXNBTg2kFZXSnIBBmk,1657
169
170
  prefect/utilities/processutils.py,sha256=yo_GO48pZzgn4A0IK5irTAoqyUCYvWKDSqHXCrtP8c4,14547
170
171
  prefect/utilities/pydantic.py,sha256=YEY7hp5ptaYqOzsZJC4dXf9d2g37aOdepoH8FBPg7uw,12394
171
172
  prefect/utilities/render_swagger.py,sha256=h2UrORVN3f7gM4zurtMnySjQXZIOWbji3uMinpbkl8U,3717
172
- prefect/utilities/services.py,sha256=WoYOkWFnuW0K5I2RPx2g7F7WhuVgz39zWK9xkgiSHC8,6604
173
+ prefect/utilities/services.py,sha256=pan_cq-REq2TfTCevdj0OC58qqQFOcetkPN_VV7nDRw,7622
173
174
  prefect/utilities/slugify.py,sha256=57Vb14t13F3zm1P65KAu8nVeAz0iJCd1Qc5eMG-R5y8,169
174
175
  prefect/utilities/templating.py,sha256=nAiOGMMHGbIDFkGYy-g-dzcbY311WfycdgAhsM3cLpY,13298
175
176
  prefect/utilities/text.py,sha256=eXGIsCcZ7h_6hy8T5GDQjL8GiKyktoOqavYub0QjgO4,445
@@ -178,7 +179,7 @@ prefect/utilities/urls.py,sha256=GuiV3mk-XfzXx139ySyNQNbNaolA3T-hUZvW3T_PhXU,639
178
179
  prefect/utilities/visualization.py,sha256=Lum4IvLQ0nHsdLt6GGzS3Wwo-828u1rmOKc5mmWu994,6502
179
180
  prefect/utilities/schema_tools/__init__.py,sha256=KsFsTEHQqgp89TkDpjggkgBBywoHQPxbx-m6YQhiNEI,322
180
181
  prefect/utilities/schema_tools/hydration.py,sha256=Nitnmr35Mcn5z9NXIvh9DuZW5nCZxpjyMc9RFawMsgs,8376
181
- prefect/utilities/schema_tools/validation.py,sha256=zZHL_UFxAlgaUzi-qsEOrhWtZ7EkFQvPkX_YN1EJNTo,8414
182
+ prefect/utilities/schema_tools/validation.py,sha256=2GCjxwApTFwzey40ul9OkcAXrU3r-kWK__9ucMo0qbk,9744
182
183
  prefect/workers/__init__.py,sha256=8dP8SLZbWYyC_l9DRTQSE3dEbDgns5DZDhxkp_NfsbQ,35
183
184
  prefect/workers/base.py,sha256=gjv-ZxwJOSr9mytY5bVwj8rtFriLGacGghQhwcX9hQI,43457
184
185
  prefect/workers/block.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
@@ -186,8 +187,8 @@ prefect/workers/cloud.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
186
187
  prefect/workers/process.py,sha256=t1f1EYRoPL5B25KbLgUX2b5q-lCCAXb2Gpf6T2M9WfY,19822
187
188
  prefect/workers/server.py,sha256=lgh2FfSuaNU7b6HPxSFm8JtKvAvHsZGkiOo4y4tW1Cw,2022
188
189
  prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
189
- prefect_client-3.0.0rc13.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
190
- prefect_client-3.0.0rc13.dist-info/METADATA,sha256=s2r3T5XgBq13oTAtYVrA5ADAs9zvB3Ls5rAwubtA9H8,7432
191
- prefect_client-3.0.0rc13.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
192
- prefect_client-3.0.0rc13.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
193
- prefect_client-3.0.0rc13.dist-info/RECORD,,
190
+ prefect_client-3.0.0rc14.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
191
+ prefect_client-3.0.0rc14.dist-info/METADATA,sha256=KGcV02xz4lmcKDK6ciIVBMGFoFNNi8Gl64l4Y3OF7kM,7474
192
+ prefect_client-3.0.0rc14.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
193
+ prefect_client-3.0.0rc14.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
194
+ prefect_client-3.0.0rc14.dist-info/RECORD,,