prefect-client 3.4.11.dev4__tar.gz → 3.4.12.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.4.11.dev4 → prefect_client-3.4.12.dev1}/PKG-INFO +1 -1
- prefect_client-3.4.12.dev1/src/prefect/_build_info.py +5 -0
- prefect_client-3.4.12.dev1/src/prefect/_internal/installation.py +60 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/__init__.py +1 -1
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/__init__.py +2 -2
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/schemas/objects.py +3 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/_asyncio.py +0 -21
- prefect_client-3.4.12.dev1/src/prefect/concurrency/_leases.py +139 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/asyncio.py +4 -38
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/sync.py +6 -41
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/context.py +1 -1
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/base.py +1 -1
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/steps/core.py +6 -3
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/steps/pull.py +1 -1
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/flow_engine.py +26 -2
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/infrastructure/provisioners/coiled.py +2 -5
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/infrastructure/provisioners/ecs.py +2 -5
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/infrastructure/provisioners/modal.py +2 -3
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/locking/memory.py +4 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/handlers.py +24 -6
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/flow_runs.py +7 -2
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/transactions.py +27 -14
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/dockerutils.py +1 -3
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/workers/process.py +1 -1
- prefect_client-3.4.11.dev4/src/prefect/_build_info.py +0 -5
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/.gitignore +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/LICENSE +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/README.md +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/pyproject.toml +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/__main__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_experimental/lineage.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/pydantic/v2_validated_func.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/agent.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/automations.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/base.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/engine.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/cli/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/cli/automations.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/related.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/flows.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/futures.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/main.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/plugins.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/py.typed +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/results.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runner/_observers.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runner/submit.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runner/utils.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/schedules.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/serializers.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/states.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/tasks.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/telemetry/bootstrap.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/telemetry/instrumentation.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/telemetry/logging.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/telemetry/processors.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/telemetry/services.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/types/names.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/asyncutils.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/callables.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/engine.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/filesystem.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/processutils.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/templating.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/variables.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/workers/utilities.py +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
import subprocess
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
import prefect.utilities.processutils
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def install_packages(
|
|
9
|
+
packages: list[str], stream_output: bool = False, upgrade: bool = False
|
|
10
|
+
):
|
|
11
|
+
"""
|
|
12
|
+
Install packages using uv if available, otherwise use pip.
|
|
13
|
+
"""
|
|
14
|
+
base_command = ["pip", "install", *packages]
|
|
15
|
+
if upgrade:
|
|
16
|
+
base_command.append("--upgrade")
|
|
17
|
+
if stream_output:
|
|
18
|
+
stdout = sys.stdout
|
|
19
|
+
stderr = sys.stderr
|
|
20
|
+
else:
|
|
21
|
+
stdout = subprocess.DEVNULL
|
|
22
|
+
stderr = subprocess.DEVNULL
|
|
23
|
+
try:
|
|
24
|
+
uv = importlib.import_module("uv")
|
|
25
|
+
|
|
26
|
+
command = [uv.find_uv_bin(), *base_command]
|
|
27
|
+
subprocess.check_call(
|
|
28
|
+
command,
|
|
29
|
+
stdout=stdout,
|
|
30
|
+
stderr=stderr,
|
|
31
|
+
)
|
|
32
|
+
except (ImportError, ModuleNotFoundError, FileNotFoundError):
|
|
33
|
+
command = [sys.executable, "-m", *base_command]
|
|
34
|
+
subprocess.check_call(
|
|
35
|
+
command,
|
|
36
|
+
stdout=stdout,
|
|
37
|
+
stderr=stderr,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def ainstall_packages(
|
|
42
|
+
packages: list[str], stream_output: bool = False, upgrade: bool = False
|
|
43
|
+
):
|
|
44
|
+
"""
|
|
45
|
+
Install packages using uv if available, otherwise use pip.
|
|
46
|
+
"""
|
|
47
|
+
base_command = ["pip", "install", *packages]
|
|
48
|
+
if upgrade:
|
|
49
|
+
base_command.append("--upgrade")
|
|
50
|
+
try:
|
|
51
|
+
uv = importlib.import_module("uv")
|
|
52
|
+
|
|
53
|
+
await prefect.utilities.processutils.run_process(
|
|
54
|
+
[uv.find_uv_bin(), *base_command], stream_output=stream_output
|
|
55
|
+
)
|
|
56
|
+
except (ImportError, ModuleNotFoundError, FileNotFoundError):
|
|
57
|
+
await prefect.utilities.processutils.run_process(
|
|
58
|
+
[sys.executable, "-m", *base_command],
|
|
59
|
+
stream_output=stream_output,
|
|
60
|
+
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Asynchronous client implementation for communicating with the [Prefect REST API](/api-ref/rest-api/).
|
|
2
|
+
Asynchronous client implementation for communicating with the [Prefect REST API](https://docs.prefect.io/v3/api-ref/rest-api/).
|
|
3
3
|
|
|
4
4
|
Explore the client by communicating with an in-memory webserver - no setup required:
|
|
5
5
|
|
|
@@ -279,7 +279,7 @@ class PrefectClient(
|
|
|
279
279
|
WorkPoolAsyncClient,
|
|
280
280
|
):
|
|
281
281
|
"""
|
|
282
|
-
An asynchronous client for interacting with the [Prefect REST API](/api-ref/rest-api/).
|
|
282
|
+
An asynchronous client for interacting with the [Prefect REST API](https://docs.prefect.io/v3/api-ref/rest-api/).
|
|
283
283
|
|
|
284
284
|
Args:
|
|
285
285
|
api: the REST API URL or FastAPI application to connect to
|
|
@@ -1142,7 +1142,7 @@ class SyncPrefectClient(
|
|
|
1142
1142
|
WorkPoolClient,
|
|
1143
1143
|
):
|
|
1144
1144
|
"""
|
|
1145
|
-
A synchronous client for interacting with the [Prefect REST API](/api-ref/rest-api/).
|
|
1145
|
+
A synchronous client for interacting with the [Prefect REST API](https://docs.prefect.io/v3/api-ref/rest-api/).
|
|
1146
1146
|
|
|
1147
1147
|
Args:
|
|
1148
1148
|
api: the REST API URL or FastAPI application to connect to
|
{prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/client/schemas/objects.py
RENAMED
|
@@ -185,6 +185,9 @@ class StateDetails(PrefectBaseModel):
|
|
|
185
185
|
task_parameters_id: Optional[UUID] = None
|
|
186
186
|
# Captures the trace_id and span_id of the span where this state was created
|
|
187
187
|
traceparent: Optional[str] = None
|
|
188
|
+
# The ID of the lease that is currently holding the deployment concurrency slot
|
|
189
|
+
# for this run.
|
|
190
|
+
deployment_concurrency_lease_id: Optional[UUID] = None
|
|
188
191
|
|
|
189
192
|
def to_run_result(
|
|
190
193
|
self, run_type: RunType
|
{prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/_asyncio.py
RENAMED
|
@@ -131,27 +131,6 @@ async def aacquire_concurrency_slots_with_lease(
|
|
|
131
131
|
) from exc
|
|
132
132
|
|
|
133
133
|
|
|
134
|
-
async def amaintain_concurrency_lease(
|
|
135
|
-
lease_id: UUID,
|
|
136
|
-
lease_duration: float,
|
|
137
|
-
) -> None:
|
|
138
|
-
"""
|
|
139
|
-
Maintain a concurrency lease by renewing it after the given interval.
|
|
140
|
-
|
|
141
|
-
Args:
|
|
142
|
-
lease_id: The ID of the lease to maintain.
|
|
143
|
-
lease_duration: The duration of the lease in seconds.
|
|
144
|
-
"""
|
|
145
|
-
async with get_client() as client:
|
|
146
|
-
while True:
|
|
147
|
-
await asyncio.sleep( # Renew the lease 3/4 of the way through the lease duration
|
|
148
|
-
lease_duration * 0.75
|
|
149
|
-
)
|
|
150
|
-
await client.renew_concurrency_lease(
|
|
151
|
-
lease_id=lease_id, lease_duration=lease_duration
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
|
|
155
134
|
async def arelease_concurrency_slots(
|
|
156
135
|
names: list[str], slots: int, occupancy_seconds: float
|
|
157
136
|
) -> list[MinimalConcurrencyLimitResponse]:
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import concurrent.futures
|
|
3
|
+
from contextlib import asynccontextmanager, contextmanager
|
|
4
|
+
from typing import AsyncGenerator, Generator
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from prefect._internal.concurrency.api import create_call
|
|
8
|
+
from prefect._internal.concurrency.cancellation import (
|
|
9
|
+
AsyncCancelScope,
|
|
10
|
+
WatcherThreadCancelScope,
|
|
11
|
+
)
|
|
12
|
+
from prefect._internal.concurrency.threads import get_global_loop
|
|
13
|
+
from prefect.client.orchestration import get_client
|
|
14
|
+
from prefect.logging.loggers import get_logger, get_run_logger
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def _lease_renewal_loop(
|
|
18
|
+
lease_id: UUID,
|
|
19
|
+
lease_duration: float,
|
|
20
|
+
) -> None:
|
|
21
|
+
"""
|
|
22
|
+
Maintain a concurrency lease by renewing it after the given interval.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
lease_id: The ID of the lease to maintain.
|
|
26
|
+
lease_duration: The duration of the lease in seconds.
|
|
27
|
+
"""
|
|
28
|
+
async with get_client() as client:
|
|
29
|
+
while True:
|
|
30
|
+
await client.renew_concurrency_lease(
|
|
31
|
+
lease_id=lease_id, lease_duration=lease_duration
|
|
32
|
+
)
|
|
33
|
+
await asyncio.sleep( # Renew the lease 3/4 of the way through the lease duration
|
|
34
|
+
lease_duration * 0.75
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@contextmanager
|
|
39
|
+
def maintain_concurrency_lease(
|
|
40
|
+
lease_id: UUID,
|
|
41
|
+
lease_duration: float,
|
|
42
|
+
raise_on_lease_renewal_failure: bool = False,
|
|
43
|
+
) -> Generator[None, None, None]:
|
|
44
|
+
"""
|
|
45
|
+
Maintain a concurrency lease for the given lease ID.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
lease_id: The ID of the lease to maintain.
|
|
49
|
+
lease_duration: The duration of the lease in seconds.
|
|
50
|
+
raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
|
|
51
|
+
"""
|
|
52
|
+
# Start a loop to renew the lease on the global event loop to avoid blocking the main thread
|
|
53
|
+
global_loop = get_global_loop()
|
|
54
|
+
lease_renewal_call = create_call(
|
|
55
|
+
_lease_renewal_loop,
|
|
56
|
+
lease_id,
|
|
57
|
+
lease_duration,
|
|
58
|
+
)
|
|
59
|
+
global_loop.submit(lease_renewal_call)
|
|
60
|
+
|
|
61
|
+
with WatcherThreadCancelScope() as cancel_scope:
|
|
62
|
+
|
|
63
|
+
def handle_lease_renewal_failure(future: concurrent.futures.Future[None]):
|
|
64
|
+
if future.cancelled():
|
|
65
|
+
return
|
|
66
|
+
exc = future.exception()
|
|
67
|
+
if exc:
|
|
68
|
+
try:
|
|
69
|
+
# Use a run logger if available
|
|
70
|
+
logger = get_run_logger()
|
|
71
|
+
except Exception:
|
|
72
|
+
logger = get_logger("concurrency")
|
|
73
|
+
if raise_on_lease_renewal_failure:
|
|
74
|
+
logger.error(
|
|
75
|
+
"Concurrency lease renewal failed - slots are no longer reserved. Terminating execution to prevent over-allocation."
|
|
76
|
+
)
|
|
77
|
+
assert cancel_scope.cancel()
|
|
78
|
+
else:
|
|
79
|
+
logger.warning(
|
|
80
|
+
"Concurrency lease renewal failed - slots are no longer reserved. Execution will continue, but concurrency limits may be exceeded."
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
lease_renewal_call.future.add_done_callback(handle_lease_renewal_failure)
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
yield
|
|
87
|
+
finally:
|
|
88
|
+
# Cancel the lease renewal loop
|
|
89
|
+
lease_renewal_call.cancel()
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@asynccontextmanager
|
|
93
|
+
async def amaintain_concurrency_lease(
|
|
94
|
+
lease_id: UUID,
|
|
95
|
+
lease_duration: float,
|
|
96
|
+
raise_on_lease_renewal_failure: bool = False,
|
|
97
|
+
) -> AsyncGenerator[None, None]:
|
|
98
|
+
"""
|
|
99
|
+
Maintain a concurrency lease for the given lease ID.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
lease_id: The ID of the lease to maintain.
|
|
103
|
+
lease_duration: The duration of the lease in seconds.
|
|
104
|
+
raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
|
|
105
|
+
"""
|
|
106
|
+
lease_renewal_task = asyncio.create_task(
|
|
107
|
+
_lease_renewal_loop(lease_id, lease_duration)
|
|
108
|
+
)
|
|
109
|
+
with AsyncCancelScope() as cancel_scope:
|
|
110
|
+
|
|
111
|
+
def handle_lease_renewal_failure(task: asyncio.Task[None]):
|
|
112
|
+
exc = task.exception()
|
|
113
|
+
if exc:
|
|
114
|
+
try:
|
|
115
|
+
# Use a run logger if available
|
|
116
|
+
logger = get_run_logger()
|
|
117
|
+
except Exception:
|
|
118
|
+
logger = get_logger("concurrency")
|
|
119
|
+
if raise_on_lease_renewal_failure:
|
|
120
|
+
logger.error(
|
|
121
|
+
"Concurrency lease renewal failed - slots are no longer reserved. Terminating execution to prevent over-allocation."
|
|
122
|
+
)
|
|
123
|
+
cancel_scope.cancel()
|
|
124
|
+
else:
|
|
125
|
+
logger.warning(
|
|
126
|
+
"Concurrency lease renewal failed - slots are no longer reserved. Execution will continue, but concurrency limits may be exceeded."
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# Add a callback to stop execution if the lease renewal fails and strict is True
|
|
130
|
+
lease_renewal_task.add_done_callback(handle_lease_renewal_failure)
|
|
131
|
+
try:
|
|
132
|
+
yield
|
|
133
|
+
finally:
|
|
134
|
+
lease_renewal_task.cancel()
|
|
135
|
+
try:
|
|
136
|
+
await lease_renewal_task
|
|
137
|
+
except (asyncio.CancelledError, Exception):
|
|
138
|
+
# Handling for errors will be done in the callback
|
|
139
|
+
pass
|
{prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/concurrency/asyncio.py
RENAMED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import asyncio
|
|
2
1
|
from collections.abc import AsyncGenerator
|
|
3
2
|
from contextlib import asynccontextmanager
|
|
4
3
|
from typing import Optional, Union
|
|
5
4
|
|
|
6
5
|
import anyio
|
|
7
6
|
|
|
8
|
-
from prefect.
|
|
9
|
-
from prefect.logging.loggers import get_logger, get_run_logger
|
|
7
|
+
from prefect.concurrency._leases import amaintain_concurrency_lease
|
|
10
8
|
|
|
11
9
|
from ._asyncio import (
|
|
12
10
|
AcquireConcurrencySlotTimeoutError as AcquireConcurrencySlotTimeoutError,
|
|
@@ -15,7 +13,6 @@ from ._asyncio import ConcurrencySlotAcquisitionError as ConcurrencySlotAcquisit
|
|
|
15
13
|
from ._asyncio import (
|
|
16
14
|
aacquire_concurrency_slots,
|
|
17
15
|
aacquire_concurrency_slots_with_lease,
|
|
18
|
-
amaintain_concurrency_lease,
|
|
19
16
|
arelease_concurrency_slots_with_lease,
|
|
20
17
|
)
|
|
21
18
|
from ._events import (
|
|
@@ -81,43 +78,12 @@ async def concurrency(
|
|
|
81
78
|
)
|
|
82
79
|
emitted_events = emit_concurrency_acquisition_events(response.limits, occupy)
|
|
83
80
|
|
|
84
|
-
lease_renewal_task = asyncio.create_task(
|
|
85
|
-
amaintain_concurrency_lease(response.lease_id, lease_duration)
|
|
86
|
-
)
|
|
87
|
-
|
|
88
81
|
try:
|
|
89
|
-
with
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
exc = task.exception()
|
|
93
|
-
if exc:
|
|
94
|
-
try:
|
|
95
|
-
# Use a run logger if available
|
|
96
|
-
logger = get_run_logger()
|
|
97
|
-
except Exception:
|
|
98
|
-
logger = get_logger("concurrency")
|
|
99
|
-
if strict:
|
|
100
|
-
logger.error(
|
|
101
|
-
"Concurrency lease renewal failed - slots are no longer reserved. Terminating execution to prevent over-allocation."
|
|
102
|
-
)
|
|
103
|
-
cancel_scope.cancel()
|
|
104
|
-
else:
|
|
105
|
-
logger.warning(
|
|
106
|
-
"Concurrency lease renewal failed - slots are no longer reserved. Execution will continue, but concurrency limits may be exceeded."
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
# Add a callback to stop execution if the lease renewal fails and strict is True
|
|
110
|
-
lease_renewal_task.add_done_callback(handle_lease_renewal_failure)
|
|
111
|
-
|
|
82
|
+
async with amaintain_concurrency_lease(
|
|
83
|
+
response.lease_id, lease_duration, raise_on_lease_renewal_failure=strict
|
|
84
|
+
):
|
|
112
85
|
yield
|
|
113
86
|
finally:
|
|
114
|
-
lease_renewal_task.cancel()
|
|
115
|
-
try:
|
|
116
|
-
await lease_renewal_task
|
|
117
|
-
except (asyncio.CancelledError, Exception):
|
|
118
|
-
# Handling for errors will be done in the callback
|
|
119
|
-
pass
|
|
120
|
-
|
|
121
87
|
try:
|
|
122
88
|
await arelease_concurrency_slots_with_lease(
|
|
123
89
|
lease_id=response.lease_id,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import concurrent.futures
|
|
2
1
|
from collections.abc import Generator
|
|
3
2
|
from contextlib import contextmanager
|
|
4
3
|
from typing import Optional, TypeVar, Union
|
|
@@ -6,22 +5,16 @@ from uuid import UUID
|
|
|
6
5
|
|
|
7
6
|
from typing_extensions import Literal
|
|
8
7
|
|
|
9
|
-
from prefect._internal.concurrency.api import create_call
|
|
10
|
-
from prefect._internal.concurrency.cancellation import (
|
|
11
|
-
WatcherThreadCancelScope,
|
|
12
|
-
)
|
|
13
|
-
from prefect._internal.concurrency.threads import get_global_loop
|
|
14
8
|
from prefect.client.schemas.responses import (
|
|
15
9
|
ConcurrencyLimitWithLeaseResponse,
|
|
16
10
|
MinimalConcurrencyLimitResponse,
|
|
17
11
|
)
|
|
18
|
-
from prefect.
|
|
12
|
+
from prefect.concurrency._leases import maintain_concurrency_lease
|
|
19
13
|
from prefect.utilities.asyncutils import run_coro_as_sync
|
|
20
14
|
|
|
21
15
|
from ._asyncio import (
|
|
22
16
|
aacquire_concurrency_slots,
|
|
23
17
|
aacquire_concurrency_slots_with_lease,
|
|
24
|
-
amaintain_concurrency_lease,
|
|
25
18
|
arelease_concurrency_slots_with_lease,
|
|
26
19
|
)
|
|
27
20
|
from ._events import (
|
|
@@ -126,42 +119,14 @@ def concurrency(
|
|
|
126
119
|
acquisition_response.limits, occupy
|
|
127
120
|
)
|
|
128
121
|
|
|
129
|
-
# Start a loop to renew the lease on the global event loop to avoid blocking the main thread
|
|
130
|
-
global_loop = get_global_loop()
|
|
131
|
-
lease_renewal_call = create_call(
|
|
132
|
-
amaintain_concurrency_lease,
|
|
133
|
-
acquisition_response.lease_id,
|
|
134
|
-
lease_duration,
|
|
135
|
-
)
|
|
136
|
-
global_loop.submit(lease_renewal_call)
|
|
137
|
-
|
|
138
122
|
try:
|
|
139
|
-
with
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
try:
|
|
145
|
-
# Use a run logger if available
|
|
146
|
-
logger = get_run_logger()
|
|
147
|
-
except Exception:
|
|
148
|
-
logger = get_logger("concurrency")
|
|
149
|
-
if strict:
|
|
150
|
-
logger.error(
|
|
151
|
-
"Concurrency lease renewal failed - slots are no longer reserved. Terminating execution to prevent over-allocation."
|
|
152
|
-
)
|
|
153
|
-
assert cancel_scope.cancel()
|
|
154
|
-
else:
|
|
155
|
-
logger.warning(
|
|
156
|
-
"Concurrency lease renewal failed - slots are no longer reserved. Execution will continue, but concurrency limits may be exceeded."
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
lease_renewal_call.future.add_done_callback(handle_lease_renewal_failure)
|
|
123
|
+
with maintain_concurrency_lease(
|
|
124
|
+
acquisition_response.lease_id,
|
|
125
|
+
lease_duration,
|
|
126
|
+
raise_on_lease_renewal_failure=strict,
|
|
127
|
+
):
|
|
160
128
|
yield
|
|
161
129
|
finally:
|
|
162
|
-
# Cancel the lease renewal loop
|
|
163
|
-
lease_renewal_call.cancel()
|
|
164
|
-
|
|
165
130
|
_release_concurrency_slots_with_lease(acquisition_response.lease_id)
|
|
166
131
|
emit_concurrency_release_events(
|
|
167
132
|
acquisition_response.limits, occupy, emitted_events
|
|
@@ -3,7 +3,7 @@ Async and thread safe models for passing runtime context data.
|
|
|
3
3
|
|
|
4
4
|
These contexts should never be directly mutated by the user.
|
|
5
5
|
|
|
6
|
-
For more user-accessible information about the current run, see [`prefect.runtime`](
|
|
6
|
+
For more user-accessible information about the current run, see [`prefect.runtime`](https://docs.prefect.io/v3/api-ref/python/prefect-runtime-flow_run).
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
import asyncio
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Core primitives for managing Prefect deployments via `prefect deploy`, providing a minimally opinionated
|
|
3
3
|
build system for managing flows and deployments.
|
|
4
4
|
|
|
5
|
-
To get started, follow along with [the
|
|
5
|
+
To get started, follow along with [the deployments tutorial](https://docs.prefect.io/v3/how-to-guides/deployments/create-deployments).
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
{prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/steps/core.py
RENAMED
|
@@ -5,16 +5,17 @@ Deployment steps are YAML representations of Python functions along with their i
|
|
|
5
5
|
|
|
6
6
|
Whenever a step is run, the following actions are taken:
|
|
7
7
|
|
|
8
|
-
- The step's inputs and block / variable references are resolved (see [the `prefect deploy` documentation](/guides/prefect-
|
|
8
|
+
- The step's inputs and block / variable references are resolved (see [the `prefect deploy` documentation](https://docs.prefect.io/v3/how-to-guides/deployments/prefect-yaml#templating-options) for more details)
|
|
9
9
|
- The step's function is imported; if it cannot be found, the `requires` keyword is used to install the necessary packages
|
|
10
10
|
- The step's function is called with the resolved inputs
|
|
11
11
|
- The step's output is returned and used to resolve inputs for subsequent steps
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
14
16
|
import os
|
|
15
17
|
import re
|
|
16
18
|
import subprocess
|
|
17
|
-
import sys
|
|
18
19
|
import warnings
|
|
19
20
|
from copy import deepcopy
|
|
20
21
|
from importlib import import_module
|
|
@@ -22,6 +23,7 @@ from typing import Any, Dict, List, Optional, Tuple, Union
|
|
|
22
23
|
|
|
23
24
|
from prefect._internal.compatibility.deprecated import PrefectDeprecationWarning
|
|
24
25
|
from prefect._internal.concurrency.api import Call, from_async
|
|
26
|
+
from prefect._internal.installation import install_packages
|
|
25
27
|
from prefect._internal.integrations import KNOWN_EXTRAS_FOR_PACKAGES
|
|
26
28
|
from prefect.logging.loggers import get_logger
|
|
27
29
|
from prefect.settings import PREFECT_DEBUG_MODE
|
|
@@ -90,7 +92,8 @@ def _get_function_for_step(
|
|
|
90
92
|
for package in packages
|
|
91
93
|
if package
|
|
92
94
|
]
|
|
93
|
-
|
|
95
|
+
install_packages(packages, stream_output=True)
|
|
96
|
+
|
|
94
97
|
except subprocess.CalledProcessError:
|
|
95
98
|
get_logger("deployments.steps.core").warning(
|
|
96
99
|
"Unable to install required packages for %s", fully_qualified_name
|
{prefect_client-3.4.11.dev4 → prefect_client-3.4.12.dev1}/src/prefect/deployments/steps/pull.py
RENAMED
|
@@ -157,7 +157,7 @@ def git_clone(
|
|
|
157
157
|
repository: https://github.com/org/repo.git
|
|
158
158
|
access_token: "{{ prefect.blocks.secret.github-access-token }}" # Requires creation of a Secret block
|
|
159
159
|
```
|
|
160
|
-
Note that you will need to [create a Secret block](/concepts/blocks/#
|
|
160
|
+
Note that you will need to [create a Secret block](https://docs.prefect.io/v3/concepts/blocks/#pre-registered-blocks) to store the
|
|
161
161
|
value of your git credentials. You can also store a username/password combo or token prefix (e.g. `x-token-auth`)
|
|
162
162
|
in your secret block. Refer to your git providers documentation for the correct authentication schema.
|
|
163
163
|
|
|
@@ -6,7 +6,13 @@ import multiprocessing
|
|
|
6
6
|
import multiprocessing.context
|
|
7
7
|
import os
|
|
8
8
|
import time
|
|
9
|
-
from contextlib import
|
|
9
|
+
from contextlib import (
|
|
10
|
+
AsyncExitStack,
|
|
11
|
+
ExitStack,
|
|
12
|
+
asynccontextmanager,
|
|
13
|
+
contextmanager,
|
|
14
|
+
nullcontext,
|
|
15
|
+
)
|
|
10
16
|
from dataclasses import dataclass, field
|
|
11
17
|
from functools import wraps
|
|
12
18
|
from typing import (
|
|
@@ -35,7 +41,11 @@ from prefect.client.orchestration import PrefectClient, SyncPrefectClient, get_c
|
|
|
35
41
|
from prefect.client.schemas import FlowRun, TaskRun
|
|
36
42
|
from prefect.client.schemas.filters import FlowRunFilter
|
|
37
43
|
from prefect.client.schemas.sorting import FlowRunSort
|
|
44
|
+
from prefect.concurrency.asyncio import (
|
|
45
|
+
amaintain_concurrency_lease,
|
|
46
|
+
)
|
|
38
47
|
from prefect.concurrency.context import ConcurrencyContext
|
|
48
|
+
from prefect.concurrency.sync import maintain_concurrency_lease
|
|
39
49
|
from prefect.concurrency.v1.context import ConcurrencyContext as ConcurrencyContextV1
|
|
40
50
|
from prefect.context import (
|
|
41
51
|
AsyncClientContext,
|
|
@@ -618,6 +628,13 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
618
628
|
)
|
|
619
629
|
stack.enter_context(ConcurrencyContextV1())
|
|
620
630
|
stack.enter_context(ConcurrencyContext())
|
|
631
|
+
if lease_id := self.state.state_details.deployment_concurrency_lease_id:
|
|
632
|
+
stack.enter_context(
|
|
633
|
+
maintain_concurrency_lease(
|
|
634
|
+
lease_id,
|
|
635
|
+
300,
|
|
636
|
+
)
|
|
637
|
+
)
|
|
621
638
|
|
|
622
639
|
# set the logger to the flow run logger
|
|
623
640
|
|
|
@@ -1157,7 +1174,7 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1157
1174
|
self.flow_run = await client.read_flow_run(self.flow_run.id)
|
|
1158
1175
|
log_prints = should_log_prints(self.flow)
|
|
1159
1176
|
|
|
1160
|
-
with
|
|
1177
|
+
async with AsyncExitStack() as stack:
|
|
1161
1178
|
# TODO: Explore closing task runner before completing the flow to
|
|
1162
1179
|
# wait for futures to complete
|
|
1163
1180
|
stack.enter_context(capture_sigterm())
|
|
@@ -1182,6 +1199,13 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1182
1199
|
)
|
|
1183
1200
|
stack.enter_context(ConcurrencyContextV1())
|
|
1184
1201
|
stack.enter_context(ConcurrencyContext())
|
|
1202
|
+
if lease_id := self.state.state_details.deployment_concurrency_lease_id:
|
|
1203
|
+
await stack.enter_async_context(
|
|
1204
|
+
amaintain_concurrency_lease(
|
|
1205
|
+
lease_id,
|
|
1206
|
+
300,
|
|
1207
|
+
)
|
|
1208
|
+
)
|
|
1185
1209
|
|
|
1186
1210
|
# set the logger to the flow run logger
|
|
1187
1211
|
self.logger: "logging.Logger" = flow_run_logger(
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import importlib
|
|
2
|
-
import shlex
|
|
3
|
-
import sys
|
|
4
2
|
from copy import deepcopy
|
|
5
3
|
from types import ModuleType
|
|
6
4
|
from typing import TYPE_CHECKING, Any, Dict, Optional
|
|
@@ -10,6 +8,7 @@ from rich.console import Console
|
|
|
10
8
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
11
9
|
from rich.prompt import Confirm
|
|
12
10
|
|
|
11
|
+
from prefect._internal.installation import ainstall_packages
|
|
13
12
|
from prefect.client.schemas.actions import BlockDocumentCreate
|
|
14
13
|
from prefect.client.schemas.objects import BlockDocument
|
|
15
14
|
from prefect.client.utilities import inject_client
|
|
@@ -66,9 +65,7 @@ class CoiledPushProvisioner:
|
|
|
66
65
|
task = progress.add_task("coiled install")
|
|
67
66
|
progress.start()
|
|
68
67
|
global coiled
|
|
69
|
-
await
|
|
70
|
-
[shlex.quote(sys.executable), "-m", "pip", "install", "coiled"]
|
|
71
|
-
)
|
|
68
|
+
await ainstall_packages(["coiled"])
|
|
72
69
|
coiled = importlib.import_module("coiled")
|
|
73
70
|
progress.advance(task)
|
|
74
71
|
|
|
@@ -6,8 +6,6 @@ import contextvars
|
|
|
6
6
|
import importlib
|
|
7
7
|
import ipaddress
|
|
8
8
|
import json
|
|
9
|
-
import shlex
|
|
10
|
-
import sys
|
|
11
9
|
from copy import deepcopy
|
|
12
10
|
from functools import partial
|
|
13
11
|
from textwrap import dedent
|
|
@@ -23,6 +21,7 @@ from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
|
23
21
|
from rich.prompt import Confirm
|
|
24
22
|
from rich.syntax import Syntax
|
|
25
23
|
|
|
24
|
+
from prefect._internal.installation import ainstall_packages
|
|
26
25
|
from prefect.cli._prompts import prompt
|
|
27
26
|
from prefect.client.schemas.actions import BlockDocumentCreate
|
|
28
27
|
from prefect.client.utilities import inject_client
|
|
@@ -1121,9 +1120,7 @@ class ElasticContainerServicePushProvisioner:
|
|
|
1121
1120
|
|
|
1122
1121
|
async def _prompt_boto3_installation(self):
|
|
1123
1122
|
global boto3
|
|
1124
|
-
await
|
|
1125
|
-
[shlex.quote(sys.executable), "-m", "pip", "install", "boto3"]
|
|
1126
|
-
)
|
|
1123
|
+
await ainstall_packages(["boto3"])
|
|
1127
1124
|
boto3 = importlib.import_module("boto3")
|
|
1128
1125
|
|
|
1129
1126
|
@staticmethod
|
|
@@ -10,6 +10,7 @@ from rich.console import Console
|
|
|
10
10
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
11
11
|
from rich.prompt import Confirm
|
|
12
12
|
|
|
13
|
+
from prefect._internal.installation import ainstall_packages
|
|
13
14
|
from prefect.client.schemas.actions import BlockDocumentCreate
|
|
14
15
|
from prefect.client.schemas.objects import BlockDocument
|
|
15
16
|
from prefect.client.utilities import inject_client
|
|
@@ -66,9 +67,7 @@ class ModalPushProvisioner:
|
|
|
66
67
|
task = progress.add_task("modal install")
|
|
67
68
|
progress.start()
|
|
68
69
|
global modal
|
|
69
|
-
await
|
|
70
|
-
[shlex.quote(sys.executable), "-m", "pip", "install", "modal"]
|
|
71
|
-
)
|
|
70
|
+
await ainstall_packages(["modal"])
|
|
72
71
|
modal = importlib.import_module("modal")
|
|
73
72
|
progress.advance(task)
|
|
74
73
|
|
|
@@ -33,6 +33,7 @@ class MemoryLockManager(LockManager):
|
|
|
33
33
|
"""
|
|
34
34
|
|
|
35
35
|
_instance = None
|
|
36
|
+
_initialized = False
|
|
36
37
|
|
|
37
38
|
def __new__(cls, *args: Any, **kwargs: Any) -> Self:
|
|
38
39
|
if cls._instance is None:
|
|
@@ -40,8 +41,11 @@ class MemoryLockManager(LockManager):
|
|
|
40
41
|
return cls._instance
|
|
41
42
|
|
|
42
43
|
def __init__(self):
|
|
44
|
+
if self.__class__._initialized:
|
|
45
|
+
return
|
|
43
46
|
self._locks_dict_lock = threading.Lock()
|
|
44
47
|
self._locks: dict[str, _LockInfo] = {}
|
|
48
|
+
self.__class__._initialized = True
|
|
45
49
|
|
|
46
50
|
def _expire_lock(self, key: str):
|
|
47
51
|
"""
|