prefect-client 3.6.24.dev3__tar.gz → 3.6.24.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.6.24.dev3 → prefect_client-3.6.24.dev5}/PKG-INFO +1 -1
- prefect_client-3.6.24.dev5/src/prefect/_build_info.py +5 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/services.py +25 -3
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/notifications.py +21 -12
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/AGENTS.md +1 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/runner.py +11 -3
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/steps/utility.py +3 -3
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/AGENTS.md +9 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/clients.py +57 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/worker.py +6 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/flow_runs.py +12 -12
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/server.py +17 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/AGENTS.md +1 -0
- prefect_client-3.6.24.dev5/src/prefect/settings/models/events.py +27 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/root.py +6 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/AGENTS.md +2 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/engine.py +22 -6
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/processutils.py +2 -2
- prefect_client-3.6.24.dev3/src/prefect/_build_info.py +0 -5
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/.gitignore +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/LICENSE +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/README.md +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/pyproject.toml +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/_version_checking.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/context.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/engine.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/flows.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/futures.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/main.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/results.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/serializers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/states.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/asyncutils.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/callables.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/filesystem.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/templating.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/workers/utilities.py +0 -0
|
@@ -57,9 +57,12 @@ if hasattr(os, "register_at_fork"):
|
|
|
57
57
|
class _QueueServiceBase(abc.ABC, Generic[T]):
|
|
58
58
|
_instances: dict[int, Self] = {}
|
|
59
59
|
_instance_lock = threading.Lock()
|
|
60
|
+
_max_queue_size: int = 0 # 0 means unbounded
|
|
60
61
|
|
|
61
62
|
def __init__(self, *args: Hashable) -> None:
|
|
62
|
-
self._queue: queue.Queue[Optional[T]] = queue.Queue(
|
|
63
|
+
self._queue: queue.Queue[Optional[T]] = queue.Queue(
|
|
64
|
+
maxsize=self._max_queue_size
|
|
65
|
+
)
|
|
63
66
|
self._loop: Optional[asyncio.AbstractEventLoop] = None
|
|
64
67
|
self._done_event: Optional[asyncio.Event] = None
|
|
65
68
|
self._task: Optional[asyncio.Task[None]] = None
|
|
@@ -85,7 +88,7 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
|
|
|
85
88
|
self._loop = None
|
|
86
89
|
self._done_event = None
|
|
87
90
|
self._task = None
|
|
88
|
-
self._queue = queue.Queue()
|
|
91
|
+
self._queue = queue.Queue(maxsize=self._max_queue_size)
|
|
89
92
|
self._lock = threading.Lock()
|
|
90
93
|
|
|
91
94
|
@classmethod
|
|
@@ -345,7 +348,16 @@ class QueueService(_QueueServiceBase[T]):
|
|
|
345
348
|
raise RuntimeError("Cannot put items in a stopped service instance.")
|
|
346
349
|
|
|
347
350
|
logger.debug("Service %r enqueuing item %r", self, item)
|
|
348
|
-
self.
|
|
351
|
+
prepared = self._prepare_item(item)
|
|
352
|
+
try:
|
|
353
|
+
self._queue.put_nowait(prepared)
|
|
354
|
+
except queue.Full:
|
|
355
|
+
self._logger.warning(
|
|
356
|
+
"Service %r queue is full (%d items), dropping item",
|
|
357
|
+
type(self).__name__,
|
|
358
|
+
self._queue.qsize(),
|
|
359
|
+
)
|
|
360
|
+
self._on_item_dropped(prepared)
|
|
349
361
|
|
|
350
362
|
def _prepare_item(self, item: T) -> T:
|
|
351
363
|
"""
|
|
@@ -356,6 +368,16 @@ class QueueService(_QueueServiceBase[T]):
|
|
|
356
368
|
"""
|
|
357
369
|
return item
|
|
358
370
|
|
|
371
|
+
def _on_item_dropped(self, item: T) -> None:
|
|
372
|
+
"""
|
|
373
|
+
Called when a prepared item is dropped because the queue is full.
|
|
374
|
+
|
|
375
|
+
Subclasses can override this to clean up any resources allocated
|
|
376
|
+
during _prepare_item.
|
|
377
|
+
|
|
378
|
+
The default implementation is a no-op.
|
|
379
|
+
"""
|
|
380
|
+
|
|
359
381
|
@abc.abstractmethod
|
|
360
382
|
async def _handle(self, item: T) -> None:
|
|
361
383
|
"""
|
{prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/blocks/notifications.py
RENAMED
|
@@ -714,6 +714,8 @@ class MattermostWebhook(AbstractAppriseNotificationBlock):
|
|
|
714
714
|
)
|
|
715
715
|
|
|
716
716
|
def block_initialization(self) -> None:
|
|
717
|
+
from apprise import Apprise, AppriseAsset
|
|
718
|
+
|
|
717
719
|
try:
|
|
718
720
|
# Try importing for apprise>=1.18.0
|
|
719
721
|
from apprise.plugins.mattermost import NotifyMattermost
|
|
@@ -723,19 +725,26 @@ class MattermostWebhook(AbstractAppriseNotificationBlock):
|
|
|
723
725
|
NotifyMattermost, # pyright: ignore[reportUnknownVariableType] incomplete type hints in apprise
|
|
724
726
|
)
|
|
725
727
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
728
|
+
# Add the NotifyMattermost instance directly rather than going through
|
|
729
|
+
# .url() because apprise>=1.9.9 no longer includes channels in the URL.
|
|
730
|
+
# apprise>=1.9.9 renamed `channels` to `targets`.
|
|
731
|
+
mattermost_instance = NotifyMattermost(
|
|
732
|
+
token=self.token.get_secret_value(),
|
|
733
|
+
fullpath=self.path,
|
|
734
|
+
host=self.hostname,
|
|
735
|
+
targets=self.channels,
|
|
736
|
+
include_image=self.include_image,
|
|
737
|
+
port=self.port,
|
|
738
|
+
secure=self.secure,
|
|
739
|
+
) # pyright: ignore[reportUnknownVariableType] incomplete type hints in apprise
|
|
740
|
+
|
|
741
|
+
prefect_app_data = AppriseAsset(
|
|
742
|
+
app_id="Prefect Notifications",
|
|
743
|
+
app_desc="Prefect Notifications",
|
|
744
|
+
app_url="https://prefect.io",
|
|
737
745
|
)
|
|
738
|
-
self.
|
|
746
|
+
self._apprise_client = Apprise(asset=prefect_app_data)
|
|
747
|
+
self._apprise_client.add(mattermost_instance) # pyright: ignore[reportUnknownMemberType]
|
|
739
748
|
|
|
740
749
|
|
|
741
750
|
class DiscordWebhook(AbstractAppriseNotificationBlock):
|
|
@@ -33,6 +33,7 @@ For module path entrypoints, the storage destination is temporarily prepended to
|
|
|
33
33
|
|
|
34
34
|
## Pitfalls
|
|
35
35
|
|
|
36
|
+
- **Flow source outside cwd**: `RunnerDeployment.from_flow()` computes the entrypoint path with `Path.relative_to(cwd)`. When the flow file is outside the working directory (e.g., on a different drive on Windows, or an absolute path not under cwd), `relative_to()` raises `ValueError` — the code falls back to `os.path.relpath()`, which may produce paths containing `..` components. Infrastructure that expects clean relative paths (no `..`) must handle this case.
|
|
36
37
|
- **Windows shell mode**: `run_shell_script` always uses `asyncio.create_subprocess_shell` on Windows (`sys.platform == "win32"`), regardless of the `shell` parameter. This ensures cmd.exe built-ins (`echo`, `dir`, `set`, etc.) work. On non-Windows, `shell=False` (default) uses `create_subprocess_exec` with `shlex.split`.
|
|
37
38
|
- **Step ID namespace**: `id` and `requires` are reserved keywords — do not use them as step output keys.
|
|
38
39
|
- **Step import side effects**: steps are imported dynamically; packages listed in `requires` are installed into the current environment at execution time.
|
|
@@ -32,6 +32,7 @@ Example:
|
|
|
32
32
|
from __future__ import annotations
|
|
33
33
|
|
|
34
34
|
import importlib
|
|
35
|
+
import os
|
|
35
36
|
import sys
|
|
36
37
|
import tempfile
|
|
37
38
|
from datetime import datetime, timedelta
|
|
@@ -1011,9 +1012,16 @@ class RunnerDeployment(BaseModel):
|
|
|
1011
1012
|
raise ValueError(no_file_location_error)
|
|
1012
1013
|
|
|
1013
1014
|
# set entrypoint
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1015
|
+
try:
|
|
1016
|
+
entry_path = (
|
|
1017
|
+
Path(flow_file).absolute().relative_to(Path.cwd().absolute())
|
|
1018
|
+
)
|
|
1019
|
+
except ValueError:
|
|
1020
|
+
entry_path = Path(
|
|
1021
|
+
os.path.relpath(
|
|
1022
|
+
Path(flow_file).absolute(), Path.cwd().absolute()
|
|
1023
|
+
)
|
|
1024
|
+
)
|
|
1017
1025
|
deployment.entrypoint = (
|
|
1018
1026
|
f"{entry_path}:{getattr(flow.fn, '__qualname__', flow.fn.__name__)}"
|
|
1019
1027
|
)
|
{prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/deployments/steps/utility.py
RENAMED
|
@@ -52,12 +52,12 @@ async def _stream_capture_process_output(
|
|
|
52
52
|
async with create_task_group() as tg:
|
|
53
53
|
tg.start_soon(
|
|
54
54
|
stream_text,
|
|
55
|
-
TextReceiveStream(process.stdout),
|
|
55
|
+
TextReceiveStream(process.stdout, errors="replace"),
|
|
56
56
|
*stdout_sinks,
|
|
57
57
|
)
|
|
58
58
|
tg.start_soon(
|
|
59
59
|
stream_text,
|
|
60
|
-
TextReceiveStream(process.stderr),
|
|
60
|
+
TextReceiveStream(process.stderr, errors="replace"),
|
|
61
61
|
*stderr_sinks,
|
|
62
62
|
)
|
|
63
63
|
|
|
@@ -71,7 +71,7 @@ async def _read_stream(
|
|
|
71
71
|
data = await stream.read(4096)
|
|
72
72
|
if not data:
|
|
73
73
|
break
|
|
74
|
-
text = data.decode()
|
|
74
|
+
text = data.decode(errors="replace")
|
|
75
75
|
for sink in sinks:
|
|
76
76
|
sink.write(text)
|
|
77
77
|
if hasattr(sink, "flush"):
|
|
@@ -9,6 +9,15 @@ Client-side event system for emitting, subscribing to, and defining automations
|
|
|
9
9
|
- Automations combine triggers (event, metric, compound, sequence) with actions.
|
|
10
10
|
- `DeploymentTriggerTypes` are the subset of triggers usable in `prefect.yaml` deployment definitions.
|
|
11
11
|
|
|
12
|
+
## clients.py — Checkpointing Invariant
|
|
13
|
+
|
|
14
|
+
`PrefectEventsClient` uses **two independent checkpointing mechanisms** to confirm server receipt of sent events:
|
|
15
|
+
|
|
16
|
+
1. **Count-based** (`checkpoint_every`, default 700): checkpoints after N emitted events.
|
|
17
|
+
2. **Time-based** (`checkpoint_interval`, default 30s): a background `asyncio.Task` that fires periodically regardless of event count. Prevents unbounded buffer growth for low-throughput connections.
|
|
18
|
+
|
|
19
|
+
The background task is started in `__aenter__` and after each reconnect, and cancelled in `__aexit__`. If you subclass or mock `PrefectEventsClient`, ensure both checkpointing paths are exercised — the count threshold alone is not sufficient for low-volume scenarios.
|
|
20
|
+
|
|
12
21
|
## Structure
|
|
13
22
|
|
|
14
23
|
- `schemas/` — Pydantic models: `Event`, `Resource`, `RelatedResource`, `Automation`, triggers, deployment triggers
|
|
@@ -101,17 +101,20 @@ def events_out_socket_from_api_url(url: str) -> str:
|
|
|
101
101
|
def get_events_client(
|
|
102
102
|
reconnection_attempts: int = 10,
|
|
103
103
|
checkpoint_every: int = 700,
|
|
104
|
+
checkpoint_interval: float = 30.0,
|
|
104
105
|
) -> "EventsClient":
|
|
105
106
|
api_url = PREFECT_API_URL.value()
|
|
106
107
|
if isinstance(api_url, str) and api_url.startswith(PREFECT_CLOUD_API_URL.value()):
|
|
107
108
|
return PrefectCloudEventsClient(
|
|
108
109
|
reconnection_attempts=reconnection_attempts,
|
|
109
110
|
checkpoint_every=checkpoint_every,
|
|
111
|
+
checkpoint_interval=checkpoint_interval,
|
|
110
112
|
)
|
|
111
113
|
elif api_url:
|
|
112
114
|
return PrefectEventsClient(
|
|
113
115
|
reconnection_attempts=reconnection_attempts,
|
|
114
116
|
checkpoint_every=checkpoint_every,
|
|
117
|
+
checkpoint_interval=checkpoint_interval,
|
|
115
118
|
)
|
|
116
119
|
elif PREFECT_SERVER_ALLOW_EPHEMERAL_MODE:
|
|
117
120
|
from prefect.server.api.server import SubprocessASGIServer
|
|
@@ -122,6 +125,7 @@ def get_events_client(
|
|
|
122
125
|
api_url=server.api_url,
|
|
123
126
|
reconnection_attempts=reconnection_attempts,
|
|
124
127
|
checkpoint_every=checkpoint_every,
|
|
128
|
+
checkpoint_interval=checkpoint_interval,
|
|
125
129
|
)
|
|
126
130
|
else:
|
|
127
131
|
raise ValueError(
|
|
@@ -268,6 +272,7 @@ class PrefectEventsClient(EventsClient):
|
|
|
268
272
|
api_url: Optional[str] = None,
|
|
269
273
|
reconnection_attempts: int = 10,
|
|
270
274
|
checkpoint_every: int = 700,
|
|
275
|
+
checkpoint_interval: float = 30.0,
|
|
271
276
|
):
|
|
272
277
|
"""
|
|
273
278
|
Args:
|
|
@@ -276,6 +281,9 @@ class PrefectEventsClient(EventsClient):
|
|
|
276
281
|
the client should attempt to reconnect
|
|
277
282
|
checkpoint_every: How often the client should sync with the server to
|
|
278
283
|
confirm receipt of all previously sent events
|
|
284
|
+
checkpoint_interval: Maximum seconds between checkpoints, regardless of
|
|
285
|
+
event count. Prevents unbounded growth of the unconfirmed events
|
|
286
|
+
buffer for low-throughput connections.
|
|
279
287
|
"""
|
|
280
288
|
api_url = api_url or PREFECT_API_URL.value()
|
|
281
289
|
if not api_url:
|
|
@@ -297,6 +305,8 @@ class PrefectEventsClient(EventsClient):
|
|
|
297
305
|
self._reconnection_attempts = reconnection_attempts
|
|
298
306
|
self._unconfirmed_events = []
|
|
299
307
|
self._checkpoint_every = checkpoint_every
|
|
308
|
+
self._checkpoint_interval = checkpoint_interval
|
|
309
|
+
self._checkpoint_task: Optional[asyncio.Task[None]] = None
|
|
300
310
|
|
|
301
311
|
async def __aenter__(self) -> Self:
|
|
302
312
|
await super().__aenter__()
|
|
@@ -324,6 +334,7 @@ class PrefectEventsClient(EventsClient):
|
|
|
324
334
|
# propagate immediately with a warning
|
|
325
335
|
self._log_connection_error(e)
|
|
326
336
|
raise
|
|
337
|
+
self._start_checkpoint_task()
|
|
327
338
|
return self
|
|
328
339
|
|
|
329
340
|
async def __aexit__(
|
|
@@ -332,6 +343,7 @@ class PrefectEventsClient(EventsClient):
|
|
|
332
343
|
exc_val: Optional[BaseException],
|
|
333
344
|
exc_tb: Optional[TracebackType],
|
|
334
345
|
) -> None:
|
|
346
|
+
self._stop_checkpoint_task()
|
|
335
347
|
self._websocket = None
|
|
336
348
|
# Only call __aexit__ on the connection if it was successfully established.
|
|
337
349
|
# The websockets library sets the "connection" attribute on the connect
|
|
@@ -427,6 +439,47 @@ class PrefectEventsClient(EventsClient):
|
|
|
427
439
|
for event in events_to_resend:
|
|
428
440
|
await self.emit(event)
|
|
429
441
|
logger.debug("Finished resending unconfirmed events.")
|
|
442
|
+
self._start_checkpoint_task()
|
|
443
|
+
|
|
444
|
+
def _start_checkpoint_task(self) -> None:
|
|
445
|
+
self._stop_checkpoint_task()
|
|
446
|
+
self._checkpoint_task = asyncio.create_task(self._checkpoint_loop())
|
|
447
|
+
|
|
448
|
+
def _stop_checkpoint_task(self) -> None:
|
|
449
|
+
if self._checkpoint_task is not None:
|
|
450
|
+
self._checkpoint_task.cancel()
|
|
451
|
+
self._checkpoint_task = None
|
|
452
|
+
|
|
453
|
+
async def _checkpoint_loop(self) -> None:
|
|
454
|
+
"""Periodically checkpoint unconfirmed events on a time interval,
|
|
455
|
+
independent of the count-based checkpoint in _checkpoint."""
|
|
456
|
+
while True:
|
|
457
|
+
await asyncio.sleep(self._checkpoint_interval)
|
|
458
|
+
if self._websocket and self._unconfirmed_events:
|
|
459
|
+
try:
|
|
460
|
+
await self._force_checkpoint()
|
|
461
|
+
except Exception:
|
|
462
|
+
logger.debug(
|
|
463
|
+
"Time-based checkpoint failed, will retry next interval.",
|
|
464
|
+
exc_info=True,
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
async def _force_checkpoint(self) -> None:
|
|
468
|
+
"""Checkpoint all unconfirmed events unconditionally."""
|
|
469
|
+
assert self._websocket
|
|
470
|
+
|
|
471
|
+
unconfirmed_count = len(self._unconfirmed_events)
|
|
472
|
+
if unconfirmed_count == 0:
|
|
473
|
+
return
|
|
474
|
+
|
|
475
|
+
logger.debug("Time-based checkpoint: confirming %s events.", unconfirmed_count)
|
|
476
|
+
pong = await self._websocket.ping()
|
|
477
|
+
await pong
|
|
478
|
+
self._log_debug("Pong received. Events checkpointed.")
|
|
479
|
+
|
|
480
|
+
self._unconfirmed_events = self._unconfirmed_events[unconfirmed_count:]
|
|
481
|
+
|
|
482
|
+
EVENT_WEBSOCKET_CHECKPOINTS.labels(self.client_name).inc()
|
|
430
483
|
|
|
431
484
|
async def _checkpoint(self) -> None:
|
|
432
485
|
assert self._websocket
|
|
@@ -547,6 +600,7 @@ class PrefectCloudEventsClient(PrefectEventsClient):
|
|
|
547
600
|
api_key: Optional[str] = None,
|
|
548
601
|
reconnection_attempts: int = 10,
|
|
549
602
|
checkpoint_every: int = 700,
|
|
603
|
+
checkpoint_interval: float = 30.0,
|
|
550
604
|
):
|
|
551
605
|
"""
|
|
552
606
|
Args:
|
|
@@ -556,12 +610,15 @@ class PrefectCloudEventsClient(PrefectEventsClient):
|
|
|
556
610
|
the client should attempt to reconnect
|
|
557
611
|
checkpoint_every: How often the client should sync with the server to
|
|
558
612
|
confirm receipt of all previously sent events
|
|
613
|
+
checkpoint_interval: Maximum seconds between checkpoints, regardless of
|
|
614
|
+
event count.
|
|
559
615
|
"""
|
|
560
616
|
api_url, api_key = _get_api_url_and_key(api_url, api_key)
|
|
561
617
|
super().__init__(
|
|
562
618
|
api_url=api_url,
|
|
563
619
|
reconnection_attempts=reconnection_attempts,
|
|
564
620
|
checkpoint_every=checkpoint_every,
|
|
621
|
+
checkpoint_interval=checkpoint_interval,
|
|
565
622
|
)
|
|
566
623
|
# Cloud authenticates via the Authorization header at the HTTP level,
|
|
567
624
|
# not via the "prefect" subprotocol auth handshake used by self-hosted servers.
|
|
@@ -69,6 +69,9 @@ class EventsWorker(QueueService[Event]):
|
|
|
69
69
|
def __init__(
|
|
70
70
|
self, client_type: Type[EventsClient], client_options: Tuple[Tuple[str, Any]]
|
|
71
71
|
):
|
|
72
|
+
from prefect.settings import get_current_settings
|
|
73
|
+
|
|
74
|
+
self._max_queue_size = get_current_settings().events.worker_max_queue_size
|
|
72
75
|
super().__init__(client_type, client_options)
|
|
73
76
|
self.client_type = client_type
|
|
74
77
|
self.client_options = client_options
|
|
@@ -90,6 +93,9 @@ class EventsWorker(QueueService[Event]):
|
|
|
90
93
|
self._context_cache[event.id] = copy_context()
|
|
91
94
|
return event
|
|
92
95
|
|
|
96
|
+
def _on_item_dropped(self, item: Event) -> None:
|
|
97
|
+
self._context_cache.pop(item.id, None)
|
|
98
|
+
|
|
93
99
|
async def _handle(self, event: Event):
|
|
94
100
|
context = self._context_cache.pop(event.id)
|
|
95
101
|
with temporary_context(context=context):
|
|
@@ -472,7 +472,7 @@ def pause_flow_run(
|
|
|
472
472
|
async def asuspend_flow_run(
|
|
473
473
|
wait_for_input: None = None,
|
|
474
474
|
flow_run_id: UUID | None = None,
|
|
475
|
-
timeout: int | None =
|
|
475
|
+
timeout: int | None = None,
|
|
476
476
|
key: str | None = None,
|
|
477
477
|
) -> None: ...
|
|
478
478
|
|
|
@@ -481,7 +481,7 @@ async def asuspend_flow_run(
|
|
|
481
481
|
async def asuspend_flow_run(
|
|
482
482
|
wait_for_input: Type[T],
|
|
483
483
|
flow_run_id: UUID | None = None,
|
|
484
|
-
timeout: int | None =
|
|
484
|
+
timeout: int | None = None,
|
|
485
485
|
key: str | None = None,
|
|
486
486
|
) -> T: ...
|
|
487
487
|
|
|
@@ -489,7 +489,7 @@ async def asuspend_flow_run(
|
|
|
489
489
|
async def asuspend_flow_run(
|
|
490
490
|
wait_for_input: Type[T] | None = None,
|
|
491
491
|
flow_run_id: UUID | None = None,
|
|
492
|
-
timeout: int | None =
|
|
492
|
+
timeout: int | None = None,
|
|
493
493
|
key: str | None = None,
|
|
494
494
|
) -> T | None:
|
|
495
495
|
"""
|
|
@@ -509,9 +509,9 @@ async def asuspend_flow_run(
|
|
|
509
509
|
suspend the specified flow run. If not supplied will attempt to
|
|
510
510
|
suspend the current flow run.
|
|
511
511
|
timeout: the number of seconds to wait for the flow to be resumed before
|
|
512
|
-
failing. Defaults to
|
|
513
|
-
|
|
514
|
-
|
|
512
|
+
failing. Defaults to no timeout. If the pause timeout exceeds any
|
|
513
|
+
configured flow-level timeout, the flow might fail even after
|
|
514
|
+
resuming.
|
|
515
515
|
key: An optional key to prevent calling suspend more than once. This
|
|
516
516
|
defaults to a random string and prevents suspends from running the
|
|
517
517
|
same suspend twice. A custom key can be supplied for custom
|
|
@@ -596,7 +596,7 @@ async def asuspend_flow_run(
|
|
|
596
596
|
def suspend_flow_run(
|
|
597
597
|
wait_for_input: None = None,
|
|
598
598
|
flow_run_id: UUID | None = None,
|
|
599
|
-
timeout: int | None =
|
|
599
|
+
timeout: int | None = None,
|
|
600
600
|
key: str | None = None,
|
|
601
601
|
) -> None: ...
|
|
602
602
|
|
|
@@ -605,7 +605,7 @@ def suspend_flow_run(
|
|
|
605
605
|
def suspend_flow_run(
|
|
606
606
|
wait_for_input: Type[T],
|
|
607
607
|
flow_run_id: UUID | None = None,
|
|
608
|
-
timeout: int | None =
|
|
608
|
+
timeout: int | None = None,
|
|
609
609
|
key: str | None = None,
|
|
610
610
|
) -> T: ...
|
|
611
611
|
|
|
@@ -614,7 +614,7 @@ def suspend_flow_run(
|
|
|
614
614
|
def suspend_flow_run(
|
|
615
615
|
wait_for_input: Type[T] | None = None,
|
|
616
616
|
flow_run_id: UUID | None = None,
|
|
617
|
-
timeout: int | None =
|
|
617
|
+
timeout: int | None = None,
|
|
618
618
|
key: str | None = None,
|
|
619
619
|
) -> T | None:
|
|
620
620
|
"""
|
|
@@ -634,9 +634,9 @@ def suspend_flow_run(
|
|
|
634
634
|
suspend the specified flow run. If not supplied will attempt to
|
|
635
635
|
suspend the current flow run.
|
|
636
636
|
timeout: the number of seconds to wait for the flow to be resumed before
|
|
637
|
-
failing. Defaults to
|
|
638
|
-
|
|
639
|
-
|
|
637
|
+
failing. Defaults to no timeout. If the pause timeout exceeds any
|
|
638
|
+
configured flow-level timeout, the flow might fail even after
|
|
639
|
+
resuming.
|
|
640
640
|
key: An optional key to prevent calling suspend more than once. This
|
|
641
641
|
defaults to a random string and prevents suspends from running the
|
|
642
642
|
same suspend twice. A custom key can be supplied for custom
|
|
@@ -415,6 +415,23 @@ def create_api_app(
|
|
|
415
415
|
if final:
|
|
416
416
|
gc.collect()
|
|
417
417
|
|
|
418
|
+
@api_app.middleware("http")
|
|
419
|
+
async def default_content_type(request: Request, call_next: Any): # type: ignore[reportUnusedFunction]
|
|
420
|
+
# Older Prefect clients (<3.6.19) sent JSON bodies via httpx's
|
|
421
|
+
# content= parameter, which omits the Content-Type header.
|
|
422
|
+
# FastAPI >=0.132.0 requires Content-Type: application/json to
|
|
423
|
+
# parse request bodies. Default it here for backward compat.
|
|
424
|
+
if (
|
|
425
|
+
request.method in {"POST", "PUT", "PATCH"}
|
|
426
|
+
and "content-type" not in request.headers
|
|
427
|
+
and int(request.headers.get("content-length", "0")) > 0
|
|
428
|
+
):
|
|
429
|
+
request.scope["headers"] = [
|
|
430
|
+
*request.scope["headers"],
|
|
431
|
+
(b"content-type", b"application/json"),
|
|
432
|
+
]
|
|
433
|
+
return await call_next(request)
|
|
434
|
+
|
|
418
435
|
auth_string = prefect.settings.PREFECT_SERVER_API_AUTH_STRING.value()
|
|
419
436
|
|
|
420
437
|
if auth_string is not None:
|
|
@@ -13,6 +13,7 @@ All settings are rooted in the `Settings` class in `models/root.py`, which compo
|
|
|
13
13
|
| `client` | `models/client.py` | HTTP client behavior (retries, CSRF, headers) |
|
|
14
14
|
| `cloud` | `models/cloud.py` | Prefect Cloud-specific config |
|
|
15
15
|
| `deployments` | `models/deployments.py` | Deployment defaults |
|
|
16
|
+
| `events` | `models/events.py` | Client-side event worker behavior (queue size) |
|
|
16
17
|
| `experiments` | `models/experiments.py` | Feature flags and experimental features |
|
|
17
18
|
| `flows` | `models/flows.py` | Flow behavior defaults |
|
|
18
19
|
| `internal` | `models/internal.py` | Internal machinery |
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from typing import ClassVar
|
|
2
|
+
|
|
3
|
+
from pydantic import Field
|
|
4
|
+
from pydantic_settings import SettingsConfigDict
|
|
5
|
+
|
|
6
|
+
from prefect.settings.base import PrefectBaseSettings, build_settings_config
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class EventsSettings(PrefectBaseSettings):
|
|
10
|
+
"""
|
|
11
|
+
Settings for controlling events behavior
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
model_config: ClassVar[SettingsConfigDict] = build_settings_config(("events",))
|
|
15
|
+
|
|
16
|
+
worker_max_queue_size: int = Field(
|
|
17
|
+
default=0,
|
|
18
|
+
ge=0,
|
|
19
|
+
description="""
|
|
20
|
+
Maximum number of events that can be queued for delivery to the
|
|
21
|
+
Prefect server. When the queue is full, new events are dropped with
|
|
22
|
+
a warning. Set to 0 for unbounded (the default).
|
|
23
|
+
|
|
24
|
+
Warning: setting this value too low may result in data loss as events
|
|
25
|
+
will be silently dropped when the queue is full.
|
|
26
|
+
""",
|
|
27
|
+
)
|
{prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/settings/models/root.py
RENAMED
|
@@ -32,6 +32,7 @@ from .cli import CLISettings
|
|
|
32
32
|
from .client import ClientSettings
|
|
33
33
|
from .cloud import CloudSettings
|
|
34
34
|
from .deployments import DeploymentsSettings
|
|
35
|
+
from .events import EventsSettings
|
|
35
36
|
from .experiments import ExperimentsSettings
|
|
36
37
|
from .flows import FlowsSettings
|
|
37
38
|
from .internal import InternalSettings
|
|
@@ -98,6 +99,11 @@ class Settings(PrefectBaseSettings):
|
|
|
98
99
|
description="Settings for configuring deployments defaults",
|
|
99
100
|
)
|
|
100
101
|
|
|
102
|
+
events: EventsSettings = Field(
|
|
103
|
+
default_factory=EventsSettings,
|
|
104
|
+
description="Settings for controlling events behavior",
|
|
105
|
+
)
|
|
106
|
+
|
|
101
107
|
experiments: ExperimentsSettings = Field(
|
|
102
108
|
default_factory=ExperimentsSettings,
|
|
103
109
|
description="Settings for controlling experimental features",
|
|
@@ -15,6 +15,7 @@ Does NOT include: server-specific utilities (`server/utilities/`), concurrency s
|
|
|
15
15
|
- `callables.py` — Function signature introspection and parameter coercion
|
|
16
16
|
- `collections.py` — Extended collection helpers (visit, flatten, remove nested keys)
|
|
17
17
|
- `annotations.py` — Custom Prefect type annotations used in flow/task signatures
|
|
18
|
+
- `processutils.py` — Subprocess execution and output streaming helpers (`run_process`, `consume_process_output`, `stream_text`)
|
|
18
19
|
- `pydantic.py` — Pydantic v1/v2 compatibility shims
|
|
19
20
|
- `templating.py` — Jinja template utilities and `maybe_template()` detection
|
|
20
21
|
|
|
@@ -68,3 +69,4 @@ Handlers return `Placeholder` subclasses (e.g. `RemoveValue`, `InvalidJSON`, `In
|
|
|
68
69
|
|
|
69
70
|
- `maybe_template(s)` (in `templating.py`) only checks whether a string looks like it contains a Jinja expression — it does not validate that it's well-formed. A string with `{{` but no `}}` returns `True`.
|
|
70
71
|
- `HydrationContext` workspace variables are loaded once at build time. Stale contexts don't reflect variable updates made after context creation.
|
|
72
|
+
- **Non-UTF-8 subprocess output is silently replaced.** `consume_process_output` and `stream_text` (via `TextReceiveStream(errors="replace")`) replace invalid bytes with the Unicode replacement character `\ufffd` rather than raising. If captured output contains `\ufffd`, the subprocess emitted bytes that were not valid UTF-8.
|
|
@@ -267,21 +267,30 @@ async def resolve_inputs(
|
|
|
267
267
|
else:
|
|
268
268
|
return expr
|
|
269
269
|
|
|
270
|
-
# Do not allow uncompleted upstreams
|
|
271
|
-
#
|
|
270
|
+
# Do not allow uncompleted upstreams unless `allow_failure` has been used
|
|
271
|
+
# for failed or failure-derived (PENDING/NotReady) states
|
|
272
272
|
if not state.is_completed() and not (
|
|
273
273
|
# TODO: Note that the contextual annotation here is only at the current level
|
|
274
274
|
# if `allow_failure` is used then another annotation is used, this will
|
|
275
275
|
# incorrectly evaluate to false — to resolve this, we must track all
|
|
276
276
|
# annotations wrapping the current expression but this is not yet
|
|
277
277
|
# implemented.
|
|
278
|
-
isinstance(context.get("annotation"), allow_failure)
|
|
278
|
+
isinstance(context.get("annotation"), allow_failure)
|
|
279
|
+
and (state.is_failed() or (state.is_pending() and state.name == "NotReady"))
|
|
279
280
|
):
|
|
280
281
|
raise UpstreamTaskError(
|
|
281
282
|
f"Upstream task run '{state.state_details.task_run_id}' did not reach a"
|
|
282
283
|
" 'COMPLETED' state."
|
|
283
284
|
)
|
|
284
285
|
|
|
286
|
+
# When allow_failure is used and the state is not final (e.g. PENDING/NotReady
|
|
287
|
+
# from a cascading upstream failure), return state.data directly since
|
|
288
|
+
# result_by_state is only populated for final states.
|
|
289
|
+
if not state.is_final() and isinstance(
|
|
290
|
+
context.get("annotation"), allow_failure
|
|
291
|
+
):
|
|
292
|
+
return state.data
|
|
293
|
+
|
|
285
294
|
return result_by_state.get(state)
|
|
286
295
|
|
|
287
296
|
resolved_parameters: dict[str, Any] = {}
|
|
@@ -747,21 +756,28 @@ def resolve_to_final_result(expr: Any, context: dict[str, Any]) -> Any:
|
|
|
747
756
|
|
|
748
757
|
assert state
|
|
749
758
|
|
|
750
|
-
# Do not allow uncompleted upstreams
|
|
751
|
-
#
|
|
759
|
+
# Do not allow uncompleted upstreams unless `allow_failure` has been used
|
|
760
|
+
# for failed or failure-derived (PENDING/NotReady) states
|
|
752
761
|
if not state.is_completed() and not (
|
|
753
762
|
# TODO: Note that the contextual annotation here is only at the current level
|
|
754
763
|
# if `allow_failure` is used then another annotation is used, this will
|
|
755
764
|
# incorrectly evaluate to false — to resolve this, we must track all
|
|
756
765
|
# annotations wrapping the current expression but this is not yet
|
|
757
766
|
# implemented.
|
|
758
|
-
isinstance(context.get("annotation"), allow_failure)
|
|
767
|
+
isinstance(context.get("annotation"), allow_failure)
|
|
768
|
+
and (state.is_failed() or (state.is_pending() and state.name == "NotReady"))
|
|
759
769
|
):
|
|
760
770
|
raise UpstreamTaskError(
|
|
761
771
|
f"Upstream task run '{state.state_details.task_run_id}' did not reach a"
|
|
762
772
|
" 'COMPLETED' state."
|
|
763
773
|
)
|
|
764
774
|
|
|
775
|
+
# When allow_failure is used and the state is not final (e.g. PENDING/NotReady
|
|
776
|
+
# from a cascading upstream failure), we cannot call state.result() because it
|
|
777
|
+
# raises UnfinishedRun. Return the state's data directly instead.
|
|
778
|
+
if not state.is_final() and isinstance(context.get("annotation"), allow_failure):
|
|
779
|
+
return state.data
|
|
780
|
+
|
|
765
781
|
result: Any = state.result(raise_on_failure=False, _sync=True) # pyright: ignore[reportCallIssue] _sync messes up type inference and can be removed once async_dispatch is removed
|
|
766
782
|
|
|
767
783
|
if state.state_details.traceparent:
|
{prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/utilities/processutils.py
RENAMED
|
@@ -338,13 +338,13 @@ async def consume_process_output(
|
|
|
338
338
|
if process.stdout is not None:
|
|
339
339
|
tg.start_soon(
|
|
340
340
|
stream_text,
|
|
341
|
-
TextReceiveStream(process.stdout),
|
|
341
|
+
TextReceiveStream(process.stdout, errors="replace"),
|
|
342
342
|
stdout_sink,
|
|
343
343
|
)
|
|
344
344
|
if process.stderr is not None:
|
|
345
345
|
tg.start_soon(
|
|
346
346
|
stream_text,
|
|
347
|
-
TextReceiveStream(process.stderr),
|
|
347
|
+
TextReceiveStream(process.stderr, errors="replace"),
|
|
348
348
|
stderr_sink,
|
|
349
349
|
)
|
|
350
350
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{prefect_client-3.6.24.dev3 → prefect_client-3.6.24.dev5}/src/prefect/_experimental/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|