prefect-client 3.4.25.dev5__tar.gz → 3.4.26.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.4.25.dev5 → prefect_client-3.4.26.dev2}/PKG-INFO +3 -2
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/pyproject.toml +2 -1
- prefect_client-3.4.26.dev2/src/prefect/_build_info.py +5 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/pydantic/v1_schema.py +6 -1
- prefect_client-3.4.26.dev2/src/prefect/_internal/pydantic/validated_func.py +339 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/_asyncio.py +104 -3
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/_leases.py +18 -6
- prefect_client-3.4.25.dev5/src/prefect/concurrency/sync.py → prefect_client-3.4.26.dev2/src/prefect/concurrency/_sync.py +19 -57
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/asyncio.py +8 -37
- prefect_client-3.4.26.dev2/src/prefect/concurrency/sync.py +110 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/flow_engine.py +2 -2
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/flows.py +42 -36
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runner/storage.py +93 -78
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/deployments.py +1 -1
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/flows.py +1 -1
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/saved_searches.py +1 -1
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/task_engine.py +8 -6
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/tasks.py +1 -2
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/transactions.py +2 -3
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/asyncutils.py +1 -1
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/workers/base.py +9 -2
- prefect_client-3.4.25.dev5/src/prefect/_build_info.py +0 -5
- prefect_client-3.4.25.dev5/src/prefect/_internal/pydantic/v2_validated_func.py +0 -102
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/.gitignore +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/LICENSE +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/README.md +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/__main__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/agent.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/automations.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/base.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/context.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/engine.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/cli/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/cli/automations.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/related.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/futures.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/main.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/plugins.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/py.typed +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/results.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runner/_observers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runner/submit.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runner/utils.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/schedules.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/serializers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/states.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/types/names.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/callables.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/engine.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/filesystem.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/processutils.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/templating.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/variables.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.4.
|
|
3
|
+
Version: 3.4.26.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
|
|
@@ -19,8 +19,9 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
23
|
Classifier: Topic :: Software Development :: Libraries
|
|
23
|
-
Requires-Python: <3.
|
|
24
|
+
Requires-Python: <3.15,>=3.9
|
|
24
25
|
Requires-Dist: anyio<5.0.0,>=4.4.0
|
|
25
26
|
Requires-Dist: asgi-lifespan<3.0,>=1.0
|
|
26
27
|
Requires-Dist: cachetools<7.0,>=5.3
|
|
@@ -7,7 +7,7 @@ name = "prefect-client"
|
|
|
7
7
|
dynamic = ["version"]
|
|
8
8
|
description = "Workflow orchestration and management."
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.9,<3.
|
|
10
|
+
requires-python = ">=3.9,<3.15"
|
|
11
11
|
license = { text = "Apache-2.0" }
|
|
12
12
|
authors = [{ name = "Prefect Technologies, Inc.", email = "help@prefect.io" }]
|
|
13
13
|
classifiers = [
|
|
@@ -21,6 +21,7 @@ classifiers = [
|
|
|
21
21
|
"Programming Language :: Python :: 3.11",
|
|
22
22
|
"Programming Language :: Python :: 3.12",
|
|
23
23
|
"Programming Language :: Python :: 3.13",
|
|
24
|
+
"Programming Language :: Python :: 3.14",
|
|
24
25
|
"Topic :: Software Development :: Libraries",
|
|
25
26
|
]
|
|
26
27
|
dependencies = [
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import inspect
|
|
2
|
+
import sys
|
|
2
3
|
import typing
|
|
3
4
|
import warnings
|
|
4
5
|
|
|
5
6
|
import pydantic
|
|
6
|
-
from pydantic.v1 import BaseModel as V1BaseModel
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
def is_v1_model(v: typing.Any) -> bool:
|
|
@@ -12,6 +12,11 @@ def is_v1_model(v: typing.Any) -> bool:
|
|
|
12
12
|
"ignore", category=pydantic.warnings.PydanticDeprecatedSince20
|
|
13
13
|
)
|
|
14
14
|
|
|
15
|
+
if sys.version_info >= (3, 14): # Pydantic v1 is not supported in Python 3.14+
|
|
16
|
+
return False
|
|
17
|
+
|
|
18
|
+
from pydantic.v1 import BaseModel as V1BaseModel
|
|
19
|
+
|
|
15
20
|
if isinstance(v, V1BaseModel):
|
|
16
21
|
return True
|
|
17
22
|
try:
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pure Pydantic v2 implementation of function argument validation.
|
|
3
|
+
|
|
4
|
+
This module provides validation of function arguments without calling the function,
|
|
5
|
+
compatible with Python 3.14+ (no Pydantic v1 dependency).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import inspect
|
|
11
|
+
from typing import Any, Callable, ClassVar, Optional
|
|
12
|
+
|
|
13
|
+
from pydantic import (
|
|
14
|
+
BaseModel,
|
|
15
|
+
ConfigDict,
|
|
16
|
+
Field,
|
|
17
|
+
ValidationError,
|
|
18
|
+
create_model,
|
|
19
|
+
field_validator,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# Special field names for validation
|
|
23
|
+
# These match pydantic.v1.decorator constants for compatibility
|
|
24
|
+
V_ARGS_NAME = "v__args"
|
|
25
|
+
V_KWARGS_NAME = "v__kwargs"
|
|
26
|
+
V_POSITIONAL_ONLY_NAME = "v__positional_only"
|
|
27
|
+
V_DUPLICATE_KWARGS = "v__duplicate_kwargs"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ValidatedFunction:
|
|
31
|
+
"""
|
|
32
|
+
Validates function arguments using Pydantic v2 without calling the function.
|
|
33
|
+
|
|
34
|
+
This class inspects a function's signature and creates a Pydantic model
|
|
35
|
+
that can validate arguments passed to the function, including handling
|
|
36
|
+
of *args, **kwargs, positional-only parameters, and duplicate arguments.
|
|
37
|
+
|
|
38
|
+
Example:
|
|
39
|
+
```python
|
|
40
|
+
def greet(name: str, age: int = 0):
|
|
41
|
+
return f"Hello {name}, you are {age} years old"
|
|
42
|
+
|
|
43
|
+
vf = ValidatedFunction(greet)
|
|
44
|
+
|
|
45
|
+
# Validate arguments
|
|
46
|
+
values = vf.validate_call_args(("Alice",), {"age": 30})
|
|
47
|
+
# Returns: {"name": "Alice", "age": 30}
|
|
48
|
+
|
|
49
|
+
# Invalid arguments will raise ValidationError
|
|
50
|
+
vf.validate_call_args(("Bob",), {"age": "not a number"})
|
|
51
|
+
# Raises: ValidationError
|
|
52
|
+
```
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
function: Callable[..., Any],
|
|
58
|
+
config: ConfigDict | None = None,
|
|
59
|
+
):
|
|
60
|
+
"""
|
|
61
|
+
Initialize the validated function.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
function: The function to validate arguments for
|
|
65
|
+
config: Optional Pydantic ConfigDict or dict configuration
|
|
66
|
+
|
|
67
|
+
Raises:
|
|
68
|
+
ValueError: If function parameters conflict with internal field names
|
|
69
|
+
"""
|
|
70
|
+
self.raw_function = function
|
|
71
|
+
self.signature = inspect.signature(function)
|
|
72
|
+
self.arg_mapping: dict[int, str] = {}
|
|
73
|
+
self.positional_only_args: set[str] = set()
|
|
74
|
+
self.v_args_name = V_ARGS_NAME
|
|
75
|
+
self.v_kwargs_name = V_KWARGS_NAME
|
|
76
|
+
|
|
77
|
+
# Check for conflicts with internal field names
|
|
78
|
+
reserved_names = {
|
|
79
|
+
V_ARGS_NAME,
|
|
80
|
+
V_KWARGS_NAME,
|
|
81
|
+
V_POSITIONAL_ONLY_NAME,
|
|
82
|
+
V_DUPLICATE_KWARGS,
|
|
83
|
+
}
|
|
84
|
+
param_names = set(self.signature.parameters.keys())
|
|
85
|
+
conflicts = reserved_names & param_names
|
|
86
|
+
if conflicts:
|
|
87
|
+
raise ValueError(
|
|
88
|
+
f"Function parameters conflict with internal field names: {conflicts}. "
|
|
89
|
+
f"These names are reserved: {reserved_names}"
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Build the validation model
|
|
93
|
+
fields, takes_args, takes_kwargs = self._build_fields()
|
|
94
|
+
self._create_model(fields, takes_args, takes_kwargs, config)
|
|
95
|
+
|
|
96
|
+
def _build_fields(self) -> tuple[dict[str, Any], bool, bool]:
|
|
97
|
+
"""
|
|
98
|
+
Build field definitions from function signature.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
Tuple of (fields_dict, takes_args, takes_kwargs)
|
|
102
|
+
"""
|
|
103
|
+
fields: dict[str, Any] = {}
|
|
104
|
+
takes_args = False
|
|
105
|
+
takes_kwargs = False
|
|
106
|
+
position = 0
|
|
107
|
+
|
|
108
|
+
for param_name, param in self.signature.parameters.items():
|
|
109
|
+
if param.kind == inspect.Parameter.VAR_POSITIONAL:
|
|
110
|
+
takes_args = True
|
|
111
|
+
continue
|
|
112
|
+
|
|
113
|
+
if param.kind == inspect.Parameter.VAR_KEYWORD:
|
|
114
|
+
takes_kwargs = True
|
|
115
|
+
continue
|
|
116
|
+
|
|
117
|
+
# Track positional-only parameters
|
|
118
|
+
if param.kind == inspect.Parameter.POSITIONAL_ONLY:
|
|
119
|
+
self.positional_only_args.add(param_name)
|
|
120
|
+
|
|
121
|
+
# Map position to parameter name
|
|
122
|
+
if param.kind in (
|
|
123
|
+
inspect.Parameter.POSITIONAL_ONLY,
|
|
124
|
+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
|
125
|
+
):
|
|
126
|
+
self.arg_mapping[position] = param_name
|
|
127
|
+
position += 1
|
|
128
|
+
|
|
129
|
+
# Determine type and default
|
|
130
|
+
annotation = (
|
|
131
|
+
param.annotation if param.annotation != inspect.Parameter.empty else Any
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
if param.default == inspect.Parameter.empty:
|
|
135
|
+
# Required parameter
|
|
136
|
+
fields[param_name] = (annotation, Field(...))
|
|
137
|
+
else:
|
|
138
|
+
# Optional parameter with default
|
|
139
|
+
fields[param_name] = (annotation, Field(default=param.default))
|
|
140
|
+
|
|
141
|
+
# Always add args/kwargs fields for validation, even if function doesn't accept them
|
|
142
|
+
fields[self.v_args_name] = (Optional[list[Any]], Field(default=None))
|
|
143
|
+
fields[self.v_kwargs_name] = (Optional[dict[str, Any]], Field(default=None))
|
|
144
|
+
|
|
145
|
+
# Add special validation fields
|
|
146
|
+
fields[V_POSITIONAL_ONLY_NAME] = (Optional[list[str]], Field(default=None))
|
|
147
|
+
fields[V_DUPLICATE_KWARGS] = (Optional[list[str]], Field(default=None))
|
|
148
|
+
|
|
149
|
+
return fields, takes_args, takes_kwargs
|
|
150
|
+
|
|
151
|
+
def _create_model(
|
|
152
|
+
self,
|
|
153
|
+
fields: dict[str, Any],
|
|
154
|
+
takes_args: bool,
|
|
155
|
+
takes_kwargs: bool,
|
|
156
|
+
config: ConfigDict | None,
|
|
157
|
+
) -> None:
|
|
158
|
+
"""Create the Pydantic validation model."""
|
|
159
|
+
pos_args = len(self.arg_mapping)
|
|
160
|
+
|
|
161
|
+
# Process config
|
|
162
|
+
# Note: ConfigDict is a TypedDict, so we can't use isinstance() in Python 3.14
|
|
163
|
+
# Instead, check if it's a dict-like object and merge with defaults
|
|
164
|
+
if config is None:
|
|
165
|
+
config_dict = ConfigDict(extra="forbid")
|
|
166
|
+
else:
|
|
167
|
+
config_dict = config.copy()
|
|
168
|
+
if "extra" not in config_dict:
|
|
169
|
+
config_dict["extra"] = "forbid"
|
|
170
|
+
|
|
171
|
+
# Create base model with validators
|
|
172
|
+
class DecoratorBaseModel(BaseModel):
|
|
173
|
+
model_config: ClassVar[ConfigDict] = config_dict
|
|
174
|
+
|
|
175
|
+
@field_validator(V_ARGS_NAME, check_fields=False)
|
|
176
|
+
@classmethod
|
|
177
|
+
def check_args(cls, v: Optional[list[Any]]) -> Optional[list[Any]]:
|
|
178
|
+
if takes_args or v is None:
|
|
179
|
+
return v
|
|
180
|
+
|
|
181
|
+
raise TypeError(
|
|
182
|
+
f"{pos_args} positional argument{'s' if pos_args != 1 else ''} "
|
|
183
|
+
f"expected but {pos_args + len(v)} given"
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
@field_validator(V_KWARGS_NAME, check_fields=False)
|
|
187
|
+
@classmethod
|
|
188
|
+
def check_kwargs(
|
|
189
|
+
cls, v: Optional[dict[str, Any]]
|
|
190
|
+
) -> Optional[dict[str, Any]]:
|
|
191
|
+
if takes_kwargs or v is None:
|
|
192
|
+
return v
|
|
193
|
+
|
|
194
|
+
plural = "" if len(v) == 1 else "s"
|
|
195
|
+
keys = ", ".join(map(repr, v.keys()))
|
|
196
|
+
raise TypeError(f"unexpected keyword argument{plural}: {keys}")
|
|
197
|
+
|
|
198
|
+
@field_validator(V_POSITIONAL_ONLY_NAME, check_fields=False)
|
|
199
|
+
@classmethod
|
|
200
|
+
def check_positional_only(cls, v: Optional[list[str]]) -> None:
|
|
201
|
+
if v is None:
|
|
202
|
+
return
|
|
203
|
+
|
|
204
|
+
plural = "" if len(v) == 1 else "s"
|
|
205
|
+
keys = ", ".join(map(repr, v))
|
|
206
|
+
raise TypeError(
|
|
207
|
+
f"positional-only argument{plural} passed as keyword "
|
|
208
|
+
f"argument{plural}: {keys}"
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
@field_validator(V_DUPLICATE_KWARGS, check_fields=False)
|
|
212
|
+
@classmethod
|
|
213
|
+
def check_duplicate_kwargs(cls, v: Optional[list[str]]) -> None:
|
|
214
|
+
if v is None:
|
|
215
|
+
return
|
|
216
|
+
|
|
217
|
+
plural = "" if len(v) == 1 else "s"
|
|
218
|
+
keys = ", ".join(map(repr, v))
|
|
219
|
+
raise TypeError(f"multiple values for argument{plural}: {keys}")
|
|
220
|
+
|
|
221
|
+
# Create the model dynamically
|
|
222
|
+
model_name = f"{self.raw_function.__name__.title()}Model"
|
|
223
|
+
self.model = create_model(
|
|
224
|
+
model_name,
|
|
225
|
+
__base__=DecoratorBaseModel,
|
|
226
|
+
**fields,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
def validate_call_args(
|
|
230
|
+
self, args: tuple[Any, ...], kwargs: dict[str, Any]
|
|
231
|
+
) -> dict[str, Any]:
|
|
232
|
+
"""
|
|
233
|
+
Validate function arguments and return normalized parameters.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
args: Positional arguments
|
|
237
|
+
kwargs: Keyword arguments
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
Dictionary mapping parameter names to values
|
|
241
|
+
|
|
242
|
+
Raises:
|
|
243
|
+
ValidationError: If arguments don't match the function signature
|
|
244
|
+
"""
|
|
245
|
+
# Build the values dict for validation
|
|
246
|
+
values: dict[str, Any] = {}
|
|
247
|
+
var_args: list[Any] = []
|
|
248
|
+
var_kwargs: dict[str, Any] = {}
|
|
249
|
+
positional_only_passed_as_kw: list[str] = []
|
|
250
|
+
duplicate_kwargs: list[str] = []
|
|
251
|
+
|
|
252
|
+
# Process positional arguments
|
|
253
|
+
for i, arg in enumerate(args):
|
|
254
|
+
if i in self.arg_mapping:
|
|
255
|
+
param_name = self.arg_mapping[i]
|
|
256
|
+
if param_name in kwargs:
|
|
257
|
+
# Duplicate: both positional and keyword
|
|
258
|
+
duplicate_kwargs.append(param_name)
|
|
259
|
+
values[param_name] = arg
|
|
260
|
+
else:
|
|
261
|
+
# Extra positional args go into *args
|
|
262
|
+
var_args.append(arg)
|
|
263
|
+
|
|
264
|
+
# Process keyword arguments
|
|
265
|
+
for key, value in kwargs.items():
|
|
266
|
+
if key in values:
|
|
267
|
+
# Already set by positional arg
|
|
268
|
+
continue
|
|
269
|
+
|
|
270
|
+
# Check if this is a positional-only param passed as keyword
|
|
271
|
+
if key in self.positional_only_args:
|
|
272
|
+
positional_only_passed_as_kw.append(key)
|
|
273
|
+
continue
|
|
274
|
+
|
|
275
|
+
# Check if this is a known parameter
|
|
276
|
+
if key in self.signature.parameters:
|
|
277
|
+
values[key] = value
|
|
278
|
+
else:
|
|
279
|
+
# Unknown parameter goes into **kwargs
|
|
280
|
+
var_kwargs[key] = value
|
|
281
|
+
|
|
282
|
+
# Add special fields
|
|
283
|
+
if var_args:
|
|
284
|
+
values[self.v_args_name] = var_args
|
|
285
|
+
if var_kwargs:
|
|
286
|
+
values[self.v_kwargs_name] = var_kwargs
|
|
287
|
+
if positional_only_passed_as_kw:
|
|
288
|
+
values[V_POSITIONAL_ONLY_NAME] = positional_only_passed_as_kw
|
|
289
|
+
if duplicate_kwargs:
|
|
290
|
+
values[V_DUPLICATE_KWARGS] = duplicate_kwargs
|
|
291
|
+
|
|
292
|
+
# Validate using the model
|
|
293
|
+
try:
|
|
294
|
+
validated = self.model.model_validate(values)
|
|
295
|
+
except ValidationError as e:
|
|
296
|
+
# Convert ValidationError to TypeError for certain cases to match Python's behavior
|
|
297
|
+
# Check if the error is about extra kwargs
|
|
298
|
+
for error in e.errors():
|
|
299
|
+
if error.get("type") == "extra_forbidden" and error.get("loc") == (
|
|
300
|
+
"kwargs",
|
|
301
|
+
):
|
|
302
|
+
# This is an extra keyword argument error
|
|
303
|
+
extra_keys = error.get("input", {})
|
|
304
|
+
if isinstance(extra_keys, dict):
|
|
305
|
+
plural = "" if len(extra_keys) == 1 else "s"
|
|
306
|
+
keys = ", ".join(map(repr, extra_keys.keys()))
|
|
307
|
+
raise TypeError(f"unexpected keyword argument{plural}: {keys}")
|
|
308
|
+
# For other validation errors, re-raise as-is
|
|
309
|
+
raise
|
|
310
|
+
|
|
311
|
+
# Extract only the actual function parameters
|
|
312
|
+
result: dict[str, Any] = {}
|
|
313
|
+
for param_name in self.signature.parameters.keys():
|
|
314
|
+
param = self.signature.parameters[param_name]
|
|
315
|
+
|
|
316
|
+
if param.kind == inspect.Parameter.VAR_POSITIONAL:
|
|
317
|
+
result[param_name] = getattr(validated, self.v_args_name) or []
|
|
318
|
+
elif param.kind == inspect.Parameter.VAR_KEYWORD:
|
|
319
|
+
result[param_name] = getattr(validated, self.v_kwargs_name) or {}
|
|
320
|
+
else:
|
|
321
|
+
# Regular parameter
|
|
322
|
+
value = getattr(validated, param_name)
|
|
323
|
+
result[param_name] = value
|
|
324
|
+
|
|
325
|
+
return result
|
|
326
|
+
|
|
327
|
+
def __call__(self, *args: Any, **kwargs: Any) -> Any:
|
|
328
|
+
"""
|
|
329
|
+
Validate arguments and call the function.
|
|
330
|
+
|
|
331
|
+
Args:
|
|
332
|
+
*args: Positional arguments
|
|
333
|
+
**kwargs: Keyword arguments
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
The result of calling the function with validated arguments
|
|
337
|
+
"""
|
|
338
|
+
validated_params = self.validate_call_args(args, kwargs)
|
|
339
|
+
return self.raw_function(**validated_params)
|
{prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/_asyncio.py
RENAMED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import asyncio
|
|
2
4
|
import logging
|
|
3
|
-
from
|
|
5
|
+
from contextlib import asynccontextmanager
|
|
6
|
+
from typing import TYPE_CHECKING, AsyncGenerator, Literal, Optional
|
|
4
7
|
from uuid import UUID
|
|
5
8
|
|
|
9
|
+
import anyio
|
|
6
10
|
import httpx
|
|
7
11
|
|
|
8
12
|
from prefect.client.orchestration import get_client
|
|
@@ -10,6 +14,12 @@ from prefect.client.schemas.responses import (
|
|
|
10
14
|
ConcurrencyLimitWithLeaseResponse,
|
|
11
15
|
MinimalConcurrencyLimitResponse,
|
|
12
16
|
)
|
|
17
|
+
from prefect.concurrency._events import (
|
|
18
|
+
emit_concurrency_acquisition_events,
|
|
19
|
+
emit_concurrency_release_events,
|
|
20
|
+
)
|
|
21
|
+
from prefect.concurrency._leases import amaintain_concurrency_lease
|
|
22
|
+
from prefect.concurrency.context import ConcurrencyContext
|
|
13
23
|
from prefect.logging import get_logger
|
|
14
24
|
from prefect.logging.loggers import get_run_logger
|
|
15
25
|
from prefect.utilities.timeout import timeout_async
|
|
@@ -80,6 +90,7 @@ async def aacquire_concurrency_slots_with_lease(
|
|
|
80
90
|
lease_duration: float = 300,
|
|
81
91
|
strict: bool = False,
|
|
82
92
|
holder: "Optional[ConcurrencyLeaseHolder]" = None,
|
|
93
|
+
suppress_warnings: bool = False,
|
|
83
94
|
) -> ConcurrencyLimitWithLeaseResponse:
|
|
84
95
|
try:
|
|
85
96
|
# Use a run logger if available
|
|
@@ -108,8 +119,14 @@ async def aacquire_concurrency_slots_with_lease(
|
|
|
108
119
|
f"Concurrency limits {names!r} must be created before acquiring slots"
|
|
109
120
|
)
|
|
110
121
|
else:
|
|
111
|
-
|
|
112
|
-
|
|
122
|
+
log_level = (
|
|
123
|
+
logging.DEBUG
|
|
124
|
+
if suppress_warnings
|
|
125
|
+
else logging.WARNING
|
|
126
|
+
)
|
|
127
|
+
logger.log(
|
|
128
|
+
log_level,
|
|
129
|
+
f"Concurrency limits {names!r} do not exist - skipping acquisition.",
|
|
113
130
|
)
|
|
114
131
|
|
|
115
132
|
return retval
|
|
@@ -159,3 +176,87 @@ def _response_to_minimal_concurrency_limit_response(
|
|
|
159
176
|
return [
|
|
160
177
|
MinimalConcurrencyLimitResponse.model_validate(obj_) for obj_ in response.json()
|
|
161
178
|
]
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@asynccontextmanager
|
|
182
|
+
async def concurrency(
|
|
183
|
+
names: str | list[str],
|
|
184
|
+
occupy: int = 1,
|
|
185
|
+
timeout_seconds: Optional[float] = None,
|
|
186
|
+
max_retries: Optional[int] = None,
|
|
187
|
+
lease_duration: float = 300,
|
|
188
|
+
strict: bool = False,
|
|
189
|
+
holder: "Optional[ConcurrencyLeaseHolder]" = None,
|
|
190
|
+
suppress_warnings: bool = False,
|
|
191
|
+
) -> AsyncGenerator[None, None]:
|
|
192
|
+
"""
|
|
193
|
+
Internal version of the `concurrency` context manager. The public version is located in `prefect.concurrency.asyncio`.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
names: The names of the concurrency limits to acquire slots from.
|
|
197
|
+
occupy: The number of slots to acquire and hold from each limit.
|
|
198
|
+
timeout_seconds: The number of seconds to wait for the slots to be acquired before
|
|
199
|
+
raising a `TimeoutError`. A timeout of `None` will wait indefinitely.
|
|
200
|
+
max_retries: The maximum number of retries to acquire the concurrency slots.
|
|
201
|
+
lease_duration: The duration of the lease for the acquired slots in seconds.
|
|
202
|
+
strict: A boolean specifying whether to raise an error if the concurrency limit does not exist.
|
|
203
|
+
Defaults to `False`.
|
|
204
|
+
holder: A dictionary containing information about the holder of the concurrency slots.
|
|
205
|
+
Typically includes 'type' and 'id' keys.
|
|
206
|
+
|
|
207
|
+
Raises:
|
|
208
|
+
TimeoutError: If the slots are not acquired within the given timeout.
|
|
209
|
+
ConcurrencySlotAcquisitionError: If the concurrency limit does not exist and `strict` is `True`.
|
|
210
|
+
|
|
211
|
+
Example:
|
|
212
|
+
A simple example of using the async `concurrency` context manager:
|
|
213
|
+
```python
|
|
214
|
+
from prefect.concurrency.asyncio import concurrency
|
|
215
|
+
|
|
216
|
+
async def resource_heavy():
|
|
217
|
+
async with concurrency("test", occupy=1):
|
|
218
|
+
print("Resource heavy task")
|
|
219
|
+
|
|
220
|
+
async def main():
|
|
221
|
+
await resource_heavy()
|
|
222
|
+
```
|
|
223
|
+
"""
|
|
224
|
+
if not names:
|
|
225
|
+
yield
|
|
226
|
+
return
|
|
227
|
+
|
|
228
|
+
names = names if isinstance(names, list) else [names]
|
|
229
|
+
|
|
230
|
+
response = await aacquire_concurrency_slots_with_lease(
|
|
231
|
+
names=names,
|
|
232
|
+
slots=occupy,
|
|
233
|
+
timeout_seconds=timeout_seconds,
|
|
234
|
+
max_retries=max_retries,
|
|
235
|
+
lease_duration=lease_duration,
|
|
236
|
+
strict=strict,
|
|
237
|
+
holder=holder,
|
|
238
|
+
suppress_warnings=suppress_warnings,
|
|
239
|
+
)
|
|
240
|
+
emitted_events = emit_concurrency_acquisition_events(response.limits, occupy)
|
|
241
|
+
|
|
242
|
+
try:
|
|
243
|
+
async with amaintain_concurrency_lease(
|
|
244
|
+
response.lease_id,
|
|
245
|
+
lease_duration,
|
|
246
|
+
raise_on_lease_renewal_failure=strict,
|
|
247
|
+
suppress_warnings=suppress_warnings,
|
|
248
|
+
):
|
|
249
|
+
yield
|
|
250
|
+
finally:
|
|
251
|
+
try:
|
|
252
|
+
await arelease_concurrency_slots_with_lease(
|
|
253
|
+
lease_id=response.lease_id,
|
|
254
|
+
)
|
|
255
|
+
except anyio.get_cancelled_exc_class():
|
|
256
|
+
# The task was cancelled before it could release the lease. Add the
|
|
257
|
+
# lease ID to the cleanup list so it can be released when the
|
|
258
|
+
# concurrency context is exited.
|
|
259
|
+
if ctx := ConcurrencyContext.get():
|
|
260
|
+
ctx.cleanup_lease_ids.append(response.lease_id)
|
|
261
|
+
|
|
262
|
+
emit_concurrency_release_events(response.limits, occupy, emitted_events)
|
{prefect_client-3.4.25.dev5 → prefect_client-3.4.26.dev2}/src/prefect/concurrency/_leases.py
RENAMED
|
@@ -40,6 +40,7 @@ def maintain_concurrency_lease(
|
|
|
40
40
|
lease_id: UUID,
|
|
41
41
|
lease_duration: float,
|
|
42
42
|
raise_on_lease_renewal_failure: bool = False,
|
|
43
|
+
suppress_warnings: bool = False,
|
|
43
44
|
) -> Generator[None, None, None]:
|
|
44
45
|
"""
|
|
45
46
|
Maintain a concurrency lease for the given lease ID.
|
|
@@ -76,9 +77,14 @@ def maintain_concurrency_lease(
|
|
|
76
77
|
)
|
|
77
78
|
assert cancel_scope.cancel()
|
|
78
79
|
else:
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
if suppress_warnings:
|
|
81
|
+
logger.debug(
|
|
82
|
+
"Concurrency lease renewal failed - slots are no longer reserved. Execution will continue, but concurrency limits may be exceeded."
|
|
83
|
+
)
|
|
84
|
+
else:
|
|
85
|
+
logger.warning(
|
|
86
|
+
"Concurrency lease renewal failed - slots are no longer reserved. Execution will continue, but concurrency limits may be exceeded."
|
|
87
|
+
)
|
|
82
88
|
|
|
83
89
|
lease_renewal_call.future.add_done_callback(handle_lease_renewal_failure)
|
|
84
90
|
|
|
@@ -94,6 +100,7 @@ async def amaintain_concurrency_lease(
|
|
|
94
100
|
lease_id: UUID,
|
|
95
101
|
lease_duration: float,
|
|
96
102
|
raise_on_lease_renewal_failure: bool = False,
|
|
103
|
+
suppress_warnings: bool = False,
|
|
97
104
|
) -> AsyncGenerator[None, None]:
|
|
98
105
|
"""
|
|
99
106
|
Maintain a concurrency lease for the given lease ID.
|
|
@@ -125,9 +132,14 @@ async def amaintain_concurrency_lease(
|
|
|
125
132
|
)
|
|
126
133
|
cancel_scope.cancel()
|
|
127
134
|
else:
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
135
|
+
if suppress_warnings:
|
|
136
|
+
logger.debug(
|
|
137
|
+
"Concurrency lease renewal failed - slots are no longer reserved. Execution will continue, but concurrency limits may be exceeded."
|
|
138
|
+
)
|
|
139
|
+
else:
|
|
140
|
+
logger.warning(
|
|
141
|
+
"Concurrency lease renewal failed - slots are no longer reserved. Execution will continue, but concurrency limits may be exceeded."
|
|
142
|
+
)
|
|
131
143
|
|
|
132
144
|
# Add a callback to stop execution if the lease renewal fails and strict is True
|
|
133
145
|
lease_renewal_task.add_done_callback(handle_lease_renewal_failure)
|