prefect-client 3.6.30.dev3__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.dev3 → prefect_client-3.6.30.dev4}/PKG-INFO +1 -1
- {prefect_client-3.6.30.dev3 → 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.dev3 → prefect_client-3.6.30.dev4}/src/prefect/flow_engine.py +131 -18
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/flows.py +147 -19
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/results.py +151 -20
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/AGENTS.md +2 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_workspace_starter.py +75 -3
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/concurrency_limits_v2.py +37 -17
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/task_engine.py +8 -6
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/task_runners.py +80 -1
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/AGENTS.md +1 -1
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/visualization.py +18 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/workers/base.py +25 -11
- prefect_client-3.6.30.dev3/src/prefect/_build_info.py +0 -5
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/.gitignore +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/LICENSE +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/README.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/hatch_build.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/pyproject.toml +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/_version_checking.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/context.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/engine.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/futures.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/main.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/serializers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/states.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.30.dev3 → prefect_client-3.6.30.dev4}/src/prefect/workers/utilities.py +0 -0
|
@@ -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
|
|
@@ -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())
|
|
@@ -1886,10 +1886,14 @@ class Flow(Generic[P, R]):
|
|
|
1886
1886
|
return_type=return_type,
|
|
1887
1887
|
)
|
|
1888
1888
|
|
|
1889
|
-
async def avisualize(
|
|
1889
|
+
async def avisualize(
|
|
1890
|
+
self,
|
|
1891
|
+
*args: "P.args",
|
|
1892
|
+
**kwargs: "P.kwargs",
|
|
1893
|
+
) -> None:
|
|
1890
1894
|
"""
|
|
1891
|
-
Generates a
|
|
1892
|
-
|
|
1895
|
+
Generates a visualization representing the current flow. In IPython notebooks,
|
|
1896
|
+
graphviz output is rendered inline, otherwise in a new window as a PNG.
|
|
1893
1897
|
|
|
1894
1898
|
Raises:
|
|
1895
1899
|
- ImportError: If `graphviz` isn't installed.
|
|
@@ -1920,7 +1924,6 @@ class Flow(Generic[P, R]):
|
|
|
1920
1924
|
self.fn(*args, **kwargs)
|
|
1921
1925
|
|
|
1922
1926
|
graph = build_task_dependencies(tracker)
|
|
1923
|
-
|
|
1924
1927
|
visualize_task_dependencies(graph, self.name)
|
|
1925
1928
|
|
|
1926
1929
|
except GraphvizImportError:
|
|
@@ -1945,10 +1948,14 @@ class Flow(Generic[P, R]):
|
|
|
1945
1948
|
raise new_exception
|
|
1946
1949
|
|
|
1947
1950
|
@async_dispatch(avisualize)
|
|
1948
|
-
def visualize(
|
|
1951
|
+
def visualize(
|
|
1952
|
+
self,
|
|
1953
|
+
*args: "P.args",
|
|
1954
|
+
**kwargs: "P.kwargs",
|
|
1955
|
+
) -> None:
|
|
1949
1956
|
"""
|
|
1950
|
-
Generates a
|
|
1951
|
-
|
|
1957
|
+
Generates a visualization representing the current flow. In IPython notebooks,
|
|
1958
|
+
graphviz output is rendered inline, otherwise in a new window as a PNG.
|
|
1952
1959
|
|
|
1953
1960
|
Raises:
|
|
1954
1961
|
- ImportError: If `graphviz` isn't installed.
|
|
@@ -1980,7 +1987,6 @@ class Flow(Generic[P, R]):
|
|
|
1980
1987
|
self.fn(*args, **kwargs)
|
|
1981
1988
|
|
|
1982
1989
|
graph = build_task_dependencies(tracker)
|
|
1983
|
-
|
|
1984
1990
|
visualize_task_dependencies(graph, self.name)
|
|
1985
1991
|
|
|
1986
1992
|
except GraphvizImportError:
|
|
@@ -2004,6 +2010,112 @@ class Flow(Generic[P, R]):
|
|
|
2004
2010
|
new_exception.__traceback__ = e.__traceback__
|
|
2005
2011
|
raise new_exception
|
|
2006
2012
|
|
|
2013
|
+
async def agenerate_mermaid_graph(
|
|
2014
|
+
self,
|
|
2015
|
+
*args: "P.args",
|
|
2016
|
+
**kwargs: "P.kwargs",
|
|
2017
|
+
) -> str:
|
|
2018
|
+
"""
|
|
2019
|
+
Generates a Mermaid flowchart diagram representing the structure of the current
|
|
2020
|
+
flow and returns it as a string.
|
|
2021
|
+
|
|
2022
|
+
Returns:
|
|
2023
|
+
A Mermaid `flowchart TD` diagram string.
|
|
2024
|
+
|
|
2025
|
+
Raises:
|
|
2026
|
+
- FlowVisualizationError: If the flow can't be visualized for any other reason.
|
|
2027
|
+
"""
|
|
2028
|
+
from prefect.utilities.visualization import (
|
|
2029
|
+
FlowVisualizationError,
|
|
2030
|
+
TaskVizTracker,
|
|
2031
|
+
VisualizationUnsupportedError,
|
|
2032
|
+
build_mermaid_dependencies,
|
|
2033
|
+
)
|
|
2034
|
+
|
|
2035
|
+
if not PREFECT_TESTING_UNIT_TEST_MODE:
|
|
2036
|
+
warnings.warn(
|
|
2037
|
+
"`flow.generate_mermaid_graph()` will execute code inside of your flow"
|
|
2038
|
+
" that is not decorated with `@task` or `@flow`."
|
|
2039
|
+
)
|
|
2040
|
+
|
|
2041
|
+
try:
|
|
2042
|
+
with TaskVizTracker() as tracker:
|
|
2043
|
+
if self.isasync:
|
|
2044
|
+
await self.fn(*args, **kwargs) # type: ignore[reportGeneralTypeIssues]
|
|
2045
|
+
else:
|
|
2046
|
+
self.fn(*args, **kwargs)
|
|
2047
|
+
|
|
2048
|
+
return build_mermaid_dependencies(tracker)
|
|
2049
|
+
|
|
2050
|
+
except VisualizationUnsupportedError:
|
|
2051
|
+
raise
|
|
2052
|
+
except FlowVisualizationError:
|
|
2053
|
+
raise
|
|
2054
|
+
except Exception as e:
|
|
2055
|
+
msg = (
|
|
2056
|
+
"It's possible you are trying to visualize a flow that contains "
|
|
2057
|
+
"code that directly interacts with the result of a task"
|
|
2058
|
+
" inside of the flow. \nTry passing a `viz_return_value` "
|
|
2059
|
+
"to the task decorator, e.g. `@task(viz_return_value=[1, 2, 3]).`"
|
|
2060
|
+
)
|
|
2061
|
+
|
|
2062
|
+
new_exception = type(e)(str(e) + "\n" + msg)
|
|
2063
|
+
new_exception.__traceback__ = e.__traceback__
|
|
2064
|
+
raise new_exception
|
|
2065
|
+
|
|
2066
|
+
def generate_mermaid_graph(
|
|
2067
|
+
self,
|
|
2068
|
+
*args: "P.args",
|
|
2069
|
+
**kwargs: "P.kwargs",
|
|
2070
|
+
) -> str:
|
|
2071
|
+
"""
|
|
2072
|
+
Generates a Mermaid flowchart diagram representing the structure of the current
|
|
2073
|
+
flow and returns it as a string.
|
|
2074
|
+
|
|
2075
|
+
Returns:
|
|
2076
|
+
A Mermaid `flowchart TD` diagram string.
|
|
2077
|
+
|
|
2078
|
+
Raises:
|
|
2079
|
+
- FlowVisualizationError: If the flow can't be visualized for any other reason.
|
|
2080
|
+
"""
|
|
2081
|
+
from prefect.utilities.visualization import (
|
|
2082
|
+
FlowVisualizationError,
|
|
2083
|
+
TaskVizTracker,
|
|
2084
|
+
VisualizationUnsupportedError,
|
|
2085
|
+
build_mermaid_dependencies,
|
|
2086
|
+
)
|
|
2087
|
+
|
|
2088
|
+
if not PREFECT_TESTING_UNIT_TEST_MODE:
|
|
2089
|
+
warnings.warn(
|
|
2090
|
+
"`flow.generate_mermaid_graph()` will execute code inside of your flow"
|
|
2091
|
+
" that is not decorated with `@task` or `@flow`."
|
|
2092
|
+
)
|
|
2093
|
+
|
|
2094
|
+
try:
|
|
2095
|
+
with TaskVizTracker() as tracker:
|
|
2096
|
+
if self.isasync:
|
|
2097
|
+
run_coro_as_sync(self.fn(*args, **kwargs))
|
|
2098
|
+
else:
|
|
2099
|
+
self.fn(*args, **kwargs)
|
|
2100
|
+
|
|
2101
|
+
return build_mermaid_dependencies(tracker)
|
|
2102
|
+
|
|
2103
|
+
except VisualizationUnsupportedError:
|
|
2104
|
+
raise
|
|
2105
|
+
except FlowVisualizationError:
|
|
2106
|
+
raise
|
|
2107
|
+
except Exception as e:
|
|
2108
|
+
msg = (
|
|
2109
|
+
"It's possible you are trying to visualize a flow that contains "
|
|
2110
|
+
"code that directly interacts with the result of a task"
|
|
2111
|
+
" inside of the flow. \nTry passing a `viz_return_value` "
|
|
2112
|
+
"to the task decorator, e.g. `@task(viz_return_value=[1, 2, 3]).`"
|
|
2113
|
+
)
|
|
2114
|
+
|
|
2115
|
+
new_exception = type(e)(str(e) + "\n" + msg)
|
|
2116
|
+
new_exception.__traceback__ = e.__traceback__
|
|
2117
|
+
raise new_exception
|
|
2118
|
+
|
|
2007
2119
|
|
|
2008
2120
|
class FlowDecorator:
|
|
2009
2121
|
@overload
|
|
@@ -2542,7 +2654,13 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2542
2654
|
upload_bundle_to_storage,
|
|
2543
2655
|
)
|
|
2544
2656
|
from prefect.context import FlowRunContext, TagsContext
|
|
2545
|
-
from prefect.results import
|
|
2657
|
+
from prefect.results import (
|
|
2658
|
+
_DefaultResultStorageSource,
|
|
2659
|
+
_get_default_result_storage,
|
|
2660
|
+
_result_storage_is_configured_for_remote_retrieval,
|
|
2661
|
+
get_result_store,
|
|
2662
|
+
resolve_result_storage,
|
|
2663
|
+
)
|
|
2546
2664
|
from prefect.states import Pending, Scheduled
|
|
2547
2665
|
from prefect.tasks import Task
|
|
2548
2666
|
|
|
@@ -2563,26 +2681,36 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2563
2681
|
)
|
|
2564
2682
|
|
|
2565
2683
|
current_result_store = get_result_store()
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
current_result_store.result_storage
|
|
2569
|
-
or isinstance(current_result_store.result_storage, LocalFileSystem)
|
|
2684
|
+
if not _result_storage_is_configured_for_remote_retrieval(
|
|
2685
|
+
self.result_storage,
|
|
2686
|
+
current_result_store.result_storage,
|
|
2570
2687
|
):
|
|
2688
|
+
result_storage = None
|
|
2571
2689
|
if (
|
|
2572
2690
|
work_pool.storage_configuration.default_result_storage_block_id
|
|
2573
|
-
is None
|
|
2691
|
+
is not None
|
|
2574
2692
|
):
|
|
2693
|
+
result_storage = resolve_result_storage(
|
|
2694
|
+
work_pool.storage_configuration.default_result_storage_block_id,
|
|
2695
|
+
_sync=True,
|
|
2696
|
+
)
|
|
2697
|
+
else:
|
|
2698
|
+
default_result_storage = _get_default_result_storage()
|
|
2699
|
+
if (
|
|
2700
|
+
default_result_storage.source
|
|
2701
|
+
is not _DefaultResultStorageSource.LOCAL_STORAGE_PATH
|
|
2702
|
+
):
|
|
2703
|
+
result_storage = default_result_storage.storage
|
|
2704
|
+
|
|
2705
|
+
if result_storage is None:
|
|
2575
2706
|
logger.warning(
|
|
2576
2707
|
f"Flow {self.name!r} has no result storage configured. Please configure "
|
|
2577
2708
|
"result storage for the flow if you want to retrieve the result for the flow run."
|
|
2578
2709
|
)
|
|
2710
|
+
flow = self
|
|
2579
2711
|
else:
|
|
2580
|
-
# Use the work pool's default result storage block for the flow run to ensure the caller can retrieve the result
|
|
2581
2712
|
flow = self.with_options(
|
|
2582
|
-
result_storage=
|
|
2583
|
-
work_pool.storage_configuration.default_result_storage_block_id,
|
|
2584
|
-
_sync=True,
|
|
2585
|
-
),
|
|
2713
|
+
result_storage=result_storage,
|
|
2586
2714
|
persist_result=True,
|
|
2587
2715
|
)
|
|
2588
2716
|
else:
|