prefect-client 3.9.1.dev8__tar.gz → 3.9.2__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.9.1.dev8 → prefect_client-3.9.2}/PKG-INFO +1 -1
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/AGENTS.md +2 -1
- prefect_client-3.9.2/src/prefect/_build_info.py +5 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/engine.py +59 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/objects.py +2 -2
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/AGENTS.md +1 -1
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/_leases.py +64 -8
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/filesystems.py +8 -2
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/flow_engine.py +65 -25
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/flow_runs.py +14 -1
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/flows.py +46 -16
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/coiled.py +1 -1
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/modal.py +1 -1
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/input/actions.py +3 -2
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/locking/filesystem.py +9 -4
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/locking/memory.py +10 -5
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/locking/protocol.py +6 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/AGENTS.md +2 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_hook_runner.py +4 -5
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_workspace_resolver.py +4 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_workspace_runtime_bootstrap.py +48 -8
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/storage.py +18 -3
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/deployments.py +11 -2
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/flow_runs.py +21 -9
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/server.py +64 -7
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/work_queues.py +34 -13
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/workers.py +64 -17
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/task_runners.py +10 -1
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/types/_datetime.py +4 -1
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/callables/__init__.py +6 -3
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/collections.py +28 -7
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/importtools.py +10 -2
- prefect_client-3.9.1.dev8/src/prefect/_build_info.py +0 -5
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/.gitignore +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/LICENSE +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/README.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/hatch_build.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/pyproject.toml +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/__main__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/_observation_delivery.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/attempt_control.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/server_maintenance.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/agent.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/automations.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/base.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/context.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/engine.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/related.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/futures.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/main.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/plugins.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/py.typed +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/results.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_uv_command.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_workspace_hook_runner.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_workspace_runtime.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/_workspace_supervisor.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/schedules.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/serializers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/observed_states.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/_types.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/states.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/tasks.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/transactions.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/types/_datetime_deprecations.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/types/names.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/variables.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/workers/utilities.py +0 -0
|
@@ -29,7 +29,7 @@ Runtime flow/task parameter values must come from `utilities.callables.get_call_
|
|
|
29
29
|
- **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.
|
|
30
30
|
- **Event and log WebSocket subscribers are parallel implementations.** `events/clients.py::PrefectEventSubscriber` and `logging/clients.py::PrefectLogsSubscriber` duplicate the same reconnect/backoff/dedup logic, including the `reconnect_on_clean_close` option (used by `events/subscribers.py::FlowRunSubscriber` so a clean disconnect doesn't hide a terminal event). Mirror any reconnection-behavior change across both.
|
|
31
31
|
- **Flow run observers own their stream recovery.** `_internal/observers.py` observers create subscribers with `reconnection_attempts=0` and delegate polling fallback, reconnect backoff, and setup deadlines to `_internal/_observation_delivery.py::ObservationDelivery`. Subscribers close any socket left by a failed or cancelled `__aenter__`, since callers never exit a context that failed to enter.
|
|
32
|
-
- **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `prefect-client` depends on `whenever` only on Python 3.13+, so modules it ships must keep `whenever` imports behind `sys.version_info >= (3, 13)`; only
|
|
32
|
+
- **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `prefect-client` depends on `whenever` only on Python 3.13+, so modules it ships must keep `whenever` imports behind `sys.version_info >= (3, 13)`; only code that the client build strips may import it unconditionally (see the repo-root `client/AGENTS.md`). `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences across supported whenever releases. Version-specific code is guarded by feature-detection flags (`_WHENEVER_NEW_API` for ≥ 0.10.0, `_SYSTEM_TZ` for ≥ 0.11), not version checks. These flags are only probed on Python 3.13+ (`_WHENEVER_NEW_API` is `False` and `_SYSTEM_TZ` is undefined on 3.11/3.12), so a helper that server-only code calls on every Python must feature-detect on the `whenever` class itself. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Likewise avoid `.assume_system_tz()`/`.to_system_tz()` (deprecated in 0.11; the warning fails tests under `filterwarnings = error`) — use `in_local_tz()` — and direct `DateTimeDelta` imports (removed in 0.11) — use the `Interval` alias. Violations will silently break on whichever whenever version the helpers weren't written for.
|
|
33
33
|
- **Call Pendulum-only members via `types/_datetime.py::_pendulum_call` on Python 3.11/3.12.** Prefect's `DateTime`/`Date`/`Duration` wrap Pendulum-only members (and some shared stdlib methods like `replace`) with user-facing deprecation warnings; `_pendulum_call` bypasses them so users only see warnings for their own calls. `pyproject.toml` ignores these warnings in pytest, so direct calls from Prefect code pass tests silently unless covered by the guards in `tests/test_datetime.py`.
|
|
34
34
|
- **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.
|
|
35
35
|
- **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.
|
|
@@ -41,6 +41,7 @@ Runtime flow/task parameter values must come from `utilities.callables.get_call_
|
|
|
41
41
|
- **`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.
|
|
42
42
|
- **`ResultRecord` must be marked persisted after every storage write.** `ResultStore` calls `mark_persisted()` on every record it writes; `to_state_create` in `states.py` consults `is_persisted` as a fallback when `should_persist_result()` returns `False` (e.g., after run context teardown). Any new sync or async persist path that omits `mark_persisted()` will silently drop state metadata for already-written results.
|
|
43
43
|
- **Flow-run suspension is enforced at orchestration boundaries.** Suspension is delivered via `FlowRunSuspensionRequest` and raised with `raise_if_flow_run_suspension_requested()`. When changing engines, futures, task runners, or generator execution, check before returning control to flow user code or proposing a flow state that could leave `Suspended`; keep sync/async paths aligned and avoid per-boundary API reads.
|
|
44
|
+
- **Flow state hooks accept the same signatures on every execution path.** The sync and async flow engines and `runner/_hook_runner.py` share `_internal/engine.py::resolve_flow_hook_arguments`; `runner/_workspace_runtime_bootstrap.py` keeps its own copy because it may run under an older Prefect. Change the shared function and the copy together.
|
|
44
45
|
- **Subflow tracking tasks use UUID dynamic keys when called from within a submitted task.** `flow_engine.py` marks the synthetic tracking `Task` with `_is_subflow_tracking_task=True`; `tasks.py` checks this flag to assign UUID-based (unstable) `dynamic_key` values when the tracking task runs inside a submitted task context. This prevents key collisions between concurrent sibling subflows on parent-flow retry. Direct subflow calls (no enclosing task context) keep stable sequential keys to preserve the retry optimization that reuses completed subflow results.
|
|
45
46
|
|
|
46
47
|
## Logging
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Internal engine utilities"""
|
|
2
2
|
|
|
3
|
+
import inspect
|
|
3
4
|
from collections.abc import Callable
|
|
4
5
|
from functools import partial
|
|
5
6
|
from typing import TYPE_CHECKING, Any, Union
|
|
@@ -9,6 +10,9 @@ from prefect.context import FlowRunContext
|
|
|
9
10
|
from prefect.flows import Flow
|
|
10
11
|
from prefect.tasks import Task, TaskRunNameCallbackWithParameters
|
|
11
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from prefect.client.schemas.objects import FlowRun, State
|
|
15
|
+
|
|
12
16
|
|
|
13
17
|
def dynamic_key_for_task_run(
|
|
14
18
|
context: FlowRunContext, task: "Task[..., Any]", stable: bool = True
|
|
@@ -93,3 +97,58 @@ def get_hook_name(hook: Callable[..., Any]) -> str:
|
|
|
93
97
|
hook.func.__name__ if isinstance(hook, partial) else hook.__class__.__name__
|
|
94
98
|
)
|
|
95
99
|
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def resolve_flow_hook_arguments(
|
|
103
|
+
hook: Callable[..., Any],
|
|
104
|
+
flow: "Flow[..., Any]",
|
|
105
|
+
flow_run: "FlowRun",
|
|
106
|
+
state: "State",
|
|
107
|
+
) -> tuple[tuple[Any, ...], dict[str, Any]]:
|
|
108
|
+
"""
|
|
109
|
+
Return the positional and keyword arguments to call a flow state hook with,
|
|
110
|
+
checking its signature without calling it.
|
|
111
|
+
|
|
112
|
+
A hook that names its parameters `flow`, `flow_run` (or `run`) and `state`
|
|
113
|
+
gets them by name, in any order and including keyword-only parameters.
|
|
114
|
+
Otherwise, a hook that takes three positional arguments gets them in that
|
|
115
|
+
order, whatever their names, and a hook that only takes keyword arguments
|
|
116
|
+
gets them by name.
|
|
117
|
+
|
|
118
|
+
Raises:
|
|
119
|
+
TypeError: if the hook accepts none of these forms.
|
|
120
|
+
"""
|
|
121
|
+
try:
|
|
122
|
+
signature = inspect.signature(hook)
|
|
123
|
+
except (TypeError, ValueError):
|
|
124
|
+
return (flow, flow_run, state), {}
|
|
125
|
+
|
|
126
|
+
def binds(*args: Any, **kwargs: Any) -> bool:
|
|
127
|
+
try:
|
|
128
|
+
signature.bind(*args, **kwargs)
|
|
129
|
+
except TypeError:
|
|
130
|
+
return False
|
|
131
|
+
return True
|
|
132
|
+
|
|
133
|
+
named = (inspect.Parameter.POSITIONAL_OR_KEYWORD, inspect.Parameter.KEYWORD_ONLY)
|
|
134
|
+
for flow_run_name in ("flow_run", "run"):
|
|
135
|
+
kwargs = {"flow": flow, flow_run_name: flow_run, "state": state}
|
|
136
|
+
declared = all(
|
|
137
|
+
name in signature.parameters and signature.parameters[name].kind in named
|
|
138
|
+
for name in kwargs
|
|
139
|
+
)
|
|
140
|
+
if declared and binds(**kwargs):
|
|
141
|
+
return (), kwargs
|
|
142
|
+
|
|
143
|
+
if binds(flow, flow_run, state):
|
|
144
|
+
return (flow, flow_run, state), {}
|
|
145
|
+
|
|
146
|
+
kwargs = {"flow": flow, "flow_run": flow_run, "state": state}
|
|
147
|
+
if binds(**kwargs):
|
|
148
|
+
return (), kwargs
|
|
149
|
+
|
|
150
|
+
raise TypeError(
|
|
151
|
+
f"Hook {get_hook_name(hook)!r} must accept the flow, the flow run and the"
|
|
152
|
+
" state as three positional arguments or as parameters named `flow`,"
|
|
153
|
+
" `flow_run` (or `run`) and `state`"
|
|
154
|
+
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import datetime
|
|
4
|
+
import json
|
|
4
5
|
import warnings
|
|
5
6
|
from collections.abc import Callable, Mapping
|
|
6
7
|
from enum import Enum
|
|
@@ -17,7 +18,6 @@ from typing import (
|
|
|
17
18
|
)
|
|
18
19
|
from uuid import UUID
|
|
19
20
|
|
|
20
|
-
import orjson
|
|
21
21
|
from pydantic import (
|
|
22
22
|
AfterValidator,
|
|
23
23
|
ConfigDict,
|
|
@@ -1768,7 +1768,7 @@ class FlowRunInput(ObjectBaseModel):
|
|
|
1768
1768
|
Returns:
|
|
1769
1769
|
Any: the decoded value
|
|
1770
1770
|
"""
|
|
1771
|
-
return
|
|
1771
|
+
return json.loads(self.value)
|
|
1772
1772
|
|
|
1773
1773
|
|
|
1774
1774
|
class GlobalConcurrencyLimit(ObjectBaseModel):
|
|
@@ -18,7 +18,7 @@ Does NOT define concurrency limits (server-side in `server/`). Does NOT handle t
|
|
|
18
18
|
|
|
19
19
|
**`raise_on_lease_renewal_failure` (public parameter):** Controls lease renewal failure behavior independently from `strict`. When `None` (default), falls back to the value of `strict` for backward compatibility. Set to `False` to let long-running tasks continue even if a transient renewal error occurs; set to `True` to terminate immediately on renewal failure regardless of `strict`. This means `strict=True, raise_on_lease_renewal_failure=False` gives strict slot acquisition but non-fatal renewal failures, and vice versa.
|
|
20
20
|
|
|
21
|
-
**Lease renewal:** `_leases.py` starts a daemon thread that renews immediately on entry, then waits for 75% of `lease_duration` between renewals. The renewal thread uses the standard `get_client(sync_client=True)` path and retries each renewal up to 3 times with exponential backoff. If all attempts fail, a shared failure handler either cancels execution with the existing sync/async cancel scope or logs a warning, depending on `raise_on_lease_renewal_failure`.
|
|
21
|
+
**Lease renewal:** `_leases.py` starts a daemon thread that renews immediately on entry, then waits for 75% of `lease_duration` between renewals. The renewal thread uses the standard `get_client(sync_client=True)` path and retries each renewal up to 3 times with exponential backoff. If all attempts fail, a shared failure handler either cancels execution with the existing sync/async cancel scope or logs a warning, depending on `raise_on_lease_renewal_failure`. Exception: when a `flow_run_id` is given and renewal fails with `410 Gone`, the thread reads the flow run and stops without cancelling if its server state is final, because the terminal transition releases the lease before the engine receives the proposal response.
|
|
22
22
|
|
|
23
23
|
**Sync/async lockstep invariant:** `asyncio.py`/`sync.py` and `_asyncio.py`/`_sync.py` are parallel implementations. Any behavior change to one must be mirrored in the other.
|
|
24
24
|
|
|
@@ -4,6 +4,9 @@ from contextlib import asynccontextmanager, contextmanager
|
|
|
4
4
|
from typing import TYPE_CHECKING, AsyncGenerator, Generator
|
|
5
5
|
from uuid import UUID
|
|
6
6
|
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from prefect._internal.compatibility.starlette import status
|
|
7
10
|
from prefect._internal.concurrency.cancellation import (
|
|
8
11
|
AsyncCancelScope,
|
|
9
12
|
WatcherThreadCancelScope,
|
|
@@ -90,6 +93,45 @@ def _lease_renewal_loop(
|
|
|
90
93
|
stop_event.wait(lease_duration * _RENEWAL_FRACTION)
|
|
91
94
|
|
|
92
95
|
|
|
96
|
+
def _lease_released_by_final_flow_run(
|
|
97
|
+
exc: BaseException, lease_id: UUID, flow_run_id: UUID | None
|
|
98
|
+
) -> bool:
|
|
99
|
+
"""
|
|
100
|
+
Check whether a lease renewal failure is explained by the flow run having
|
|
101
|
+
reached a final state on the server, which releases the lease before the
|
|
102
|
+
engine has received the response to its terminal state proposal.
|
|
103
|
+
"""
|
|
104
|
+
if flow_run_id is None or not (
|
|
105
|
+
isinstance(exc, httpx.HTTPStatusError)
|
|
106
|
+
and exc.response.status_code == status.HTTP_410_GONE
|
|
107
|
+
):
|
|
108
|
+
return False
|
|
109
|
+
|
|
110
|
+
logger = get_logger("concurrency")
|
|
111
|
+
try:
|
|
112
|
+
with get_client(sync_client=True) as client:
|
|
113
|
+
flow_run = client.read_flow_run(flow_run_id)
|
|
114
|
+
except Exception:
|
|
115
|
+
logger.debug(
|
|
116
|
+
"Failed to read flow run %s after its concurrency lease was not found",
|
|
117
|
+
flow_run_id,
|
|
118
|
+
exc_info=True,
|
|
119
|
+
)
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
if flow_run.state is None or not flow_run.state.is_final():
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
logger.debug(
|
|
126
|
+
"Concurrency lease %s was released because flow run %s reached final "
|
|
127
|
+
"state %s; stopping lease renewal",
|
|
128
|
+
lease_id,
|
|
129
|
+
flow_run_id,
|
|
130
|
+
flow_run.state.type.value,
|
|
131
|
+
)
|
|
132
|
+
return True
|
|
133
|
+
|
|
134
|
+
|
|
93
135
|
def _handle_lease_renewal_failure(
|
|
94
136
|
exc: BaseException,
|
|
95
137
|
lease_id: UUID,
|
|
@@ -139,6 +181,7 @@ def _start_lease_renewal_thread(
|
|
|
139
181
|
raise_on_lease_renewal_failure: bool,
|
|
140
182
|
suppress_warnings: bool,
|
|
141
183
|
cancel_scope: AsyncCancelScope | WatcherThreadCancelScope,
|
|
184
|
+
flow_run_id: UUID | None = None,
|
|
142
185
|
) -> tuple[threading.Event, threading.Thread]:
|
|
143
186
|
stop_event = threading.Event()
|
|
144
187
|
renewal_ctx = contextvars.copy_context()
|
|
@@ -152,14 +195,17 @@ def _start_lease_renewal_thread(
|
|
|
152
195
|
try:
|
|
153
196
|
_lease_renewal_loop(lease_id, lease_duration, stop_event)
|
|
154
197
|
except Exception as exc:
|
|
155
|
-
if
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
198
|
+
if stop_event.is_set() or _lease_released_by_final_flow_run(
|
|
199
|
+
exc, lease_id, flow_run_id
|
|
200
|
+
):
|
|
201
|
+
return
|
|
202
|
+
_handle_lease_renewal_failure(
|
|
203
|
+
exc,
|
|
204
|
+
lease_id,
|
|
205
|
+
raise_on_lease_renewal_failure,
|
|
206
|
+
suppress_warnings,
|
|
207
|
+
cancel_scope,
|
|
208
|
+
)
|
|
163
209
|
|
|
164
210
|
def renewal_loop() -> None:
|
|
165
211
|
renewal_ctx.run(_run_with_failure_handler)
|
|
@@ -179,6 +225,7 @@ def maintain_concurrency_lease(
|
|
|
179
225
|
lease_duration: float,
|
|
180
226
|
raise_on_lease_renewal_failure: bool = False,
|
|
181
227
|
suppress_warnings: bool = False,
|
|
228
|
+
flow_run_id: UUID | None = None,
|
|
182
229
|
) -> Generator[None, None, None]:
|
|
183
230
|
"""
|
|
184
231
|
Maintain a concurrency lease for the given lease ID.
|
|
@@ -187,6 +234,9 @@ def maintain_concurrency_lease(
|
|
|
187
234
|
lease_id: The ID of the lease to maintain.
|
|
188
235
|
lease_duration: The duration of the lease in seconds.
|
|
189
236
|
raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
|
|
237
|
+
flow_run_id: The ID of the flow run holding the lease. When the lease is
|
|
238
|
+
not found and this flow run is final on the server, the lease was
|
|
239
|
+
released by the terminal transition and execution is not terminated.
|
|
190
240
|
"""
|
|
191
241
|
with WatcherThreadCancelScope() as cancel_scope:
|
|
192
242
|
stop_event: threading.Event | None = None
|
|
@@ -198,6 +248,7 @@ def maintain_concurrency_lease(
|
|
|
198
248
|
raise_on_lease_renewal_failure,
|
|
199
249
|
suppress_warnings,
|
|
200
250
|
cancel_scope,
|
|
251
|
+
flow_run_id,
|
|
201
252
|
)
|
|
202
253
|
yield
|
|
203
254
|
finally:
|
|
@@ -213,6 +264,7 @@ async def amaintain_concurrency_lease(
|
|
|
213
264
|
lease_duration: float,
|
|
214
265
|
raise_on_lease_renewal_failure: bool = False,
|
|
215
266
|
suppress_warnings: bool = False,
|
|
267
|
+
flow_run_id: UUID | None = None,
|
|
216
268
|
) -> AsyncGenerator[None, None]:
|
|
217
269
|
"""
|
|
218
270
|
Maintain a concurrency lease for the given lease ID.
|
|
@@ -221,6 +273,9 @@ async def amaintain_concurrency_lease(
|
|
|
221
273
|
lease_id: The ID of the lease to maintain.
|
|
222
274
|
lease_duration: The duration of the lease in seconds.
|
|
223
275
|
raise_on_lease_renewal_failure: A boolean specifying whether to raise an error if the lease renewal fails.
|
|
276
|
+
flow_run_id: The ID of the flow run holding the lease. When the lease is
|
|
277
|
+
not found and this flow run is final on the server, the lease was
|
|
278
|
+
released by the terminal transition and execution is not terminated.
|
|
224
279
|
"""
|
|
225
280
|
with AsyncCancelScope() as cancel_scope:
|
|
226
281
|
stop_event: threading.Event | None = None
|
|
@@ -231,6 +286,7 @@ async def amaintain_concurrency_lease(
|
|
|
231
286
|
raise_on_lease_renewal_failure,
|
|
232
287
|
suppress_warnings,
|
|
233
288
|
cancel_scope,
|
|
289
|
+
flow_run_id,
|
|
234
290
|
)
|
|
235
291
|
yield
|
|
236
292
|
finally:
|
|
@@ -547,7 +547,10 @@ class RemoteFileSystem(WritableFileSystem, WritableDeploymentStorage):
|
|
|
547
547
|
counter = 0
|
|
548
548
|
for f in Path(local_path).rglob("*"):
|
|
549
549
|
relative_path = f.relative_to(local_path)
|
|
550
|
-
if
|
|
550
|
+
if (
|
|
551
|
+
included_files is not None
|
|
552
|
+
and relative_path.as_posix() not in included_files
|
|
553
|
+
):
|
|
551
554
|
continue
|
|
552
555
|
|
|
553
556
|
if to_path.endswith("/"):
|
|
@@ -603,7 +606,10 @@ class RemoteFileSystem(WritableFileSystem, WritableDeploymentStorage):
|
|
|
603
606
|
counter = 0
|
|
604
607
|
for f in Path(local_path).rglob("*"):
|
|
605
608
|
relative_path = f.relative_to(local_path)
|
|
606
|
-
if
|
|
609
|
+
if (
|
|
610
|
+
included_files is not None
|
|
611
|
+
and relative_path.as_posix() not in included_files
|
|
612
|
+
):
|
|
607
613
|
continue
|
|
608
614
|
|
|
609
615
|
if to_path.endswith("/"):
|
|
@@ -11,7 +11,7 @@ import signal
|
|
|
11
11
|
import sys
|
|
12
12
|
import threading
|
|
13
13
|
import time
|
|
14
|
-
from collections.abc import Mapping
|
|
14
|
+
from collections.abc import Callable, Mapping
|
|
15
15
|
from contextlib import (
|
|
16
16
|
AsyncExitStack,
|
|
17
17
|
ExitStack,
|
|
@@ -59,7 +59,11 @@ from prefect._internal.control_listener import (
|
|
|
59
59
|
get_intent,
|
|
60
60
|
report_engine_outcome,
|
|
61
61
|
)
|
|
62
|
-
from prefect._internal.engine import
|
|
62
|
+
from prefect._internal.engine import (
|
|
63
|
+
get_hook_name,
|
|
64
|
+
resolve_custom_flow_run_name,
|
|
65
|
+
resolve_flow_hook_arguments,
|
|
66
|
+
)
|
|
63
67
|
from prefect._internal.metrics import RunMetrics
|
|
64
68
|
from prefect.client.orchestration import PrefectClient, SyncPrefectClient, get_client
|
|
65
69
|
from prefect.client.schemas import FlowRun, TaskRun
|
|
@@ -330,28 +334,40 @@ def _send_heartbeats(
|
|
|
330
334
|
resource, related = engine._build_heartbeat_event_template()
|
|
331
335
|
|
|
332
336
|
stop_event = threading.Event()
|
|
337
|
+
# The heartbeat thread checks for a stop and emits while holding this lock,
|
|
338
|
+
# so once `stop_heartbeats` returns, no heartbeat is mid-emit and none will
|
|
339
|
+
# be emitted.
|
|
340
|
+
emit_lock = threading.Lock()
|
|
333
341
|
|
|
334
|
-
def
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
if (
|
|
338
|
-
engine.flow_run
|
|
339
|
-
and engine.flow_run.state
|
|
340
|
-
and engine.flow_run.state.is_final()
|
|
341
|
-
):
|
|
342
|
-
engine.logger.debug("Flow run in terminal state, stopping heartbeat")
|
|
343
|
-
return
|
|
342
|
+
def stop_heartbeats() -> None:
|
|
343
|
+
with emit_lock:
|
|
344
|
+
stop_event.set()
|
|
344
345
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
engine.logger.debug("Failed to emit heartbeat", exc_info=True)
|
|
349
|
-
|
|
350
|
-
# Sleep in increments to allow quick shutdown
|
|
351
|
-
for _ in range(heartbeat_seconds):
|
|
346
|
+
def heartbeat_loop() -> None:
|
|
347
|
+
while True:
|
|
348
|
+
with emit_lock:
|
|
352
349
|
if stop_event.is_set():
|
|
353
350
|
return
|
|
354
|
-
|
|
351
|
+
|
|
352
|
+
# Check state before emitting - don't emit if final
|
|
353
|
+
if (
|
|
354
|
+
engine.flow_run
|
|
355
|
+
and engine.flow_run.state
|
|
356
|
+
and engine.flow_run.state.is_final()
|
|
357
|
+
):
|
|
358
|
+
engine.logger.debug(
|
|
359
|
+
"Flow run in terminal state, stopping heartbeat"
|
|
360
|
+
)
|
|
361
|
+
return
|
|
362
|
+
|
|
363
|
+
try:
|
|
364
|
+
engine._emit_flow_run_heartbeat(resource, related)
|
|
365
|
+
except Exception:
|
|
366
|
+
engine.logger.debug("Failed to emit heartbeat", exc_info=True)
|
|
367
|
+
|
|
368
|
+
# Waiting on the event wakes the thread as soon as heartbeats stop
|
|
369
|
+
if stop_event.wait(heartbeat_seconds):
|
|
370
|
+
return
|
|
355
371
|
|
|
356
372
|
# Copy the current context so the heartbeat thread sees the same
|
|
357
373
|
# `SettingsContext` (and therefore the same `PREFECT_API_URL`) as the
|
|
@@ -366,13 +382,14 @@ def _send_heartbeats(
|
|
|
366
382
|
thread = threading.Thread(
|
|
367
383
|
target=heartbeat_ctx.run, args=(heartbeat_loop,), daemon=True
|
|
368
384
|
)
|
|
385
|
+
engine._stop_heartbeats = stop_heartbeats
|
|
369
386
|
thread.start()
|
|
370
387
|
engine.logger.debug("Started flow run heartbeat context")
|
|
371
388
|
|
|
372
389
|
try:
|
|
373
390
|
yield
|
|
374
391
|
finally:
|
|
375
|
-
|
|
392
|
+
stop_heartbeats()
|
|
376
393
|
if join_on_exit:
|
|
377
394
|
thread.join(timeout=2)
|
|
378
395
|
engine.logger.debug("Stopped flow run heartbeat context")
|
|
@@ -424,6 +441,15 @@ class BaseFlowRunEngine(Generic[P, R]):
|
|
|
424
441
|
default_factory=FlowRunSuspensionRequest
|
|
425
442
|
)
|
|
426
443
|
_attempt_conclusion: EngineOutcomeReceipt | None = field(default=None, init=False)
|
|
444
|
+
# Stops the heartbeat thread started by the most recent `_send_heartbeats`.
|
|
445
|
+
# `set_state` calls it before proposing a terminal state: the server
|
|
446
|
+
# timestamps that state when it accepts it, but the heartbeat thread sees
|
|
447
|
+
# it only after the response arrives. A heartbeat sent in that gap occurs
|
|
448
|
+
# after the terminal state, and an automation that expects every heartbeat
|
|
449
|
+
# to be followed by another event then fires on the finished run.
|
|
450
|
+
_stop_heartbeats: Callable[[], None] | None = field(
|
|
451
|
+
default=None, init=False, repr=False
|
|
452
|
+
)
|
|
427
453
|
|
|
428
454
|
def __post_init__(self) -> None:
|
|
429
455
|
if self.flow is None and self.flow_run_id is None:
|
|
@@ -757,6 +783,9 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
757
783
|
if self.short_circuit:
|
|
758
784
|
return self.state
|
|
759
785
|
|
|
786
|
+
if state.is_final() and self._stop_heartbeats is not None:
|
|
787
|
+
self._stop_heartbeats()
|
|
788
|
+
|
|
760
789
|
state = propose_state_sync(
|
|
761
790
|
self.client, state, flow_run_id=self.flow_run.id, force=force
|
|
762
791
|
) # type: ignore
|
|
@@ -1072,7 +1101,8 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1072
1101
|
f"Running hook {hook_name!r} in response to entering state"
|
|
1073
1102
|
f" {state.name!r}"
|
|
1074
1103
|
)
|
|
1075
|
-
|
|
1104
|
+
args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
|
|
1105
|
+
result = hook(*args, **kwargs)
|
|
1076
1106
|
if asyncio.iscoroutine(result):
|
|
1077
1107
|
run_coro_as_sync(result)
|
|
1078
1108
|
except Exception:
|
|
@@ -1137,7 +1167,10 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1137
1167
|
if lease_id := self.state.state_details.deployment_concurrency_lease_id:
|
|
1138
1168
|
stack.enter_context(
|
|
1139
1169
|
maintain_concurrency_lease(
|
|
1140
|
-
lease_id,
|
|
1170
|
+
lease_id,
|
|
1171
|
+
300,
|
|
1172
|
+
raise_on_lease_renewal_failure=True,
|
|
1173
|
+
flow_run_id=self.flow_run.id,
|
|
1141
1174
|
)
|
|
1142
1175
|
)
|
|
1143
1176
|
|
|
@@ -1492,6 +1525,9 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1492
1525
|
if self.short_circuit:
|
|
1493
1526
|
return self.state
|
|
1494
1527
|
|
|
1528
|
+
if state.is_final() and self._stop_heartbeats is not None:
|
|
1529
|
+
self._stop_heartbeats()
|
|
1530
|
+
|
|
1495
1531
|
state = await propose_state(
|
|
1496
1532
|
self.client, state, flow_run_id=self.flow_run.id, force=force
|
|
1497
1533
|
) # type: ignore
|
|
@@ -1800,7 +1836,8 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1800
1836
|
f"Running hook {hook_name!r} in response to entering state"
|
|
1801
1837
|
f" {state.name!r}"
|
|
1802
1838
|
)
|
|
1803
|
-
|
|
1839
|
+
args, kwargs = resolve_flow_hook_arguments(hook, flow, flow_run, state)
|
|
1840
|
+
result = hook(*args, **kwargs)
|
|
1804
1841
|
if asyncio.iscoroutine(result):
|
|
1805
1842
|
await result
|
|
1806
1843
|
except Exception:
|
|
@@ -1865,7 +1902,10 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1865
1902
|
if lease_id := self.state.state_details.deployment_concurrency_lease_id:
|
|
1866
1903
|
await stack.enter_async_context(
|
|
1867
1904
|
amaintain_concurrency_lease(
|
|
1868
|
-
lease_id,
|
|
1905
|
+
lease_id,
|
|
1906
|
+
300,
|
|
1907
|
+
raise_on_lease_renewal_failure=True,
|
|
1908
|
+
flow_run_id=self.flow_run.id,
|
|
1869
1909
|
)
|
|
1870
1910
|
)
|
|
1871
1911
|
|
|
@@ -133,6 +133,7 @@ async def wait_for_flow_run(
|
|
|
133
133
|
)
|
|
134
134
|
|
|
135
135
|
with anyio.move_on_after(timeout):
|
|
136
|
+
received_final_event = False
|
|
136
137
|
async with get_events_subscriber(filter=event_filter) as subscriber:
|
|
137
138
|
flow_run = await client.read_flow_run(flow_run_id)
|
|
138
139
|
if flow_run.state and flow_run.state.is_final():
|
|
@@ -151,7 +152,19 @@ async def wait_for_flow_run(
|
|
|
151
152
|
logger.info(f"Flow run is in state {state.name!r}")
|
|
152
153
|
|
|
153
154
|
if state.is_final():
|
|
154
|
-
|
|
155
|
+
received_final_event = True
|
|
156
|
+
break
|
|
157
|
+
|
|
158
|
+
if received_final_event:
|
|
159
|
+
# A final state event can be delivered before the state change is
|
|
160
|
+
# visible to API reads, so read until the run reports a final state
|
|
161
|
+
poll_delay = 0.1
|
|
162
|
+
while True:
|
|
163
|
+
flow_run = await client.read_flow_run(flow_run_id)
|
|
164
|
+
if flow_run.state and flow_run.state.is_final():
|
|
165
|
+
return flow_run
|
|
166
|
+
await anyio.sleep(poll_delay)
|
|
167
|
+
poll_delay = min(poll_delay * 2, 5)
|
|
155
168
|
|
|
156
169
|
raise FlowRunWaitTimeout(
|
|
157
170
|
f"Flow run with ID {flow_run_id} exceeded watch timeout of {timeout} seconds"
|
|
@@ -121,15 +121,22 @@ F = TypeVar("F", bound="Flow[Any, Any]") # The type of the flow
|
|
|
121
121
|
class FlowStateHook(Protocol, Generic[P, R]):
|
|
122
122
|
"""
|
|
123
123
|
A callable that is invoked when a flow enters a given state.
|
|
124
|
+
|
|
125
|
+
It receives the flow, the flow run, and the state as its first three
|
|
126
|
+
parameters, whatever their names. A hook whose parameters are named `flow`,
|
|
127
|
+
`flow_run` (or `run`), and `state` receives them by name instead.
|
|
124
128
|
"""
|
|
125
129
|
|
|
126
130
|
__name__: str
|
|
127
131
|
|
|
128
132
|
def __call__(
|
|
129
|
-
self, flow: Flow[P, R], flow_run: FlowRun, state: State
|
|
133
|
+
self, flow: Flow[P, R], flow_run: FlowRun, state: State, /
|
|
130
134
|
) -> Awaitable[None] | None: ...
|
|
131
135
|
|
|
132
136
|
|
|
137
|
+
_FlowStateHookT = TypeVar("_FlowStateHookT", bound="FlowStateHook[..., Any]")
|
|
138
|
+
|
|
139
|
+
|
|
133
140
|
if TYPE_CHECKING:
|
|
134
141
|
import logging
|
|
135
142
|
|
|
@@ -593,6 +600,11 @@ class Flow(Generic[P, R]):
|
|
|
593
600
|
Validate parameters for compatibility with the flow by attempting to cast the inputs to the
|
|
594
601
|
associated types specified by the function's type annotations.
|
|
595
602
|
|
|
603
|
+
Resolve saved block references by UUID or by a dictionary containing
|
|
604
|
+
`block_document_id` or `block_document_slug`. UUID strings, including UUID
|
|
605
|
+
URNs, retain their block-reference meaning. Other `$ref` values, such as
|
|
606
|
+
JSON Schema paths and URLs, are preserved as parameter data.
|
|
607
|
+
|
|
596
608
|
Returns:
|
|
597
609
|
A new dict of parameters that have been cast to the appropriate types
|
|
598
610
|
|
|
@@ -601,11 +613,24 @@ class Flow(Generic[P, R]):
|
|
|
601
613
|
"""
|
|
602
614
|
|
|
603
615
|
def resolve_block_reference(data: Any | dict[str, Any]) -> Any:
|
|
604
|
-
if isinstance(data, dict)
|
|
605
|
-
|
|
616
|
+
if not isinstance(data, dict) or "$ref" not in data:
|
|
617
|
+
return data
|
|
606
618
|
|
|
607
|
-
|
|
608
|
-
|
|
619
|
+
ref = data["$ref"]
|
|
620
|
+
if isinstance(ref, str):
|
|
621
|
+
try:
|
|
622
|
+
UUID(ref)
|
|
623
|
+
except ValueError:
|
|
624
|
+
return data
|
|
625
|
+
elif not isinstance(ref, UUID) and not (
|
|
626
|
+
isinstance(ref, dict)
|
|
627
|
+
and ("block_document_id" in ref or "block_document_slug" in ref)
|
|
628
|
+
):
|
|
629
|
+
return data
|
|
630
|
+
|
|
631
|
+
from prefect.blocks.core import Block
|
|
632
|
+
|
|
633
|
+
return Block.load_from_ref(ref, _sync=True)
|
|
609
634
|
|
|
610
635
|
try:
|
|
611
636
|
parameters = visit_collection(
|
|
@@ -706,11 +731,11 @@ class Flow(Generic[P, R]):
|
|
|
706
731
|
from fastapi.encoders import jsonable_encoder
|
|
707
732
|
|
|
708
733
|
serialized_parameters[key] = jsonable_encoder(value)
|
|
709
|
-
except
|
|
710
|
-
# `jsonable_encoder`
|
|
711
|
-
#
|
|
712
|
-
#
|
|
713
|
-
#
|
|
734
|
+
except Exception:
|
|
735
|
+
# `jsonable_encoder` can raise arbitrary errors for values it
|
|
736
|
+
# cannot encode (e.g. `RecursionError` for self-referential
|
|
737
|
+
# objects, or any error from `__reduce__` while deep-copying a
|
|
738
|
+
# dataclass). Fall back to the placeholder below.
|
|
714
739
|
logger.debug(
|
|
715
740
|
f"Parameter {key!r} for flow {self.name!r} is unserializable. "
|
|
716
741
|
f"Type {type(value).__name__!r} and will not be stored "
|
|
@@ -1004,23 +1029,23 @@ class Flow(Generic[P, R]):
|
|
|
1004
1029
|
_sla=_sla,
|
|
1005
1030
|
)
|
|
1006
1031
|
|
|
1007
|
-
def on_completion(self, fn:
|
|
1032
|
+
def on_completion(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1008
1033
|
self.on_completion_hooks.append(fn)
|
|
1009
1034
|
return fn
|
|
1010
1035
|
|
|
1011
|
-
def on_cancellation(self, fn:
|
|
1036
|
+
def on_cancellation(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1012
1037
|
self.on_cancellation_hooks.append(fn)
|
|
1013
1038
|
return fn
|
|
1014
1039
|
|
|
1015
|
-
def on_crashed(self, fn:
|
|
1040
|
+
def on_crashed(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1016
1041
|
self.on_crashed_hooks.append(fn)
|
|
1017
1042
|
return fn
|
|
1018
1043
|
|
|
1019
|
-
def on_running(self, fn:
|
|
1044
|
+
def on_running(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1020
1045
|
self.on_running_hooks.append(fn)
|
|
1021
1046
|
return fn
|
|
1022
1047
|
|
|
1023
|
-
def on_failure(self, fn:
|
|
1048
|
+
def on_failure(self, fn: _FlowStateHookT) -> _FlowStateHookT:
|
|
1024
1049
|
self.on_failure_hooks.append(fn)
|
|
1025
1050
|
return fn
|
|
1026
1051
|
|
|
@@ -3007,7 +3032,12 @@ def load_flow_from_entrypoint(
|
|
|
3007
3032
|
# If the flow has dependencies that are not installed in the current
|
|
3008
3033
|
# environment, fallback to loading the flow via AST parsing.
|
|
3009
3034
|
if use_placeholder_flow:
|
|
3010
|
-
|
|
3035
|
+
try:
|
|
3036
|
+
flow: Optional[Flow[P, Any]] = safe_load_flow_from_entrypoint(
|
|
3037
|
+
entrypoint
|
|
3038
|
+
)
|
|
3039
|
+
except Exception:
|
|
3040
|
+
flow = None
|
|
3011
3041
|
if flow is None:
|
|
3012
3042
|
raise
|
|
3013
3043
|
else:
|
{prefect_client-3.9.1.dev8 → prefect_client-3.9.2}/src/prefect/infrastructure/provisioners/coiled.py
RENAMED
|
@@ -215,7 +215,7 @@ class CoiledPushProvisioner:
|
|
|
215
215
|
else:
|
|
216
216
|
raise RuntimeError(
|
|
217
217
|
"Coiled credentials not found. Please create a new token by"
|
|
218
|
-
" running
|
|
218
|
+
" running `coiled login` and try again."
|
|
219
219
|
)
|
|
220
220
|
|
|
221
221
|
# Create the credentials block
|