prefect-client 3.6.24.dev5__tar.gz → 3.6.25.dev1__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.6.24.dev5 → prefect_client-3.6.25.dev1}/PKG-INFO +1 -1
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/AGENTS.md +1 -0
- prefect_client-3.6.25.dev1/src/prefect/_build_info.py +5 -0
- prefect_client-3.6.25.dev1/src/prefect/blocks/AGENTS.md +48 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/core.py +76 -8
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/notifications.py +2 -3
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/AGENTS.md +3 -1
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/_asyncio.py +9 -1
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/_leases.py +30 -6
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/_sync.py +9 -1
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/asyncio.py +7 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/sync.py +7 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/context.py +47 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/docker/__init__.py +6 -0
- prefect_client-3.6.25.dev1/src/prefect/docker/_buildx.py +217 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/docker/docker_image.py +91 -4
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/flow_engine.py +75 -83
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/sources.py +3 -1
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/pydantic.py +10 -4
- prefect_client-3.6.24.dev5/src/prefect/_build_info.py +0 -5
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/.gitignore +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/LICENSE +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/README.md +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/pyproject.toml +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/_version_checking.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/engine.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/flows.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/futures.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/main.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/results.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/serializers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/states.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/asyncutils.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/callables.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/engine.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/filesystem.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/processutils.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/templating.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/workers/utilities.py +0 -0
|
@@ -49,5 +49,6 @@ Use `get_logger()` from `prefect.logging` instead of raw `logging.getLogger()`
|
|
|
49
49
|
- `runner/` → Thin facade over extracted single-responsibility classes for local flow run execution (see runner/AGENTS.md)
|
|
50
50
|
- `deployments/` → YAML-driven deployment lifecycle: project init, build/push/pull steps, and triggering remote flow runs (see deployments/AGENTS.md)
|
|
51
51
|
- `utilities/` → Cross-cutting helpers: async utils, schema hydration, callables introspection, and more (see utilities/AGENTS.md)
|
|
52
|
+
- `blocks/` → Server-persisted configuration objects for external service credentials and settings (see blocks/AGENTS.md)
|
|
52
53
|
- `docker/` → `DockerImage` class for building and pushing Docker images during deployment
|
|
53
54
|
- `telemetry/` → OS-level resource metric collection and run telemetry
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Blocks
|
|
2
|
+
|
|
3
|
+
Reusable, server-persisted configuration objects for connecting workflows to external services. Blocks store credentials and settings securely and are shared across runs via the Prefect server.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Blocks handle configuration lifecycle: define fields in Python, register schema with the server, save/load named instances, and serialize secrets safely. They do NOT execute workflow logic — that belongs in flows and tasks. Block subclasses define the interface; `core.py` handles all server interaction.
|
|
8
|
+
|
|
9
|
+
## Entry Points & Contracts
|
|
10
|
+
|
|
11
|
+
- `Block` (`core.py`) — base class for all blocks. Subclass it, declare Pydantic fields, optionally set `_block_type_slug`, `_logo_url`, etc.
|
|
12
|
+
- `abstract.py` — abstract interfaces (`CredentialsBlock`, `NotificationBlock`, `DatabaseBlock`, `ObjectStorageBlock`, `SecretBlock`, `JobBlock`) to signal capability and constrain API shape.
|
|
13
|
+
- `system.py` — built-in `Secret[T]` block for storing a single secret value.
|
|
14
|
+
- `notifications.py` — `SlackWebhook` and Apprise-based notification blocks.
|
|
15
|
+
- `webhook.py` — `Webhook` block for calling HTTP endpoints.
|
|
16
|
+
- `redis.py` — `RedisStorageContainer` implementing `WritableFileSystem`.
|
|
17
|
+
|
|
18
|
+
## Usage Patterns
|
|
19
|
+
|
|
20
|
+
**Define a block:**
|
|
21
|
+
```python
|
|
22
|
+
class MyBlock(Block):
|
|
23
|
+
_block_type_slug = "my-block"
|
|
24
|
+
api_key: SecretStr
|
|
25
|
+
endpoint: str
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Save and load:**
|
|
29
|
+
```python
|
|
30
|
+
await MyBlock(api_key="...", endpoint="...").save("prod")
|
|
31
|
+
block = await MyBlock.load("prod")
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Sync/async dispatch:** All I/O methods (`save`, `load`, `register_type_and_schema`, `delete`) use `@async_dispatch` — the same method name works in sync and async contexts.
|
|
35
|
+
|
|
36
|
+
## Anti-Patterns
|
|
37
|
+
|
|
38
|
+
- **Don't call `register_type_and_schema()` manually before `save()`** — `save()` calls it automatically and handles idempotency.
|
|
39
|
+
- **Don't change `_block_type_slug` after a block has been registered** — the slug is the server-side primary key; renaming it creates a new block type and orphans existing documents.
|
|
40
|
+
- **Don't use `load(validate=False)` as the normal path** — it bypasses validation and leaves missing fields as `None`. It exists only for schema migration scenarios.
|
|
41
|
+
|
|
42
|
+
## Pitfalls
|
|
43
|
+
|
|
44
|
+
- **`position` in JSON schema** — `model_json_schema()` injects a `position` key (0-based field declaration order) into every property, including nested block definitions. This key affects the schema checksum. Adding or reordering fields changes the checksum and invalidates previously stored schema references.
|
|
45
|
+
- **Schema checksum stability** — the checksum covers field definitions including `position`. Any field addition, removal, or reorder creates a new schema version on the server.
|
|
46
|
+
- **Secret fields use dot-notation paths** — `"credentials.api_key"` means a nested field is secret; `"passwords.*"` means all values under that key are secret. The `secret_fields` list in the schema drives serialization obfuscation.
|
|
47
|
+
- **Nested blocks are registered transitively** — `register_type_and_schema()` walks all field annotations recursively. A deeply nested block that fails registration will surface an error at the outermost `save()` call.
|
|
48
|
+
- **Sync/async paths must stay in lockstep** — `_save_sync` and `asave` / `_save` must produce identical results. Changes to one must be mirrored in the other.
|
|
@@ -428,21 +428,28 @@ class Block(BaseModel, ABC):
|
|
|
428
428
|
if (ctx := info.context) and ctx.get("include_secrets") is True:
|
|
429
429
|
# Add serialization mode to context so handle_secret_render knows how to process nested models
|
|
430
430
|
ctx["serialization_mode"] = info.mode
|
|
431
|
+
ctx["by_alias"] = info.by_alias
|
|
431
432
|
|
|
432
|
-
for field_name in type(self).model_fields:
|
|
433
|
+
for field_name, field_info in type(self).model_fields.items():
|
|
433
434
|
field_value = getattr(self, field_name)
|
|
434
435
|
|
|
435
|
-
#
|
|
436
|
+
# Determine the correct key in the serialized dict,
|
|
437
|
+
# respecting alias settings to avoid creating duplicate
|
|
438
|
+
# entries (e.g. both "schema" and "schema_" for a field
|
|
439
|
+
# defined as `schema_: str = Field(alias="schema")`).
|
|
440
|
+
alias = field_info.serialization_alias or field_info.alias
|
|
441
|
+
if info.by_alias and alias:
|
|
442
|
+
key = alias
|
|
443
|
+
else:
|
|
444
|
+
key = field_name
|
|
445
|
+
|
|
446
|
+
# Skip fields that don't contain secrets
|
|
436
447
|
# as they're already properly serialized by the handler
|
|
437
|
-
if (
|
|
438
|
-
info.mode == "json"
|
|
439
|
-
and field_name in jsonable_self
|
|
440
|
-
and not self._field_has_secrets(field_name)
|
|
441
|
-
):
|
|
448
|
+
if key in jsonable_self and not self._field_has_secrets(field_name):
|
|
442
449
|
continue
|
|
443
450
|
|
|
444
451
|
# For all other fields, use visit_collection with handle_secret_render
|
|
445
|
-
jsonable_self[
|
|
452
|
+
jsonable_self[key] = visit_collection(
|
|
446
453
|
expr=field_value,
|
|
447
454
|
visit_fn=partial(handle_secret_render, context=ctx),
|
|
448
455
|
return_data=True,
|
|
@@ -1946,6 +1953,54 @@ class Block(BaseModel, ABC):
|
|
|
1946
1953
|
|
|
1947
1954
|
return f"prefect.blocks.{self.get_block_type_slug()}.{block_document_name}"
|
|
1948
1955
|
|
|
1956
|
+
@classmethod
|
|
1957
|
+
def _inject_field_positions(
|
|
1958
|
+
cls,
|
|
1959
|
+
schema: dict[str, Any],
|
|
1960
|
+
model_cls: type["Block"],
|
|
1961
|
+
by_alias: bool,
|
|
1962
|
+
) -> None:
|
|
1963
|
+
"""Add a 'position' key to each property in the schema based on field declaration order."""
|
|
1964
|
+
if "properties" not in schema:
|
|
1965
|
+
return
|
|
1966
|
+
for position, field_name in enumerate(model_cls.model_fields):
|
|
1967
|
+
field_info = model_cls.model_fields[field_name]
|
|
1968
|
+
alias = field_info.alias or field_name
|
|
1969
|
+
key = alias if by_alias else field_name
|
|
1970
|
+
if key in schema["properties"]:
|
|
1971
|
+
schema["properties"][key]["position"] = position
|
|
1972
|
+
|
|
1973
|
+
@classmethod
|
|
1974
|
+
def _collect_nested_block_types(
|
|
1975
|
+
cls, model_cls: type["Block"]
|
|
1976
|
+
) -> dict[str, type["Block"]]:
|
|
1977
|
+
"""Return a mapping of class name → Block subclass for all nested blocks."""
|
|
1978
|
+
result: dict[str, type["Block"]] = {}
|
|
1979
|
+
|
|
1980
|
+
for field in model_cls.model_fields.values():
|
|
1981
|
+
annotation = field.annotation
|
|
1982
|
+
if annotation is None:
|
|
1983
|
+
continue
|
|
1984
|
+
cls._walk_annotation_for_blocks(annotation, result)
|
|
1985
|
+
|
|
1986
|
+
return result
|
|
1987
|
+
|
|
1988
|
+
@classmethod
|
|
1989
|
+
def _walk_annotation_for_blocks(
|
|
1990
|
+
cls,
|
|
1991
|
+
annotation: type,
|
|
1992
|
+
result: dict[str, type["Block"]],
|
|
1993
|
+
) -> None:
|
|
1994
|
+
if Block.is_block_class(annotation):
|
|
1995
|
+
if annotation.__name__ not in result:
|
|
1996
|
+
result[annotation.__name__] = annotation
|
|
1997
|
+
# recurse into the nested block's own fields
|
|
1998
|
+
for nested in cls._collect_nested_block_types(annotation).items():
|
|
1999
|
+
result.setdefault(nested[0], nested[1])
|
|
2000
|
+
if get_origin(annotation) in NestedTypes:
|
|
2001
|
+
for arg in get_args(annotation):
|
|
2002
|
+
cls._walk_annotation_for_blocks(arg, result)
|
|
2003
|
+
|
|
1949
2004
|
@classmethod
|
|
1950
2005
|
def model_json_schema(
|
|
1951
2006
|
cls,
|
|
@@ -1964,6 +2019,19 @@ class Block(BaseModel, ABC):
|
|
|
1964
2019
|
schema["definitions"] = schema.pop("$defs")
|
|
1965
2020
|
|
|
1966
2021
|
schema = remove_nested_keys(["additionalProperties"], schema)
|
|
2022
|
+
|
|
2023
|
+
# Add position to top-level properties based on field declaration order
|
|
2024
|
+
cls._inject_field_positions(schema, cls, by_alias)
|
|
2025
|
+
|
|
2026
|
+
# Add position to nested block definitions
|
|
2027
|
+
if "definitions" in schema:
|
|
2028
|
+
nested_blocks = cls._collect_nested_block_types(cls)
|
|
2029
|
+
for def_name, def_schema in schema["definitions"].items():
|
|
2030
|
+
if def_name in nested_blocks:
|
|
2031
|
+
cls._inject_field_positions(
|
|
2032
|
+
def_schema, nested_blocks[def_name], by_alias
|
|
2033
|
+
)
|
|
2034
|
+
|
|
1967
2035
|
return schema
|
|
1968
2036
|
|
|
1969
2037
|
@classmethod
|
{prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/blocks/notifications.py
RENAMED
|
@@ -496,8 +496,7 @@ class TwilioSMS(AbstractAppriseNotificationBlock):
|
|
|
496
496
|
to_phone_numbers: list[str] = Field(
|
|
497
497
|
default=...,
|
|
498
498
|
description="A list of valid Twilio phone number(s) to send the message to.",
|
|
499
|
-
|
|
500
|
-
examples=["18004242424"],
|
|
499
|
+
examples=['["18004242424", "18004242425"]'],
|
|
501
500
|
)
|
|
502
501
|
|
|
503
502
|
def block_initialization(self) -> None:
|
|
@@ -1056,7 +1055,7 @@ class SendgridEmail(AbstractAppriseNotificationBlock):
|
|
|
1056
1055
|
default=...,
|
|
1057
1056
|
title="Recipient emails",
|
|
1058
1057
|
description="Email ids of all recipients.",
|
|
1059
|
-
examples=['"recipient1@gmail.com"'],
|
|
1058
|
+
examples=['["recipient1@gmail.com", "recipient2@gmail.com"]'],
|
|
1060
1059
|
)
|
|
1061
1060
|
|
|
1062
1061
|
def block_initialization(self) -> None:
|
|
@@ -16,7 +16,9 @@ Does NOT define concurrency limits (server-side in `server/`). Does NOT handle t
|
|
|
16
16
|
|
|
17
17
|
**`strict=False` (default):** logs a warning if the named limit doesn't exist, but proceeds. `strict=True` raises `ConcurrencySlotAcquisitionError`.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
**`raise_on_lease_renewal_failure` (public parameter):** Controls lease renewal failure behavior independently from `strict`. When `None` (default), falls back to the value of `strict` for backward compatibility. Set to `False` to let long-running tasks continue even if a transient renewal error occurs; set to `True` to terminate immediately on renewal failure regardless of `strict`. This means `strict=True, raise_on_lease_renewal_failure=False` gives strict slot acquisition but non-fatal renewal failures, and vice versa.
|
|
20
|
+
|
|
21
|
+
**Lease renewal:** `_leases.py` runs a background loop that renews immediately on entry, then sleeps for 75% of `lease_duration` between renewals. Each renewal call uses `@retry_async_fn(max_attempts=3)` for transient failures. If all 3 attempts fail, the background task raises and a done-callback either cancels execution or logs a warning, depending on `raise_on_lease_renewal_failure`.
|
|
20
22
|
|
|
21
23
|
**Sync/async lockstep invariant:** `asyncio.py`/`sync.py` and `_asyncio.py`/`_sync.py` are parallel implementations. Any behavior change to one must be mirrored in the other.
|
|
22
24
|
|
{prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/_asyncio.py
RENAMED
|
@@ -167,6 +167,7 @@ async def concurrency(
|
|
|
167
167
|
strict: bool = False,
|
|
168
168
|
holder: "Optional[ConcurrencyLeaseHolder]" = None,
|
|
169
169
|
suppress_warnings: bool = False,
|
|
170
|
+
raise_on_lease_renewal_failure: Optional[bool] = None,
|
|
170
171
|
) -> AsyncGenerator[None, None]:
|
|
171
172
|
"""
|
|
172
173
|
Internal version of the `concurrency` context manager. The public version is located in `prefect.concurrency.asyncio`.
|
|
@@ -182,6 +183,11 @@ async def concurrency(
|
|
|
182
183
|
Defaults to `False`.
|
|
183
184
|
holder: A dictionary containing information about the holder of the concurrency slots.
|
|
184
185
|
Typically includes 'type' and 'id' keys.
|
|
186
|
+
raise_on_lease_renewal_failure: Controls whether to terminate execution when lease
|
|
187
|
+
renewal fails. When `None` (default), follows the `strict` parameter for
|
|
188
|
+
backward compatibility. Set to `False` to allow long-running tasks to continue
|
|
189
|
+
even if a transient lease renewal error occurs. Set to `True` to terminate
|
|
190
|
+
execution immediately on renewal failure.
|
|
185
191
|
|
|
186
192
|
Raises:
|
|
187
193
|
TimeoutError: If the slots are not acquired within the given timeout.
|
|
@@ -227,7 +233,9 @@ async def concurrency(
|
|
|
227
233
|
async with amaintain_concurrency_lease(
|
|
228
234
|
response.lease_id,
|
|
229
235
|
lease_duration,
|
|
230
|
-
raise_on_lease_renewal_failure=
|
|
236
|
+
raise_on_lease_renewal_failure=raise_on_lease_renewal_failure
|
|
237
|
+
if raise_on_lease_renewal_failure is not None
|
|
238
|
+
else strict,
|
|
231
239
|
suppress_warnings=suppress_warnings,
|
|
232
240
|
):
|
|
233
241
|
yield
|
{prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/_leases.py
RENAMED
|
@@ -79,19 +79,31 @@ def maintain_concurrency_lease(
|
|
|
79
79
|
logger = get_logger("concurrency")
|
|
80
80
|
if raise_on_lease_renewal_failure:
|
|
81
81
|
logger.error(
|
|
82
|
-
"Concurrency lease renewal failed - slots are no longer reserved.
|
|
82
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
83
|
+
"Terminating execution to prevent over-allocation. "
|
|
84
|
+
"Lease ID: %s, exception: %s",
|
|
85
|
+
lease_id,
|
|
86
|
+
exc,
|
|
83
87
|
exc_info=(type(exc), exc, exc.__traceback__),
|
|
84
88
|
)
|
|
85
89
|
assert cancel_scope.cancel()
|
|
86
90
|
else:
|
|
87
91
|
if suppress_warnings:
|
|
88
92
|
logger.debug(
|
|
89
|
-
"Concurrency lease renewal failed - slots are no longer reserved.
|
|
93
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
94
|
+
"Execution will continue, but concurrency limits may be exceeded. "
|
|
95
|
+
"Lease ID: %s, exception: %s",
|
|
96
|
+
lease_id,
|
|
97
|
+
exc,
|
|
90
98
|
exc_info=(type(exc), exc, exc.__traceback__),
|
|
91
99
|
)
|
|
92
100
|
else:
|
|
93
101
|
logger.warning(
|
|
94
|
-
"Concurrency lease renewal failed - slots are no longer reserved.
|
|
102
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
103
|
+
"Execution will continue, but concurrency limits may be exceeded. "
|
|
104
|
+
"Lease ID: %s, exception: %s",
|
|
105
|
+
lease_id,
|
|
106
|
+
exc,
|
|
95
107
|
exc_info=(type(exc), exc, exc.__traceback__),
|
|
96
108
|
)
|
|
97
109
|
|
|
@@ -137,19 +149,31 @@ async def amaintain_concurrency_lease(
|
|
|
137
149
|
logger = get_logger("concurrency")
|
|
138
150
|
if raise_on_lease_renewal_failure:
|
|
139
151
|
logger.error(
|
|
140
|
-
"Concurrency lease renewal failed - slots are no longer reserved.
|
|
152
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
153
|
+
"Terminating execution to prevent over-allocation. "
|
|
154
|
+
"Lease ID: %s, exception: %s",
|
|
155
|
+
lease_id,
|
|
156
|
+
exc,
|
|
141
157
|
exc_info=(type(exc), exc, exc.__traceback__),
|
|
142
158
|
)
|
|
143
159
|
cancel_scope.cancel()
|
|
144
160
|
else:
|
|
145
161
|
if suppress_warnings:
|
|
146
162
|
logger.debug(
|
|
147
|
-
"Concurrency lease renewal failed - slots are no longer reserved.
|
|
163
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
164
|
+
"Execution will continue, but concurrency limits may be exceeded. "
|
|
165
|
+
"Lease ID: %s, exception: %s",
|
|
166
|
+
lease_id,
|
|
167
|
+
exc,
|
|
148
168
|
exc_info=(type(exc), exc, exc.__traceback__),
|
|
149
169
|
)
|
|
150
170
|
else:
|
|
151
171
|
logger.warning(
|
|
152
|
-
"Concurrency lease renewal failed - slots are no longer reserved.
|
|
172
|
+
"Concurrency lease renewal failed - slots are no longer reserved. "
|
|
173
|
+
"Execution will continue, but concurrency limits may be exceeded. "
|
|
174
|
+
"Lease ID: %s, exception: %s",
|
|
175
|
+
lease_id,
|
|
176
|
+
exc,
|
|
153
177
|
exc_info=(type(exc), exc, exc.__traceback__),
|
|
154
178
|
)
|
|
155
179
|
|
|
@@ -81,6 +81,7 @@ def concurrency(
|
|
|
81
81
|
strict: bool = False,
|
|
82
82
|
holder: "Optional[ConcurrencyLeaseHolder]" = None,
|
|
83
83
|
suppress_warnings: bool = False,
|
|
84
|
+
raise_on_lease_renewal_failure: Optional[bool] = None,
|
|
84
85
|
) -> Generator[None, None, None]:
|
|
85
86
|
"""A context manager that acquires and releases concurrency slots from the
|
|
86
87
|
given concurrency limits.
|
|
@@ -96,6 +97,11 @@ def concurrency(
|
|
|
96
97
|
Defaults to `False`.
|
|
97
98
|
holder: A dictionary containing information about the holder of the concurrency slots.
|
|
98
99
|
Typically includes 'type' and 'id' keys.
|
|
100
|
+
raise_on_lease_renewal_failure: Controls whether to terminate execution when lease
|
|
101
|
+
renewal fails. When `None` (default), follows the `strict` parameter for
|
|
102
|
+
backward compatibility. Set to `False` to allow long-running tasks to continue
|
|
103
|
+
even if a transient lease renewal error occurs. Set to `True` to terminate
|
|
104
|
+
execution immediately on renewal failure.
|
|
99
105
|
|
|
100
106
|
Raises:
|
|
101
107
|
TimeoutError: If the slots are not acquired within the given timeout.
|
|
@@ -143,7 +149,9 @@ def concurrency(
|
|
|
143
149
|
with maintain_concurrency_lease(
|
|
144
150
|
acquisition_response.lease_id,
|
|
145
151
|
lease_duration,
|
|
146
|
-
raise_on_lease_renewal_failure=
|
|
152
|
+
raise_on_lease_renewal_failure=raise_on_lease_renewal_failure
|
|
153
|
+
if raise_on_lease_renewal_failure is not None
|
|
154
|
+
else strict,
|
|
147
155
|
suppress_warnings=suppress_warnings,
|
|
148
156
|
):
|
|
149
157
|
yield
|
{prefect_client-3.6.24.dev5 → prefect_client-3.6.25.dev1}/src/prefect/concurrency/asyncio.py
RENAMED
|
@@ -29,6 +29,7 @@ async def concurrency(
|
|
|
29
29
|
lease_duration: float = 300,
|
|
30
30
|
strict: bool = False,
|
|
31
31
|
holder: "Optional[ConcurrencyLeaseHolder]" = None,
|
|
32
|
+
raise_on_lease_renewal_failure: Optional[bool] = None,
|
|
32
33
|
) -> AsyncGenerator[None, None]:
|
|
33
34
|
"""A
|
|
34
35
|
context manager that acquires and releases concurrency slots from the
|
|
@@ -45,6 +46,11 @@ async def concurrency(
|
|
|
45
46
|
Defaults to `False`.
|
|
46
47
|
holder: A dictionary containing information about the holder of the concurrency slots.
|
|
47
48
|
Typically includes 'type' and 'id' keys.
|
|
49
|
+
raise_on_lease_renewal_failure: Controls whether to terminate execution when lease
|
|
50
|
+
renewal fails. When `None` (default), follows the `strict` parameter for
|
|
51
|
+
backward compatibility. Set to `False` to allow long-running tasks to continue
|
|
52
|
+
even if a transient lease renewal error occurs. Set to `True` to terminate
|
|
53
|
+
execution immediately on renewal failure.
|
|
48
54
|
|
|
49
55
|
Raises:
|
|
50
56
|
TimeoutError: If the slots are not acquired within the given timeout.
|
|
@@ -72,6 +78,7 @@ async def concurrency(
|
|
|
72
78
|
strict=strict,
|
|
73
79
|
holder=holder,
|
|
74
80
|
suppress_warnings=False,
|
|
81
|
+
raise_on_lease_renewal_failure=raise_on_lease_renewal_failure,
|
|
75
82
|
):
|
|
76
83
|
yield
|
|
77
84
|
|
|
@@ -27,6 +27,7 @@ def concurrency(
|
|
|
27
27
|
lease_duration: float = 300,
|
|
28
28
|
strict: bool = False,
|
|
29
29
|
holder: "Optional[ConcurrencyLeaseHolder]" = None,
|
|
30
|
+
raise_on_lease_renewal_failure: Optional[bool] = None,
|
|
30
31
|
) -> Generator[None, None, None]:
|
|
31
32
|
"""A context manager that acquires and releases concurrency slots from the
|
|
32
33
|
given concurrency limits.
|
|
@@ -42,6 +43,11 @@ def concurrency(
|
|
|
42
43
|
Defaults to `False`.
|
|
43
44
|
holder: A dictionary containing information about the holder of the concurrency slots.
|
|
44
45
|
Typically includes 'type' and 'id' keys.
|
|
46
|
+
raise_on_lease_renewal_failure: Controls whether to terminate execution when lease
|
|
47
|
+
renewal fails. When `None` (default), follows the `strict` parameter for
|
|
48
|
+
backward compatibility. Set to `False` to allow long-running tasks to continue
|
|
49
|
+
even if a transient lease renewal error occurs. Set to `True` to terminate
|
|
50
|
+
execution immediately on renewal failure.
|
|
45
51
|
|
|
46
52
|
Raises:
|
|
47
53
|
TimeoutError: If the slots are not acquired within the given timeout.
|
|
@@ -69,6 +75,7 @@ def concurrency(
|
|
|
69
75
|
strict=strict,
|
|
70
76
|
holder=holder,
|
|
71
77
|
suppress_warnings=False,
|
|
78
|
+
raise_on_lease_renewal_failure=raise_on_lease_renewal_failure,
|
|
72
79
|
):
|
|
73
80
|
yield
|
|
74
81
|
|
|
@@ -60,6 +60,53 @@ if TYPE_CHECKING:
|
|
|
60
60
|
from prefect.tasks import Task
|
|
61
61
|
|
|
62
62
|
|
|
63
|
+
class _ContextWrappedCallable:
|
|
64
|
+
"""Picklable callable that hydrates Prefect context before calling the
|
|
65
|
+
wrapped function. The serialized context is stored as cloudpickle
|
|
66
|
+
bytes so that standard pickle (used by `multiprocessing`) can handle it."""
|
|
67
|
+
|
|
68
|
+
def __init__(
|
|
69
|
+
self, fn: Callable[..., Any], serialized_context: dict[str, Any]
|
|
70
|
+
) -> None:
|
|
71
|
+
import cloudpickle
|
|
72
|
+
|
|
73
|
+
self.fn = fn
|
|
74
|
+
self._ctx_bytes = cloudpickle.dumps(serialized_context)
|
|
75
|
+
|
|
76
|
+
def __call__(self, *args: Any, **kwargs: Any) -> Any:
|
|
77
|
+
import cloudpickle
|
|
78
|
+
|
|
79
|
+
ctx = cloudpickle.loads(self._ctx_bytes)
|
|
80
|
+
with hydrated_context(ctx):
|
|
81
|
+
return self.fn(*args, **kwargs)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def with_context(fn: Callable[..., Any]) -> _ContextWrappedCallable:
|
|
85
|
+
"""Wrap a function so it runs with the current Prefect context when
|
|
86
|
+
called in a subprocess.
|
|
87
|
+
|
|
88
|
+
Use this to enable `get_run_logger()` and other context-dependent
|
|
89
|
+
APIs in functions executed via `multiprocessing.Pool`,
|
|
90
|
+
`ProcessPoolExecutor`, or `multiprocessing.Process`.
|
|
91
|
+
|
|
92
|
+
Example:
|
|
93
|
+
```python
|
|
94
|
+
from prefect.context import with_context
|
|
95
|
+
|
|
96
|
+
def worker(item):
|
|
97
|
+
logger = get_run_logger()
|
|
98
|
+
logger.info(f"Processing {item}")
|
|
99
|
+
|
|
100
|
+
@task
|
|
101
|
+
def my_task():
|
|
102
|
+
with multiprocessing.Pool() as pool:
|
|
103
|
+
pool.map(with_context(worker), items)
|
|
104
|
+
```
|
|
105
|
+
"""
|
|
106
|
+
ctx = serialize_context()
|
|
107
|
+
return _ContextWrappedCallable(fn, ctx)
|
|
108
|
+
|
|
109
|
+
|
|
63
110
|
def serialize_context(
|
|
64
111
|
asset_ctx_kwargs: Union[dict[str, Any], None] = None,
|
|
65
112
|
) -> dict[str, Any]:
|
|
@@ -17,4 +17,10 @@ def __getattr__(name: str) -> object:
|
|
|
17
17
|
module, attr = _public_api[name]
|
|
18
18
|
return getattr(import_module(module), attr)
|
|
19
19
|
|
|
20
|
+
# Allow submodule imports (e.g. `from prefect.docker._buildx import ...`)
|
|
21
|
+
try:
|
|
22
|
+
return import_module(f"{__name__}.{name}")
|
|
23
|
+
except ModuleNotFoundError:
|
|
24
|
+
pass
|
|
25
|
+
|
|
20
26
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|