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/blocks/core.py +132 -4
- prefect/blocks/notifications.py +26 -3
- prefect/client/base.py +30 -24
- prefect/client/orchestration.py +121 -47
- prefect/client/utilities.py +4 -4
- prefect/concurrency/asyncio.py +48 -7
- prefect/concurrency/context.py +24 -0
- prefect/concurrency/services.py +24 -8
- prefect/concurrency/sync.py +30 -3
- prefect/context.py +83 -23
- prefect/events/clients.py +54 -4
- prefect/events/worker.py +9 -2
- prefect/flow_engine.py +6 -3
- prefect/flows.py +166 -8
- prefect/futures.py +84 -2
- prefect/profiles.toml +13 -2
- prefect/runner/runner.py +6 -1
- prefect/settings.py +35 -2
- prefect/task_engine.py +853 -279
- prefect/task_runs.py +24 -1
- prefect/task_worker.py +3 -0
- prefect/utilities/callables.py +5 -3
- prefect/utilities/importtools.py +138 -58
- prefect/utilities/schema_tools/validation.py +30 -0
- prefect/utilities/services.py +32 -0
- {prefect_client-3.0.0rc13.dist-info → prefect_client-3.0.0rc14.dist-info}/METADATA +2 -1
- {prefect_client-3.0.0rc13.dist-info → prefect_client-3.0.0rc14.dist-info}/RECORD +30 -29
- {prefect_client-3.0.0rc13.dist-info → prefect_client-3.0.0rc14.dist-info}/LICENSE +0 -0
- {prefect_client-3.0.0rc13.dist-info → prefect_client-3.0.0rc14.dist-info}/WHEEL +0 -0
- {prefect_client-3.0.0rc13.dist-info → prefect_client-3.0.0rc14.dist-info}/top_level.txt +0 -0
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:
|
prefect/utilities/callables.py
CHANGED
@@ -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
|
|
prefect/utilities/importtools.py
CHANGED
@@ -361,79 +361,159 @@ class AliasedModuleLoader(Loader):
|
|
361
361
|
sys.modules[self.alias] = root_module
|
362
362
|
|
363
363
|
|
364
|
-
def safe_load_namespace(
|
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
|
-
|
369
|
-
|
370
|
-
|
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.
|
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
|
384
|
-
|
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
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
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
|
-
|
412
|
-
|
416
|
+
module_name = alias.name
|
417
|
+
as_name = alias.asname or module_name
|
413
418
|
try:
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
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
|
prefect/utilities/services.py
CHANGED
@@ -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.
|
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=
|
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=
|
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=
|
15
|
-
prefect/futures.py,sha256=
|
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=
|
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=
|
23
|
+
prefect/settings.py,sha256=ANN3aaQdLZUWBy1UpDvSwxpU-_4c3VL81gG0v3JGjpA,69794
|
24
24
|
prefect/states.py,sha256=lw22xucH46cN9stkxiV9ByIvq689mH5iL3gErri-Y18,22207
|
25
|
-
prefect/task_engine.py,sha256=
|
25
|
+
prefect/task_engine.py,sha256=KVkGjD9kcNw4j0YYiVmBGkfb8TpGatEF4qiZDoFDz9c,63227
|
26
26
|
prefect/task_runners.py,sha256=W1n0yMwbDIqnvffFVJADo9MGEbLaYkzWk52rqgnkMY4,15019
|
27
|
-
prefect/task_runs.py,sha256=
|
28
|
-
prefect/task_worker.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
92
|
-
prefect/concurrency/sync.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
190
|
-
prefect_client-3.0.
|
191
|
-
prefect_client-3.0.
|
192
|
-
prefect_client-3.0.
|
193
|
-
prefect_client-3.0.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|