prefect-client 3.9.1.dev3__tar.gz → 3.9.1.dev5__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.dev3 → prefect_client-3.9.1.dev5}/PKG-INFO +1 -1
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/AGENTS.md +10 -1
- prefect_client-3.9.1.dev5/src/prefect/_build_info.py +5 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/services.py +3 -2
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/result_records.py +13 -9
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/cache_policies.py +22 -4
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_work_pools/client.py +2 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/sorting.py +2 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/AGENTS.md +1 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/schemas/automations.py +11 -3
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/schemas/events.py +7 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/infrastructure/provisioners/ecs.py +86 -19
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/runner.py +10 -4
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/storage.py +18 -7
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/background_workers.py +25 -19
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/clients.py +35 -2
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/ui/flow_runs.py +1 -1
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/task_engine.py +62 -6
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/task_runners.py +28 -12
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/types/_datetime.py +2 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/filesystem/__init__.py +50 -5
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/templating/AGENTS.md +1 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/templating/__init__.py +9 -3
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/urls.py +14 -1
- prefect_client-3.9.1.dev3/src/prefect/_build_info.py +0 -5
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/.gitignore +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/LICENSE +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/README.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/hatch_build.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/pyproject.toml +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/__main__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/_observation_delivery.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/attempt_control.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/server_maintenance.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/agent.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/automations.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/base.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/context.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/engine.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/related.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/flows.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/futures.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/main.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/plugins.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/py.typed +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/results.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_uv_command.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_workspace_hook_runner.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_workspace_runtime.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_workspace_runtime_bootstrap.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/_workspace_supervisor.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/schedules.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/serializers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/observed_states.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/_types.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/states.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/tasks.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/transactions.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/types/_datetime_deprecations.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/types/names.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/variables.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/workers/utilities.py +0 -0
|
@@ -6,6 +6,10 @@ The foundation for building and executing workflows with Python. This covers the
|
|
|
6
6
|
|
|
7
7
|
There is no formal public/private boundary beyond the `_` prefix convention. Modules and functions prefixed with `_` are internal. Everything else is considered public and requires backward compatibility.
|
|
8
8
|
|
|
9
|
+
## Runtime Parameter Defaults
|
|
10
|
+
|
|
11
|
+
Runtime flow/task parameter values must come from `utilities.callables.get_call_parameters` or `get_parameter_defaults`: raw signature defaults can be `pydantic.Field(...)` objects. These helpers unwrap `FieldInfo` defaults; schema generation intentionally retains `FieldInfo` to preserve metadata.
|
|
12
|
+
|
|
9
13
|
## Entry Points
|
|
10
14
|
|
|
11
15
|
- `flows.py` / `tasks.py` — `@flow` and `@task` decorator definitions. The primary user-facing API.
|
|
@@ -25,7 +29,8 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
|
|
|
25
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.
|
|
26
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.
|
|
27
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.
|
|
28
|
-
- **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 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. 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.
|
|
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 server code that the client build strips may import it unconditionally (see `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. 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
|
+
- **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`.
|
|
29
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.
|
|
30
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.
|
|
31
36
|
- **`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.
|
|
@@ -69,3 +74,7 @@ Use `get_logger()` from `prefect.logging` instead of raw `logging.getLogger()`
|
|
|
69
74
|
- `docker/` → `DockerImage` class for building and pushing Docker images during deployment
|
|
70
75
|
- `telemetry/` → OS-level resource metric collection and run telemetry
|
|
71
76
|
- `testing/` → Test utilities shipped with the SDK: `prefect_test_harness`, assertion helpers, and reusable fixtures (see testing/AGENTS.md)
|
|
77
|
+
|
|
78
|
+
## Multi-pass Templating
|
|
79
|
+
|
|
80
|
+
When applying `utilities.templating.apply_values` in stages, use `remove_notset=False` on passes that must preserve placeholders for later values. The default drops unresolved whole-value dict entries and list items and blanks unresolved inline placeholders. This matters when deployment preparation applies environment values before build/push outputs exist; only remove unresolved values when the caller has reached its final resolution pass.
|
|
@@ -271,8 +271,9 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
|
|
|
271
271
|
|
|
272
272
|
self._stop(at_exit=at_exit)
|
|
273
273
|
|
|
274
|
-
|
|
275
|
-
|
|
274
|
+
# `_done_event` is unset if the service never started in this process, e.g.
|
|
275
|
+
# in a child process after `reset_for_fork`
|
|
276
|
+
if self._done_event is None or self._done_event.is_set():
|
|
276
277
|
future: concurrent.futures.Future[bool] = concurrent.futures.Future()
|
|
277
278
|
future.set_result(False)
|
|
278
279
|
return future
|
{prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/_internal/result_records.py
RENAMED
|
@@ -37,6 +37,7 @@ if TYPE_CHECKING:
|
|
|
37
37
|
ResultSerializer = Union[Serializer, str]
|
|
38
38
|
LITERAL_TYPES: set[type] = {type(None), bool, UUID}
|
|
39
39
|
R = TypeVar("R")
|
|
40
|
+
_LEGACY_RESULT_BLOB_KEYS = {"serializer", "data", "prefect_version", "expiration"}
|
|
40
41
|
|
|
41
42
|
|
|
42
43
|
class ResultRecordMetadata(BaseModel):
|
|
@@ -173,16 +174,19 @@ class ResultRecord(BaseModel, Generic[R]):
|
|
|
173
174
|
if isinstance(value, dict):
|
|
174
175
|
if TYPE_CHECKING: # TODO: # isintance doesn't accept generic parameters
|
|
175
176
|
value = cast(dict[str, Any], value)
|
|
176
|
-
|
|
177
|
+
# Only coerce the exact legacy `PersistedResultBlob` shape so that raw
|
|
178
|
+
# JSON results that happen to contain a `data` key aren't misread
|
|
179
|
+
if (
|
|
180
|
+
{"data", "serializer"} <= value.keys() <= _LEGACY_RESULT_BLOB_KEYS
|
|
181
|
+
and isinstance(value["data"], str)
|
|
182
|
+
and isinstance(value["serializer"], dict)
|
|
183
|
+
):
|
|
177
184
|
value["result"] = value.pop("data")
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
value["metadata"]["serializer"] = value.pop("serializer")
|
|
184
|
-
if "prefect_version" in value:
|
|
185
|
-
value["metadata"]["prefect_version"] = value.pop("prefect_version")
|
|
185
|
+
value["metadata"] = {"serializer": value.pop("serializer")}
|
|
186
|
+
if "expiration" in value:
|
|
187
|
+
value["metadata"]["expiration"] = value.pop("expiration")
|
|
188
|
+
if "prefect_version" in value:
|
|
189
|
+
value["metadata"]["prefect_version"] = value.pop("prefect_version")
|
|
186
190
|
return value
|
|
187
191
|
|
|
188
192
|
def serialize_metadata(self) -> bytes:
|
|
@@ -4,6 +4,7 @@ from copy import deepcopy
|
|
|
4
4
|
from dataclasses import dataclass, field, replace
|
|
5
5
|
from logging import Logger
|
|
6
6
|
from pathlib import Path
|
|
7
|
+
from types import CodeType
|
|
7
8
|
from typing import (
|
|
8
9
|
TYPE_CHECKING,
|
|
9
10
|
Any,
|
|
@@ -45,9 +46,10 @@ def _register_stable_transforms() -> None:
|
|
|
45
46
|
if sys.modules.get("pandas") is not None:
|
|
46
47
|
import pandas as pd # pyright: ignore
|
|
47
48
|
|
|
48
|
-
STABLE_TRANSFORMS[pd.DataFrame] = lambda df:
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
STABLE_TRANSFORMS[pd.DataFrame] = lambda df: ( # pyright: ignore
|
|
50
|
+
list(df.columns),
|
|
51
|
+
[df.iloc[:, i] for i in range(len(df.columns))],
|
|
52
|
+
)
|
|
51
53
|
|
|
52
54
|
|
|
53
55
|
@dataclass
|
|
@@ -282,6 +284,19 @@ class _None(CachePolicy):
|
|
|
282
284
|
return other
|
|
283
285
|
|
|
284
286
|
|
|
287
|
+
def _normalize_code_location(code: CodeType) -> CodeType:
|
|
288
|
+
"""Remove compilation locations, including those in nested code constants."""
|
|
289
|
+
return code.replace(
|
|
290
|
+
co_filename="",
|
|
291
|
+
co_firstlineno=1,
|
|
292
|
+
co_linetable=b"",
|
|
293
|
+
co_consts=tuple(
|
|
294
|
+
_normalize_code_location(const) if isinstance(const, CodeType) else const
|
|
295
|
+
for const in code.co_consts
|
|
296
|
+
),
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
|
|
285
300
|
@dataclass
|
|
286
301
|
class TaskSource(CachePolicy):
|
|
287
302
|
"""
|
|
@@ -312,7 +327,10 @@ class TaskSource(CachePolicy):
|
|
|
312
327
|
lines = inspect.getsource(task_ctx.task.fn.__class__)
|
|
313
328
|
except OSError as exc:
|
|
314
329
|
if "source code" in str(exc):
|
|
315
|
-
|
|
330
|
+
return hash_objects(
|
|
331
|
+
_normalize_code_location(task_ctx.task.fn.__code__),
|
|
332
|
+
raise_on_failure=True,
|
|
333
|
+
)
|
|
316
334
|
else:
|
|
317
335
|
raise
|
|
318
336
|
|
|
@@ -525,6 +525,8 @@ class WorkPoolAsyncClient(BaseAsyncClient):
|
|
|
525
525
|
json=work_pool.model_dump(mode="json", exclude_unset=True),
|
|
526
526
|
)
|
|
527
527
|
except HTTPStatusError as e:
|
|
528
|
+
if e.response.status_code == 403 and "plan does not support" in str(e):
|
|
529
|
+
raise ObjectUnsupported(http_exc=e) from e
|
|
528
530
|
if e.response.status_code == 409:
|
|
529
531
|
if overwrite:
|
|
530
532
|
existing_work_pool = await self.read_work_pool(
|
|
@@ -8,6 +8,7 @@ Client-side event system for emitting, subscribing to, and defining automations
|
|
|
8
8
|
- Events follow the CloudEvents-inspired schema: `Event` with `Resource` and `RelatedResource`.
|
|
9
9
|
- Automations combine triggers (event, metric, compound, sequence) with actions.
|
|
10
10
|
- **Metric triggers are Cloud-only.** OSS's `ServerTriggerTypes` excludes `MetricTrigger`, so `POST /automations` returns 422. For "alert if a flow takes too long" on OSS, use a proactive `EventTrigger` (`after={prefect.flow-run.Running}`, terminal states in `expect`, SLO in `within`).
|
|
11
|
+
- **Automation schemas must read values this version doesn't know.** Cloud can add action types and metric names before a client release knows about them, so unknown actions parse as `UnknownAction` and unknown metric names stay `str` in `MetricTriggerQuery.name`. Code that reads automations must handle these variants (e.g. no `.value` on a metric name without an `isinstance` check), and `prefect transfer` skips automations that use them instead of copying them.
|
|
11
12
|
- **Event name prefixes differ by backend.** OSS emits `prefect.*`; Cloud emits `prefect-cloud.*` for automation/action lifecycle events (e.g., `prefect-cloud.automation.triggered`). Cross-backend tooling that filters events must match both.
|
|
12
13
|
- `DeploymentTriggerTypes` are the subset of triggers usable in `prefect.yaml` deployment definitions.
|
|
13
14
|
|
{prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/schemas/automations.py
RENAMED
|
@@ -290,9 +290,16 @@ class MetricTriggerQuery(PrefectBaseModel):
|
|
|
290
290
|
to Metric automations, that specify the query configurations
|
|
291
291
|
and breaching conditions for the Automation"""
|
|
292
292
|
|
|
293
|
-
|
|
293
|
+
# Prefect Cloud can add metrics before a client release knows about them.
|
|
294
|
+
# Reading an automation that uses one keeps its name as a string instead of
|
|
295
|
+
# failing, so updating the automation sends the name back unchanged.
|
|
296
|
+
name: Union[PrefectMetric, str] = Field(
|
|
294
297
|
...,
|
|
295
|
-
|
|
298
|
+
union_mode="left_to_right",
|
|
299
|
+
description=(
|
|
300
|
+
"The name of the metric to query. Names this version of Prefect does "
|
|
301
|
+
"not recognize are kept as strings."
|
|
302
|
+
),
|
|
296
303
|
)
|
|
297
304
|
threshold: float = Field(
|
|
298
305
|
...,
|
|
@@ -357,7 +364,8 @@ class MetricTrigger(ResourceTrigger):
|
|
|
357
364
|
return textwrap.indent(
|
|
358
365
|
"\n".join(
|
|
359
366
|
[
|
|
360
|
-
f"Metric: {m.name.value
|
|
367
|
+
f"Metric: {m.name.value if isinstance(m.name, PrefectMetric) else m.name} "
|
|
368
|
+
f"{m.operator.value} {m.threshold} for {m.range}",
|
|
361
369
|
]
|
|
362
370
|
),
|
|
363
371
|
prefix=" " * indent,
|
{prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/events/schemas/events.py
RENAMED
|
@@ -31,6 +31,7 @@ from prefect.logging import get_logger
|
|
|
31
31
|
from prefect.settings import (
|
|
32
32
|
PREFECT_EVENTS_MAXIMUM_LABELS_PER_RESOURCE,
|
|
33
33
|
)
|
|
34
|
+
from prefect.utilities.urls import url_for
|
|
34
35
|
|
|
35
36
|
from .labelling import Labelled
|
|
36
37
|
|
|
@@ -194,6 +195,12 @@ class ReceivedEvent(Event):
|
|
|
194
195
|
description="When the event was received by Prefect Cloud",
|
|
195
196
|
)
|
|
196
197
|
|
|
198
|
+
@property
|
|
199
|
+
def url(self) -> Optional[str]:
|
|
200
|
+
"""Returns the UI URL for this event, allowing users to link to events
|
|
201
|
+
in automation templates without parsing date strings."""
|
|
202
|
+
return url_for(self, url_type="ui")
|
|
203
|
+
|
|
197
204
|
|
|
198
205
|
def matches(expected: str, value: Optional[str]) -> bool:
|
|
199
206
|
"""Returns true if the given value matches the expected string, which may
|
|
@@ -1005,7 +1005,25 @@ class ExecutionRoleResource:
|
|
|
1005
1005
|
],
|
|
1006
1006
|
}
|
|
1007
1007
|
)
|
|
1008
|
-
|
|
1008
|
+
# `AmazonECSTaskExecutionRolePolicy` allows creating log streams and
|
|
1009
|
+
# putting log events, but not creating the log group that the ECS worker
|
|
1010
|
+
# asks for with `awslogs-create-group` when CloudWatch logs are enabled.
|
|
1011
|
+
self._logs_policy_name = "PrefectEcsTaskExecutionRoleLogsPolicy"
|
|
1012
|
+
self._logs_policy_document = json.dumps(
|
|
1013
|
+
{
|
|
1014
|
+
"Version": "2012-10-17",
|
|
1015
|
+
"Statement": [
|
|
1016
|
+
{
|
|
1017
|
+
"Sid": "AllowCreateLogGroup",
|
|
1018
|
+
"Effect": "Allow",
|
|
1019
|
+
"Action": "logs:CreateLogGroup",
|
|
1020
|
+
"Resource": "*",
|
|
1021
|
+
}
|
|
1022
|
+
],
|
|
1023
|
+
}
|
|
1024
|
+
)
|
|
1025
|
+
self._requires_role_provisioning = None
|
|
1026
|
+
self._requires_logs_policy_provisioning = None
|
|
1009
1027
|
|
|
1010
1028
|
async def get_task_count(self) -> int:
|
|
1011
1029
|
"""
|
|
@@ -1014,27 +1032,58 @@ class ExecutionRoleResource:
|
|
|
1014
1032
|
Returns:
|
|
1015
1033
|
int: The number of tasks to be provisioned.
|
|
1016
1034
|
"""
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
"""
|
|
1021
|
-
Check if this resource requires provisioning.
|
|
1035
|
+
role_count = 1 if await self._role_requires_provisioning() else 0
|
|
1036
|
+
logs_policy_count = 1 if await self._logs_policy_requires_provisioning() else 0
|
|
1037
|
+
return role_count + logs_policy_count
|
|
1022
1038
|
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
"""
|
|
1026
|
-
if self._requires_provisioning is None:
|
|
1039
|
+
async def _role_requires_provisioning(self) -> bool:
|
|
1040
|
+
if self._requires_role_provisioning is None:
|
|
1027
1041
|
try:
|
|
1028
1042
|
await anyio.to_thread.run_sync(
|
|
1029
1043
|
partial(
|
|
1030
1044
|
self._iam_client.get_role, RoleName=self._execution_role_name
|
|
1031
1045
|
)
|
|
1032
1046
|
)
|
|
1033
|
-
self.
|
|
1047
|
+
self._requires_role_provisioning = False
|
|
1034
1048
|
except self._iam_client.exceptions.NoSuchEntityException:
|
|
1035
|
-
self.
|
|
1049
|
+
self._requires_role_provisioning = True
|
|
1036
1050
|
|
|
1037
|
-
return self.
|
|
1051
|
+
return self._requires_role_provisioning
|
|
1052
|
+
|
|
1053
|
+
async def _logs_policy_requires_provisioning(self) -> bool:
|
|
1054
|
+
"""
|
|
1055
|
+
Checked separately from role creation so that roles provisioned before
|
|
1056
|
+
the logs policy existed get it when provisioning is run again.
|
|
1057
|
+
"""
|
|
1058
|
+
if self._requires_logs_policy_provisioning is None:
|
|
1059
|
+
if await self._role_requires_provisioning():
|
|
1060
|
+
self._requires_logs_policy_provisioning = True
|
|
1061
|
+
else:
|
|
1062
|
+
try:
|
|
1063
|
+
await anyio.to_thread.run_sync(
|
|
1064
|
+
partial(
|
|
1065
|
+
self._iam_client.get_role_policy,
|
|
1066
|
+
RoleName=self._execution_role_name,
|
|
1067
|
+
PolicyName=self._logs_policy_name,
|
|
1068
|
+
)
|
|
1069
|
+
)
|
|
1070
|
+
self._requires_logs_policy_provisioning = False
|
|
1071
|
+
except self._iam_client.exceptions.NoSuchEntityException:
|
|
1072
|
+
self._requires_logs_policy_provisioning = True
|
|
1073
|
+
|
|
1074
|
+
return self._requires_logs_policy_provisioning
|
|
1075
|
+
|
|
1076
|
+
async def requires_provisioning(self) -> bool:
|
|
1077
|
+
"""
|
|
1078
|
+
Check if this resource requires provisioning.
|
|
1079
|
+
|
|
1080
|
+
Returns:
|
|
1081
|
+
bool: True if provisioning is required, False otherwise.
|
|
1082
|
+
"""
|
|
1083
|
+
return (
|
|
1084
|
+
await self._role_requires_provisioning()
|
|
1085
|
+
or await self._logs_policy_requires_provisioning()
|
|
1086
|
+
)
|
|
1038
1087
|
|
|
1039
1088
|
async def get_planned_actions(self) -> List[str]:
|
|
1040
1089
|
"""
|
|
@@ -1044,12 +1093,18 @@ class ExecutionRoleResource:
|
|
|
1044
1093
|
Optional[str]: A description of the planned actions for provisioning the resource,
|
|
1045
1094
|
or None if provisioning is not required.
|
|
1046
1095
|
"""
|
|
1047
|
-
|
|
1048
|
-
|
|
1096
|
+
actions: list[str] = []
|
|
1097
|
+
if await self._role_requires_provisioning():
|
|
1098
|
+
actions.append(
|
|
1049
1099
|
"Creating an IAM role assigned to ECS tasks:"
|
|
1050
1100
|
f" [blue]{self._execution_role_name}[/]"
|
|
1051
|
-
|
|
1052
|
-
|
|
1101
|
+
)
|
|
1102
|
+
if await self._logs_policy_requires_provisioning():
|
|
1103
|
+
actions.append(
|
|
1104
|
+
"Allowing the ECS task execution role to create CloudWatch log"
|
|
1105
|
+
f" groups: [blue]{self._logs_policy_name}[/]"
|
|
1106
|
+
)
|
|
1107
|
+
return actions
|
|
1053
1108
|
|
|
1054
1109
|
async def provision(
|
|
1055
1110
|
self,
|
|
@@ -1064,8 +1119,8 @@ class ExecutionRoleResource:
|
|
|
1064
1119
|
infrastructure for.
|
|
1065
1120
|
advance: A callback function to indicate progress.
|
|
1066
1121
|
"""
|
|
1067
|
-
|
|
1068
|
-
|
|
1122
|
+
console = current_console.get()
|
|
1123
|
+
if await self._role_requires_provisioning():
|
|
1069
1124
|
console.print("Provisioning execution role")
|
|
1070
1125
|
response = await anyio.to_thread.run_sync(
|
|
1071
1126
|
partial(
|
|
@@ -1088,6 +1143,18 @@ class ExecutionRoleResource:
|
|
|
1088
1143
|
partial(self._iam_client.get_role, RoleName=self._execution_role_name)
|
|
1089
1144
|
)
|
|
1090
1145
|
|
|
1146
|
+
if await self._logs_policy_requires_provisioning():
|
|
1147
|
+
console.print("Adding CloudWatch logs policy to execution role")
|
|
1148
|
+
await anyio.to_thread.run_sync(
|
|
1149
|
+
partial(
|
|
1150
|
+
self._iam_client.put_role_policy,
|
|
1151
|
+
RoleName=self._execution_role_name,
|
|
1152
|
+
PolicyName=self._logs_policy_name,
|
|
1153
|
+
PolicyDocument=self._logs_policy_document,
|
|
1154
|
+
)
|
|
1155
|
+
)
|
|
1156
|
+
advance()
|
|
1157
|
+
|
|
1091
1158
|
base_job_template["variables"]["properties"]["execution_role_arn"][
|
|
1092
1159
|
"default"
|
|
1093
1160
|
] = response["Role"]["Arn"]
|
|
@@ -527,9 +527,15 @@ class Runner:
|
|
|
527
527
|
Gracefully shuts down the runner when a SIGTERM is received.
|
|
528
528
|
"""
|
|
529
529
|
self._logger.info("SIGTERM received, initiating graceful shutdown...")
|
|
530
|
-
self.
|
|
530
|
+
if not self.started or self.stopping or self._loop is None:
|
|
531
|
+
sys.exit(0)
|
|
531
532
|
|
|
532
|
-
|
|
533
|
+
# Signal handlers run on the main thread, which may or may not be the
|
|
534
|
+
# thread driving the runner's loop, so schedule `astop` thread-safely
|
|
535
|
+
# rather than blocking on it. `astop` cancels in-flight flow runs and
|
|
536
|
+
# the polling loops, letting `start` return.
|
|
537
|
+
self.stopping = True
|
|
538
|
+
self.execute_in_background(self.astop)
|
|
533
539
|
|
|
534
540
|
async def start(
|
|
535
541
|
self, run_once: bool = False, webserver: Optional[bool] = None
|
|
@@ -714,9 +720,9 @@ class Runner:
|
|
|
714
720
|
6. FlowRunCancellingObserver — exits first
|
|
715
721
|
"""
|
|
716
722
|
self._logger.debug("Starting runner...")
|
|
723
|
+
self.stopping = False
|
|
717
724
|
self._tmp_dir.mkdir(parents=True, exist_ok=True)
|
|
718
|
-
|
|
719
|
-
self._loop = asyncio.get_event_loop()
|
|
725
|
+
self._loop = asyncio.get_running_loop()
|
|
720
726
|
|
|
721
727
|
self._client = get_client()
|
|
722
728
|
|
|
@@ -497,16 +497,27 @@ class GitRepository:
|
|
|
497
497
|
|
|
498
498
|
await self._checkout_commit(self._commit_sha)
|
|
499
499
|
|
|
500
|
-
# Otherwise,
|
|
500
|
+
# Otherwise, move the branch to the remote tip. `git pull` can't do
|
|
501
|
+
# this on a shallow clone: a new remote commit shares no history with
|
|
502
|
+
# the local one, so the merge fails on every update. Like `git pull`,
|
|
503
|
+
# `reset --keep` leaves local changes alone when nothing changed
|
|
504
|
+
# upstream and refuses when they would be overwritten.
|
|
501
505
|
else:
|
|
502
|
-
cmd
|
|
506
|
+
fetch_cmd = cmd + ["fetch", "origin"]
|
|
503
507
|
if self._branch:
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
cmd += ["--recurse-submodules"]
|
|
507
|
-
cmd += ["--depth", "1"]
|
|
508
|
+
fetch_cmd += [self._branch]
|
|
509
|
+
fetch_cmd += ["--depth", "1"]
|
|
508
510
|
try:
|
|
509
|
-
await run_process(
|
|
511
|
+
await run_process(fetch_cmd, cwd=self.destination)
|
|
512
|
+
await run_process(
|
|
513
|
+
["git", "reset", "--keep", "FETCH_HEAD"],
|
|
514
|
+
cwd=self.destination,
|
|
515
|
+
)
|
|
516
|
+
if self._include_submodules:
|
|
517
|
+
await run_process(
|
|
518
|
+
cmd + ["submodule", "update", "--init", "--recursive"],
|
|
519
|
+
cwd=self.destination,
|
|
520
|
+
)
|
|
510
521
|
self._logger.debug("Successfully pulled latest changes")
|
|
511
522
|
except subprocess.CalledProcessError as exc:
|
|
512
523
|
self._logger.error(
|
{prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/background_workers.py
RENAMED
|
@@ -63,25 +63,31 @@ async def background_worker(
|
|
|
63
63
|
webserver_only: bool = False,
|
|
64
64
|
) -> AsyncGenerator[None, None]:
|
|
65
65
|
worker_task: asyncio.Task[None] | None = None
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
66
|
+
try:
|
|
67
|
+
async with Worker(docket) as worker:
|
|
68
|
+
# Register background task functions
|
|
69
|
+
docket.register_collection(
|
|
70
|
+
"prefect.server.api.background_workers:task_functions"
|
|
71
|
+
)
|
|
71
72
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
# Register and schedule enabled perpetual services
|
|
74
|
+
await register_and_schedule_perpetual_services(
|
|
75
|
+
docket, ephemeral=ephemeral, webserver_only=webserver_only
|
|
76
|
+
)
|
|
76
77
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
try:
|
|
79
|
+
worker_task = asyncio.create_task(worker.run_forever())
|
|
80
|
+
yield
|
|
80
81
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
finally:
|
|
83
|
+
if worker_task:
|
|
84
|
+
worker_task.cancel()
|
|
85
|
+
finally:
|
|
86
|
+
# Exiting the `Worker` context above signals the worker loop to stop and
|
|
87
|
+
# waits for it, so shutdown completes even if the cancellation was lost
|
|
88
|
+
# (e.g. `asyncio.wait_for` on Python 3.11 can swallow a cancellation).
|
|
89
|
+
if worker_task:
|
|
90
|
+
try:
|
|
91
|
+
await worker_task
|
|
92
|
+
except asyncio.CancelledError:
|
|
93
|
+
pass
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import base64
|
|
4
|
-
|
|
4
|
+
import contextvars
|
|
5
|
+
from contextlib import asynccontextmanager
|
|
6
|
+
from typing import (
|
|
7
|
+
TYPE_CHECKING,
|
|
8
|
+
Any,
|
|
9
|
+
AsyncIterator,
|
|
10
|
+
Dict,
|
|
11
|
+
List,
|
|
12
|
+
Optional,
|
|
13
|
+
)
|
|
5
14
|
from urllib.parse import quote
|
|
6
15
|
from uuid import UUID
|
|
7
16
|
|
|
8
17
|
import httpx
|
|
9
18
|
import pydantic
|
|
10
|
-
from httpx import Response
|
|
19
|
+
from httpx import Request, Response
|
|
11
20
|
from starlette import status
|
|
12
21
|
from typing_extensions import Self
|
|
13
22
|
|
|
@@ -27,6 +36,29 @@ if TYPE_CHECKING:
|
|
|
27
36
|
logger: "logging.Logger" = get_logger(__name__)
|
|
28
37
|
|
|
29
38
|
|
|
39
|
+
_request_scoped_headers: contextvars.ContextVar[Optional[Dict[str, str]]] = (
|
|
40
|
+
contextvars.ContextVar("_request_scoped_headers", default=None)
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def _apply_scoped_headers(request: Request) -> None:
|
|
45
|
+
extras = _request_scoped_headers.get()
|
|
46
|
+
if not extras:
|
|
47
|
+
return
|
|
48
|
+
for name, value in extras.items():
|
|
49
|
+
request.headers[name] = value
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@asynccontextmanager
|
|
53
|
+
async def scoped_headers(headers: Dict[str, str]) -> AsyncIterator[None]:
|
|
54
|
+
"""Attach headers to every request sent by a shared client in this scope."""
|
|
55
|
+
token = _request_scoped_headers.set(headers)
|
|
56
|
+
try:
|
|
57
|
+
yield
|
|
58
|
+
finally:
|
|
59
|
+
_request_scoped_headers.reset(token)
|
|
60
|
+
|
|
61
|
+
|
|
30
62
|
class BaseClient:
|
|
31
63
|
_http_client: PrefectHttpxAsyncClient
|
|
32
64
|
|
|
@@ -53,6 +85,7 @@ class BaseClient:
|
|
|
53
85
|
base_url=f"http://prefect-in-memory{settings.server.api.base_path or '/api'}",
|
|
54
86
|
enable_csrf_support=settings.server.api.csrf_protection_enabled,
|
|
55
87
|
raise_on_all_errors=False,
|
|
88
|
+
event_hooks={"request": [_apply_scoped_headers]},
|
|
56
89
|
)
|
|
57
90
|
|
|
58
91
|
async def __aenter__(self) -> Self:
|
{prefect_client-3.9.1.dev3 → prefect_client-3.9.1.dev5}/src/prefect/server/api/ui/flow_runs.py
RENAMED
|
@@ -119,7 +119,7 @@ async def count_task_runs_by_flow_run(
|
|
|
119
119
|
results = await session.execute(query)
|
|
120
120
|
|
|
121
121
|
task_run_counts_by_flow_run = {
|
|
122
|
-
flow_run_id: task_run_count for flow_run_id, task_run_count in results
|
|
122
|
+
flow_run_id: task_run_count for flow_run_id, task_run_count in results
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
return {
|