prefect-client 3.8.1.dev4__tar.gz → 3.8.2__tar.gz
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_client-3.8.1.dev4 → prefect_client-3.8.2}/PKG-INFO +2 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/pyproject.toml +1 -1
- prefect_client-3.8.2/src/prefect/_build_info.py +5 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/services.py +13 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/control_listener.py +4 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/observers.py +188 -27
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/websockets.py +9 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/core.py +8 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flow_runs/client.py +56 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_work_pools/client.py +2 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/filters.py +26 -20
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/objects.py +1 -1
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/AGENTS.md +1 -1
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/_asyncio.py +26 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/services.py +84 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/context.py +19 -1
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/runner.py +67 -7
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/engine.py +6 -8
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/clients.py +0 -1
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/utilities.py +7 -3
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/flow_engine.py +16 -22
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/flows.py +2 -3
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/futures.py +6 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/container_instance.py +1 -1
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/AGENTS.md +2 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_control_channel.py +9 -8
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_process_manager.py +33 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_starter_engine.py +5 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_workspace_starter.py +3 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/storage.py +2 -2
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/tasks.py +0 -8
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/processutils/__init__.py +24 -3
- prefect_client-3.8.1.dev4/src/prefect/_build_info.py +0 -5
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/.gitignore +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/LICENSE +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/README.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/hatch_build.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/__main__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/agent.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/automations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/related.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/main.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/plugins.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/py.typed +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/results.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/schedules.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/serializers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/_types.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/states.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/transactions.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/types/names.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/variables.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.8.
|
|
3
|
+
Version: 3.8.2
|
|
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
|
|
@@ -22,7 +22,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries
|
|
23
23
|
Requires-Python: <3.15,>=3.10
|
|
24
24
|
Requires-Dist: amplitude-analytics<2.0.0,>=1.2.1
|
|
25
|
-
Requires-Dist: anyio
|
|
25
|
+
Requires-Dist: anyio<5.0.0,>=4.4.0
|
|
26
26
|
Requires-Dist: asgi-lifespan<3.0,>=1.0
|
|
27
27
|
Requires-Dist: cachetools<8.0,>=5.3
|
|
28
28
|
Requires-Dist: cloudpickle<4.0,>=2.0
|
{prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/services.py
RENAMED
|
@@ -408,10 +408,21 @@ class FutureQueueService(
|
|
|
408
408
|
# If the request to the increment endpoint fails in a non-standard
|
|
409
409
|
# way, we need to set the future's result so it'll be re-raised in
|
|
410
410
|
# the context of the caller.
|
|
411
|
-
future.
|
|
411
|
+
if future.set_running_or_notify_cancel():
|
|
412
|
+
future.set_exception(exc)
|
|
412
413
|
raise exc
|
|
413
414
|
else:
|
|
414
|
-
future
|
|
415
|
+
# Transitioning the future to running before setting its result closes
|
|
416
|
+
# the window where the caller cancels it while `acquire` is in flight:
|
|
417
|
+
# after this point `cancel()` fails, and if the caller got there first
|
|
418
|
+
# the acquired resource is nobody's and must be discarded.
|
|
419
|
+
if future.set_running_or_notify_cancel():
|
|
420
|
+
future.set_result(response)
|
|
421
|
+
else:
|
|
422
|
+
await self._discard(response)
|
|
423
|
+
|
|
424
|
+
async def _discard(self, response: R) -> None:
|
|
425
|
+
"""Dispose of a result whose caller is no longer waiting for it."""
|
|
415
426
|
|
|
416
427
|
@abc.abstractmethod
|
|
417
428
|
async def acquire(self, *args: Unpack[Ts]) -> R:
|
{prefect_client-3.8.1.dev4 → prefect_client-3.8.2}/src/prefect/_internal/control_listener.py
RENAMED
|
@@ -13,7 +13,7 @@ Protocol:
|
|
|
13
13
|
one-shot env vars without connecting yet.
|
|
14
14
|
3. The outermost `capture_sigterm()` calls `start()`, which connects back to
|
|
15
15
|
the runner and spawns a daemon thread blocked on the socket.
|
|
16
|
-
4. The runner writes a single-byte intent (`b"c"`
|
|
16
|
+
4. The runner writes a single-byte intent (`b"c"`, `b"r"` or `b"q"`).
|
|
17
17
|
5. If Prefect still owns the live SIGTERM bridge, the child writes `b"a"`,
|
|
18
18
|
commits the intent for engine dispatch, and on Windows triggers
|
|
19
19
|
`_thread.interrupt_main(SIGTERM)`.
|
|
@@ -37,10 +37,12 @@ from typing import Literal
|
|
|
37
37
|
|
|
38
38
|
from prefect.utilities.engine import commit_control_intent_and_ack
|
|
39
39
|
|
|
40
|
-
Intent = Literal["cancel"]
|
|
40
|
+
Intent = Literal["cancel", "reschedule", "relinquish"]
|
|
41
41
|
|
|
42
42
|
_INTENT_FOR_BYTE: dict[bytes, Intent] = {
|
|
43
43
|
b"c": "cancel",
|
|
44
|
+
b"r": "reschedule",
|
|
45
|
+
b"q": "relinquish",
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
_intent: Intent | None = None
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import logging
|
|
5
|
+
import time
|
|
4
6
|
import uuid
|
|
5
7
|
from contextlib import AsyncExitStack
|
|
8
|
+
from datetime import datetime
|
|
6
9
|
from typing import Any, Protocol
|
|
7
10
|
|
|
8
11
|
from prefect._flow_run_suspension import is_suspended_flow_run_state
|
|
@@ -17,9 +20,16 @@ from prefect.client.schemas.filters import (
|
|
|
17
20
|
from prefect.client.schemas.objects import State, StateType
|
|
18
21
|
from prefect.events.clients import PrefectEventSubscriber, get_events_subscriber
|
|
19
22
|
from prefect.events.filters import EventFilter, EventNameFilter
|
|
23
|
+
from prefect.exceptions import ObjectNotFound
|
|
20
24
|
from prefect.logging.loggers import get_logger
|
|
21
25
|
from prefect.utilities.services import critical_service_loop
|
|
22
26
|
|
|
27
|
+
# How long to wait before warning that a suspension state is still unavailable,
|
|
28
|
+
# how often to look initially, and the retry cap after the warning.
|
|
29
|
+
SUSPENSION_CONFIRMATION_WARNING_AFTER = 30.0
|
|
30
|
+
SUSPENSION_CONFIRMATION_INTERVAL = 0.5
|
|
31
|
+
SUSPENSION_CONFIRMATION_MAX_INTERVAL = 10.0
|
|
32
|
+
|
|
23
33
|
|
|
24
34
|
class OnCancellingCallback(Protocol):
|
|
25
35
|
def __call__(self, flow_run_id: uuid.UUID) -> None: ...
|
|
@@ -33,6 +43,133 @@ class OnFailureCallback(Protocol):
|
|
|
33
43
|
def __call__(self, flow_run_ids: set[uuid.UUID]) -> None: ...
|
|
34
44
|
|
|
35
45
|
|
|
46
|
+
class _SuspensionWatch:
|
|
47
|
+
"""Reconcile suspension events with durable states for one flow run."""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
flow_run_id: uuid.UUID,
|
|
52
|
+
client: PrefectClient,
|
|
53
|
+
on_suspended: OnSuspendedCallback,
|
|
54
|
+
logger: logging.Logger,
|
|
55
|
+
) -> None:
|
|
56
|
+
self.flow_run_id = flow_run_id
|
|
57
|
+
self.is_suspended = False
|
|
58
|
+
self._client = client
|
|
59
|
+
self._on_suspended = on_suspended
|
|
60
|
+
self._logger = logger
|
|
61
|
+
self._initialized = asyncio.Event()
|
|
62
|
+
self._replay_checkpoint: datetime | None = None
|
|
63
|
+
self._confirmation_tasks: dict[uuid.UUID, asyncio.Task[None]] = {}
|
|
64
|
+
self._closed = False
|
|
65
|
+
|
|
66
|
+
def initialize(self, state: State | None) -> None:
|
|
67
|
+
"""Set the initial server checkpoint and release waiting events."""
|
|
68
|
+
if not self._initialized.is_set():
|
|
69
|
+
self._replay_checkpoint = state.timestamp if state is not None else None
|
|
70
|
+
self._initialized.set()
|
|
71
|
+
self.notify_if_suspended(state)
|
|
72
|
+
|
|
73
|
+
def notify_if_suspended(self, state: State | None) -> None:
|
|
74
|
+
if (
|
|
75
|
+
not self.is_suspended
|
|
76
|
+
and state is not None
|
|
77
|
+
and is_suspended_flow_run_state(state)
|
|
78
|
+
):
|
|
79
|
+
self.is_suspended = True
|
|
80
|
+
self._on_suspended(self.flow_run_id, state)
|
|
81
|
+
|
|
82
|
+
def observe(self, state_id: uuid.UUID, occurred: datetime) -> None:
|
|
83
|
+
"""Confirm a new suspension event without blocking event consumption."""
|
|
84
|
+
if self._closed or self.is_suspended:
|
|
85
|
+
return
|
|
86
|
+
if state_id in self._confirmation_tasks:
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
task = asyncio.create_task(self._confirm(state_id, occurred))
|
|
90
|
+
self._confirmation_tasks[state_id] = task
|
|
91
|
+
task.add_done_callback(
|
|
92
|
+
lambda completed, state_id=state_id: self._confirmation_done(
|
|
93
|
+
state_id, completed
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
async def _confirm(self, state_id: uuid.UUID, occurred: datetime) -> None:
|
|
98
|
+
await self._initialized.wait()
|
|
99
|
+
if self._closed or self.is_suspended:
|
|
100
|
+
return
|
|
101
|
+
if self._replay_checkpoint is not None and occurred <= self._replay_checkpoint:
|
|
102
|
+
self._logger.debug(
|
|
103
|
+
"Ignoring replayed suspension event for flow run %s that occurred"
|
|
104
|
+
" at or before the initial server state.",
|
|
105
|
+
self.flow_run_id,
|
|
106
|
+
)
|
|
107
|
+
return
|
|
108
|
+
|
|
109
|
+
warning_deadline = time.monotonic() + SUSPENSION_CONFIRMATION_WARNING_AFTER
|
|
110
|
+
retry_interval = SUSPENSION_CONFIRMATION_INTERVAL
|
|
111
|
+
warned = False
|
|
112
|
+
last_error: Exception | None = None
|
|
113
|
+
|
|
114
|
+
while not self._closed and not self.is_suspended:
|
|
115
|
+
try:
|
|
116
|
+
state = await self._client.read_flow_run_state(state_id)
|
|
117
|
+
except ObjectNotFound:
|
|
118
|
+
pass
|
|
119
|
+
except Exception as exc:
|
|
120
|
+
last_error = exc
|
|
121
|
+
else:
|
|
122
|
+
if state.state_details.flow_run_id not in (None, self.flow_run_id):
|
|
123
|
+
self._logger.warning(
|
|
124
|
+
"Suspension event for flow run %s referred to state %s owned"
|
|
125
|
+
" by flow run %s.",
|
|
126
|
+
self.flow_run_id,
|
|
127
|
+
state_id,
|
|
128
|
+
state.state_details.flow_run_id,
|
|
129
|
+
)
|
|
130
|
+
return
|
|
131
|
+
self.notify_if_suspended(state)
|
|
132
|
+
return
|
|
133
|
+
|
|
134
|
+
if not warned and time.monotonic() >= warning_deadline:
|
|
135
|
+
self._logger.warning(
|
|
136
|
+
"Received a suspension event for flow run %s, but state %s has"
|
|
137
|
+
" not become readable within %s seconds; continuing to retry.",
|
|
138
|
+
self.flow_run_id,
|
|
139
|
+
state_id,
|
|
140
|
+
SUSPENSION_CONFIRMATION_WARNING_AFTER,
|
|
141
|
+
exc_info=last_error,
|
|
142
|
+
)
|
|
143
|
+
warned = True
|
|
144
|
+
|
|
145
|
+
await asyncio.sleep(retry_interval)
|
|
146
|
+
if warned:
|
|
147
|
+
retry_interval = min(
|
|
148
|
+
max(retry_interval * 2, SUSPENSION_CONFIRMATION_INTERVAL),
|
|
149
|
+
SUSPENSION_CONFIRMATION_MAX_INTERVAL,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def _confirmation_done(self, state_id: uuid.UUID, task: asyncio.Task[None]) -> None:
|
|
153
|
+
self._confirmation_tasks.pop(state_id, None)
|
|
154
|
+
if task.cancelled():
|
|
155
|
+
return
|
|
156
|
+
if error := task.exception():
|
|
157
|
+
self._logger.error(
|
|
158
|
+
"Suspension confirmation failed for flow run %s and state %s.",
|
|
159
|
+
self.flow_run_id,
|
|
160
|
+
state_id,
|
|
161
|
+
exc_info=error,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
def cancel(self) -> tuple[asyncio.Task[None], ...]:
|
|
165
|
+
self._closed = True
|
|
166
|
+
tasks = tuple(self._confirmation_tasks.values())
|
|
167
|
+
self._confirmation_tasks.clear()
|
|
168
|
+
for task in tasks:
|
|
169
|
+
task.cancel()
|
|
170
|
+
return tasks
|
|
171
|
+
|
|
172
|
+
|
|
36
173
|
class FlowRunCancellingObserver:
|
|
37
174
|
def __init__(
|
|
38
175
|
self,
|
|
@@ -283,35 +420,59 @@ class FlowRunSuspendingObserver:
|
|
|
283
420
|
self._event_filter = EventFilter(
|
|
284
421
|
event=EventNameFilter(name=["prefect.flow-run.Suspended"])
|
|
285
422
|
)
|
|
286
|
-
self._in_flight_flow_run_ids: set[uuid.UUID] = set()
|
|
287
423
|
self._events_subscriber: PrefectEventSubscriber | None
|
|
288
424
|
self._exit_stack = AsyncExitStack()
|
|
289
425
|
self._consumer_task: asyncio.Task[None] | None = None
|
|
290
426
|
self._polling_task: asyncio.Task[None] | None = None
|
|
291
427
|
self._is_shutting_down = False
|
|
292
428
|
self._client: PrefectClient | None = None
|
|
293
|
-
self.
|
|
429
|
+
self._watches: dict[uuid.UUID, _SuspensionWatch] = {}
|
|
430
|
+
|
|
431
|
+
@property
|
|
432
|
+
def _in_flight_flow_run_ids(self) -> set[uuid.UUID]:
|
|
433
|
+
return set(self._watches)
|
|
294
434
|
|
|
295
435
|
def add_in_flight_flow_run_id(self, flow_run_id: uuid.UUID):
|
|
436
|
+
if self._client is None:
|
|
437
|
+
raise RuntimeError(
|
|
438
|
+
"Client not initialized. Please use `async with` to initialize the observer."
|
|
439
|
+
)
|
|
296
440
|
self.logger.debug("Adding in-flight flow run ID: %s", flow_run_id)
|
|
297
|
-
self.
|
|
441
|
+
if flow_run_id not in self._watches:
|
|
442
|
+
watch = self._watches[flow_run_id] = self._create_watch(flow_run_id)
|
|
443
|
+
watch.initialize(None)
|
|
444
|
+
|
|
445
|
+
def _create_watch(self, flow_run_id: uuid.UUID) -> _SuspensionWatch:
|
|
446
|
+
if self._client is None:
|
|
447
|
+
raise RuntimeError(
|
|
448
|
+
"Client not initialized. Please use `async with` to initialize the observer."
|
|
449
|
+
)
|
|
450
|
+
return _SuspensionWatch(
|
|
451
|
+
flow_run_id=flow_run_id,
|
|
452
|
+
client=self._client,
|
|
453
|
+
on_suspended=self.on_suspended,
|
|
454
|
+
logger=self.logger,
|
|
455
|
+
)
|
|
298
456
|
|
|
299
457
|
def remove_in_flight_flow_run_id(self, flow_run_id: uuid.UUID):
|
|
300
458
|
self.logger.debug("Removing in-flight flow run ID: %s", flow_run_id)
|
|
301
|
-
self.
|
|
302
|
-
|
|
459
|
+
if watch := self._watches.pop(flow_run_id, None):
|
|
460
|
+
watch.cancel()
|
|
303
461
|
|
|
304
462
|
async def watch_flow_run_id(self, flow_run_id: uuid.UUID) -> None:
|
|
305
|
-
self.add_in_flight_flow_run_id(flow_run_id)
|
|
306
463
|
if self._client is None:
|
|
307
464
|
raise RuntimeError(
|
|
308
465
|
"Client not initialized. Please use `async with` to initialize the observer."
|
|
309
466
|
)
|
|
467
|
+
self.logger.debug("Adding in-flight flow run ID: %s", flow_run_id)
|
|
468
|
+
if flow_run_id not in self._watches:
|
|
469
|
+
self._watches[flow_run_id] = self._create_watch(flow_run_id)
|
|
310
470
|
retry_interval = max(min(self.polling_interval, 1.0), 0.01)
|
|
311
471
|
attempts = 0
|
|
312
472
|
|
|
313
473
|
while not self._is_shutting_down:
|
|
314
|
-
|
|
474
|
+
watch = self._watches.get(flow_run_id)
|
|
475
|
+
if watch is None or watch.is_suspended:
|
|
315
476
|
return
|
|
316
477
|
|
|
317
478
|
try:
|
|
@@ -328,26 +489,14 @@ class FlowRunSuspendingObserver:
|
|
|
328
489
|
await asyncio.sleep(retry_interval)
|
|
329
490
|
continue
|
|
330
491
|
|
|
331
|
-
|
|
492
|
+
watch.initialize(flow_run.state)
|
|
332
493
|
return
|
|
333
494
|
|
|
334
495
|
def _notify_if_suspended_state(
|
|
335
496
|
self, flow_run_id: uuid.UUID, state: State | None
|
|
336
497
|
) -> None:
|
|
337
|
-
if
|
|
338
|
-
|
|
339
|
-
self.on_suspended(flow_run_id, state)
|
|
340
|
-
|
|
341
|
-
async def _notify_if_suspended(self, flow_run_id: uuid.UUID) -> None:
|
|
342
|
-
if self._client is None:
|
|
343
|
-
raise RuntimeError(
|
|
344
|
-
"Client not initialized. Please use `async with` to initialize the observer."
|
|
345
|
-
)
|
|
346
|
-
if flow_run_id in self._suspended_flow_run_ids:
|
|
347
|
-
return
|
|
348
|
-
|
|
349
|
-
flow_run = await self._client.read_flow_run(flow_run_id)
|
|
350
|
-
self._notify_if_suspended_state(flow_run_id, flow_run.state)
|
|
498
|
+
if watch := self._watches.get(flow_run_id):
|
|
499
|
+
watch.notify_if_suspended(state)
|
|
351
500
|
|
|
352
501
|
async def _consume_events(self):
|
|
353
502
|
if self._events_subscriber is None:
|
|
@@ -361,9 +510,14 @@ class FlowRunSuspendingObserver:
|
|
|
361
510
|
"prefect.flow-run.", ""
|
|
362
511
|
)
|
|
363
512
|
)
|
|
364
|
-
|
|
513
|
+
watch = self._watches.get(flow_run_id)
|
|
514
|
+
if watch is None:
|
|
365
515
|
continue
|
|
366
|
-
|
|
516
|
+
|
|
517
|
+
# State change events carry the ID of the state they report, so the
|
|
518
|
+
# event identifies the exact transition to confirm. Confirmation is
|
|
519
|
+
# done in a separate task to keep consuming events while we wait.
|
|
520
|
+
watch.observe(event.id, event.occurred)
|
|
367
521
|
except ValueError:
|
|
368
522
|
self.logger.warning(
|
|
369
523
|
"Received event with invalid flow run ID: %s",
|
|
@@ -412,7 +566,11 @@ class FlowRunSuspendingObserver:
|
|
|
412
566
|
"Client not initialized. Please use `async with` to initialize the observer."
|
|
413
567
|
)
|
|
414
568
|
|
|
415
|
-
flow_run_ids =
|
|
569
|
+
flow_run_ids = {
|
|
570
|
+
flow_run_id
|
|
571
|
+
for flow_run_id, watch in self._watches.items()
|
|
572
|
+
if not watch.is_suspended
|
|
573
|
+
}
|
|
416
574
|
if not flow_run_ids:
|
|
417
575
|
return
|
|
418
576
|
|
|
@@ -434,8 +592,7 @@ class FlowRunSuspendingObserver:
|
|
|
434
592
|
|
|
435
593
|
for flow_run in suspended_flow_runs:
|
|
436
594
|
if flow_run.state:
|
|
437
|
-
self.
|
|
438
|
-
self.on_suspended(flow_run.id, flow_run.state)
|
|
595
|
+
self._notify_if_suspended_state(flow_run.id, flow_run.state)
|
|
439
596
|
|
|
440
597
|
async def __aenter__(self):
|
|
441
598
|
try:
|
|
@@ -470,6 +627,10 @@ class FlowRunSuspendingObserver:
|
|
|
470
627
|
async def __aexit__(self, *exc_info: Any):
|
|
471
628
|
self.logger.debug("Shutting down FlowRunSuspendingObserver")
|
|
472
629
|
self._is_shutting_down = True
|
|
630
|
+
tasks = [task for watch in self._watches.values() for task in watch.cancel()]
|
|
631
|
+
self._watches.clear()
|
|
632
|
+
if tasks:
|
|
633
|
+
await asyncio.gather(*tasks, return_exceptions=True)
|
|
473
634
|
await self._exit_stack.__aexit__(*exc_info)
|
|
474
635
|
if self._consumer_task is not None:
|
|
475
636
|
self._consumer_task.cancel()
|
|
@@ -14,6 +14,8 @@ from urllib.parse import urlparse
|
|
|
14
14
|
import certifi
|
|
15
15
|
from websockets.asyncio.client import connect
|
|
16
16
|
|
|
17
|
+
import prefect
|
|
18
|
+
from prefect.client.constants import SERVER_API_VERSION
|
|
17
19
|
from prefect.settings import get_current_settings
|
|
18
20
|
|
|
19
21
|
|
|
@@ -51,6 +53,13 @@ def websocket_connect(uri: str, **kwargs: Any) -> connect:
|
|
|
51
53
|
if ssl_context:
|
|
52
54
|
kwargs.setdefault("ssl", ssl_context)
|
|
53
55
|
|
|
56
|
+
# Identify ourselves to the server the same way the HTTP client does so that
|
|
57
|
+
# the client version can be parsed from the handshake
|
|
58
|
+
kwargs.setdefault(
|
|
59
|
+
"user_agent_header",
|
|
60
|
+
f"prefect/{prefect.__version__} (API {SERVER_API_VERSION})",
|
|
61
|
+
)
|
|
62
|
+
|
|
54
63
|
# Add custom headers from settings
|
|
55
64
|
custom_headers = get_current_settings().client.custom_headers
|
|
56
65
|
if custom_headers:
|
|
@@ -424,6 +424,14 @@ class Block(BaseModel, ABC):
|
|
|
424
424
|
def ser_model(
|
|
425
425
|
self, handler: SerializerFunctionWrapHandler, info: SerializationInfo
|
|
426
426
|
) -> Any:
|
|
427
|
+
if info.context and info.context.get("serialize_blocks_as_references"):
|
|
428
|
+
if self._block_document_id is None:
|
|
429
|
+
raise BlockNotSavedError(
|
|
430
|
+
"Block must be saved with `.save()` before it can be used as a "
|
|
431
|
+
"deployment parameter."
|
|
432
|
+
)
|
|
433
|
+
return {"$ref": {"block_document_id": str(self._block_document_id)}}
|
|
434
|
+
|
|
427
435
|
jsonable_self = handler(self)
|
|
428
436
|
if (ctx := info.context) and ctx.get("include_secrets") is True:
|
|
429
437
|
# Add serialization mode to context so handle_secret_render knows how to process nested models
|
|
@@ -416,6 +416,34 @@ class FlowRunClient(BaseClient):
|
|
|
416
416
|
)
|
|
417
417
|
return result
|
|
418
418
|
|
|
419
|
+
def read_flow_run_state(self, flow_run_state_id: "UUID") -> "State":
|
|
420
|
+
"""
|
|
421
|
+
Read a flow run state by ID.
|
|
422
|
+
|
|
423
|
+
Args:
|
|
424
|
+
flow_run_state_id: The flow run state ID.
|
|
425
|
+
|
|
426
|
+
Returns:
|
|
427
|
+
A State model representation of the flow run state.
|
|
428
|
+
|
|
429
|
+
Raises:
|
|
430
|
+
ObjectNotFound: If the flow run state does not exist.
|
|
431
|
+
"""
|
|
432
|
+
try:
|
|
433
|
+
response = self.request(
|
|
434
|
+
"GET",
|
|
435
|
+
"/flow_run_states/{id}",
|
|
436
|
+
path_params={"id": flow_run_state_id},
|
|
437
|
+
)
|
|
438
|
+
except httpx.HTTPStatusError as exc:
|
|
439
|
+
if exc.response.status_code == 404:
|
|
440
|
+
raise ObjectNotFound(http_exc=exc) from exc
|
|
441
|
+
raise
|
|
442
|
+
|
|
443
|
+
from prefect.states import State
|
|
444
|
+
|
|
445
|
+
return State.model_validate(response.json())
|
|
446
|
+
|
|
419
447
|
def read_flow_run_states(self, flow_run_id: "UUID") -> "list[State]":
|
|
420
448
|
"""
|
|
421
449
|
Query for the states of a flow run
|
|
@@ -916,6 +944,34 @@ class FlowRunAsyncClient(BaseAsyncClient):
|
|
|
916
944
|
)
|
|
917
945
|
return result
|
|
918
946
|
|
|
947
|
+
async def read_flow_run_state(self, flow_run_state_id: "UUID") -> "State":
|
|
948
|
+
"""
|
|
949
|
+
Read a flow run state by ID.
|
|
950
|
+
|
|
951
|
+
Args:
|
|
952
|
+
flow_run_state_id: The flow run state ID.
|
|
953
|
+
|
|
954
|
+
Returns:
|
|
955
|
+
A State model representation of the flow run state.
|
|
956
|
+
|
|
957
|
+
Raises:
|
|
958
|
+
ObjectNotFound: If the flow run state does not exist.
|
|
959
|
+
"""
|
|
960
|
+
try:
|
|
961
|
+
response = await self.request(
|
|
962
|
+
"GET",
|
|
963
|
+
"/flow_run_states/{id}",
|
|
964
|
+
path_params={"id": flow_run_state_id},
|
|
965
|
+
)
|
|
966
|
+
except httpx.HTTPStatusError as exc:
|
|
967
|
+
if exc.response.status_code == 404:
|
|
968
|
+
raise ObjectNotFound(http_exc=exc) from exc
|
|
969
|
+
raise
|
|
970
|
+
|
|
971
|
+
from prefect.states import State
|
|
972
|
+
|
|
973
|
+
return State.model_validate(response.json())
|
|
974
|
+
|
|
919
975
|
async def read_flow_run_states(self, flow_run_id: "UUID") -> "list[State]":
|
|
920
976
|
"""
|
|
921
977
|
Query for the states of a flow run
|
|
@@ -48,7 +48,7 @@ class WorkPoolClient(BaseClient):
|
|
|
48
48
|
Args:
|
|
49
49
|
work_pool_name: The name of the work pool to heartbeat against.
|
|
50
50
|
worker_name: The name of the worker sending the heartbeat.
|
|
51
|
-
|
|
51
|
+
get_worker_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `get_worker_id` is `True`.
|
|
52
52
|
worker_metadata: Metadata about the worker to send to the server.
|
|
53
53
|
"""
|
|
54
54
|
from uuid import UUID
|
|
@@ -376,7 +376,7 @@ class WorkPoolAsyncClient(BaseAsyncClient):
|
|
|
376
376
|
Args:
|
|
377
377
|
work_pool_name: The name of the work pool to heartbeat against.
|
|
378
378
|
worker_name: The name of the worker sending the heartbeat.
|
|
379
|
-
|
|
379
|
+
get_worker_id: Whether to return the worker ID. Note: will return `None` if the connected server does not support returning worker IDs, even if `get_worker_id` is `True`.
|
|
380
380
|
worker_metadata: Metadata about the worker to send to the server.
|
|
381
381
|
"""
|
|
382
382
|
from uuid import UUID
|