prefect-client 3.8.1.dev5__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.dev5 → prefect_client-3.8.2}/PKG-INFO +2 -2
- {prefect_client-3.8.1.dev5 → 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.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/services.py +13 -2
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/control_listener.py +4 -2
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/websockets.py +9 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/core.py +8 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_work_pools/client.py +2 -2
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/objects.py +1 -1
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/_asyncio.py +26 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/services.py +84 -2
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/context.py +19 -1
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/runner.py +67 -7
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/engine.py +6 -8
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/clients.py +0 -1
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/utilities.py +7 -3
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/flow_engine.py +16 -22
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/flows.py +2 -3
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/futures.py +6 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/container_instance.py +1 -1
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/AGENTS.md +2 -2
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_control_channel.py +9 -8
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_process_manager.py +33 -2
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_starter_engine.py +5 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_workspace_starter.py +3 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/storage.py +2 -2
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/tasks.py +0 -8
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/processutils/__init__.py +24 -3
- prefect_client-3.8.1.dev5/src/prefect/_build_info.py +0 -5
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/.gitignore +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/LICENSE +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/README.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/hatch_build.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/__main__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/agent.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/automations.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/base.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/related.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/main.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/plugins.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/py.typed +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/results.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/schedules.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/serializers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/_types.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/states.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/transactions.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/types/names.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/variables.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.8.1.dev5 → prefect_client-3.8.2}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.8.1.dev5 → 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.dev5 → 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.dev5 → 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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -1477,7 +1477,7 @@ class WorkQueueHealthPolicy(PrefectBaseModel):
|
|
|
1477
1477
|
Given empirical information about the state of the work queue, evaluate its health status.
|
|
1478
1478
|
|
|
1479
1479
|
Args:
|
|
1480
|
-
|
|
1480
|
+
late_runs_count: the count of late runs for the work queue.
|
|
1481
1481
|
last_polled: the last time the work queue was polled, if available.
|
|
1482
1482
|
|
|
1483
1483
|
Returns:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import concurrent.futures
|
|
4
5
|
import logging
|
|
5
6
|
from contextlib import asynccontextmanager
|
|
6
7
|
from typing import TYPE_CHECKING, AsyncGenerator, Literal, Optional
|
|
@@ -150,6 +151,9 @@ async def aacquire_concurrency_slots_with_lease(
|
|
|
150
151
|
)
|
|
151
152
|
try:
|
|
152
153
|
response = await asyncio.wrap_future(future)
|
|
154
|
+
except asyncio.CancelledError:
|
|
155
|
+
_release_lease_when_granted(service, future)
|
|
156
|
+
raise
|
|
153
157
|
except TimeoutError as timeout:
|
|
154
158
|
raise AcquireConcurrencySlotTimeoutError(
|
|
155
159
|
f"Attempt to acquire concurrency slots timed out after {timeout_seconds} second(s)"
|
|
@@ -225,6 +229,28 @@ def _discard_cleanup_lease(lease_id: UUID) -> None:
|
|
|
225
229
|
ctx.cleanup_lease_ids.remove(lease_id)
|
|
226
230
|
|
|
227
231
|
|
|
232
|
+
def _release_lease_when_granted(
|
|
233
|
+
service: ConcurrencySlotAcquisitionWithLeaseService,
|
|
234
|
+
future: "concurrent.futures.Future[httpx.Response]",
|
|
235
|
+
) -> None:
|
|
236
|
+
"""Release the lease for an acquisition whose caller has been cancelled.
|
|
237
|
+
|
|
238
|
+
The acquisition may still be granted after the caller is gone, and the lease
|
|
239
|
+
id never reaches the `ConcurrencyContext`, so the slots would stay occupied
|
|
240
|
+
until the lease expires. The cancelled caller cannot do the release itself, so
|
|
241
|
+
the service that acquired the slots is asked to release them.
|
|
242
|
+
"""
|
|
243
|
+
|
|
244
|
+
def _release(completed: "concurrent.futures.Future[httpx.Response]") -> None:
|
|
245
|
+
if completed.cancelled() or completed.exception() is not None:
|
|
246
|
+
# Nothing was granted, so there is nothing to release.
|
|
247
|
+
return
|
|
248
|
+
|
|
249
|
+
service.release_orphaned_lease(completed.result())
|
|
250
|
+
|
|
251
|
+
future.add_done_callback(_release)
|
|
252
|
+
|
|
253
|
+
|
|
228
254
|
def _response_to_minimal_concurrency_limit_response(
|
|
229
255
|
response: httpx.Response,
|
|
230
256
|
) -> list[MinimalConcurrencyLimitResponse]:
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import concurrent.futures
|
|
2
3
|
import json
|
|
3
4
|
from collections.abc import AsyncGenerator
|
|
4
5
|
from contextlib import asynccontextmanager
|
|
5
6
|
from threading import Lock
|
|
6
7
|
from typing import TYPE_CHECKING, Literal, Optional
|
|
7
|
-
from uuid import uuid4
|
|
8
|
+
from uuid import UUID, uuid4
|
|
8
9
|
|
|
9
10
|
import cachetools
|
|
10
11
|
import httpx
|
|
@@ -104,12 +105,25 @@ class ConcurrencySlotAcquisitionWithLeaseService(
|
|
|
104
105
|
super().__init__(concurrency_limit_names)
|
|
105
106
|
self._client: PrefectClient
|
|
106
107
|
self.concurrency_limit_names: list[str] = sorted(list(concurrency_limit_names))
|
|
108
|
+
self._pending_releases: set[concurrent.futures.Future[None]] = set()
|
|
107
109
|
|
|
108
110
|
@asynccontextmanager
|
|
109
111
|
async def _lifespan(self) -> AsyncGenerator[None, None]:
|
|
110
112
|
async with get_client() as client:
|
|
111
113
|
self._client = client
|
|
112
|
-
|
|
114
|
+
try:
|
|
115
|
+
yield
|
|
116
|
+
finally:
|
|
117
|
+
# The client closes when this exits, so releases scheduled by
|
|
118
|
+
# cancelled callers have to finish first or their slots leak.
|
|
119
|
+
if self._pending_releases:
|
|
120
|
+
await asyncio.gather(
|
|
121
|
+
*(
|
|
122
|
+
asyncio.wrap_future(release)
|
|
123
|
+
for release in tuple(self._pending_releases)
|
|
124
|
+
),
|
|
125
|
+
return_exceptions=True,
|
|
126
|
+
)
|
|
113
127
|
|
|
114
128
|
async def acquire(
|
|
115
129
|
self,
|
|
@@ -185,6 +199,74 @@ class ConcurrencySlotAcquisitionWithLeaseService(
|
|
|
185
199
|
if max_retries is not None:
|
|
186
200
|
max_retries -= 1
|
|
187
201
|
|
|
202
|
+
async def _discard(self, response: httpx.Response) -> None:
|
|
203
|
+
"""Release a lease granted to a caller that was cancelled while waiting.
|
|
204
|
+
|
|
205
|
+
Without this the slots stay occupied until the lease expires, because the
|
|
206
|
+
caller never learns the lease id and so cannot record it for cleanup.
|
|
207
|
+
"""
|
|
208
|
+
lease_id = self._lease_id_from_response(response)
|
|
209
|
+
if lease_id is None:
|
|
210
|
+
return
|
|
211
|
+
|
|
212
|
+
try:
|
|
213
|
+
await self._client.release_concurrency_slots_with_lease(lease_id=lease_id)
|
|
214
|
+
except Exception:
|
|
215
|
+
logger.warning(
|
|
216
|
+
f"Failed to release concurrency lease {lease_id} for "
|
|
217
|
+
f"{self.concurrency_limit_names} after the acquiring caller was cancelled",
|
|
218
|
+
exc_info=True,
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
def release_orphaned_lease(
|
|
222
|
+
self, response: httpx.Response
|
|
223
|
+
) -> "concurrent.futures.Future[None]":
|
|
224
|
+
"""Release a lease that was delivered to a caller which is already gone.
|
|
225
|
+
|
|
226
|
+
The release is scheduled on the service's own loop so it reuses the client
|
|
227
|
+
that acquired the slots, keeping acquisition and cleanup on the same API, and
|
|
228
|
+
is tracked so that draining the service waits for it.
|
|
229
|
+
"""
|
|
230
|
+
with self._lock:
|
|
231
|
+
loop = self._loop
|
|
232
|
+
if self._stopped or loop is None or loop.is_closed():
|
|
233
|
+
logger.warning(
|
|
234
|
+
f"Unable to release concurrency lease for {self.concurrency_limit_names} "
|
|
235
|
+
"after the acquiring caller was cancelled: the acquisition service is "
|
|
236
|
+
"no longer running. The slots remain occupied until the lease expires."
|
|
237
|
+
)
|
|
238
|
+
stopped: concurrent.futures.Future[None] = concurrent.futures.Future()
|
|
239
|
+
stopped.set_result(None)
|
|
240
|
+
return stopped
|
|
241
|
+
|
|
242
|
+
# Registering under the lock `_stop` uses keeps the service from
|
|
243
|
+
# finishing its lifespan, and closing its client, before this release.
|
|
244
|
+
release = asyncio.run_coroutine_threadsafe(self._discard(response), loop)
|
|
245
|
+
self._pending_releases.add(release)
|
|
246
|
+
|
|
247
|
+
release.add_done_callback(self._pending_releases.discard)
|
|
248
|
+
return release
|
|
249
|
+
|
|
250
|
+
def _lease_id_from_response(self, response: httpx.Response) -> Optional[UUID]:
|
|
251
|
+
"""Read the lease id out of a successful acquisition response.
|
|
252
|
+
|
|
253
|
+
Returns `None` when no slots were acquired, and logs when the response is
|
|
254
|
+
malformed, since that leaves a possibly active lease we cannot release.
|
|
255
|
+
"""
|
|
256
|
+
try:
|
|
257
|
+
data = response.json()
|
|
258
|
+
if not data.get("limits"):
|
|
259
|
+
return None
|
|
260
|
+
return UUID(data["lease_id"])
|
|
261
|
+
except Exception:
|
|
262
|
+
logger.warning(
|
|
263
|
+
f"Unable to read the lease id from the acquisition response for "
|
|
264
|
+
f"{self.concurrency_limit_names}; if a lease was granted its slots "
|
|
265
|
+
"remain occupied until it expires.",
|
|
266
|
+
exc_info=True,
|
|
267
|
+
)
|
|
268
|
+
return None
|
|
269
|
+
|
|
188
270
|
|
|
189
271
|
def _should_use_cache(
|
|
190
272
|
names: list[str], holder: Optional["ConcurrencyLeaseHolder"]
|
|
@@ -14,6 +14,7 @@ import warnings
|
|
|
14
14
|
from collections.abc import AsyncGenerator, Generator, Mapping
|
|
15
15
|
from contextlib import ExitStack, asynccontextmanager, contextmanager
|
|
16
16
|
from contextvars import ContextVar, Token
|
|
17
|
+
from pathlib import Path
|
|
17
18
|
from typing import (
|
|
18
19
|
TYPE_CHECKING,
|
|
19
20
|
Any,
|
|
@@ -46,11 +47,13 @@ from prefect.results import (
|
|
|
46
47
|
)
|
|
47
48
|
from prefect.settings import Profile, Settings
|
|
48
49
|
from prefect.settings.legacy import (
|
|
50
|
+
Setting,
|
|
49
51
|
_get_settings_fields, # type: ignore[reportPrivateUsage]
|
|
50
52
|
)
|
|
51
53
|
from prefect.states import State
|
|
52
54
|
from prefect.task_runners import TaskRunner
|
|
53
55
|
from prefect.types import DateTime
|
|
56
|
+
from prefect.utilities.collections import visit_collection
|
|
54
57
|
from prefect.utilities.services import start_client_metrics_server
|
|
55
58
|
|
|
56
59
|
T = TypeVar("T")
|
|
@@ -825,6 +828,21 @@ class SettingsContext(ContextModel):
|
|
|
825
828
|
def __hash__(self: Self) -> int:
|
|
826
829
|
return hash(self.settings)
|
|
827
830
|
|
|
831
|
+
def serialize(self, include_secrets: bool = True) -> dict[str, Any]:
|
|
832
|
+
"""Serialize settings without platform-specific path objects."""
|
|
833
|
+
serialized = super().serialize(include_secrets=include_secrets)
|
|
834
|
+
return visit_collection(
|
|
835
|
+
serialized,
|
|
836
|
+
visit_fn=lambda value: (
|
|
837
|
+
value.name
|
|
838
|
+
if isinstance(value, Setting)
|
|
839
|
+
else str(value)
|
|
840
|
+
if isinstance(value, Path)
|
|
841
|
+
else value
|
|
842
|
+
),
|
|
843
|
+
return_data=True,
|
|
844
|
+
)
|
|
845
|
+
|
|
828
846
|
@classmethod
|
|
829
847
|
def get(cls) -> Optional["SettingsContext"]:
|
|
830
848
|
# Return the global context instead of `None` if no context exists
|
|
@@ -976,7 +994,7 @@ def use_profile(
|
|
|
976
994
|
|
|
977
995
|
Args:
|
|
978
996
|
profile: The name of the profile to load or an instance of a Profile.
|
|
979
|
-
|
|
997
|
+
override_environment_variables: If set, variables in the profile will take
|
|
980
998
|
precedence over current environment variables. By default, environment
|
|
981
999
|
variables will override profile settings.
|
|
982
1000
|
include_current_context: If set, the new settings will be constructed
|
|
@@ -53,6 +53,8 @@ from pydantic import (
|
|
|
53
53
|
ConfigDict,
|
|
54
54
|
Field,
|
|
55
55
|
PrivateAttr,
|
|
56
|
+
TypeAdapter,
|
|
57
|
+
field_serializer,
|
|
56
58
|
field_validator,
|
|
57
59
|
model_validator,
|
|
58
60
|
)
|
|
@@ -69,6 +71,7 @@ from prefect._internal.schemas.validators import (
|
|
|
69
71
|
reconcile_schedules_runner,
|
|
70
72
|
)
|
|
71
73
|
from prefect._internal.versioning import VersionType, get_inferred_version_info
|
|
74
|
+
from prefect.blocks.core import Block, BlockNotSavedError
|
|
72
75
|
from prefect.client.base import ServerType
|
|
73
76
|
from prefect.client.orchestration import PrefectClient, SyncPrefectClient, get_client
|
|
74
77
|
from prefect.client.schemas.actions import (
|
|
@@ -106,7 +109,12 @@ from prefect.types.entrypoint import EntrypointType
|
|
|
106
109
|
from prefect.utilities.annotations import freeze
|
|
107
110
|
from prefect.utilities.asyncutils import run_coro_as_sync
|
|
108
111
|
from prefect.utilities.callables import ParameterSchema, parameter_schema
|
|
109
|
-
from prefect.utilities.collections import
|
|
112
|
+
from prefect.utilities.collections import (
|
|
113
|
+
StopVisiting,
|
|
114
|
+
get_from_dict,
|
|
115
|
+
isiterable,
|
|
116
|
+
visit_collection,
|
|
117
|
+
)
|
|
110
118
|
from prefect.utilities.dockerutils import (
|
|
111
119
|
parse_image_tag,
|
|
112
120
|
)
|
|
@@ -117,6 +125,11 @@ if TYPE_CHECKING:
|
|
|
117
125
|
|
|
118
126
|
__all__ = ["RunnerDeployment"]
|
|
119
127
|
|
|
128
|
+
_DEPLOYMENT_PARAMETER_SERIALIZER = TypeAdapter(
|
|
129
|
+
dict[str, Any],
|
|
130
|
+
config=ConfigDict(ser_json_timedelta="float"),
|
|
131
|
+
)
|
|
132
|
+
|
|
120
133
|
|
|
121
134
|
def _extract_concurrency_options(
|
|
122
135
|
concurrency_limit: Union[int, ConcurrencyLimitConfig, None],
|
|
@@ -296,6 +309,47 @@ class RunnerDeployment(BaseModel):
|
|
|
296
309
|
def full_name(self) -> str:
|
|
297
310
|
return f"{self.flow_name}/{self.name}"
|
|
298
311
|
|
|
312
|
+
@field_validator("parameters", "schedules", mode="before")
|
|
313
|
+
@classmethod
|
|
314
|
+
def validate_block_parameters(cls, value: Any) -> Any:
|
|
315
|
+
def ensure_block_is_saved(value: Any) -> Any:
|
|
316
|
+
if isinstance(value, Block):
|
|
317
|
+
if value._block_document_id is None:
|
|
318
|
+
raise BlockNotSavedError(
|
|
319
|
+
"Block must be saved with `.save()` before it can be used as a "
|
|
320
|
+
"deployment parameter."
|
|
321
|
+
)
|
|
322
|
+
raise StopVisiting()
|
|
323
|
+
return value
|
|
324
|
+
|
|
325
|
+
visit_collection(value, ensure_block_is_saved)
|
|
326
|
+
return value
|
|
327
|
+
|
|
328
|
+
@field_serializer("parameters", when_used="json")
|
|
329
|
+
def serialize_block_parameters(self, parameters: dict[str, Any]) -> dict[str, Any]:
|
|
330
|
+
return _DEPLOYMENT_PARAMETER_SERIALIZER.dump_python(
|
|
331
|
+
parameters,
|
|
332
|
+
mode="json",
|
|
333
|
+
context={"serialize_blocks_as_references": True},
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
def _schedules_with_serialized_block_parameters(
|
|
337
|
+
self,
|
|
338
|
+
) -> Optional[List[Union[DeploymentScheduleCreate, DeploymentScheduleUpdate]]]:
|
|
339
|
+
if self.schedules is None:
|
|
340
|
+
return None
|
|
341
|
+
|
|
342
|
+
return [
|
|
343
|
+
schedule.model_copy(
|
|
344
|
+
update={
|
|
345
|
+
"parameters": self.serialize_block_parameters(schedule.parameters)
|
|
346
|
+
}
|
|
347
|
+
)
|
|
348
|
+
if schedule.parameters
|
|
349
|
+
else schedule
|
|
350
|
+
for schedule in self.schedules
|
|
351
|
+
]
|
|
352
|
+
|
|
299
353
|
def _get_deployment_version_info(
|
|
300
354
|
self, version_type: Optional[VersionType] = None
|
|
301
355
|
) -> VersionInfo:
|
|
@@ -378,6 +432,9 @@ class RunnerDeployment(BaseModel):
|
|
|
378
432
|
" with a work pool."
|
|
379
433
|
)
|
|
380
434
|
|
|
435
|
+
parameters = self.model_dump(mode="json", include={"parameters"})["parameters"]
|
|
436
|
+
schedules = self._schedules_with_serialized_block_parameters()
|
|
437
|
+
|
|
381
438
|
async with get_client() as client:
|
|
382
439
|
flow_id = await client.create_flow_from_name(self.flow_name)
|
|
383
440
|
|
|
@@ -389,10 +446,10 @@ class RunnerDeployment(BaseModel):
|
|
|
389
446
|
version=self.version,
|
|
390
447
|
version_info=version_info,
|
|
391
448
|
paused=self.paused,
|
|
392
|
-
schedules=
|
|
449
|
+
schedules=schedules,
|
|
393
450
|
concurrency_limit=self.concurrency_limit,
|
|
394
451
|
concurrency_options=self.concurrency_options,
|
|
395
|
-
parameters=
|
|
452
|
+
parameters=parameters,
|
|
396
453
|
description=self.description,
|
|
397
454
|
tags=self.tags,
|
|
398
455
|
path=self._path,
|
|
@@ -481,6 +538,9 @@ class RunnerDeployment(BaseModel):
|
|
|
481
538
|
" with a work pool."
|
|
482
539
|
)
|
|
483
540
|
|
|
541
|
+
parameters = self.model_dump(mode="json", include={"parameters"})["parameters"]
|
|
542
|
+
schedules = self._schedules_with_serialized_block_parameters()
|
|
543
|
+
|
|
484
544
|
with get_client(sync_client=True) as client:
|
|
485
545
|
flow_id = client.create_flow_from_name(self.flow_name)
|
|
486
546
|
|
|
@@ -492,10 +552,10 @@ class RunnerDeployment(BaseModel):
|
|
|
492
552
|
version=self.version,
|
|
493
553
|
version_info=version_info,
|
|
494
554
|
paused=self.paused,
|
|
495
|
-
schedules=
|
|
555
|
+
schedules=schedules,
|
|
496
556
|
concurrency_limit=self.concurrency_limit,
|
|
497
557
|
concurrency_options=self.concurrency_options,
|
|
498
|
-
parameters=
|
|
558
|
+
parameters=parameters,
|
|
499
559
|
description=self.description,
|
|
500
560
|
tags=self.tags,
|
|
501
561
|
path=self._path,
|
|
@@ -579,7 +639,7 @@ class RunnerDeployment(BaseModel):
|
|
|
579
639
|
if self.schedules:
|
|
580
640
|
update_payload["schedules"] = [
|
|
581
641
|
schedule.model_dump(mode="json", exclude_unset=True)
|
|
582
|
-
for schedule in self.
|
|
642
|
+
for schedule in self._schedules_with_serialized_block_parameters() or []
|
|
583
643
|
]
|
|
584
644
|
|
|
585
645
|
await client.update_deployment(
|
|
@@ -631,7 +691,7 @@ class RunnerDeployment(BaseModel):
|
|
|
631
691
|
if self.schedules:
|
|
632
692
|
update_payload["schedules"] = [
|
|
633
693
|
schedule.model_dump(mode="json", exclude_unset=True)
|
|
634
|
-
for schedule in self.
|
|
694
|
+
for schedule in self._schedules_with_serialized_block_parameters() or []
|
|
635
695
|
]
|
|
636
696
|
|
|
637
697
|
client.update_deployment(
|
|
@@ -100,16 +100,14 @@ def handle_engine_signals(flow_run_id: UUID | None = None):
|
|
|
100
100
|
engine_logger.info(msg)
|
|
101
101
|
exit(0)
|
|
102
102
|
except TerminationSignal:
|
|
103
|
-
#
|
|
104
|
-
#
|
|
105
|
-
#
|
|
106
|
-
|
|
107
|
-
# Only the first case should translate to a clean process exit.
|
|
108
|
-
if get_intent() == "cancel":
|
|
103
|
+
# An intent means the runner or the `prefect flow-run execute` supervisor
|
|
104
|
+
# drove this termination and owns the flow run's next state, so exit cleanly.
|
|
105
|
+
# A raw external termination has no intent and must keep propagating.
|
|
106
|
+
if get_intent() is not None:
|
|
109
107
|
if flow_run_id:
|
|
110
|
-
msg = f"Execution of flow run '{flow_run_id}' was
|
|
108
|
+
msg = f"Execution of flow run '{flow_run_id}' was terminated."
|
|
111
109
|
else:
|
|
112
|
-
msg = "Execution was
|
|
110
|
+
msg = "Execution was terminated."
|
|
113
111
|
engine_logger.info(msg)
|
|
114
112
|
clear_intent()
|
|
115
113
|
exit(0)
|
|
@@ -718,7 +718,6 @@ class PrefectEventSubscriber:
|
|
|
718
718
|
"""
|
|
719
719
|
Args:
|
|
720
720
|
api_url: The base URL for a Prefect Cloud workspace
|
|
721
|
-
api_key: The API of an actor with the manage_events scope
|
|
722
721
|
reconnection_attempts: When the client is disconnected, how many times
|
|
723
722
|
the client should attempt to reconnect
|
|
724
723
|
reconnect_on_clean_close: Whether to reconnect when the server closes
|
|
@@ -49,9 +49,13 @@ def emit_event(
|
|
|
49
49
|
payload: An open-ended set of data describing what happened.
|
|
50
50
|
id: The sender-provided identifier for this event. Defaults to a random
|
|
51
51
|
UUID.
|
|
52
|
-
follows: The event that preceded this one.
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
follows: The event that preceded this one. Setting `follows`
|
|
53
|
+
establishes that this event is known to have occurred after the
|
|
54
|
+
given event, which the system can use to disambiguate the
|
|
55
|
+
ordering of the two events. Only the `id` and `occurred` of the
|
|
56
|
+
given event are used; it is not emitted again. If the preceding
|
|
57
|
+
event happened more than 5 minutes prior to this event the
|
|
58
|
+
follows relationship will not be set.
|
|
55
59
|
|
|
56
60
|
Returns:
|
|
57
61
|
The event that was emitted if worker is using a client that emit
|
|
@@ -195,26 +195,17 @@ def _termination_intent() -> Intent | None:
|
|
|
195
195
|
for the outermost flow run as well as nested subflows running in the
|
|
196
196
|
same process.
|
|
197
197
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
`except TerminationSignal` dispatch below will gain a matching branch.
|
|
198
|
+
Adding an intent means extending `Intent` in
|
|
199
|
+
`prefect._internal.control_listener` and the `except TerminationSignal`
|
|
200
|
+
dispatch below with a matching branch.
|
|
202
201
|
"""
|
|
203
202
|
return get_intent()
|
|
204
203
|
|
|
205
204
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
process proposes `AwaitingRetry` and then sends a plain SIGTERM to the
|
|
211
|
-
child. That path does not use the control channel, so the child must not
|
|
212
|
-
reinterpret the resulting `TerminationSignal` as a crash.
|
|
213
|
-
"""
|
|
214
|
-
return (
|
|
215
|
-
os.environ.get("PREFECT_FLOW_RUN_EXECUTE_SIGTERM_BEHAVIOR", "").lower()
|
|
216
|
-
== "reschedule"
|
|
217
|
-
)
|
|
205
|
+
# Intents where the `prefect flow-run execute` supervisor owns the run's next state
|
|
206
|
+
# (`reschedule` proposes it; `relinquish` leaves it to retrying infrastructure), so
|
|
207
|
+
# the engine must exit without proposing one.
|
|
208
|
+
_SUPERVISOR_OWNED_INTENTS: frozenset[Intent] = frozenset({"reschedule", "relinquish"})
|
|
218
209
|
|
|
219
210
|
|
|
220
211
|
def _is_async_runtime_cancellation(exc: BaseException) -> bool:
|
|
@@ -1198,10 +1189,8 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1198
1189
|
if intent == "cancel":
|
|
1199
1190
|
self.handle_cancellation(exc)
|
|
1200
1191
|
elif intent is None:
|
|
1201
|
-
if _should_bubble_raw_sigterm_for_reschedule():
|
|
1202
|
-
raise
|
|
1203
1192
|
self.handle_crash(exc)
|
|
1204
|
-
|
|
1193
|
+
elif intent not in _SUPERVISOR_OWNED_INTENTS:
|
|
1205
1194
|
# Defensive: an unknown intent means the control
|
|
1206
1195
|
# listener was extended (e.g. "suspend" in a
|
|
1207
1196
|
# follow-up PR) without extending this dispatch.
|
|
@@ -1896,10 +1885,8 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1896
1885
|
if intent == "cancel":
|
|
1897
1886
|
await self.handle_cancellation(exc)
|
|
1898
1887
|
elif intent is None:
|
|
1899
|
-
if _should_bubble_raw_sigterm_for_reschedule():
|
|
1900
|
-
raise
|
|
1901
1888
|
await self.handle_crash(exc)
|
|
1902
|
-
|
|
1889
|
+
elif intent not in _SUPERVISOR_OWNED_INTENTS:
|
|
1903
1890
|
# Defensive: see sync engine's dispatch for why.
|
|
1904
1891
|
self.logger.error(
|
|
1905
1892
|
"Unhandled termination intent %r; treating as"
|
|
@@ -1936,6 +1923,13 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1936
1923
|
exc_info=exc,
|
|
1937
1924
|
)
|
|
1938
1925
|
raise
|
|
1926
|
+
if (
|
|
1927
|
+
_is_async_runtime_cancellation(exc)
|
|
1928
|
+
and _termination_intent() in _SUPERVISOR_OWNED_INTENTS
|
|
1929
|
+
):
|
|
1930
|
+
# A supervisor-driven SIGTERM can surface here as a cancellation
|
|
1931
|
+
# rather than a TerminationSignal.
|
|
1932
|
+
raise TerminationSignal(signal.SIGTERM) from exc
|
|
1939
1933
|
# We don't want to crash a flow run if the user code finished executing
|
|
1940
1934
|
if self.flow_run.state and not self.flow_run.state.is_final():
|
|
1941
1935
|
# BaseExceptions are caught and handled as crashes
|