prefect-client 3.6.27.dev5__tar.gz → 3.6.28.dev2__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.dev5 → prefect_client-3.6.28.dev2}/PKG-INFO +1 -1
- prefect_client-3.6.28.dev2/src/prefect/_build_info.py +5 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/bundles/__init__.py +44 -31
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/notifications.py +19 -7
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/webhook.py +16 -4
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/AGENTS.md +1 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/objects.py +12 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/task_runners.py +11 -3
- prefect_client-3.6.28.dev2/src/prefect/utilities/AGENTS.md +57 -0
- prefect_client-3.6.28.dev2/src/prefect/utilities/asyncutils/AGENTS.md +20 -0
- prefect_client-3.6.28.dev2/src/prefect/utilities/callables/AGENTS.md +22 -0
- prefect_client-3.6.28.dev2/src/prefect/utilities/engine/AGENTS.md +31 -0
- prefect_client-3.6.28.dev2/src/prefect/utilities/filesystem/AGENTS.md +17 -0
- prefect_client-3.6.28.dev2/src/prefect/utilities/processutils/AGENTS.md +22 -0
- prefect_client-3.6.28.dev2/src/prefect/utilities/schema_tools/AGENTS.md +53 -0
- prefect_client-3.6.28.dev2/src/prefect/utilities/templating/AGENTS.md +19 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/urls.py +230 -8
- prefect_client-3.6.27.dev5/src/prefect/_build_info.py +0 -5
- prefect_client-3.6.27.dev5/src/prefect/utilities/AGENTS.md +0 -83
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/.gitignore +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/LICENSE +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/README.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/pyproject.toml +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/_version_checking.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/context.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/engine.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/flows.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/futures.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/main.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/results.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/serializers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/states.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/annotations.py +0 -0
- /prefect_client-3.6.27.dev5/src/prefect/utilities/asyncutils.py → /prefect_client-3.6.28.dev2/src/prefect/utilities/asyncutils/__init__.py +0 -0
- /prefect_client-3.6.27.dev5/src/prefect/utilities/callables.py → /prefect_client-3.6.28.dev2/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/dockerutils.py +0 -0
- /prefect_client-3.6.27.dev5/src/prefect/utilities/engine.py → /prefect_client-3.6.28.dev2/src/prefect/utilities/engine/__init__.py +0 -0
- /prefect_client-3.6.27.dev5/src/prefect/utilities/filesystem.py → /prefect_client-3.6.28.dev2/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/names.py +0 -0
- /prefect_client-3.6.27.dev5/src/prefect/utilities/processutils.py → /prefect_client-3.6.28.dev2/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/slugify.py +0 -0
- /prefect_client-3.6.27.dev5/src/prefect/utilities/templating.py → /prefect_client-3.6.28.dev2/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/workers/utilities.py +0 -0
|
@@ -36,7 +36,10 @@ from prefect.settings.models.root import Settings
|
|
|
36
36
|
from prefect.utilities.processutils import sanitize_subprocess_env
|
|
37
37
|
from prefect.utilities.slugify import slugify
|
|
38
38
|
|
|
39
|
-
from prefect._experimental._launchers import
|
|
39
|
+
from prefect._experimental._launchers import (
|
|
40
|
+
get_launcher_for_side,
|
|
41
|
+
validate_bundle_step_launcher,
|
|
42
|
+
)
|
|
40
43
|
|
|
41
44
|
from .execute import execute_bundle_from_file
|
|
42
45
|
from ._file_collector import FileCollector
|
|
@@ -411,38 +414,48 @@ def create_bundle_for_flow_run(
|
|
|
411
414
|
"""
|
|
412
415
|
context = context or serialize_context()
|
|
413
416
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
417
|
+
# Skip `uv pip freeze` when the execution side of the flow's launcher
|
|
418
|
+
# opts out of uv-based launchers. The `dependencies` field is only
|
|
419
|
+
# consumed by `execute_bundle_in_subprocess` (which uses `uv pip install`);
|
|
420
|
+
# custom execution launchers are responsible for their own environment.
|
|
421
|
+
# Upload-only launcher overrides still use `uv run` at execution time and
|
|
422
|
+
# therefore still need the dependency snapshot.
|
|
423
|
+
flow_launcher = getattr(flow, "launcher", None)
|
|
424
|
+
if get_launcher_for_side(flow_launcher, "execution") is None:
|
|
425
|
+
dependencies = (
|
|
426
|
+
subprocess.check_output(
|
|
427
|
+
[
|
|
428
|
+
_get_uv_path(),
|
|
429
|
+
"pip",
|
|
430
|
+
"freeze",
|
|
431
|
+
# Exclude editable installs because we won't be able to install them in the execution environment
|
|
432
|
+
"--exclude-editable",
|
|
433
|
+
]
|
|
434
|
+
)
|
|
435
|
+
.decode()
|
|
436
|
+
.strip()
|
|
423
437
|
)
|
|
424
|
-
.decode()
|
|
425
|
-
.strip()
|
|
426
|
-
)
|
|
427
438
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
439
|
+
# Remove dependencies installed from a local file path because we won't be able
|
|
440
|
+
# to install them in the execution environment. The user will be responsible for
|
|
441
|
+
# making sure they are available in the execution environment
|
|
442
|
+
filtered_dependencies: list[str] = []
|
|
443
|
+
file_dependencies: list[str] = []
|
|
444
|
+
for line in dependencies.split("\n"):
|
|
445
|
+
if "file://" in line:
|
|
446
|
+
file_dependencies.append(line)
|
|
447
|
+
else:
|
|
448
|
+
filtered_dependencies.append(line)
|
|
449
|
+
dependencies = "\n".join(filtered_dependencies)
|
|
450
|
+
if file_dependencies:
|
|
451
|
+
logger.warning(
|
|
452
|
+
"The following dependencies were installed from a local file path and will not be "
|
|
453
|
+
"automatically installed in the execution environment: %s. If these dependencies "
|
|
454
|
+
"are not available in the execution environment, your flow run may fail.",
|
|
455
|
+
"\n".join(file_dependencies),
|
|
456
|
+
)
|
|
457
|
+
else:
|
|
458
|
+
dependencies = ""
|
|
446
459
|
|
|
447
460
|
# Collect and package included files if specified
|
|
448
461
|
files_key: str | None = None
|
{prefect_client-3.6.27.dev5 → prefect_client-3.6.28.dev2}/src/prefect/blocks/notifications.py
RENAMED
|
@@ -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.dev5 → prefect_client-3.6.28.dev2}/src/prefect/client/schemas/objects.py
RENAMED
|
@@ -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.
|
|
@@ -616,14 +616,19 @@ class _UnpicklingFuture(concurrent.futures.Future[R]):
|
|
|
616
616
|
|
|
617
617
|
def __init__(self, wrapped_future: concurrent.futures.Future[bytes]):
|
|
618
618
|
self.wrapped_future = wrapped_future
|
|
619
|
+
self._deserialization_error: BaseException | None = None
|
|
619
620
|
|
|
620
621
|
def result(self, timeout: float | None = None) -> R:
|
|
622
|
+
if self._deserialization_error is not None:
|
|
623
|
+
raise self._deserialization_error
|
|
621
624
|
pickled_result = self.wrapped_future.result(timeout)
|
|
622
625
|
import cloudpickle
|
|
623
626
|
|
|
624
627
|
return cloudpickle.loads(pickled_result)
|
|
625
628
|
|
|
626
629
|
def exception(self, timeout: float | None = None) -> BaseException | None:
|
|
630
|
+
if self._deserialization_error is not None:
|
|
631
|
+
return self._deserialization_error
|
|
627
632
|
return self.wrapped_future.exception(timeout)
|
|
628
633
|
|
|
629
634
|
def done(self) -> bool:
|
|
@@ -639,10 +644,13 @@ class _UnpicklingFuture(concurrent.futures.Future[R]):
|
|
|
639
644
|
self, fn: Callable[[concurrent.futures.Future[R]], object]
|
|
640
645
|
) -> None:
|
|
641
646
|
def _fn(wrapped_future: concurrent.futures.Future[bytes]) -> None:
|
|
642
|
-
|
|
647
|
+
try:
|
|
648
|
+
import cloudpickle
|
|
643
649
|
|
|
644
|
-
|
|
645
|
-
|
|
650
|
+
cloudpickle.loads(wrapped_future.result())
|
|
651
|
+
except Exception as e:
|
|
652
|
+
self._deserialization_error = e
|
|
653
|
+
fn(self)
|
|
646
654
|
|
|
647
655
|
return self.wrapped_future.add_done_callback(_fn)
|
|
648
656
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Utilities
|
|
2
|
+
|
|
3
|
+
General-purpose helpers and cross-cutting tools used throughout the Prefect SDK and server.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Shared utilities: data manipulation, async helpers, schema tooling, callables introspection, and infrastructure helpers. These modules have no common theme beyond being broadly reused — if something is self-contained and used across two or more subsystems, it lives here.
|
|
8
|
+
|
|
9
|
+
Does NOT include: server-specific utilities (`server/utilities/`), concurrency slot management (`concurrency/`), or logging infrastructure (`logging/`).
|
|
10
|
+
|
|
11
|
+
## Cross-cutting rules
|
|
12
|
+
|
|
13
|
+
- **Don't add server imports to utility modules.** Everything here is used client-side too. `HydrationContext.build()` in `schema_tools/` is an explicit, documented exception (async, server-only); no new server-touching code should creep into other modules.
|
|
14
|
+
|
|
15
|
+
## Subpackages (focused intent nodes)
|
|
16
|
+
|
|
17
|
+
Each subpackage owns its own `AGENTS.md` with entry points and pitfalls specific to that domain.
|
|
18
|
+
|
|
19
|
+
- `schema_tools/` → Hydration and validation of `__prefect_kind` template structures (see `schema_tools/AGENTS.md`)
|
|
20
|
+
- `processutils/` → Subprocess execution, output streaming, and command serialization (see `processutils/AGENTS.md`)
|
|
21
|
+
- `callables/` → Function signature introspection, parameter coercion, parameter schema generation (see `callables/AGENTS.md`)
|
|
22
|
+
- `asyncutils/` → Async/sync bridging, thread coordination, concurrency primitives (see `asyncutils/AGENTS.md`)
|
|
23
|
+
- `templating/` → Placeholder detection and value application for Prefect's `{{ }}` templating (see `templating/AGENTS.md`)
|
|
24
|
+
- `engine/` → Result-to-state linking, SIGTERM bridge management, and control-intent coordination (see `engine/AGENTS.md`)
|
|
25
|
+
- `filesystem/` → File filtering, path normalization, `tmpchdir` (see `filesystem/AGENTS.md`)
|
|
26
|
+
|
|
27
|
+
## Flat modules
|
|
28
|
+
|
|
29
|
+
These modules have no dedicated intent node yet. Promote any one of them to a subpackage (`foo.py` → `foo/__init__.py` + `foo/AGENTS.md`) when non-obvious invariants accrue — the import path is preserved.
|
|
30
|
+
|
|
31
|
+
- `annotations.py` — Custom Prefect type annotations used in flow/task signatures (`unmapped`, `allow_failure`, `quote`, `NotSet`)
|
|
32
|
+
- `collections.py` — Extended collection helpers (`visit_collection`, `flatten`, `remove_nested_keys`)
|
|
33
|
+
- `dispatch.py` — Dynamic type dispatch registry
|
|
34
|
+
- `importtools.py` — Dynamic imports, aliased module loading, script-to-module conversion
|
|
35
|
+
- `pydantic.py` — Pydantic v1/v2 compatibility shims, custom serializers, type dispatch integration
|
|
36
|
+
- `hashing.py` — Stable hashing (`stable_hash`, `file_hash`, `hash_objects`)
|
|
37
|
+
- `dockerutils.py` — Docker image building, Python version detection, Docker client helpers
|
|
38
|
+
- `timeout.py` — Timeout context managers for async/sync code
|
|
39
|
+
- `services.py` — Client metrics server and resilient service loop with backoff
|
|
40
|
+
- `visualization.py` — Flow/task graph visualization via Graphviz
|
|
41
|
+
- `urls.py` — URL validation and UI path formatting
|
|
42
|
+
- `names.py` — Slug generation and obfuscation helpers
|
|
43
|
+
- `math.py` — Distribution sampling and clamping utilities
|
|
44
|
+
- `text.py` — String truncation and fuzzy matching
|
|
45
|
+
- `context.py` — Context variable accessors
|
|
46
|
+
- `compat.py` — Python version compatibility shims
|
|
47
|
+
- `slugify.py` — Thin wrapper around `unicode-slugify`
|
|
48
|
+
- `generics.py` — Generic type validation
|
|
49
|
+
- `render_swagger.py` — MkDocs plugin for rendering Swagger/OpenAPI schemas
|
|
50
|
+
|
|
51
|
+
Private (`_`-prefixed):
|
|
52
|
+
|
|
53
|
+
- `_ast.py` — AST-based flow-decorator discovery in source files
|
|
54
|
+
- `_engine.py` — Naming and hook-resolution helpers for custom flow/task run names
|
|
55
|
+
- `_git.py` — Git origin/branch introspection for deployment metadata
|
|
56
|
+
- `_infrastructure_exit_codes.py` — Registry of exit-code explanations for infrastructure processes
|
|
57
|
+
- `_deprecated.py` — Legacy wrappers retained for backward compat
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# asyncutils
|
|
2
|
+
|
|
3
|
+
Async/sync bridging, thread coordination, and concurrency primitives used throughout the SDK.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Bridges Prefect's async engine with user-written sync code (and vice versa) without deadlocking the event loop or losing context. Also provides a handful of async-aware primitives (`LazySemaphore`, timed task creation) used by higher layers.
|
|
8
|
+
|
|
9
|
+
## Entry Points
|
|
10
|
+
|
|
11
|
+
- `run_coro_as_sync(coro)` — run an async coroutine from sync code, reusing the global loop when available.
|
|
12
|
+
- `run_sync_in_worker_thread(fn, *args, **kwargs)` — execute a blocking sync callable off the event loop.
|
|
13
|
+
- `sync_compatible(fn)` — decorator letting a single `async def` be called from both sync and async callers.
|
|
14
|
+
- `LazySemaphore` — a semaphore whose capacity is resolved on first acquisition (used for managing open-file limits at import time without evaluating `resource` limits eagerly).
|
|
15
|
+
- `gather(*calls)` / `create_gather_task_group()` — run a collection of coroutine-returning callables concurrently and collect their results positionally.
|
|
16
|
+
- `create_task(coro)` — create an `asyncio.Task` with Prefect's logging-and-cancellation-friendly wiring.
|
|
17
|
+
|
|
18
|
+
## Pitfalls
|
|
19
|
+
|
|
20
|
+
_No pitfalls documented yet. Add here when non-obvious behaviors surface during debugging — especially around context propagation, thread-to-loop hand-off, and cancellation semantics, which tend to bite in subtle ways._
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# callables
|
|
2
|
+
|
|
3
|
+
Function signature introspection, parameter coercion, and JSON Schema generation for flow and task parameters.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Inspects user-written flow/task functions to produce:
|
|
8
|
+
- Bindable `args`/`kwargs` from a parameters dict (`parameters_to_args_kwargs`, `get_call_parameters`).
|
|
9
|
+
- JSON Schema representations of function signatures for UI parameter forms and server-side validation (`parameter_schema`).
|
|
10
|
+
|
|
11
|
+
## Entry Points
|
|
12
|
+
|
|
13
|
+
- `parameters_to_args_kwargs(fn, parameters) -> (args, kwargs)` — split a parameters dict into positional and keyword slots based on the function's signature.
|
|
14
|
+
- `get_call_parameters(fn, call_args, call_kwargs) -> dict` — inverse: bind actual call args/kwargs into a parameters dict.
|
|
15
|
+
- `parameter_schema(fn) -> ParameterSchema` — introspect the function signature into a Pydantic-backed JSON Schema.
|
|
16
|
+
|
|
17
|
+
## Pitfalls
|
|
18
|
+
|
|
19
|
+
- **`parameters_to_args_kwargs` adjusts the positional/keyword split based on the wrapper's signature, not the wrapped function's.** For `@functools.wraps`-decorated callables, it inspects the *wrapper* (via `follow_wrapped=False`) to count how many positional slots are actually available and routes excess parameters to `**kwargs`. This means `args` and `kwargs` from this function are shaped for the *wrapper* call, not the inner function — callers must not assume all POSITIONAL_OR_KEYWORD parameters end up in `args`.
|
|
20
|
+
- **`parameters_to_args_kwargs` skips the positional-to-keyword rewrite entirely when the function signature contains `*args`.** Inserting KEYWORD_ONLY parameters before a VAR_POSITIONAL parameter is invalid in Python, so the original signature is used as-is in that case.
|
|
21
|
+
- **Passing the same key in both an explicit parameter and a `**kwargs` dict raises `TypeError`.** `parameters_to_args_kwargs` detects when a VAR_KEYWORD (`**kwargs`) dict contains a key that also appears as an explicit parameter and raises rather than silently letting the variadic entry win. Exception: POSITIONAL_ONLY parameters are exempt because `fn(1, **{'a': 2})` is legal when `a` is positional-only.
|
|
22
|
+
- **`generate_parameter_schema` silently downgrades unsupported parameter types to `Any`.** When a parameter's type raises `ValueError`, `TypeError`, or `PydanticInvalidForJsonSchema` during JSON schema generation (e.g., `Callable`, custom types Pydantic can't serialize), the type is replaced with `Any` in the output schema without warning. If a flow parameter shows up as `Any` in the schema, the declared type is not JSON-schema-compatible.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# engine
|
|
2
|
+
|
|
3
|
+
Result-to-state linking, SIGTERM bridge management, and helpers shared by the flow/task engines.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Two responsibilities live here:
|
|
8
|
+
|
|
9
|
+
1. **Result-to-state linking** — glue between Python return values (which callers receive) and the `State` objects that represent them on the server. Maintains the identity-keyed `run_results` map inside `EngineContext` and exposes safe accessors.
|
|
10
|
+
|
|
11
|
+
2. **SIGTERM bridge** — installs and tears down Prefect's SIGTERM handler (`TerminationSignal`), coordinates control-intent acknowledgement with the runner, and exposes locked helpers so the engine can atomically commit cancellation intent before signalling readiness to the runner.
|
|
12
|
+
|
|
13
|
+
Naming and hook-resolution helpers for custom flow/task run names live in sibling `../_engine.py` (flat module), not here.
|
|
14
|
+
|
|
15
|
+
## Entry Points
|
|
16
|
+
|
|
17
|
+
**Result linking:**
|
|
18
|
+
- `link_state_to_result(state, result, run_type)` — associate a `State` with a Python object under a specific `RunType` for later lookup via `get_state_for_result`.
|
|
19
|
+
- `link_state_to_flow_run_result(state, result)` / `link_state_to_task_run_result(state, result)` — scoped variants used by the flow and task engines respectively.
|
|
20
|
+
- `get_state_for_result(obj) -> tuple[State, RunType] | None` — identity-verified lookup that handles `id()` collisions safely.
|
|
21
|
+
|
|
22
|
+
**SIGTERM bridge:**
|
|
23
|
+
- `capture_sigterm()` — context manager that installs Prefect's SIGTERM bridge; outermost scope installs it, nested scopes reuse or reinstall as needed. The runner's control listener connects only while this context is active.
|
|
24
|
+
- `is_prefect_sigterm_handler_installed() -> bool` — check (under lock) whether Prefect's bridge is the active SIGTERM handler.
|
|
25
|
+
- `can_ack_control_intent() -> bool` — check (under the same lock) whether the child can safely acknowledge a queued control intent.
|
|
26
|
+
- `commit_control_intent_and_ack(commit_intent, clear_intent, send_ack, trigger_cancel)` — atomically commit a control intent and write the ack byte to the runner, all under `_prefect_sigterm_bridge_lock`.
|
|
27
|
+
|
|
28
|
+
## Pitfalls
|
|
29
|
+
|
|
30
|
+
- **Never access `EngineContext.run_results` directly via `id(obj)`.** Always call `get_state_for_result(obj)` — the accessor verifies object identity in addition to the ID match, avoiding false hits when Python reuses an id for a different object after GC.
|
|
31
|
+
- **All SIGTERM-state reads and writes must hold `_prefect_sigterm_bridge_lock`.** The lock is a `threading.RLock` that serializes handler install/restore with ack writes. Reading `signal.getsignal(SIGTERM)` outside the lock creates a TOCTOU race where the handler is restored after the child decides it's safe to ack but before the runner observes the ack byte.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# filesystem
|
|
2
|
+
|
|
3
|
+
File path utilities, pathspec-based filtering, and local filesystem context managers.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Path normalization, file filtering compatible with `.gitignore`/`.prefectignore`-style pattern lists (`filter_files`), open-file-limit introspection (`get_open_file_limit`), and a `tmpchdir` context manager for scoped working-directory changes.
|
|
8
|
+
|
|
9
|
+
## Entry Points
|
|
10
|
+
|
|
11
|
+
- `filter_files(root, ignore_patterns, include_dirs=True) -> set[str]` — return the set of paths under `root` that should be *ignored* according to pathspec patterns. Intended as input to `shutil.copytree`'s `ignore` callback.
|
|
12
|
+
- `tmpchdir(path)` — context manager that `chdir`s into `path` and restores the previous cwd on exit.
|
|
13
|
+
- `get_open_file_limit() -> int` — platform-specific maximum open-file count, with a conservative Windows default.
|
|
14
|
+
|
|
15
|
+
## Pitfalls
|
|
16
|
+
|
|
17
|
+
- **`filter_files` with `include_dirs=True` (the default) always includes all ancestor directories of matched files**, even if those directories weren't directly matched by the ignore patterns. This ensures `shutil.copytree`'s `ignore_func` doesn't skip directories containing files that should be copied. Side effect: callers expecting only pathspec-matched entries will receive additional directory paths. The parent-dir expansion does NOT run when `include_dirs=False`.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# processutils
|
|
2
|
+
|
|
3
|
+
Subprocess execution, output streaming, command serialization, and signal forwarding.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Cross-platform subprocess primitives used by workers, runners, bundle execution, and the CLI. Handles process launch (`run_process`), output consumption (`consume_process_output`, `stream_text`), and platform-neutral command serialization (`command_to_string`, `command_from_string`).
|
|
8
|
+
|
|
9
|
+
## Entry Points
|
|
10
|
+
|
|
11
|
+
- `sanitize_subprocess_env(env) -> dict[str, str]` — strip `None` values from an env mapping before passing to subprocess launch APIs; `None` means "omit this key", which `subprocess` and `anyio.open_process` do not accept.
|
|
12
|
+
- `run_process(command, ...)` — async subprocess runner with output streaming and signal forwarding.
|
|
13
|
+
- `consume_process_output(process, stdout_sink, stderr_sink)` — drain a running process's streams into writers.
|
|
14
|
+
- `stream_text(source, *sinks)` — fan out a text stream to multiple sinks.
|
|
15
|
+
- `command_to_string(command: list[str]) -> str` / `command_from_string(s: str) -> list[str]` — platform-neutral serialize/deserialize of command arrays for storage and cross-platform bundles.
|
|
16
|
+
- `get_sys_executable() -> str` — `sys.executable` with platform-appropriate handling (see pitfalls).
|
|
17
|
+
|
|
18
|
+
## Pitfalls
|
|
19
|
+
|
|
20
|
+
- **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.
|
|
21
|
+
- **`command_to_string` always uses POSIX quoting (`shlex.join`), even on Windows.** This is intentional for platform-neutral storage — bundle commands are serialized by one platform and may be deserialized by another. `command_from_string` uses a dual-path approach: if the string was POSIX-serialized by Prefect (round-trips cleanly through `shlex.split`/`shlex.join`), it uses POSIX parsing; otherwise it falls back to native Windows command-line parsing (`CommandLineToArgvW`). Do not use `" ".join(command)` or `shlex.split(command)` directly when working with stored Prefect commands — use these helpers instead.
|
|
22
|
+
- **`get_sys_executable()` no longer quotes the Python path on Windows.** It previously returned `'"path/to/python"'` (with embedded quotes) on Windows; now it returns the raw path. Code relying on the old quoted form (e.g., joining into a shell string) will break — use `subprocess.list2cmdline` or `command_to_string` for shell-safe serialization instead.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# schema_tools
|
|
2
|
+
|
|
3
|
+
Hydration and validation of `__prefect_kind` template structures used in deployment parameters and automation action payloads.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Resolves `__prefect_kind` structures into real Python values (hydration) and validates JSON Schema parameter specs with first-class support for Prefect's placeholder types (validation).
|
|
8
|
+
|
|
9
|
+
## Entry Point
|
|
10
|
+
|
|
11
|
+
```python
|
|
12
|
+
from prefect.utilities.schema_tools.hydration import hydrate, HydrationContext
|
|
13
|
+
|
|
14
|
+
ctx = HydrationContext(render_jinja=True, jinja_context={"event": event})
|
|
15
|
+
result = hydrate(parameters, ctx)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## `__prefect_kind` Contracts
|
|
19
|
+
|
|
20
|
+
| Kind | Input structure | Output | Notes |
|
|
21
|
+
|------|----------------|--------|-------|
|
|
22
|
+
| `"jinja"` | `{"__prefect_kind": "jinja", "template": "..."}` | `str` | **Always returns a string** — even if the template renders a number |
|
|
23
|
+
| `"json"` | `{"__prefect_kind": "json", "value": ...}` | parsed value | If `value` is already a non-string (int, bool, list, dict, None), it is returned as-is without JSON decoding |
|
|
24
|
+
| `"workspace_variable"` | `{"__prefect_kind": "workspace_variable", "variable_name": "..."}` | variable value | Requires `render_workspace_variables=True` in context |
|
|
25
|
+
|
|
26
|
+
**Critical non-obvious invariant:** `jinja` kind always returns a `str`. To preserve the original type of a templated value (int, float, bool, list, dict), use the json+jinja pattern with `| tojson`:
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
# Type-preserving round-trip for a single expression:
|
|
30
|
+
{
|
|
31
|
+
"__prefect_kind": "json",
|
|
32
|
+
"value": {
|
|
33
|
+
"__prefect_kind": "jinja",
|
|
34
|
+
"template": "{{ value | tojson }}"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
# Renders {{ value | tojson }} → JSON string → json.loads() → original type
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
This is the pattern used by `RunDeployment._wrap_v1_template` for single-expression Jinja parameters.
|
|
41
|
+
|
|
42
|
+
## Placeholder Protocol
|
|
43
|
+
|
|
44
|
+
Handlers return `Placeholder` subclasses (e.g. `RemoveValue`, `InvalidJSON`, `InvalidJinja`) when values are missing or rendering fails. `hydrate()` removes keys with `RemoveValue` and propagates error placeholders unless `raise_on_error=True` in the context.
|
|
45
|
+
|
|
46
|
+
## Anti-Patterns
|
|
47
|
+
|
|
48
|
+
- **Don't use `jinja` kind and expect a typed value** — it always returns a string. Use `json` + `jinja` + `| tojson` for type preservation.
|
|
49
|
+
- **Don't add server imports to this module** — it's used client-side too. `HydrationContext.build()` is an explicit exception (async, server-only); the rest of `hydration.py` must remain importable without a running server.
|
|
50
|
+
|
|
51
|
+
## Pitfalls
|
|
52
|
+
|
|
53
|
+
- **`HydrationContext` workspace variables are loaded once at build time.** Stale contexts don't reflect variable updates made after context creation.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# templating
|
|
2
|
+
|
|
3
|
+
Placeholder detection and value application for Prefect's `{{ }}` templating used in block references, workspace variables, and parameter templating.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Finds `{{ ... }}` placeholders inside nested structures (`find_placeholders`) and substitutes their resolved values back in (`apply_values`). Distinguishes between standard placeholders, block-document references, and environment variable placeholders via `PlaceholderType`.
|
|
8
|
+
|
|
9
|
+
Note: this module is *not* a Jinja renderer. For Jinja hydration of `__prefect_kind: "jinja"` structures, see `../schema_tools/`. For user-facing Jinja templates in automation actions, see `prefect/server/utilities/user_templates.py`.
|
|
10
|
+
|
|
11
|
+
## Entry Points
|
|
12
|
+
|
|
13
|
+
- `find_placeholders(template) -> set[Placeholder]` — walk any dict/list/str and collect `{{ name }}` placeholders, classified by `PlaceholderType`.
|
|
14
|
+
- `apply_values(template, values) -> template` — substitute resolved values back into the nested structure.
|
|
15
|
+
- `determine_placeholder_type(name) -> PlaceholderType` — classify a placeholder name as STANDARD / BLOCK_DOCUMENT / ENV_VAR.
|
|
16
|
+
|
|
17
|
+
## Pitfalls
|
|
18
|
+
|
|
19
|
+
- **`resolve_block_document_references` raises `ValueError` for malformed block placeholders.** Placeholders must follow the format `prefect.blocks.<block-type-slug>.<block-document-name>` (at least two dot-separated parts after the prefix). A placeholder like `{{ prefect.blocks.only-type }}` (missing the document name) raises `ValueError` before any network call is made.
|