prefect-client 3.6.30.dev2__tar.gz → 3.6.30.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/.gitignore +2 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/PKG-INFO +1 -1
- prefect_client-3.6.30.dev4/hatch_build.py +61 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/AGENTS.md +4 -0
- prefect_client-3.6.30.dev4/src/prefect/_build_info.py +5 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/__init__.py +42 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/routes.py +1 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/objects.py +18 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/AGENTS.md +2 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/core.py +43 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/flow_engine.py +131 -18
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/flows.py +147 -19
- prefect_client-3.6.30.dev4/src/prefect/locking/_filelock.py +242 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/results.py +151 -20
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/AGENTS.md +18 -1
- prefect_client-3.6.30.dev4/src/prefect/runner/_workspace_resolver.py +360 -0
- prefect_client-3.6.30.dev4/src/prefect/runner/_workspace_starter.py +289 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/storage.py +17 -0
- prefect_client-3.6.30.dev4/src/prefect/server/api/admin.py +85 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/concurrency_limits_v2.py +37 -17
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/server.py +252 -60
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/ui.py +1 -1
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/task_engine.py +8 -6
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/task_runners.py +80 -1
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/AGENTS.md +1 -1
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/templating/__init__.py +64 -39
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/visualization.py +18 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/base.py +25 -11
- prefect_client-3.6.30.dev2/src/prefect/_build_info.py +0 -5
- prefect_client-3.6.30.dev2/src/prefect/server/api/admin.py +0 -25
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/LICENSE +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/README.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/pyproject.toml +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/_version_checking.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/context.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/engine.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/futures.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/main.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/serializers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/states.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/workers/utilities.py +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
try:
|
|
8
|
+
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
|
|
9
|
+
except ModuleNotFoundError: # pragma: no cover - only used when testing helpers
|
|
10
|
+
|
|
11
|
+
class BuildHookInterface: # type: ignore[no-redef]
|
|
12
|
+
root: str
|
|
13
|
+
target_name: str
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
PACKAGED_UI_INDEX_FILES = (
|
|
17
|
+
Path("src/prefect/server/ui/index.html"),
|
|
18
|
+
Path("src/prefect/server/ui-v2/index.html"),
|
|
19
|
+
)
|
|
20
|
+
REQUIRE_PACKAGED_UI_ENV_VAR = "PREFECT_REQUIRE_PACKAGED_UI_BUNDLES"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _truthy_env_var(name: str) -> bool:
|
|
24
|
+
return os.environ.get(name, "").lower() not in {"", "0", "false", "no", "off"}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def should_validate_packaged_ui_index_files(root: str | Path) -> bool:
|
|
28
|
+
if _truthy_env_var(REQUIRE_PACKAGED_UI_ENV_VAR):
|
|
29
|
+
return True
|
|
30
|
+
|
|
31
|
+
root_path = Path(root)
|
|
32
|
+
return any(
|
|
33
|
+
(root_path / index_file.parent).exists()
|
|
34
|
+
for index_file in PACKAGED_UI_INDEX_FILES
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def validate_packaged_ui_index_files(root: str | Path) -> None:
|
|
39
|
+
root_path = Path(root)
|
|
40
|
+
missing_index_files = [
|
|
41
|
+
str(index_file)
|
|
42
|
+
for index_file in PACKAGED_UI_INDEX_FILES
|
|
43
|
+
if not (root_path / index_file).is_file()
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
if missing_index_files:
|
|
47
|
+
raise RuntimeError(
|
|
48
|
+
"Prefect package builds require both UI bundles to be built. "
|
|
49
|
+
"Missing index.html files: "
|
|
50
|
+
f"{', '.join(missing_index_files)}"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class CustomBuildHook(BuildHookInterface):
|
|
55
|
+
def initialize(self, version: str, build_data: dict[str, Any]) -> None:
|
|
56
|
+
if (
|
|
57
|
+
version != "editable"
|
|
58
|
+
and self.target_name in {"sdist", "wheel"}
|
|
59
|
+
and should_validate_packaged_ui_index_files(self.root)
|
|
60
|
+
):
|
|
61
|
+
validate_packaged_ui_index_files(self.root)
|
|
@@ -10,6 +10,7 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
|
|
|
10
10
|
|
|
11
11
|
- `flows.py` / `tasks.py` — `@flow` and `@task` decorator definitions. The primary user-facing API.
|
|
12
12
|
- `flow_engine.py` / `task_engine.py` — Async execution engines that orchestrate runs. **Critical invariant:** both sync and async engine paths must be kept in lockstep. Changes to one must be mirrored in the other.
|
|
13
|
+
- `flow_engine.py` is also a subprocess entrypoint: `python -m prefect.flow_engine <entrypoint>`. Reads `PREFECT__FLOW_RUN_ID` from the environment; accepts exactly one argument (the flow entrypoint path or module ref). Workers and infrastructure use this to launch flow runs as isolated subprocesses. Plain functions not decorated with `@flow` are auto-converted to flows at this entry point.
|
|
13
14
|
- `states.py` — State objects and transition logic
|
|
14
15
|
- `results.py` — Result persistence and retrieval
|
|
15
16
|
- `futures.py` — `PrefectFuture` for async task results
|
|
@@ -20,12 +21,15 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
|
|
|
20
21
|
## Key Contracts
|
|
21
22
|
|
|
22
23
|
- **Engine ordering matters.** The engines apply features (retries, caching, result persistence, transactions) in a specific order. Changing the order or forgetting a feature in one engine path is the most common source of breakage.
|
|
24
|
+
- **Set run metadata before state transitions.** Any run attribute that event subscribers observe at the moment of a state transition (e.g., custom `flow_run_name`) must be persisted to the server *before* `set_state()` is called for that transition. Metadata set after the call appears stale to subscribers of that state event.
|
|
23
25
|
- **Sync and async must stay in sync.** Both `flow_engine.py` and `task_engine.py` have sync and async paths. Any behavior change must be applied to both.
|
|
24
26
|
- **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences between whenever 0.7.x–0.9.x and ≥ 0.10.0. The `_WHENEVER_NEW_API` flag (True when whenever ≥ 0.10.0) guards version-specific code. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Violations will silently break on whichever whenever version the helpers weren't written for.
|
|
25
27
|
- **Flow and task engines advance state differently.** The flow engine makes blocking API calls to the server to propose and advance states. The task engine emits `prefect.task_run.*` events (delivered via WebSockets) but advances state locally through `set_state` calls with polling/backoff — do not assume the two engines work the same way.
|
|
26
28
|
- **Flow state transitions go through the server.** The flow engine proposes states to the server, which accepts or rejects them via orchestration rules. The task engine, by contrast, manages state transitions locally via `set_state` and emits `prefect.task_run.*` events — it does not propose states to the server.
|
|
27
29
|
- **`ProcessPoolTaskRunner` requires picklable data across subprocess boundaries.** `PrefectFuture` objects are not picklable and cannot be passed to worker subprocesses. Any `wait_for` futures must be waited on in the parent process and converted to `State` objects before submission. The subprocess task engine handles `State` objects via `resolve_to_final_result`, which raises `UpstreamTaskError` for non-completed upstreams.
|
|
28
30
|
- **`ProcessPoolTaskRunner` instances may be deserialized without `__init__` running.** When a runner is pickled and restored in a subprocess, `__init__` is not called, so instance attributes set there may be absent. Access any such attribute via `getattr(self, "_attr", default)` rather than `self._attr` directly — both in the property getter and in `duplicate()`. The `subprocess_message_processor_factories` property demonstrates the required pattern.
|
|
31
|
+
- **`ThreadPoolTaskRunner` is cloudpickled when a flow run is dispatched to a subprocess.** `threading.Lock` and other non-picklable thread primitives must be dropped in `__getstate__` and rebuilt in `__setstate__`. Any new instance state added to this class must be evaluated for picklability.
|
|
32
|
+
- **Nested task submissions on a bounded `ThreadPoolTaskRunner` can deadlock.** When a worker task submits children and blocks on `.result()` while all `max_workers` threads are busy, the pool starves. `_warn_if_nested_submit_would_deadlock` detects this and emits a one-time warning — preserve this detection when changing pool management.
|
|
29
33
|
- **`ResultRecordMetadata` tolerates unknown serializer types.** When loading persisted metadata, an unrecognized serializer `type` is converted to an `UnknownSerializer` placeholder rather than raising `ValidationError`. This allows inspecting result metadata when the serializer implementation is unavailable in the current environment. However, known serializer types with invalid fields still raise `ValidationError`. `UnknownSerializer.dumps()` and `UnknownSerializer.loads()` raise `RuntimeError` — the tolerance is for inspection only, not actual serialization/deserialization.
|
|
30
34
|
|
|
31
35
|
## Logging
|
|
@@ -110,6 +110,8 @@ from prefect.client.schemas.objects import (
|
|
|
110
110
|
FlowRunResult,
|
|
111
111
|
Parameter,
|
|
112
112
|
Constant,
|
|
113
|
+
ServerDefaultResultStorage,
|
|
114
|
+
ServerDefaultResultStorageUpdate,
|
|
113
115
|
TaskRunPolicy,
|
|
114
116
|
WorkQueue,
|
|
115
117
|
WorkQueueStatusDetail,
|
|
@@ -1079,6 +1081,27 @@ class PrefectClient(
|
|
|
1079
1081
|
res = await self._client.get("/admin/version")
|
|
1080
1082
|
return res.json()
|
|
1081
1083
|
|
|
1084
|
+
async def read_server_default_result_storage(
|
|
1085
|
+
self,
|
|
1086
|
+
) -> ServerDefaultResultStorage:
|
|
1087
|
+
response = await self._client.get("/admin/storage")
|
|
1088
|
+
return ServerDefaultResultStorage.model_validate(response.json())
|
|
1089
|
+
|
|
1090
|
+
async def update_server_default_result_storage(
|
|
1091
|
+
self,
|
|
1092
|
+
default_result_storage_block_id: UUID,
|
|
1093
|
+
) -> ServerDefaultResultStorage:
|
|
1094
|
+
response = await self._client.put(
|
|
1095
|
+
"/admin/storage",
|
|
1096
|
+
json=ServerDefaultResultStorageUpdate(
|
|
1097
|
+
default_result_storage_block_id=default_result_storage_block_id
|
|
1098
|
+
).model_dump(mode="json"),
|
|
1099
|
+
)
|
|
1100
|
+
return ServerDefaultResultStorage.model_validate(response.json())
|
|
1101
|
+
|
|
1102
|
+
async def clear_server_default_result_storage(self) -> None:
|
|
1103
|
+
await self._client.delete("/admin/storage")
|
|
1104
|
+
|
|
1082
1105
|
def client_version(self) -> str:
|
|
1083
1106
|
return prefect.__version__
|
|
1084
1107
|
|
|
@@ -1451,6 +1474,25 @@ class SyncPrefectClient(
|
|
|
1451
1474
|
res = self._client.get("/admin/version")
|
|
1452
1475
|
return res.json()
|
|
1453
1476
|
|
|
1477
|
+
def read_server_default_result_storage(self) -> ServerDefaultResultStorage:
|
|
1478
|
+
response = self._client.get("/admin/storage")
|
|
1479
|
+
return ServerDefaultResultStorage.model_validate(response.json())
|
|
1480
|
+
|
|
1481
|
+
def update_server_default_result_storage(
|
|
1482
|
+
self,
|
|
1483
|
+
default_result_storage_block_id: UUID,
|
|
1484
|
+
) -> ServerDefaultResultStorage:
|
|
1485
|
+
response = self._client.put(
|
|
1486
|
+
"/admin/storage",
|
|
1487
|
+
json=ServerDefaultResultStorageUpdate(
|
|
1488
|
+
default_result_storage_block_id=default_result_storage_block_id
|
|
1489
|
+
).model_dump(mode="json"),
|
|
1490
|
+
)
|
|
1491
|
+
return ServerDefaultResultStorage.model_validate(response.json())
|
|
1492
|
+
|
|
1493
|
+
def clear_server_default_result_storage(self) -> None:
|
|
1494
|
+
self._client.delete("/admin/storage")
|
|
1495
|
+
|
|
1454
1496
|
def client_version(self) -> str:
|
|
1455
1497
|
return prefect.__version__
|
|
1456
1498
|
|
{prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/objects.py
RENAMED
|
@@ -1550,6 +1550,24 @@ class WorkPoolStorageConfiguration(PrefectBaseModel):
|
|
|
1550
1550
|
)
|
|
1551
1551
|
|
|
1552
1552
|
|
|
1553
|
+
class ServerDefaultResultStorage(PrefectBaseModel):
|
|
1554
|
+
"""Server-side default result storage configuration."""
|
|
1555
|
+
|
|
1556
|
+
default_result_storage_block_id: Optional[UUID] = Field(
|
|
1557
|
+
default=None,
|
|
1558
|
+
description="The block document ID of the server default result storage block.",
|
|
1559
|
+
)
|
|
1560
|
+
|
|
1561
|
+
|
|
1562
|
+
class ServerDefaultResultStorageUpdate(PrefectBaseModel):
|
|
1563
|
+
"""Request payload for setting the server default result storage block."""
|
|
1564
|
+
|
|
1565
|
+
default_result_storage_block_id: UUID = Field(
|
|
1566
|
+
default=...,
|
|
1567
|
+
description="The block document ID of the server default result storage block.",
|
|
1568
|
+
)
|
|
1569
|
+
|
|
1570
|
+
|
|
1553
1571
|
class WorkPool(ObjectBaseModel):
|
|
1554
1572
|
"""An ORM representation of a work pool"""
|
|
1555
1573
|
|
|
@@ -23,6 +23,8 @@ Built-in steps:
|
|
|
23
23
|
- `steps/pull.py` — `git_clone`, `set_working_directory`, `pull_from_remote_storage`
|
|
24
24
|
- `steps/utility.py` — `run_shell_script`, `pip_install_requirements`
|
|
25
25
|
|
|
26
|
+
**Step observer**: `run_steps` does not accept a step completion callback as a parameter by design — inject one via `_observe_step_completion(callback)` context manager from `steps/core.py`. The callback receives `(step, output, cwd_before, cwd_after)` after each step; either CWD arg is `None` when the directory becomes inaccessible (e.g., the step deleted its working directory).
|
|
27
|
+
|
|
26
28
|
## Entrypoint Formats
|
|
27
29
|
|
|
28
30
|
`runner.py`'s `from_storage` / `afrom_storage` (and `Flow.from_source`) support two entrypoint formats:
|
{prefect_client-3.6.30.dev2 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/core.py
RENAMED
|
@@ -17,8 +17,12 @@ import os
|
|
|
17
17
|
import re
|
|
18
18
|
import subprocess
|
|
19
19
|
import warnings
|
|
20
|
+
from collections.abc import Callable, Iterator
|
|
21
|
+
from contextlib import contextmanager
|
|
22
|
+
from contextvars import ContextVar
|
|
20
23
|
from copy import deepcopy
|
|
21
24
|
from importlib import import_module
|
|
25
|
+
from pathlib import Path
|
|
22
26
|
from typing import Any
|
|
23
27
|
from uuid import UUID
|
|
24
28
|
|
|
@@ -39,6 +43,15 @@ from prefect.utilities.templating import (
|
|
|
39
43
|
|
|
40
44
|
RESERVED_KEYWORDS = {"id", "requires"}
|
|
41
45
|
|
|
46
|
+
_StepCompletionObserver = Callable[
|
|
47
|
+
[dict[str, Any], Any, Path | None, Path | None],
|
|
48
|
+
None,
|
|
49
|
+
]
|
|
50
|
+
_STEP_COMPLETION_OBSERVER: ContextVar[_StepCompletionObserver | None] = ContextVar(
|
|
51
|
+
"step_completion_observer",
|
|
52
|
+
default=None,
|
|
53
|
+
)
|
|
54
|
+
|
|
42
55
|
|
|
43
56
|
class StepExecutionError(Exception):
|
|
44
57
|
"""
|
|
@@ -46,6 +59,22 @@ class StepExecutionError(Exception):
|
|
|
46
59
|
"""
|
|
47
60
|
|
|
48
61
|
|
|
62
|
+
def _safe_current_working_directory() -> Path | None:
|
|
63
|
+
try:
|
|
64
|
+
return Path.cwd().resolve()
|
|
65
|
+
except OSError:
|
|
66
|
+
return None
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@contextmanager
|
|
70
|
+
def _observe_step_completion(callback: _StepCompletionObserver) -> Iterator[None]:
|
|
71
|
+
token = _STEP_COMPLETION_OBSERVER.set(callback)
|
|
72
|
+
try:
|
|
73
|
+
yield
|
|
74
|
+
finally:
|
|
75
|
+
_STEP_COMPLETION_OBSERVER.reset(token)
|
|
76
|
+
|
|
77
|
+
|
|
49
78
|
def _strip_version(requirement: str) -> str:
|
|
50
79
|
"""
|
|
51
80
|
Strips the version from a requirement string.
|
|
@@ -152,6 +181,7 @@ async def run_steps(
|
|
|
152
181
|
logger: Any | None = None,
|
|
153
182
|
) -> dict[str, Any]:
|
|
154
183
|
upstream_outputs = deepcopy(upstream_outputs) if upstream_outputs else {}
|
|
184
|
+
step_completion_observer = _STEP_COMPLETION_OBSERVER.get()
|
|
155
185
|
for step_index, step in enumerate(steps):
|
|
156
186
|
if not step:
|
|
157
187
|
continue
|
|
@@ -177,6 +207,11 @@ async def run_steps(
|
|
|
177
207
|
|
|
178
208
|
try:
|
|
179
209
|
# catch warnings to ensure deprecation warnings are printed
|
|
210
|
+
step_start_cwd = (
|
|
211
|
+
_safe_current_working_directory()
|
|
212
|
+
if step_completion_observer is not None
|
|
213
|
+
else None
|
|
214
|
+
)
|
|
180
215
|
with warnings.catch_warnings(record=True) as w:
|
|
181
216
|
warnings.simplefilter(
|
|
182
217
|
"always",
|
|
@@ -201,6 +236,14 @@ async def run_steps(
|
|
|
201
236
|
print_function(message)
|
|
202
237
|
printed_messages.append(message)
|
|
203
238
|
|
|
239
|
+
if step_completion_observer is not None:
|
|
240
|
+
step_completion_observer(
|
|
241
|
+
step,
|
|
242
|
+
step_output,
|
|
243
|
+
step_start_cwd,
|
|
244
|
+
_safe_current_working_directory(),
|
|
245
|
+
)
|
|
246
|
+
|
|
204
247
|
if not isinstance(step_output, dict):
|
|
205
248
|
if PREFECT_DEBUG_MODE:
|
|
206
249
|
get_logger().warning(
|
|
@@ -8,6 +8,7 @@ import multiprocessing
|
|
|
8
8
|
import multiprocessing.context
|
|
9
9
|
import os
|
|
10
10
|
import signal
|
|
11
|
+
import sys
|
|
11
12
|
import threading
|
|
12
13
|
import time
|
|
13
14
|
from contextlib import (
|
|
@@ -66,7 +67,7 @@ from prefect.context import (
|
|
|
66
67
|
hydrated_context,
|
|
67
68
|
serialize_context,
|
|
68
69
|
)
|
|
69
|
-
from prefect.engine import handle_engine_signals
|
|
70
|
+
from prefect.engine import _drive_run_flow_result, handle_engine_signals
|
|
70
71
|
from prefect.events.related import RelatedResource, tags_as_related_resources
|
|
71
72
|
from prefect.events.utilities import emit_event
|
|
72
73
|
from prefect.exceptions import (
|
|
@@ -92,6 +93,8 @@ from prefect.logging.loggers import (
|
|
|
92
93
|
)
|
|
93
94
|
from prefect.results import (
|
|
94
95
|
ResultStore,
|
|
96
|
+
_aget_default_persist_result,
|
|
97
|
+
_get_default_persist_result,
|
|
95
98
|
get_result_store,
|
|
96
99
|
should_persist_result,
|
|
97
100
|
)
|
|
@@ -109,6 +112,7 @@ from prefect.states import (
|
|
|
109
112
|
exception_to_failed_state,
|
|
110
113
|
return_value_to_state,
|
|
111
114
|
)
|
|
115
|
+
from prefect.telemetry._metrics import RunMetrics
|
|
112
116
|
from prefect.telemetry.run_telemetry import (
|
|
113
117
|
LABELS_TRACEPARENT_KEY,
|
|
114
118
|
TRACEPARENT_KEY,
|
|
@@ -142,6 +146,7 @@ P = ParamSpec("P")
|
|
|
142
146
|
R = TypeVar("R")
|
|
143
147
|
|
|
144
148
|
MINIMUM_HEARTBEAT_INTERVAL = 30
|
|
149
|
+
_engine_logger = get_logger("engine")
|
|
145
150
|
_CONTROL_CHANNEL_ENV_KEYS = frozenset(
|
|
146
151
|
{"PREFECT__CONTROL_PORT", "PREFECT__CONTROL_TOKEN"}
|
|
147
152
|
)
|
|
@@ -220,15 +225,18 @@ def load_flow_run(flow_run_id: UUID) -> FlowRun:
|
|
|
220
225
|
return flow_run
|
|
221
226
|
|
|
222
227
|
|
|
228
|
+
def _load_flow_from_runtime_entrypoint(entrypoint: str) -> Flow[..., Any]:
|
|
229
|
+
try:
|
|
230
|
+
return load_flow_from_entrypoint(entrypoint, use_placeholder_flow=False)
|
|
231
|
+
except MissingFlowError:
|
|
232
|
+
return load_function_and_convert_to_flow(entrypoint)
|
|
233
|
+
|
|
234
|
+
|
|
223
235
|
def load_flow(flow_run: FlowRun) -> Flow[..., Any]:
|
|
224
236
|
entrypoint = os.environ.get("PREFECT__FLOW_ENTRYPOINT")
|
|
225
237
|
|
|
226
238
|
if entrypoint:
|
|
227
|
-
|
|
228
|
-
try:
|
|
229
|
-
flow = load_flow_from_entrypoint(entrypoint, use_placeholder_flow=False)
|
|
230
|
-
except MissingFlowError:
|
|
231
|
-
flow = load_function_and_convert_to_flow(entrypoint)
|
|
239
|
+
flow = _load_flow_from_runtime_entrypoint(entrypoint)
|
|
232
240
|
else:
|
|
233
241
|
flow = run_coro_as_sync(
|
|
234
242
|
load_flow_from_flow_run(flow_run, use_placeholder_flow=False)
|
|
@@ -242,6 +250,51 @@ def load_flow_and_flow_run(flow_run_id: UUID) -> tuple[FlowRun, Flow[..., Any]]:
|
|
|
242
250
|
return flow_run, flow
|
|
243
251
|
|
|
244
252
|
|
|
253
|
+
def _run_flow_from_runtime_entrypoint(flow_run_id: UUID, entrypoint: str) -> None:
|
|
254
|
+
configure_from_env()
|
|
255
|
+
|
|
256
|
+
with handle_engine_signals(flow_run_id):
|
|
257
|
+
flow_run = load_flow_run(flow_run_id=flow_run_id)
|
|
258
|
+
run_logger = flow_run_logger(flow_run=flow_run)
|
|
259
|
+
|
|
260
|
+
try:
|
|
261
|
+
flow = _load_flow_from_runtime_entrypoint(entrypoint)
|
|
262
|
+
except Exception:
|
|
263
|
+
run_logger.error(
|
|
264
|
+
"Unexpected exception encountered when trying to load flow",
|
|
265
|
+
exc_info=True,
|
|
266
|
+
)
|
|
267
|
+
raise
|
|
268
|
+
|
|
269
|
+
with RunMetrics(flow_run, flow):
|
|
270
|
+
run_result = run_flow(flow, flow_run=flow_run, error_logger=run_logger)
|
|
271
|
+
_drive_run_flow_result(flow, run_result)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def _main(argv: list[str] | None = None) -> int:
|
|
275
|
+
args = sys.argv[1:] if argv is None else argv
|
|
276
|
+
if len(args) != 1:
|
|
277
|
+
_engine_logger.error(
|
|
278
|
+
"Invalid flow entrypoint. Expected one argument; received: %s", args
|
|
279
|
+
)
|
|
280
|
+
return 1
|
|
281
|
+
|
|
282
|
+
flow_run_id_value = os.environ.get("PREFECT__FLOW_RUN_ID")
|
|
283
|
+
try:
|
|
284
|
+
flow_run_id = UUID(flow_run_id_value) if flow_run_id_value else None
|
|
285
|
+
except ValueError:
|
|
286
|
+
flow_run_id = None
|
|
287
|
+
|
|
288
|
+
if flow_run_id is None:
|
|
289
|
+
_engine_logger.error(
|
|
290
|
+
"Invalid flow run id. Expected PREFECT__FLOW_RUN_ID to contain a UUID."
|
|
291
|
+
)
|
|
292
|
+
return 1
|
|
293
|
+
|
|
294
|
+
_run_flow_from_runtime_entrypoint(flow_run_id, args[0])
|
|
295
|
+
return 0
|
|
296
|
+
|
|
297
|
+
|
|
245
298
|
@contextmanager
|
|
246
299
|
def _send_heartbeats(
|
|
247
300
|
engine: "BaseFlowRunEngine[Any, Any]",
|
|
@@ -602,6 +655,32 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
602
655
|
)
|
|
603
656
|
self.short_circuit = True
|
|
604
657
|
|
|
658
|
+
if (
|
|
659
|
+
not self.short_circuit
|
|
660
|
+
and not self._flow_run_name_set
|
|
661
|
+
and self.flow.flow_run_name
|
|
662
|
+
):
|
|
663
|
+
if self.flow_run is None:
|
|
664
|
+
raise ValueError("Flow run not set")
|
|
665
|
+
|
|
666
|
+
with FlowRunContext(
|
|
667
|
+
flow=self.flow,
|
|
668
|
+
flow_run=self.flow_run,
|
|
669
|
+
parameters=self.parameters,
|
|
670
|
+
client=self.client,
|
|
671
|
+
task_runner=self.flow.task_runner,
|
|
672
|
+
result_store=get_result_store().update_for_flow(self.flow, _sync=True),
|
|
673
|
+
):
|
|
674
|
+
flow_run_name = resolve_custom_flow_run_name(
|
|
675
|
+
flow=self.flow, parameters=self.parameters or {}
|
|
676
|
+
)
|
|
677
|
+
self.client.set_flow_run_name(
|
|
678
|
+
flow_run_id=self.flow_run.id, name=flow_run_name
|
|
679
|
+
)
|
|
680
|
+
self.flow_run.name = flow_run_name
|
|
681
|
+
self._flow_run_name_set = True
|
|
682
|
+
self._telemetry.update_run_name(name=flow_run_name)
|
|
683
|
+
|
|
605
684
|
new_state = Running()
|
|
606
685
|
state = self.set_state(new_state)
|
|
607
686
|
while state.is_pending():
|
|
@@ -927,6 +1006,12 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
927
1006
|
if log_prints:
|
|
928
1007
|
stack.enter_context(patch_print())
|
|
929
1008
|
task_runner = stack.enter_context(self.flow.task_runner.duplicate())
|
|
1009
|
+
result_store = get_result_store().update_for_flow(self.flow, _sync=True)
|
|
1010
|
+
persist_result = (
|
|
1011
|
+
self.flow.persist_result
|
|
1012
|
+
if self.flow.persist_result is not None
|
|
1013
|
+
else _get_default_persist_result()
|
|
1014
|
+
)
|
|
930
1015
|
stack.enter_context(
|
|
931
1016
|
FlowRunContext(
|
|
932
1017
|
flow=self.flow,
|
|
@@ -934,13 +1019,9 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
934
1019
|
flow_run=self.flow_run,
|
|
935
1020
|
parameters=self.parameters,
|
|
936
1021
|
client=client,
|
|
937
|
-
result_store=
|
|
938
|
-
self.flow, _sync=True
|
|
939
|
-
),
|
|
1022
|
+
result_store=result_store,
|
|
940
1023
|
task_runner=task_runner,
|
|
941
|
-
persist_result=
|
|
942
|
-
if self.flow.persist_result is not None
|
|
943
|
-
else should_persist_result(),
|
|
1024
|
+
persist_result=persist_result,
|
|
944
1025
|
)
|
|
945
1026
|
)
|
|
946
1027
|
# Set deployment context vars only if this is the top-level deployment run
|
|
@@ -1248,6 +1329,32 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1248
1329
|
)
|
|
1249
1330
|
self.short_circuit = True
|
|
1250
1331
|
|
|
1332
|
+
if (
|
|
1333
|
+
not self.short_circuit
|
|
1334
|
+
and not self._flow_run_name_set
|
|
1335
|
+
and self.flow.flow_run_name
|
|
1336
|
+
):
|
|
1337
|
+
if self.flow_run is None:
|
|
1338
|
+
raise ValueError("Flow run not set")
|
|
1339
|
+
|
|
1340
|
+
with FlowRunContext(
|
|
1341
|
+
flow=self.flow,
|
|
1342
|
+
flow_run=self.flow_run,
|
|
1343
|
+
parameters=self.parameters,
|
|
1344
|
+
client=self.client,
|
|
1345
|
+
task_runner=self.flow.task_runner,
|
|
1346
|
+
result_store=get_result_store().update_for_flow(self.flow, _sync=True),
|
|
1347
|
+
):
|
|
1348
|
+
flow_run_name = resolve_custom_flow_run_name(
|
|
1349
|
+
flow=self.flow, parameters=self.parameters or {}
|
|
1350
|
+
)
|
|
1351
|
+
await self.client.set_flow_run_name(
|
|
1352
|
+
flow_run_id=self.flow_run.id, name=flow_run_name
|
|
1353
|
+
)
|
|
1354
|
+
self.flow_run.name = flow_run_name
|
|
1355
|
+
self._flow_run_name_set = True
|
|
1356
|
+
self._telemetry.update_run_name(name=flow_run_name)
|
|
1357
|
+
|
|
1251
1358
|
new_state = Running()
|
|
1252
1359
|
state = await self.set_state(new_state)
|
|
1253
1360
|
while state.is_pending():
|
|
@@ -1566,6 +1673,12 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1566
1673
|
if log_prints:
|
|
1567
1674
|
stack.enter_context(patch_print())
|
|
1568
1675
|
task_runner = stack.enter_context(self.flow.task_runner.duplicate())
|
|
1676
|
+
result_store = get_result_store().update_for_flow(self.flow, _sync=True)
|
|
1677
|
+
persist_result = (
|
|
1678
|
+
self.flow.persist_result
|
|
1679
|
+
if self.flow.persist_result is not None
|
|
1680
|
+
else await _aget_default_persist_result()
|
|
1681
|
+
)
|
|
1569
1682
|
stack.enter_context(
|
|
1570
1683
|
FlowRunContext(
|
|
1571
1684
|
flow=self.flow,
|
|
@@ -1573,13 +1686,9 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1573
1686
|
flow_run=self.flow_run,
|
|
1574
1687
|
parameters=self.parameters,
|
|
1575
1688
|
client=client,
|
|
1576
|
-
result_store=
|
|
1577
|
-
self.flow, _sync=True
|
|
1578
|
-
),
|
|
1689
|
+
result_store=result_store,
|
|
1579
1690
|
task_runner=task_runner,
|
|
1580
|
-
persist_result=
|
|
1581
|
-
if self.flow.persist_result is not None
|
|
1582
|
-
else should_persist_result(),
|
|
1691
|
+
persist_result=persist_result,
|
|
1583
1692
|
)
|
|
1584
1693
|
)
|
|
1585
1694
|
# Set deployment context vars only if this is the top-level deployment run
|
|
@@ -2119,3 +2228,7 @@ def run_flow_in_subprocess(
|
|
|
2119
2228
|
process.start()
|
|
2120
2229
|
|
|
2121
2230
|
return process
|
|
2231
|
+
|
|
2232
|
+
|
|
2233
|
+
if __name__ == "__main__":
|
|
2234
|
+
raise SystemExit(_main())
|