prefect-client 3.6.27.dev4__tar.gz → 3.6.28__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.27.dev4 → prefect_client-3.6.28}/.gitignore +1 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/PKG-INFO +3 -3
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/pyproject.toml +2 -2
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/AGENTS.md +2 -0
- prefect_client-3.6.28/src/prefect/_build_info.py +5 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/__init__.py +100 -31
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/execute.py +1 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/deprecated.py +7 -1
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/v2_schema.py +14 -5
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_result_records.py +16 -1
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/notifications.py +19 -7
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/webhook.py +16 -4
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/AGENTS.md +1 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/_version_checking.py +1 -1
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/objects.py +12 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/flow_engine.py +14 -1
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/futures.py +51 -2
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/AGENTS.md +5 -1
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/serializers.py +38 -2
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/sources.py +16 -16
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/task_runners.py +11 -3
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/_datetime.py +89 -39
- prefect_client-3.6.28/src/prefect/utilities/AGENTS.md +57 -0
- prefect_client-3.6.28/src/prefect/utilities/asyncutils/AGENTS.md +20 -0
- prefect_client-3.6.28/src/prefect/utilities/callables/AGENTS.md +22 -0
- prefect_client-3.6.27.dev4/src/prefect/utilities/callables.py → prefect_client-3.6.28/src/prefect/utilities/callables/__init__.py +2 -1
- prefect_client-3.6.28/src/prefect/utilities/engine/AGENTS.md +31 -0
- prefect_client-3.6.28/src/prefect/utilities/filesystem/AGENTS.md +17 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/importtools.py +11 -1
- prefect_client-3.6.28/src/prefect/utilities/processutils/AGENTS.md +22 -0
- prefect_client-3.6.28/src/prefect/utilities/schema_tools/AGENTS.md +53 -0
- prefect_client-3.6.28/src/prefect/utilities/templating/AGENTS.md +19 -0
- prefect_client-3.6.27.dev4/src/prefect/utilities/templating.py → prefect_client-3.6.28/src/prefect/utilities/templating/__init__.py +5 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/urls.py +230 -8
- prefect_client-3.6.27.dev4/src/prefect/_build_info.py +0 -5
- prefect_client-3.6.27.dev4/src/prefect/utilities/AGENTS.md +0 -81
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/LICENSE +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/README.md +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/context.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/engine.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/flows.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/main.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/results.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/states.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/annotations.py +0 -0
- /prefect_client-3.6.27.dev4/src/prefect/utilities/asyncutils.py → /prefect_client-3.6.28/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/dockerutils.py +0 -0
- /prefect_client-3.6.27.dev4/src/prefect/utilities/engine.py → /prefect_client-3.6.28/src/prefect/utilities/engine/__init__.py +0 -0
- /prefect_client-3.6.27.dev4/src/prefect/utilities/filesystem.py → /prefect_client-3.6.28/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/names.py +0 -0
- /prefect_client-3.6.27.dev4/src/prefect/utilities/processutils.py → /prefect_client-3.6.28/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.6.
|
|
3
|
+
Version: 3.6.28
|
|
4
4
|
Summary: Workflow orchestration and management.
|
|
5
5
|
Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
|
|
6
6
|
Project-URL: Documentation, https://docs.prefect.io
|
|
@@ -40,7 +40,7 @@ Requires-Dist: jsonpatch<2.0,>=1.32
|
|
|
40
40
|
Requires-Dist: jsonschema<5.0.0,>=4.18.0
|
|
41
41
|
Requires-Dist: opentelemetry-api<2.0.0,>=1.27.0
|
|
42
42
|
Requires-Dist: orjson<4.0,>=3.7
|
|
43
|
-
Requires-Dist: packaging<26.
|
|
43
|
+
Requires-Dist: packaging<26.2,>=21.3
|
|
44
44
|
Requires-Dist: pathspec>=0.8.0
|
|
45
45
|
Requires-Dist: pendulum<4,>=3.1.0; python_version < '3.13'
|
|
46
46
|
Requires-Dist: prometheus-client>=0.20.0
|
|
@@ -53,7 +53,7 @@ Requires-Dist: python-slugify<9.0,>=5.0
|
|
|
53
53
|
Requires-Dist: pytz<2027,>=2021.1
|
|
54
54
|
Requires-Dist: pyyaml<7.0.0,>=5.4.1
|
|
55
55
|
Requires-Dist: rfc3339-validator<0.2.0,>=0.1.4
|
|
56
|
-
Requires-Dist: rich<
|
|
56
|
+
Requires-Dist: rich<16.0,>=11.0
|
|
57
57
|
Requires-Dist: ruamel-yaml-clib>=0.2.8; platform_python_implementation == 'CPython'
|
|
58
58
|
Requires-Dist: ruamel-yaml>=0.17.0
|
|
59
59
|
Requires-Dist: sniffio<2.0.0,>=1.3.0
|
|
@@ -44,7 +44,7 @@ dependencies = [
|
|
|
44
44
|
"jsonschema>=4.18.0,<5.0.0",
|
|
45
45
|
"opentelemetry-api>=1.27.0,<2.0.0",
|
|
46
46
|
"orjson>=3.7,<4.0",
|
|
47
|
-
"packaging>=21.3,<26.
|
|
47
|
+
"packaging>=21.3,<26.2",
|
|
48
48
|
"pathspec>=0.8.0",
|
|
49
49
|
"pendulum>=3.1.0,<4; python_version<'3.13'",
|
|
50
50
|
"prometheus-client>=0.20.0",
|
|
@@ -57,7 +57,7 @@ dependencies = [
|
|
|
57
57
|
"pytz>=2021.1,<2027",
|
|
58
58
|
"pyyaml>=5.4.1,<7.0.0",
|
|
59
59
|
"rfc3339-validator>=0.1.4,<0.2.0",
|
|
60
|
-
"rich>=11.0,<
|
|
60
|
+
"rich>=11.0,<16.0",
|
|
61
61
|
"ruamel.yaml>=0.17.0",
|
|
62
62
|
"ruamel.yaml.clib>=0.2.8; platform_python_implementation == 'CPython'",
|
|
63
63
|
"sniffio>=1.3.0,<2.0.0",
|
|
@@ -21,10 +21,12 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
|
|
|
21
21
|
|
|
22
22
|
- **Engine ordering matters.** The engines apply features (retries, caching, result persistence, transactions) in a specific order. Changing the order or forgetting a feature in one engine path is the most common source of breakage.
|
|
23
23
|
- **Sync and async must stay in sync.** Both `flow_engine.py` and `task_engine.py` have sync and async paths. Any behavior change must be applied to both.
|
|
24
|
+
- **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences between whenever 0.7.x–0.9.x and ≥ 0.10.0. The `_WHENEVER_NEW_API` flag (True when whenever ≥ 0.10.0) guards version-specific code. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Violations will silently break on whichever whenever version the helpers weren't written for.
|
|
24
25
|
- **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.
|
|
25
26
|
- **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.
|
|
26
27
|
- **`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.
|
|
27
28
|
- **`ProcessPoolTaskRunner` instances may be deserialized without `__init__` running.** When a runner is pickled and restored in a subprocess, `__init__` is not called, so instance attributes set there may be absent. Access any such attribute via `getattr(self, "_attr", default)` rather than `self._attr` directly — both in the property getter and in `duplicate()`. The `subprocess_message_processor_factories` property demonstrates the required pattern.
|
|
29
|
+
- **`ResultRecordMetadata` tolerates unknown serializer types.** When loading persisted metadata, an unrecognized serializer `type` is converted to an `UnknownSerializer` placeholder rather than raising `ValidationError`. This allows inspecting result metadata when the serializer implementation is unavailable in the current environment. However, known serializer types with invalid fields still raise `ValidationError`. `UnknownSerializer.dumps()` and `UnknownSerializer.loads()` raise `RuntimeError` — the tolerance is for inspection only, not actual serialization/deserialization.
|
|
28
30
|
|
|
29
31
|
## Logging
|
|
30
32
|
|
{prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_experimental/bundles/__init__.py
RENAMED
|
@@ -23,7 +23,10 @@ from typing_extensions import Literal, NotRequired, TypeAlias
|
|
|
23
23
|
|
|
24
24
|
import anyio
|
|
25
25
|
import cloudpickle # pyright: ignore[reportMissingTypeStubs]
|
|
26
|
+
from packaging.requirements import InvalidRequirement, Requirement
|
|
27
|
+
from packaging.version import Version
|
|
26
28
|
|
|
29
|
+
import prefect
|
|
27
30
|
from prefect._internal.control_listener import configure_from_env
|
|
28
31
|
from prefect.client.schemas.objects import FlowRun
|
|
29
32
|
from prefect.context import SettingsContext, get_settings_context, serialize_context
|
|
@@ -36,7 +39,10 @@ from prefect.settings.models.root import Settings
|
|
|
36
39
|
from prefect.utilities.processutils import sanitize_subprocess_env
|
|
37
40
|
from prefect.utilities.slugify import slugify
|
|
38
41
|
|
|
39
|
-
from prefect._experimental._launchers import
|
|
42
|
+
from prefect._experimental._launchers import (
|
|
43
|
+
get_launcher_for_side,
|
|
44
|
+
validate_bundle_step_launcher,
|
|
45
|
+
)
|
|
40
46
|
|
|
41
47
|
from .execute import execute_bundle_from_file
|
|
42
48
|
from ._file_collector import FileCollector
|
|
@@ -411,38 +417,48 @@ def create_bundle_for_flow_run(
|
|
|
411
417
|
"""
|
|
412
418
|
context = context or serialize_context()
|
|
413
419
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
420
|
+
# Skip `uv pip freeze` when the execution side of the flow's launcher
|
|
421
|
+
# opts out of uv-based launchers. The `dependencies` field is only
|
|
422
|
+
# consumed by `execute_bundle_in_subprocess` (which uses `uv pip install`);
|
|
423
|
+
# custom execution launchers are responsible for their own environment.
|
|
424
|
+
# Upload-only launcher overrides still use `uv run` at execution time and
|
|
425
|
+
# therefore still need the dependency snapshot.
|
|
426
|
+
flow_launcher = getattr(flow, "launcher", None)
|
|
427
|
+
if get_launcher_for_side(flow_launcher, "execution") is None:
|
|
428
|
+
dependencies = (
|
|
429
|
+
subprocess.check_output(
|
|
430
|
+
[
|
|
431
|
+
_get_uv_path(),
|
|
432
|
+
"pip",
|
|
433
|
+
"freeze",
|
|
434
|
+
# Exclude editable installs because we won't be able to install them in the execution environment
|
|
435
|
+
"--exclude-editable",
|
|
436
|
+
]
|
|
437
|
+
)
|
|
438
|
+
.decode()
|
|
439
|
+
.strip()
|
|
423
440
|
)
|
|
424
|
-
.decode()
|
|
425
|
-
.strip()
|
|
426
|
-
)
|
|
427
441
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
442
|
+
# Remove dependencies installed from a local file path because we won't be able
|
|
443
|
+
# to install them in the execution environment. The user will be responsible for
|
|
444
|
+
# making sure they are available in the execution environment
|
|
445
|
+
filtered_dependencies: list[str] = []
|
|
446
|
+
file_dependencies: list[str] = []
|
|
447
|
+
for line in dependencies.split("\n"):
|
|
448
|
+
if "file://" in line:
|
|
449
|
+
file_dependencies.append(line)
|
|
450
|
+
else:
|
|
451
|
+
filtered_dependencies.append(line)
|
|
452
|
+
dependencies = "\n".join(filtered_dependencies)
|
|
453
|
+
if file_dependencies:
|
|
454
|
+
logger.warning(
|
|
455
|
+
"The following dependencies were installed from a local file path and will not be "
|
|
456
|
+
"automatically installed in the execution environment: %s. If these dependencies "
|
|
457
|
+
"are not available in the execution environment, your flow run may fail.",
|
|
458
|
+
"\n".join(file_dependencies),
|
|
459
|
+
)
|
|
460
|
+
else:
|
|
461
|
+
dependencies = ""
|
|
446
462
|
|
|
447
463
|
# Collect and package included files if specified
|
|
448
464
|
files_key: str | None = None
|
|
@@ -603,6 +619,52 @@ def execute_bundle_in_subprocess(
|
|
|
603
619
|
return process
|
|
604
620
|
|
|
605
621
|
|
|
622
|
+
def _pin_prefect_in_bundle_step_requires(requires: list[str]) -> list[str]:
|
|
623
|
+
"""
|
|
624
|
+
Ensure the `uv run --with` requirements for an outer bundle-step process
|
|
625
|
+
include the exact current publishable Prefect version.
|
|
626
|
+
|
|
627
|
+
The outer bundle-step process imports Prefect before the bundle's frozen
|
|
628
|
+
dependencies are installed, so transitive constraints like
|
|
629
|
+
`prefect>=3.6.24` from integration packages can otherwise resolve an
|
|
630
|
+
older stable Prefect even when the bundle was built against a newer
|
|
631
|
+
version. Pinning `prefect=={prefect.__version__}` keeps the outer
|
|
632
|
+
process on the same version the bundle was built with.
|
|
633
|
+
|
|
634
|
+
- Rewrites any existing `prefect` (or `prefect[...]`) requirement to the
|
|
635
|
+
exact current version, preserving extras and markers.
|
|
636
|
+
- Appends `prefect=={prefect.__version__}` if no Prefect requirement is
|
|
637
|
+
present.
|
|
638
|
+
- Returns the requirements unchanged for local/unpublishable versions,
|
|
639
|
+
matching the behavior of `prefect._internal.installation`.
|
|
640
|
+
"""
|
|
641
|
+
version = Version(prefect.__version__)
|
|
642
|
+
if version.local:
|
|
643
|
+
return requires
|
|
644
|
+
|
|
645
|
+
pinned_version = prefect.__version__
|
|
646
|
+
updated: list[str] = []
|
|
647
|
+
found_prefect = False
|
|
648
|
+
for requirement in requires:
|
|
649
|
+
try:
|
|
650
|
+
parsed = Requirement(requirement)
|
|
651
|
+
except InvalidRequirement:
|
|
652
|
+
updated.append(requirement)
|
|
653
|
+
continue
|
|
654
|
+
if parsed.name.lower() != "prefect":
|
|
655
|
+
updated.append(requirement)
|
|
656
|
+
continue
|
|
657
|
+
found_prefect = True
|
|
658
|
+
extras = f"[{','.join(sorted(parsed.extras))}]" if parsed.extras else ""
|
|
659
|
+
marker = f" ; {parsed.marker}" if parsed.marker else ""
|
|
660
|
+
updated.append(f"prefect{extras}=={pinned_version}{marker}")
|
|
661
|
+
|
|
662
|
+
if not found_prefect:
|
|
663
|
+
updated.append(f"prefect=={pinned_version}")
|
|
664
|
+
|
|
665
|
+
return updated
|
|
666
|
+
|
|
667
|
+
|
|
606
668
|
def convert_step_to_command(
|
|
607
669
|
step: dict[str, Any], key: str, quiet: bool = False
|
|
608
670
|
) -> list[str]:
|
|
@@ -642,6 +704,13 @@ def convert_step_to_command(
|
|
|
642
704
|
if quiet:
|
|
643
705
|
command.append("--quiet")
|
|
644
706
|
|
|
707
|
+
# Pin the outer bundle-step process to the current publishable Prefect
|
|
708
|
+
# version so integration `requires` like `prefect-aws>=0.5.5` cannot
|
|
709
|
+
# resolve an older stable Prefect via transitive `prefect>=...`
|
|
710
|
+
# constraints before the bundle's frozen dependencies are applied.
|
|
711
|
+
if requires:
|
|
712
|
+
requires = _pin_prefect_in_bundle_step_requires(requires)
|
|
713
|
+
|
|
645
714
|
# Add the `--with` argument to handle dependencies for running the step
|
|
646
715
|
if requires:
|
|
647
716
|
command.extend(["--with", ",".join(requires)])
|
|
@@ -91,8 +91,14 @@ def generate_deprecation_message(
|
|
|
91
91
|
if sys.version_info >= (3, 13):
|
|
92
92
|
from whenever import PlainDateTime
|
|
93
93
|
|
|
94
|
+
_pdt_from_dt = (
|
|
95
|
+
PlainDateTime
|
|
96
|
+
if hasattr(PlainDateTime, "to_stdlib")
|
|
97
|
+
else PlainDateTime.from_py_datetime
|
|
98
|
+
)
|
|
99
|
+
_dt = _pdt_from_dt(start_date).add(months=6)
|
|
94
100
|
end_date = (
|
|
95
|
-
|
|
101
|
+
_dt.to_stdlib() if hasattr(_dt, "to_stdlib") else _dt.py_datetime()
|
|
96
102
|
)
|
|
97
103
|
else:
|
|
98
104
|
import pendulum
|
{prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/_internal/pydantic/v2_schema.py
RENAMED
|
@@ -5,6 +5,7 @@ import typing as t
|
|
|
5
5
|
import pydantic
|
|
6
6
|
from pydantic import BaseModel as V2BaseModel
|
|
7
7
|
from pydantic import ConfigDict, PydanticUndefinedAnnotation, create_model
|
|
8
|
+
from pydantic.errors import PydanticUserError
|
|
8
9
|
from pydantic.fields import FieldInfo
|
|
9
10
|
from pydantic.type_adapter import TypeAdapter
|
|
10
11
|
|
|
@@ -115,11 +116,19 @@ def create_v2_schema(
|
|
|
115
116
|
raise TypeError(exc.message)
|
|
116
117
|
|
|
117
118
|
# root model references under #definitions
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
119
|
+
try:
|
|
120
|
+
schema = adapter.json_schema(
|
|
121
|
+
by_alias=True,
|
|
122
|
+
ref_template="#/definitions/{model}",
|
|
123
|
+
schema_generator=GenerateEmptySchemaForUserClasses,
|
|
124
|
+
)
|
|
125
|
+
except PydanticUserError as exc:
|
|
126
|
+
# In Pydantic >=2.13, unresolved forward references defer the error
|
|
127
|
+
# until the schema is built. Surface these as TypeError, matching the
|
|
128
|
+
# behavior parameter_schema expects for invalid parameter types.
|
|
129
|
+
if exc.code == "class-not-fully-defined":
|
|
130
|
+
raise TypeError(str(exc))
|
|
131
|
+
raise
|
|
123
132
|
# ensure backwards compatibility by copying $defs into definitions
|
|
124
133
|
if "$defs" in schema:
|
|
125
134
|
schema["definitions"] = schema["$defs"]
|
|
@@ -17,6 +17,7 @@ from pydantic import (
|
|
|
17
17
|
BaseModel,
|
|
18
18
|
Field,
|
|
19
19
|
ValidationError,
|
|
20
|
+
field_validator,
|
|
20
21
|
model_validator,
|
|
21
22
|
)
|
|
22
23
|
|
|
@@ -24,8 +25,9 @@ import prefect
|
|
|
24
25
|
from prefect.exceptions import (
|
|
25
26
|
SerializationError,
|
|
26
27
|
)
|
|
27
|
-
from prefect.serializers import PickleSerializer, Serializer
|
|
28
|
+
from prefect.serializers import PickleSerializer, Serializer, UnknownSerializer
|
|
28
29
|
from prefect.types import DateTime
|
|
30
|
+
from prefect.utilities.dispatch import lookup_type
|
|
29
31
|
|
|
30
32
|
if TYPE_CHECKING:
|
|
31
33
|
pass
|
|
@@ -49,6 +51,19 @@ class ResultRecordMetadata(BaseModel):
|
|
|
49
51
|
prefect_version: str = Field(default=prefect.__version__)
|
|
50
52
|
storage_block_id: Optional[uuid.UUID] = Field(default=None)
|
|
51
53
|
|
|
54
|
+
@field_validator("serializer", mode="before")
|
|
55
|
+
@classmethod
|
|
56
|
+
def _tolerate_unknown_serializer(
|
|
57
|
+
cls, value: Serializer | dict[str, Any] | Any
|
|
58
|
+
) -> Serializer | dict[str, Any] | Any:
|
|
59
|
+
if isinstance(value, dict) and "type" in value:
|
|
60
|
+
try:
|
|
61
|
+
lookup_type(Serializer, dispatch_key=value["type"])
|
|
62
|
+
except KeyError:
|
|
63
|
+
return UnknownSerializer.model_construct(**value)
|
|
64
|
+
return Serializer(**value)
|
|
65
|
+
return value
|
|
66
|
+
|
|
52
67
|
def dump_bytes(self) -> bytes:
|
|
53
68
|
"""
|
|
54
69
|
Serialize the metadata to bytes.
|
|
@@ -13,7 +13,11 @@ from prefect.blocks.abstract import NotificationBlock, NotificationError
|
|
|
13
13
|
from prefect.logging import LogEavesdropper
|
|
14
14
|
from prefect.types import SecretDict
|
|
15
15
|
from prefect.utilities.templating import apply_values, find_placeholders
|
|
16
|
-
from prefect.utilities.urls import
|
|
16
|
+
from prefect.utilities.urls import (
|
|
17
|
+
SSRFProtectedAsyncHTTPTransport,
|
|
18
|
+
SSRFProtectedHTTPTransport,
|
|
19
|
+
validate_restricted_url,
|
|
20
|
+
)
|
|
17
21
|
|
|
18
22
|
PREFECT_NOTIFY_TYPE_DEFAULT = "info" # Use a valid apprise type as default
|
|
19
23
|
|
|
@@ -987,13 +991,18 @@ class CustomWebhookNotificationBlock(NotificationBlock):
|
|
|
987
991
|
import httpx
|
|
988
992
|
|
|
989
993
|
request_args = self._build_request_args(body, subject)
|
|
994
|
+
client_kwargs: dict[str, Any] = {
|
|
995
|
+
"headers": {"user-agent": "Prefect Notifications"},
|
|
996
|
+
}
|
|
990
997
|
if not self.allow_private_urls:
|
|
991
998
|
validate_restricted_url(request_args["url"])
|
|
999
|
+
# Re-validate at connection time and pin the resolved IP to close
|
|
1000
|
+
# the DNS-rebinding TOCTOU window.
|
|
1001
|
+
client_kwargs["transport"] = SSRFProtectedAsyncHTTPTransport()
|
|
992
1002
|
cookies = request_args.pop("cookies", dict())
|
|
1003
|
+
client_kwargs["cookies"] = cookies
|
|
993
1004
|
# make request with httpx
|
|
994
|
-
async with httpx.AsyncClient(
|
|
995
|
-
headers={"user-agent": "Prefect Notifications"}, cookies=cookies
|
|
996
|
-
) as client:
|
|
1005
|
+
async with httpx.AsyncClient(**client_kwargs) as client:
|
|
997
1006
|
resp = await client.request(**request_args)
|
|
998
1007
|
resp.raise_for_status()
|
|
999
1008
|
|
|
@@ -1002,13 +1011,16 @@ class CustomWebhookNotificationBlock(NotificationBlock):
|
|
|
1002
1011
|
import httpx
|
|
1003
1012
|
|
|
1004
1013
|
request_args = self._build_request_args(body, subject)
|
|
1014
|
+
client_kwargs: dict[str, Any] = {
|
|
1015
|
+
"headers": {"user-agent": "Prefect Notifications"},
|
|
1016
|
+
}
|
|
1005
1017
|
if not self.allow_private_urls:
|
|
1006
1018
|
validate_restricted_url(request_args["url"])
|
|
1019
|
+
client_kwargs["transport"] = SSRFProtectedHTTPTransport()
|
|
1007
1020
|
cookies = request_args.pop("cookies", dict())
|
|
1021
|
+
client_kwargs["cookies"] = cookies
|
|
1008
1022
|
# make request with httpx
|
|
1009
|
-
with httpx.Client(
|
|
1010
|
-
headers={"user-agent": "Prefect Notifications"}, cookies=cookies
|
|
1011
|
-
) as client:
|
|
1023
|
+
with httpx.Client(**client_kwargs) as client:
|
|
1012
1024
|
resp = client.request(**request_args)
|
|
1013
1025
|
resp.raise_for_status()
|
|
1014
1026
|
|
|
@@ -8,12 +8,21 @@ from typing_extensions import Literal
|
|
|
8
8
|
|
|
9
9
|
from prefect.blocks.core import Block
|
|
10
10
|
from prefect.types import SecretDict
|
|
11
|
-
from prefect.utilities.urls import
|
|
11
|
+
from prefect.utilities.urls import (
|
|
12
|
+
SSRFProtectedAsyncHTTPTransport,
|
|
13
|
+
validate_restricted_url,
|
|
14
|
+
)
|
|
12
15
|
|
|
13
16
|
# Use a global HTTP transport to maintain a process-wide connection pool for
|
|
14
17
|
# interservice requests
|
|
15
18
|
_http_transport = AsyncHTTPTransport()
|
|
16
19
|
_insecure_http_transport = AsyncHTTPTransport(verify=False)
|
|
20
|
+
# Separate pools for calls that must be protected from DNS-rebinding SSRF. The
|
|
21
|
+
# protected transport validates the resolved IP at connection time and connects
|
|
22
|
+
# to the pre-resolved address, closing the TOCTOU window exploited by DNS
|
|
23
|
+
# rebinding attacks.
|
|
24
|
+
_safe_http_transport = SSRFProtectedAsyncHTTPTransport()
|
|
25
|
+
_safe_insecure_http_transport = SSRFProtectedAsyncHTTPTransport(verify=False)
|
|
17
26
|
|
|
18
27
|
|
|
19
28
|
class Webhook(Block):
|
|
@@ -53,10 +62,13 @@ class Webhook(Block):
|
|
|
53
62
|
)
|
|
54
63
|
|
|
55
64
|
def block_initialization(self) -> None:
|
|
56
|
-
if self.
|
|
57
|
-
self.
|
|
65
|
+
if self.allow_private_urls:
|
|
66
|
+
transport = _http_transport if self.verify else _insecure_http_transport
|
|
58
67
|
else:
|
|
59
|
-
|
|
68
|
+
transport = (
|
|
69
|
+
_safe_http_transport if self.verify else _safe_insecure_http_transport
|
|
70
|
+
)
|
|
71
|
+
self._client = AsyncClient(transport=transport)
|
|
60
72
|
|
|
61
73
|
async def call(self, payload: dict[str, Any] | str | None = None) -> Response:
|
|
62
74
|
"""
|
|
@@ -9,6 +9,7 @@ HTTP client for communicating with Prefect server and Prefect Cloud.
|
|
|
9
9
|
- **Methods should accept simple kwargs** (`str`, `int`, `UUID`, etc.) and return Pydantic models. Avoid accepting complex objects as parameters.
|
|
10
10
|
- **Client schemas are separate from server schemas.** This module has its own `schemas/` to avoid tangling with `server/schemas/`. Keep the boundary clean.
|
|
11
11
|
- **Do not import server-only modules** (`server/database`, `server/models`, etc.) from anything in this directory — it would break the `prefect-client` package build.
|
|
12
|
+
- **Task-run submission schemas must be eagerly rebuilt.** Schemas instantiated on the concurrent submission path (`Task.create_local_run()`) are rebuilt at import time via `model_rebuild()` at the bottom of `schemas/objects.py`. Pydantic defers schema construction to first use; under threadpool contention, multiple workers race to build the same schema simultaneously. If you add a new schema used in this hot path, add a corresponding `model_rebuild()` call there.
|
|
12
13
|
|
|
13
14
|
## Structure
|
|
14
15
|
|
{prefect_client-3.6.27.dev4 → prefect_client-3.6.28}/src/prefect/client/_version_checking.py
RENAMED
|
@@ -142,7 +142,7 @@ async def check_server_version(
|
|
|
142
142
|
if auth_string:
|
|
143
143
|
token = base64.b64encode(auth_string.encode("utf-8")).decode("utf-8")
|
|
144
144
|
headers["Authorization"] = f"Basic {token}"
|
|
145
|
-
elif api_key:
|
|
145
|
+
elif api_key and "Authorization" not in headers:
|
|
146
146
|
headers["Authorization"] = f"Bearer {api_key}"
|
|
147
147
|
if headers:
|
|
148
148
|
httpx_kwargs["headers"] = headers
|
|
@@ -942,6 +942,18 @@ class TaskRun(TimeSeriesBaseModel, ObjectBaseModel):
|
|
|
942
942
|
return get_or_create_run_name(name)
|
|
943
943
|
|
|
944
944
|
|
|
945
|
+
# These models are instantiated while task runs are being created locally on the
|
|
946
|
+
# concurrent submission path. Rebuild them eagerly so threadpool workers do not
|
|
947
|
+
# trigger deferred first-use schema builds under contention.
|
|
948
|
+
RunInput.model_rebuild()
|
|
949
|
+
TaskRunPolicy.model_rebuild()
|
|
950
|
+
TaskRunResult.model_rebuild()
|
|
951
|
+
FlowRunResult.model_rebuild()
|
|
952
|
+
Parameter.model_rebuild()
|
|
953
|
+
Constant.model_rebuild()
|
|
954
|
+
TaskRun.model_rebuild()
|
|
955
|
+
|
|
956
|
+
|
|
945
957
|
class Workspace(PrefectBaseModel):
|
|
946
958
|
"""
|
|
947
959
|
A Prefect Cloud workspace.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import contextvars
|
|
4
5
|
import datetime
|
|
5
6
|
import logging
|
|
6
7
|
import multiprocessing
|
|
@@ -292,7 +293,19 @@ def _send_heartbeats(
|
|
|
292
293
|
return
|
|
293
294
|
time.sleep(1)
|
|
294
295
|
|
|
295
|
-
thread
|
|
296
|
+
# Copy the current context so the heartbeat thread sees the same
|
|
297
|
+
# `SettingsContext` (and therefore the same `PREFECT_API_URL`) as the
|
|
298
|
+
# calling thread. Without this, `threading.Thread` starts with an empty
|
|
299
|
+
# context and `SettingsContext.get()` falls back to the process-wide
|
|
300
|
+
# `GLOBAL_SETTINGS_CONTEXT`, which is initialized at import time and can
|
|
301
|
+
# have a stale `api.url=None`. That caused `EventsWorker.instance()` from
|
|
302
|
+
# the heartbeat path to spawn an ephemeral `SubprocessASGIServer` during
|
|
303
|
+
# flow teardown, racing with interpreter shutdown and aborting the
|
|
304
|
+
# process.
|
|
305
|
+
heartbeat_ctx = contextvars.copy_context()
|
|
306
|
+
thread = threading.Thread(
|
|
307
|
+
target=heartbeat_ctx.run, args=(heartbeat_loop,), daemon=True
|
|
308
|
+
)
|
|
296
309
|
thread.start()
|
|
297
310
|
engine.logger.debug("Started flow run heartbeat context")
|
|
298
311
|
|
|
@@ -194,6 +194,44 @@ class PrefectConcurrentFuture(PrefectWrappedFuture[R, concurrent.futures.Future[
|
|
|
194
194
|
when the task run is submitted to a ThreadPoolExecutor.
|
|
195
195
|
"""
|
|
196
196
|
|
|
197
|
+
def __init__(
|
|
198
|
+
self,
|
|
199
|
+
task_run_id: uuid.UUID,
|
|
200
|
+
wrapped_future: concurrent.futures.Future[R],
|
|
201
|
+
):
|
|
202
|
+
super().__init__(task_run_id, wrapped_future)
|
|
203
|
+
self._prefect_done_callbacks: list[Callable[[PrefectFuture[R]], None]] = []
|
|
204
|
+
self._prefect_done_callbacks_lock = threading.Lock()
|
|
205
|
+
self._prefect_done_event = threading.Event()
|
|
206
|
+
|
|
207
|
+
# Register Prefect's internal completion notifier before any user callbacks
|
|
208
|
+
# so wait()/as_completed() do not depend on callback chain ordering.
|
|
209
|
+
self._wrapped_future.add_done_callback(self._notify_prefect_done_callbacks)
|
|
210
|
+
|
|
211
|
+
def _add_prefect_done_callback(
|
|
212
|
+
self, fn: Callable[[PrefectFuture[R]], None]
|
|
213
|
+
) -> None:
|
|
214
|
+
with self._prefect_done_callbacks_lock:
|
|
215
|
+
if self._prefect_done_event.is_set():
|
|
216
|
+
call_immediately = True
|
|
217
|
+
else:
|
|
218
|
+
self._prefect_done_callbacks.append(fn)
|
|
219
|
+
call_immediately = False
|
|
220
|
+
|
|
221
|
+
if call_immediately:
|
|
222
|
+
fn(self)
|
|
223
|
+
|
|
224
|
+
def _notify_prefect_done_callbacks(
|
|
225
|
+
self, future: concurrent.futures.Future[R]
|
|
226
|
+
) -> None:
|
|
227
|
+
with self._prefect_done_callbacks_lock:
|
|
228
|
+
self._prefect_done_event.set()
|
|
229
|
+
callbacks = self._prefect_done_callbacks[:]
|
|
230
|
+
self._prefect_done_callbacks.clear()
|
|
231
|
+
|
|
232
|
+
for callback in callbacks:
|
|
233
|
+
callback(self)
|
|
234
|
+
|
|
197
235
|
def wait(self, timeout: float | None = None) -> None:
|
|
198
236
|
try:
|
|
199
237
|
result = self._wrapped_future.result(timeout=timeout)
|
|
@@ -538,6 +576,17 @@ class PrefectFutureList(list[PrefectFuture[R]], Iterator[PrefectFuture[R]]):
|
|
|
538
576
|
return results
|
|
539
577
|
|
|
540
578
|
|
|
579
|
+
def _register_prefect_done_callback(
|
|
580
|
+
future: PrefectFuture[R], callback: Callable[[PrefectFuture[R]], None]
|
|
581
|
+
) -> None:
|
|
582
|
+
add_prefect_done_callback = getattr(future, "_add_prefect_done_callback", None)
|
|
583
|
+
if add_prefect_done_callback is not None:
|
|
584
|
+
add_prefect_done_callback(callback)
|
|
585
|
+
return
|
|
586
|
+
|
|
587
|
+
future.add_done_callback(callback)
|
|
588
|
+
|
|
589
|
+
|
|
541
590
|
def as_completed(
|
|
542
591
|
futures: list[PrefectFuture[R]], timeout: float | None = None
|
|
543
592
|
) -> Generator[PrefectFuture[R], None]:
|
|
@@ -560,7 +609,7 @@ def as_completed(
|
|
|
560
609
|
finished_event.set()
|
|
561
610
|
|
|
562
611
|
for future in pending:
|
|
563
|
-
future
|
|
612
|
+
_register_prefect_done_callback(future, add_to_done)
|
|
564
613
|
|
|
565
614
|
while pending:
|
|
566
615
|
finished_event.wait()
|
|
@@ -651,7 +700,7 @@ def wait(
|
|
|
651
700
|
|
|
652
701
|
# Add callbacks to all pending futures
|
|
653
702
|
for future in not_done:
|
|
654
|
-
future
|
|
703
|
+
_register_prefect_done_callback(future, mark_done)
|
|
655
704
|
|
|
656
705
|
# Wait for futures to complete within timeout
|
|
657
706
|
while not_done:
|
|
@@ -96,7 +96,11 @@ Each execution mode has a ProcessStarter implementation. To add a new execution
|
|
|
96
96
|
|
|
97
97
|
`ScheduledRunPoller` now calls `propose_pending` (Scheduled → Pending) before handing off to `FlowRunExecutor`. `FlowRunExecutor` then calls `propose_submitting` (Pending → Submitting sub-state) as step 1 of its lifecycle **when `propose_submitting=True` (the default)**. These are two separate transitions — do not collapse them. The split exists so automations listening for the Pending state fire correctly before the executor begins.
|
|
98
98
|
|
|
99
|
-
**
|
|
99
|
+
**Two callers set `propose_submitting=False`** via `FlowRunExecutorContext.create_executor(propose_submitting=False)` — both have already advanced the flow run past the Pending state, so proposing Submitting again would be wrong:
|
|
100
|
+
- `prefect flow-run execute` CLI path (invoked by a worker)
|
|
101
|
+
- `execute_bundle()` in `prefect._experimental.bundles.execute` (invoked by bundle dispatch)
|
|
102
|
+
|
|
103
|
+
The cancelling precheck (step 1a) still runs unconditionally even when `propose_submitting=False`.
|
|
100
104
|
|
|
101
105
|
## ProcessWorker Migration (Known Gap)
|
|
102
106
|
|
|
@@ -132,9 +132,16 @@ class Serializer(BaseModel, Generic[D]):
|
|
|
132
132
|
except KeyError as exc:
|
|
133
133
|
raise ValidationError.from_exception_data(
|
|
134
134
|
title=cls.__name__,
|
|
135
|
-
line_errors=[
|
|
135
|
+
line_errors=[
|
|
136
|
+
{
|
|
137
|
+
"type": "value_error",
|
|
138
|
+
"loc": ("type",),
|
|
139
|
+
"input": kwargs["type"],
|
|
140
|
+
"ctx": {"error": exc},
|
|
141
|
+
}
|
|
142
|
+
],
|
|
136
143
|
input_type="python",
|
|
137
|
-
)
|
|
144
|
+
) from exc
|
|
138
145
|
|
|
139
146
|
return super().__new__(subcls)
|
|
140
147
|
else:
|
|
@@ -158,6 +165,35 @@ class Serializer(BaseModel, Generic[D]):
|
|
|
158
165
|
return type_str if isinstance(type_str, str) else None
|
|
159
166
|
|
|
160
167
|
|
|
168
|
+
class UnknownSerializer(Serializer):
|
|
169
|
+
"""
|
|
170
|
+
Opaque placeholder for serializers that are unavailable in the current process.
|
|
171
|
+
|
|
172
|
+
This allows persisted result metadata to be inspected without importing the custom
|
|
173
|
+
serializer implementation. Actual serialization work still fails when attempted.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
type: str
|
|
177
|
+
|
|
178
|
+
model_config: ClassVar[ConfigDict] = ConfigDict(extra="allow")
|
|
179
|
+
|
|
180
|
+
@classmethod
|
|
181
|
+
def __dispatch_key__(cls) -> str:
|
|
182
|
+
return "__unknown__"
|
|
183
|
+
|
|
184
|
+
def dumps(self, obj: Any) -> bytes:
|
|
185
|
+
raise RuntimeError(
|
|
186
|
+
f"Serializer {self.type!r} is not available in this environment, so "
|
|
187
|
+
"serialization cannot be performed."
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
def loads(self, blob: bytes) -> Any:
|
|
191
|
+
raise RuntimeError(
|
|
192
|
+
f"Serializer {self.type!r} is not available in this environment, so "
|
|
193
|
+
"deserialization cannot be performed."
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
|
|
161
197
|
class PickleSerializer(Serializer[D]):
|
|
162
198
|
"""
|
|
163
199
|
Serializes objects using the pickle protocol.
|