prefect-client 3.8.2.dev6__tar.gz → 3.8.3.dev2__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.2.dev6 → prefect_client-3.8.3.dev2}/PKG-INFO +2 -2
- prefect_client-3.8.3.dev2/src/prefect/_build_info.py +5 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/services.py +13 -2
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/_asyncio.py +26 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/services.py +84 -2
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/flows.py +1 -0
- prefect_client-3.8.3.dev2/src/prefect/runner/_uv_command.py +90 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_workspace_starter.py +7 -66
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/process.py +44 -5
- prefect_client-3.8.2.dev6/src/prefect/_build_info.py +0 -5
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/.gitignore +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/LICENSE +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/README.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/hatch_build.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/pyproject.toml +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/__main__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/agent.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/automations.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/base.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/context.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/engine.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/related.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/futures.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/main.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/plugins.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/py.typed +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/results.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/schedules.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/serializers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/_types.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/states.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/tasks.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/transactions.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/types/names.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/variables.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.8.
|
|
3
|
+
Version: 3.8.3.dev2
|
|
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
|
|
@@ -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:
|
|
@@ -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"]
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Auto-`uv run` launcher command construction shared by runner and worker paths."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import shutil
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Iterable
|
|
8
|
+
|
|
9
|
+
from packaging.requirements import InvalidRequirement, Requirement
|
|
10
|
+
from packaging.utils import canonicalize_name
|
|
11
|
+
|
|
12
|
+
from prefect._internal.compatibility.backports import tomllib
|
|
13
|
+
from prefect.settings import get_current_settings
|
|
14
|
+
from prefect.utilities.processutils import command_to_string
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _dependencies_include_prefect(dependencies: object) -> bool:
|
|
18
|
+
if not isinstance(dependencies, Iterable) or isinstance(dependencies, (str, bytes)):
|
|
19
|
+
return False
|
|
20
|
+
|
|
21
|
+
for dependency in dependencies:
|
|
22
|
+
if not isinstance(dependency, str):
|
|
23
|
+
continue
|
|
24
|
+
try:
|
|
25
|
+
name = Requirement(dependency).name
|
|
26
|
+
except InvalidRequirement:
|
|
27
|
+
continue
|
|
28
|
+
if canonicalize_name(name) == "prefect":
|
|
29
|
+
return True
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _pyproject_declares_prefect_dependency(pyproject: Path) -> bool:
|
|
34
|
+
try:
|
|
35
|
+
data = tomllib.loads(pyproject.read_text(encoding="utf-8"))
|
|
36
|
+
except (OSError, tomllib.TOMLDecodeError):
|
|
37
|
+
return False
|
|
38
|
+
|
|
39
|
+
project = data.get("project")
|
|
40
|
+
if not isinstance(project, dict):
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
return _dependencies_include_prefect(project.get("dependencies"))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def uv_project_command(
|
|
47
|
+
project_root: Path | None,
|
|
48
|
+
engine_args: Iterable[str],
|
|
49
|
+
path: str | None = None,
|
|
50
|
+
auto_install_dependencies: bool | None = None,
|
|
51
|
+
) -> str | None:
|
|
52
|
+
"""Build an auto-`uv run` command for a project directory, if applicable.
|
|
53
|
+
|
|
54
|
+
Returns `None` unless dependency auto-installation is enabled, `project_root`
|
|
55
|
+
contains a `pyproject.toml` declaring `prefect` as a project dependency, and
|
|
56
|
+
`uv` is discoverable on `path` (or the current `PATH` when `path` is `None`).
|
|
57
|
+
|
|
58
|
+
`auto_install_dependencies` overrides the current setting value, for callers
|
|
59
|
+
that resolve the setting from a run-specific environment.
|
|
60
|
+
"""
|
|
61
|
+
if auto_install_dependencies is None:
|
|
62
|
+
auto_install_dependencies = (
|
|
63
|
+
get_current_settings().runner.auto_install_dependencies
|
|
64
|
+
)
|
|
65
|
+
if not auto_install_dependencies:
|
|
66
|
+
return None
|
|
67
|
+
|
|
68
|
+
if project_root is None:
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
pyproject = project_root / "pyproject.toml"
|
|
72
|
+
if not pyproject.is_file() or not _pyproject_declares_prefect_dependency(pyproject):
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
uv_executable = (
|
|
76
|
+
shutil.which("uv", path=path) if path is not None else shutil.which("uv")
|
|
77
|
+
)
|
|
78
|
+
if uv_executable is None:
|
|
79
|
+
return None
|
|
80
|
+
|
|
81
|
+
return command_to_string(
|
|
82
|
+
[
|
|
83
|
+
uv_executable,
|
|
84
|
+
"run",
|
|
85
|
+
"--no-default-groups",
|
|
86
|
+
"--project",
|
|
87
|
+
str(project_root),
|
|
88
|
+
*engine_args,
|
|
89
|
+
]
|
|
90
|
+
)
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/runner/_workspace_starter.py
RENAMED
|
@@ -2,26 +2,23 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import functools
|
|
4
4
|
import os
|
|
5
|
-
import shutil
|
|
6
5
|
import site
|
|
7
6
|
import subprocess
|
|
8
7
|
import sys
|
|
9
8
|
import sysconfig
|
|
10
9
|
from contextlib import contextmanager
|
|
11
10
|
from pathlib import Path
|
|
12
|
-
from typing import TYPE_CHECKING, Any,
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Iterator
|
|
13
12
|
from uuid import UUID
|
|
14
13
|
|
|
15
14
|
import anyio
|
|
16
15
|
import anyio.abc
|
|
17
|
-
from packaging.requirements import InvalidRequirement, Requirement
|
|
18
|
-
from packaging.utils import canonicalize_name
|
|
19
16
|
|
|
20
|
-
from prefect._internal.compatibility.backports import tomllib
|
|
21
17
|
from prefect.exceptions import MissingFlowError
|
|
22
18
|
from prefect.flows import load_flow_from_entrypoint, load_function_and_convert_to_flow
|
|
23
19
|
from prefect.runner._process_manager import ProcessHandle
|
|
24
20
|
from prefect.runner._starter_engine import EngineCommandStarter
|
|
21
|
+
from prefect.runner._uv_command import uv_project_command
|
|
25
22
|
from prefect.runner._workspace_resolver import (
|
|
26
23
|
PreparedWorkspace,
|
|
27
24
|
PreparedWorkspaceResult,
|
|
@@ -29,7 +26,7 @@ from prefect.runner._workspace_resolver import (
|
|
|
29
26
|
)
|
|
30
27
|
from prefect.settings import get_current_settings
|
|
31
28
|
from prefect.utilities.asyncutils import run_sync_in_worker_thread
|
|
32
|
-
from prefect.utilities.processutils import
|
|
29
|
+
from prefect.utilities.processutils import sanitize_subprocess_env
|
|
33
30
|
|
|
34
31
|
if TYPE_CHECKING:
|
|
35
32
|
from prefect.client.schemas.objects import FlowRun
|
|
@@ -217,67 +214,11 @@ def _absolute_file_entrypoint(workspace: PreparedWorkspace) -> str:
|
|
|
217
214
|
return f"{entrypoint_path.resolve()}:{object_name}"
|
|
218
215
|
|
|
219
216
|
|
|
220
|
-
def _dependencies_include_prefect(dependencies: object) -> bool:
|
|
221
|
-
if not isinstance(dependencies, Iterable) or isinstance(dependencies, (str, bytes)):
|
|
222
|
-
return False
|
|
223
|
-
|
|
224
|
-
for dependency in dependencies:
|
|
225
|
-
if not isinstance(dependency, str):
|
|
226
|
-
continue
|
|
227
|
-
try:
|
|
228
|
-
name = Requirement(dependency).name
|
|
229
|
-
except InvalidRequirement:
|
|
230
|
-
continue
|
|
231
|
-
if canonicalize_name(name) == "prefect":
|
|
232
|
-
return True
|
|
233
|
-
return False
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
def _pyproject_declares_prefect_dependency(pyproject: Path) -> bool:
|
|
237
|
-
try:
|
|
238
|
-
data = tomllib.loads(pyproject.read_text(encoding="utf-8"))
|
|
239
|
-
except (OSError, tomllib.TOMLDecodeError):
|
|
240
|
-
return False
|
|
241
|
-
|
|
242
|
-
project = data.get("project")
|
|
243
|
-
if not isinstance(project, dict):
|
|
244
|
-
return False
|
|
245
|
-
|
|
246
|
-
return _dependencies_include_prefect(project.get("dependencies"))
|
|
247
|
-
|
|
248
|
-
|
|
249
217
|
def _uv_run_command(workspace: PreparedWorkspace) -> str | None:
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
if project_root is None:
|
|
255
|
-
return None
|
|
256
|
-
|
|
257
|
-
pyproject = project_root / "pyproject.toml"
|
|
258
|
-
if not pyproject.is_file() or not _pyproject_declares_prefect_dependency(pyproject):
|
|
259
|
-
return None
|
|
260
|
-
|
|
261
|
-
workspace_path = workspace.environment.get("PATH")
|
|
262
|
-
uv_executable = (
|
|
263
|
-
shutil.which("uv", path=workspace_path)
|
|
264
|
-
if workspace_path is not None
|
|
265
|
-
else shutil.which("uv")
|
|
266
|
-
)
|
|
267
|
-
if uv_executable is None:
|
|
268
|
-
return None
|
|
269
|
-
|
|
270
|
-
return command_to_string(
|
|
271
|
-
[
|
|
272
|
-
uv_executable,
|
|
273
|
-
"run",
|
|
274
|
-
"--no-default-groups",
|
|
275
|
-
"--project",
|
|
276
|
-
str(project_root),
|
|
277
|
-
"-m",
|
|
278
|
-
"prefect.flow_engine",
|
|
279
|
-
workspace.runtime_entrypoint,
|
|
280
|
-
]
|
|
218
|
+
return uv_project_command(
|
|
219
|
+
workspace.project_root,
|
|
220
|
+
["-m", "prefect.flow_engine", workspace.runtime_entrypoint],
|
|
221
|
+
path=workspace.environment.get("PATH"),
|
|
281
222
|
)
|
|
282
223
|
|
|
283
224
|
|
|
@@ -25,10 +25,11 @@ from typing import TYPE_CHECKING, Any, Optional, TypeVar
|
|
|
25
25
|
|
|
26
26
|
import anyio
|
|
27
27
|
import anyio.abc
|
|
28
|
-
from pydantic import Field, field_validator
|
|
28
|
+
from pydantic import Field, PrivateAttr, TypeAdapter, ValidationError, field_validator
|
|
29
29
|
|
|
30
30
|
from prefect._internal.schemas.validators import validate_working_dir
|
|
31
31
|
from prefect.client.schemas.objects import Flow as APIFlow
|
|
32
|
+
from prefect.runner._uv_command import uv_project_command
|
|
32
33
|
from prefect.runner.runner import Runner
|
|
33
34
|
from prefect.states import Pending
|
|
34
35
|
from prefect.utilities.processutils import command_to_string, get_sys_executable
|
|
@@ -53,6 +54,8 @@ class ProcessJobConfiguration(BaseJobConfiguration):
|
|
|
53
54
|
stream_output: bool = Field(default=True)
|
|
54
55
|
working_dir: Optional[Path] = Field(default=None)
|
|
55
56
|
|
|
57
|
+
_command_configured: bool = PrivateAttr(default=False)
|
|
58
|
+
|
|
56
59
|
@field_validator("working_dir")
|
|
57
60
|
@classmethod
|
|
58
61
|
def validate_working_dir(cls, v: Path | str | None) -> Path | None:
|
|
@@ -69,6 +72,10 @@ class ProcessJobConfiguration(BaseJobConfiguration):
|
|
|
69
72
|
worker_name: str | None = None,
|
|
70
73
|
worker_id: "UUID | None" = None,
|
|
71
74
|
) -> None:
|
|
75
|
+
# The base implementation fills in `_base_flow_run_command()` when no command
|
|
76
|
+
# is configured, so provenance must be captured before delegating.
|
|
77
|
+
self._command_configured = self.command is not None
|
|
78
|
+
|
|
72
79
|
super().prepare_for_flow_run(
|
|
73
80
|
flow_run,
|
|
74
81
|
deployment,
|
|
@@ -80,9 +87,9 @@ class ProcessJobConfiguration(BaseJobConfiguration):
|
|
|
80
87
|
|
|
81
88
|
self.env: dict[str, str | None] = {**os.environ, **self.env}
|
|
82
89
|
self.command: str | None = (
|
|
83
|
-
|
|
84
|
-
if self.
|
|
85
|
-
else
|
|
90
|
+
self.command
|
|
91
|
+
if self._command_configured
|
|
92
|
+
else command_to_string([get_sys_executable(), "-m", "prefect.engine"])
|
|
86
93
|
)
|
|
87
94
|
|
|
88
95
|
@staticmethod
|
|
@@ -94,6 +101,38 @@ class ProcessJobConfiguration(BaseJobConfiguration):
|
|
|
94
101
|
"""
|
|
95
102
|
return "python -m prefect.engine"
|
|
96
103
|
|
|
104
|
+
def _resolve_command(self, working_dir: Path | str) -> str | None:
|
|
105
|
+
"""
|
|
106
|
+
Use an auto-`uv run` launcher for the flow run when the working directory
|
|
107
|
+
is a project that declares `prefect` as a dependency and the deployment
|
|
108
|
+
did not configure an explicit command.
|
|
109
|
+
"""
|
|
110
|
+
if self._command_configured:
|
|
111
|
+
return self.command
|
|
112
|
+
|
|
113
|
+
env = self.env or {}
|
|
114
|
+
# A run-specific setting in the environment takes precedence over the
|
|
115
|
+
# worker process's own setting.
|
|
116
|
+
auto_install = env.get("PREFECT_RUNNER_AUTO_INSTALL_DEPENDENCIES")
|
|
117
|
+
try:
|
|
118
|
+
auto_install_dependencies = (
|
|
119
|
+
TypeAdapter(bool).validate_python(auto_install)
|
|
120
|
+
if auto_install is not None
|
|
121
|
+
else None
|
|
122
|
+
)
|
|
123
|
+
except ValidationError:
|
|
124
|
+
auto_install_dependencies = None
|
|
125
|
+
|
|
126
|
+
uv_command = uv_project_command(
|
|
127
|
+
# `uv` resolves `--project` relative to the flow run's working
|
|
128
|
+
# directory, so the project root must be absolute.
|
|
129
|
+
Path(working_dir).resolve(),
|
|
130
|
+
["-m", "prefect.engine"],
|
|
131
|
+
path=env.get("PATH"),
|
|
132
|
+
auto_install_dependencies=auto_install_dependencies,
|
|
133
|
+
)
|
|
134
|
+
return uv_command or self.command
|
|
135
|
+
|
|
97
136
|
|
|
98
137
|
class ProcessVariables(BaseVariables):
|
|
99
138
|
stream_output: bool = Field(
|
|
@@ -151,7 +190,7 @@ class ProcessWorker(
|
|
|
151
190
|
warnings.simplefilter("ignore", DeprecationWarning)
|
|
152
191
|
process = await self._runner.execute_flow_run(
|
|
153
192
|
flow_run_id=flow_run.id,
|
|
154
|
-
command=configuration.
|
|
193
|
+
command=configuration._resolve_command(working_dir),
|
|
155
194
|
cwd=working_dir,
|
|
156
195
|
env=configuration.env,
|
|
157
196
|
stream_output=configuration.stream_output,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/__init__.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/_launchers.py
RENAMED
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/bundles/execute.py
RENAMED
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/plugins/apply.py
RENAMED
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/plugins/manager.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/plugins/spec.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/sla/__init__.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/sla/client.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_experimental/sla/objects.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/client.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/device_id.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/emit.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/enabled.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/events.py
RENAMED
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/notice.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/analytics/service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/api.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/calls.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/threads.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/concurrency/waiters.py
RENAMED
|
File without changes
|
{prefect_client-3.8.2.dev6 → prefect_client-3.8.3.dev2}/src/prefect/_internal/control_listener.py
RENAMED
|
File without changes
|
|
File without changes
|