prefect-client 3.7.4.dev3__tar.gz → 3.7.5__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.7.4.dev3 → prefect_client-3.7.5}/PKG-INFO +1 -1
- prefect_client-3.7.5/src/prefect/_build_info.py +5 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/threads.py +9 -0
- prefect_client-3.7.5/src/prefect/_internal/schemas/_registry.py +13 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/schemas/validators.py +5 -1
- prefect_client-3.7.5/src/prefect/_internal/urls.py +57 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/actions.py +18 -2
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/schedules.py +28 -7
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/base.py +27 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/flow_engine.py +2 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/flows.py +5 -1
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/AGENTS.md +2 -2
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_event_emitter.py +24 -16
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/storage.py +51 -9
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/background_workers.py +2 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/deployments.py +5 -1
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/flow_runs.py +78 -5
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/server.py +35 -14
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/ui/schemas.py +6 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/workers.py +95 -6
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/_types.py +4 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/services.py +37 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/tasks.py +13 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/asyncutils/__init__.py +19 -1
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/dockerutils.py +1 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/schema_tools/AGENTS.md +1 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/schema_tools/validation.py +14 -2
- prefect_client-3.7.4.dev3/src/prefect/_build_info.py +0 -5
- prefect_client-3.7.4.dev3/src/prefect/_internal/urls.py +0 -29
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/.gitignore +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/LICENSE +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/README.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/hatch_build.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/pyproject.toml +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/__main__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/agent.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/automations.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/base.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/context.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/engine.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/related.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/futures.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/main.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/plugins.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/py.typed +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/results.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/schedules.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/serializers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/states.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/transactions.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/types/names.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/variables.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/workers/utilities.py +0 -0
{prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/concurrency/threads.py
RENAMED
|
@@ -38,9 +38,18 @@ def _reset_after_fork_in_child():
|
|
|
38
38
|
|
|
39
39
|
This handler is called by os.register_at_fork() in the child process after fork().
|
|
40
40
|
"""
|
|
41
|
+
global _global_loop, _run_sync_loop
|
|
42
|
+
|
|
41
43
|
for instance in list(_active_instances):
|
|
42
44
|
instance.reset_for_fork()
|
|
43
45
|
|
|
46
|
+
# Clear global references so get_global_loop() / get_run_sync_loop() create
|
|
47
|
+
# fresh instances. After fork the old EventLoopThread objects have a stale
|
|
48
|
+
# Thread whose is_alive() still returns True (the dead thread's tstate lock
|
|
49
|
+
# is held), so the "is the thread alive?" guard in the getters never fires.
|
|
50
|
+
_global_loop = None
|
|
51
|
+
_run_sync_loop = None
|
|
52
|
+
|
|
44
53
|
|
|
45
54
|
# Register fork handler if supported (POSIX systems)
|
|
46
55
|
if hasattr(os, "register_at_fork"):
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from referencing import Registry
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def non_fetching_registry() -> Registry:
|
|
5
|
+
"""An empty `referencing.Registry` that disables remote `$ref` fetching.
|
|
6
|
+
|
|
7
|
+
Passing an explicit registry to jsonschema suppresses its default behavior of
|
|
8
|
+
fetching `$ref` URLs over the network while validating an instance. With an
|
|
9
|
+
empty registry, external references raise `referencing.exceptions.Unresolvable`
|
|
10
|
+
without any network request, while in-document references (`#/$defs/...`) still
|
|
11
|
+
resolve normally.
|
|
12
|
+
"""
|
|
13
|
+
return Registry()
|
{prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/_internal/schemas/validators.py
RENAMED
|
@@ -21,7 +21,9 @@ from uuid import UUID
|
|
|
21
21
|
from zoneinfo import ZoneInfo
|
|
22
22
|
|
|
23
23
|
import jsonschema
|
|
24
|
+
import referencing.exceptions
|
|
24
25
|
|
|
26
|
+
from prefect._internal.schemas._registry import non_fetching_registry
|
|
25
27
|
from prefect.types._datetime import DateTime, create_datetime_instance, get_timezones
|
|
26
28
|
from prefect.utilities.collections import isiterable
|
|
27
29
|
from prefect.utilities.filesystem import relative_path_to_current_platform
|
|
@@ -65,7 +67,9 @@ def validate_values_conform_to_schema(
|
|
|
65
67
|
|
|
66
68
|
try:
|
|
67
69
|
if schema is not None and values is not None:
|
|
68
|
-
jsonschema.validate(values, schema)
|
|
70
|
+
jsonschema.validate(values, schema, registry=non_fetching_registry())
|
|
71
|
+
except referencing.exceptions.Unresolvable as exc:
|
|
72
|
+
raise ValueError(f"Validation failed. Failure reason: {exc}") from exc
|
|
69
73
|
except jsonschema.ValidationError as exc:
|
|
70
74
|
if exc.json_path == "$":
|
|
71
75
|
error_message = "Validation failed."
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from collections.abc import Iterable
|
|
3
|
+
from urllib.parse import urlparse, urlunparse
|
|
4
|
+
|
|
5
|
+
_URL_AUTH_PATTERN = re.compile(
|
|
6
|
+
r"(?P<scheme>https?://)[^/\s'\"<>]*@", flags=re.IGNORECASE
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def strip_auth_from_url(url: str) -> str:
|
|
11
|
+
"""
|
|
12
|
+
Remove authentication credentials (username/password) from a URL.
|
|
13
|
+
|
|
14
|
+
Useful for sanitizing URLs before including them in error messages
|
|
15
|
+
or logs to avoid leaking secrets.
|
|
16
|
+
"""
|
|
17
|
+
try:
|
|
18
|
+
parsed = urlparse(url)
|
|
19
|
+
|
|
20
|
+
if not parsed.hostname:
|
|
21
|
+
return url
|
|
22
|
+
|
|
23
|
+
netloc = parsed.hostname
|
|
24
|
+
if parsed.port:
|
|
25
|
+
netloc = f"{netloc}:{parsed.port}"
|
|
26
|
+
|
|
27
|
+
return urlunparse(
|
|
28
|
+
(
|
|
29
|
+
parsed.scheme,
|
|
30
|
+
netloc,
|
|
31
|
+
parsed.path,
|
|
32
|
+
parsed.params,
|
|
33
|
+
parsed.query,
|
|
34
|
+
parsed.fragment,
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
except ValueError:
|
|
38
|
+
return strip_auth_from_urls_in_text(url)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def strip_auth_from_urls_in_text(
|
|
42
|
+
text: str, extra_secrets: Iterable[str] | None = None
|
|
43
|
+
) -> str:
|
|
44
|
+
"""
|
|
45
|
+
Remove authentication credentials from HTTP(S) URLs embedded in text.
|
|
46
|
+
|
|
47
|
+
Useful for sanitizing command output before including it in error messages
|
|
48
|
+
or logs. Any caller-supplied secrets are replaced with a redaction marker.
|
|
49
|
+
"""
|
|
50
|
+
if not text:
|
|
51
|
+
return text
|
|
52
|
+
|
|
53
|
+
sanitized = _URL_AUTH_PATTERN.sub(r"\g<scheme>", text)
|
|
54
|
+
for secret in extra_secrets or ():
|
|
55
|
+
if secret:
|
|
56
|
+
sanitized = sanitized.replace(secret, "***")
|
|
57
|
+
return sanitized
|
|
@@ -6,6 +6,7 @@ from typing import Annotated, Any, Callable, Optional, TypeVar, Union
|
|
|
6
6
|
from uuid import UUID, uuid4
|
|
7
7
|
|
|
8
8
|
import jsonschema
|
|
9
|
+
import referencing.exceptions
|
|
9
10
|
from pydantic import (
|
|
10
11
|
AfterValidator,
|
|
11
12
|
BaseModel,
|
|
@@ -18,6 +19,7 @@ from pydantic import (
|
|
|
18
19
|
import prefect.client.schemas.objects as objects
|
|
19
20
|
from prefect._internal.result_records import ResultRecordMetadata
|
|
20
21
|
from prefect._internal.schema import ParameterSchema
|
|
22
|
+
from prefect._internal.schemas._registry import non_fetching_registry
|
|
21
23
|
from prefect._internal.schemas.bases import ActionBaseModel
|
|
22
24
|
from prefect._internal.schemas.validators import (
|
|
23
25
|
convert_to_strings,
|
|
@@ -324,7 +326,14 @@ class DeploymentCreate(ActionBaseModel):
|
|
|
324
326
|
if "default" in v and k in required:
|
|
325
327
|
required.remove(k)
|
|
326
328
|
|
|
327
|
-
|
|
329
|
+
try:
|
|
330
|
+
jsonschema.validate(
|
|
331
|
+
self.job_variables,
|
|
332
|
+
variables_schema,
|
|
333
|
+
registry=non_fetching_registry(),
|
|
334
|
+
)
|
|
335
|
+
except referencing.exceptions.Unresolvable as exc:
|
|
336
|
+
raise jsonschema.ValidationError(str(exc)) from exc
|
|
328
337
|
|
|
329
338
|
|
|
330
339
|
class DeploymentUpdate(ActionBaseModel):
|
|
@@ -403,7 +412,14 @@ class DeploymentUpdate(ActionBaseModel):
|
|
|
403
412
|
required.remove(k)
|
|
404
413
|
|
|
405
414
|
if variables_schema is not None:
|
|
406
|
-
|
|
415
|
+
try:
|
|
416
|
+
jsonschema.validate(
|
|
417
|
+
self.job_variables,
|
|
418
|
+
variables_schema,
|
|
419
|
+
registry=non_fetching_registry(),
|
|
420
|
+
)
|
|
421
|
+
except referencing.exceptions.Unresolvable as exc:
|
|
422
|
+
raise jsonschema.ValidationError(str(exc)) from exc
|
|
407
423
|
|
|
408
424
|
|
|
409
425
|
class DeploymentBranch(ActionBaseModel):
|
|
@@ -26,6 +26,26 @@ MAX_ITERATIONS = 1000
|
|
|
26
26
|
MAX_RRULE_LENGTH = 6500
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
def _iana_timezone_name(tzinfo: datetime.tzinfo) -> str:
|
|
30
|
+
"""Return a valid IANA timezone name for *tzinfo*, or `"UTC"`."""
|
|
31
|
+
for attr in ("key", "name"):
|
|
32
|
+
value: Optional[str] = getattr(tzinfo, attr, None)
|
|
33
|
+
if value and is_valid_timezone(value):
|
|
34
|
+
return value
|
|
35
|
+
|
|
36
|
+
filename: Optional[str] = getattr(tzinfo, "_filename", None)
|
|
37
|
+
if filename:
|
|
38
|
+
normalized = filename.replace("\\", "/")
|
|
39
|
+
marker = "/zoneinfo/"
|
|
40
|
+
idx = normalized.find(marker)
|
|
41
|
+
if idx != -1:
|
|
42
|
+
candidate = normalized[idx + len(marker) :]
|
|
43
|
+
if candidate and is_valid_timezone(candidate):
|
|
44
|
+
return candidate
|
|
45
|
+
|
|
46
|
+
return "UTC"
|
|
47
|
+
|
|
48
|
+
|
|
29
49
|
def is_valid_timezone(v: str) -> bool:
|
|
30
50
|
"""
|
|
31
51
|
Validate that the provided timezone is a valid IANA timezone.
|
|
@@ -204,26 +224,27 @@ class RRuleSchedule(PrefectBaseModel):
|
|
|
204
224
|
if isinstance(rrule, dateutil.rrule.rrule):
|
|
205
225
|
dtstart = _rrule_dt(rrule)
|
|
206
226
|
if dtstart and dtstart.tzinfo is not None:
|
|
207
|
-
timezone = dtstart.tzinfo
|
|
227
|
+
timezone = _iana_timezone_name(dtstart.tzinfo)
|
|
208
228
|
else:
|
|
209
229
|
timezone = "UTC"
|
|
210
230
|
return RRuleSchedule(rrule=str(rrule), timezone=timezone)
|
|
211
231
|
rrules = _rrule(rrule)
|
|
212
232
|
dtstarts = [dts for rr in rrules if (dts := _rrule_dt(rr)) is not None]
|
|
213
233
|
unique_dstarts = set(d.astimezone(ZoneInfo("UTC")) for d in dtstarts)
|
|
214
|
-
|
|
234
|
+
unique_tz_names = set(
|
|
235
|
+
_iana_timezone_name(d.tzinfo) for d in dtstarts if d.tzinfo is not None
|
|
236
|
+
)
|
|
215
237
|
|
|
216
|
-
if len(
|
|
238
|
+
if len(unique_tz_names) > 1:
|
|
217
239
|
raise ValueError(
|
|
218
|
-
f"rruleset has too many dtstart timezones: {
|
|
240
|
+
f"rruleset has too many dtstart timezones: {unique_tz_names}"
|
|
219
241
|
)
|
|
220
242
|
|
|
221
243
|
if len(unique_dstarts) > 1:
|
|
222
244
|
raise ValueError(f"rruleset has too many dtstarts: {unique_dstarts}")
|
|
223
245
|
|
|
224
|
-
if unique_dstarts and
|
|
225
|
-
[
|
|
226
|
-
timezone = unique_tz.tzname(dtstarts[0])
|
|
246
|
+
if unique_dstarts and unique_tz_names:
|
|
247
|
+
[timezone] = unique_tz_names
|
|
227
248
|
else:
|
|
228
249
|
timezone = "UTC"
|
|
229
250
|
|
|
@@ -278,6 +278,33 @@ def _interval_schedule_to_dict(schedule: IntervalSchedule) -> dict[str, Any]:
|
|
|
278
278
|
return schedule_config
|
|
279
279
|
|
|
280
280
|
|
|
281
|
+
def _deployment_already_saved_to_prefect_file(
|
|
282
|
+
deployment: dict[str, Any],
|
|
283
|
+
prefect_file: Path = Path("prefect.yaml"),
|
|
284
|
+
) -> bool:
|
|
285
|
+
"""
|
|
286
|
+
Return True if `prefect.yaml` already contains a deployment entry matching the
|
|
287
|
+
given deployment's name and entrypoint.
|
|
288
|
+
|
|
289
|
+
Used to decide whether the interactive `prefect deploy` flow should offer to
|
|
290
|
+
persist a newly-created deployment: a deployment that is already declared in
|
|
291
|
+
the file does not need to be saved again, but a brand-new one (even when the
|
|
292
|
+
file otherwise exists) should still be offered up for saving.
|
|
293
|
+
"""
|
|
294
|
+
if not prefect_file.exists():
|
|
295
|
+
return False
|
|
296
|
+
|
|
297
|
+
with prefect_file.open(mode="r") as f:
|
|
298
|
+
contents = yaml.safe_load(f) or {}
|
|
299
|
+
|
|
300
|
+
for existing in contents.get("deployments") or []:
|
|
301
|
+
if existing.get("name") == deployment.get("name") and existing.get(
|
|
302
|
+
"entrypoint"
|
|
303
|
+
) == deployment.get("entrypoint"):
|
|
304
|
+
return True
|
|
305
|
+
return False
|
|
306
|
+
|
|
307
|
+
|
|
281
308
|
def _save_deployment_to_prefect_file(
|
|
282
309
|
deployment: dict[str, Any],
|
|
283
310
|
build_steps: list[dict[str, Any]] | None = None,
|
|
@@ -972,6 +972,7 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
972
972
|
parent_task = Task(
|
|
973
973
|
name=self.flow.name, fn=self.flow.fn, version=self.flow.version
|
|
974
974
|
)
|
|
975
|
+
setattr(parent_task, "_is_subflow_tracking_task", True)
|
|
975
976
|
|
|
976
977
|
parent_task_run = run_coro_as_sync(
|
|
977
978
|
parent_task.create_run(
|
|
@@ -1667,6 +1668,7 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1667
1668
|
parent_task = Task(
|
|
1668
1669
|
name=self.flow.name, fn=self.flow.fn, version=self.flow.version
|
|
1669
1670
|
)
|
|
1671
|
+
setattr(parent_task, "_is_subflow_tracking_task", True)
|
|
1670
1672
|
|
|
1671
1673
|
parent_task_run = await parent_task.create_run(
|
|
1672
1674
|
flow_run_context=flow_run_ctx,
|
|
@@ -706,7 +706,11 @@ class Flow(Generic[P, R]):
|
|
|
706
706
|
from fastapi.encoders import jsonable_encoder
|
|
707
707
|
|
|
708
708
|
serialized_parameters[key] = jsonable_encoder(value)
|
|
709
|
-
except (TypeError, ValueError):
|
|
709
|
+
except (TypeError, ValueError, RecursionError):
|
|
710
|
+
# `jsonable_encoder` recurses into unknown objects with no cycle
|
|
711
|
+
# or depth limit, so a deeply-nested or self-referential value
|
|
712
|
+
# raises `RecursionError`. Treat it like any other unserializable
|
|
713
|
+
# value and fall back to the placeholder below.
|
|
710
714
|
logger.debug(
|
|
711
715
|
f"Parameter {key!r} for flow {self.name!r} is unserializable. "
|
|
712
716
|
f"Type {type(value).__name__!r} and will not be stored "
|
|
@@ -15,7 +15,7 @@ Thin facade over single-responsibility extracted classes. New behavior belongs i
|
|
|
15
15
|
| CancelFinalizer | _cancel_finalizer.py | Persist Cancelled state after kill; fall back to Crashed if state cannot be confirmed |
|
|
16
16
|
| ControlChannel | _control_channel.py | Runner-side TCP loopback IPC for delivering cancel intent to child processes before kill |
|
|
17
17
|
| HookRunner | _hook_runner.py | on_cancellation / on_crashed hook execution |
|
|
18
|
-
| EventEmitter | _event_emitter.py | Event emission via EventsClient; degrades to NullEventsClient on WebSocket
|
|
18
|
+
| EventEmitter | _event_emitter.py | Event emission via EventsClient; degrades to NullEventsClient on any WebSocket connection failure |
|
|
19
19
|
| LimitManager | _limit_manager.py | Concurrency limiting |
|
|
20
20
|
| DeploymentRegistry | _deployment_registry.py | Deployment/flow/storage/bundle maps |
|
|
21
21
|
| ScheduledRunPoller | _scheduled_run_poller.py | Poll loop, run discovery, scheduling |
|
|
@@ -49,7 +49,7 @@ These will be removed once internal callers (notably ProcessWorker) are migrated
|
|
|
49
49
|
|
|
50
50
|
## EventEmitter WebSocket Degradation
|
|
51
51
|
|
|
52
|
-
`EventEmitter.__aenter__` catches
|
|
52
|
+
`EventEmitter.__aenter__` catches connection failures and silently swaps the failed client for a `NullEventsClient` — events are non-critical telemetry (the runner emits only `prefect.runner.cancelled-flow-run`), so the flow run must not crash when the events WebSocket is unreachable. Two failure classes are caught (`_NONFATAL_CONNECTION_EXCEPTIONS`): permanent rejections (`websockets.exceptions.InvalidStatus`, i.e. HTTP 4xx — e.g. a client ≤3.6.13 connecting to a server ≥3.6.14 with `PREFECT_SERVER_API_AUTH_STRING` configured) and transient failures (`RETRYABLE_EXCEPTIONS` from `events/clients.py`: `ConnectionClosed`, `TimeoutError`, `OSError`) that outlive the events client's own reconnection attempts. A `WARNING` is logged. If `__aenter__` raises, `__aexit__` is **not** called on the original client (it was never successfully entered); the replacement `NullEventsClient` is entered instead.
|
|
53
53
|
|
|
54
54
|
## AsyncExitStack LIFO Ordering
|
|
55
55
|
|
|
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, Callable
|
|
|
5
5
|
from cachetools import TTLCache
|
|
6
6
|
from websockets.exceptions import InvalidStatus as _WsInvalidStatus
|
|
7
7
|
|
|
8
|
-
from prefect.events.clients import NullEventsClient
|
|
8
|
+
from prefect.events.clients import RETRYABLE_EXCEPTIONS, NullEventsClient
|
|
9
9
|
from prefect.events.related import tags_as_related_resources
|
|
10
10
|
from prefect.events.schemas.events import Event, RelatedResource, Resource
|
|
11
11
|
from prefect.logging import get_logger
|
|
@@ -18,12 +18,19 @@ if TYPE_CHECKING:
|
|
|
18
18
|
from prefect.client.schemas.responses import DeploymentResponse
|
|
19
19
|
from prefect.events.clients import EventsClient
|
|
20
20
|
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
|
|
21
|
+
# Connection failures that must not crash the flow run. The events WebSocket
|
|
22
|
+
# carries non-critical telemetry, so a failure to connect degrades to
|
|
23
|
+
# NullEventsClient rather than taking the flow run down with it.
|
|
24
|
+
# - _WsInvalidStatus: the server rejected the handshake (HTTP 401/403), e.g. a
|
|
25
|
+
# client <=3.6.13 connecting to a server >=3.6.14 that has
|
|
26
|
+
# PREFECT_SERVER_API_AUTH_STRING configured. A permanent failure.
|
|
27
|
+
# - RETRYABLE_EXCEPTIONS: transient failures (handshake timeout, dropped
|
|
28
|
+
# connection, network errors) that the events client already retries; once
|
|
29
|
+
# those retries are exhausted the error must still not be fatal here.
|
|
30
|
+
_NONFATAL_CONNECTION_EXCEPTIONS: tuple[type[Exception], ...] = (
|
|
31
|
+
_WsInvalidStatus,
|
|
32
|
+
*RETRYABLE_EXCEPTIONS,
|
|
33
|
+
)
|
|
27
34
|
|
|
28
35
|
|
|
29
36
|
def _default_get_events_client() -> "EventsClient":
|
|
@@ -60,17 +67,18 @@ class EventEmitter:
|
|
|
60
67
|
try:
|
|
61
68
|
await self._events_client.__aenter__()
|
|
62
69
|
except _NONFATAL_CONNECTION_EXCEPTIONS as exc:
|
|
63
|
-
# The events WebSocket
|
|
64
|
-
#
|
|
65
|
-
# >=3.6.14
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
70
|
+
# The events WebSocket could not be established -- either rejected by
|
|
71
|
+
# the server (HTTP 401/403, e.g. a client <=3.6.13 connecting to a
|
|
72
|
+
# server >=3.6.14 with PREFECT_SERVER_API_AUTH_STRING configured) or a
|
|
73
|
+
# transient connection failure that outlived the events client's own
|
|
74
|
+
# retries. Events are non-critical telemetry, so degrade gracefully
|
|
75
|
+
# instead of crashing the flow run.
|
|
69
76
|
self._logger.warning(
|
|
70
77
|
"Unable to connect to the events WebSocket (%s). "
|
|
71
|
-
"Event data will not be emitted for this runner
|
|
72
|
-
"Upgrade the Prefect client to >=3.6.14 to
|
|
73
|
-
"
|
|
78
|
+
"Event data will not be emitted for this runner; the flow run "
|
|
79
|
+
"will continue. Upgrade the Prefect client to >=3.6.14 to "
|
|
80
|
+
"restore event support if the server has authentication "
|
|
81
|
+
"configured.",
|
|
74
82
|
exc,
|
|
75
83
|
)
|
|
76
84
|
# __aenter__ failed, so __aexit__ must NOT be called on the original
|
|
@@ -14,7 +14,7 @@ from typing import (
|
|
|
14
14
|
Union,
|
|
15
15
|
runtime_checkable,
|
|
16
16
|
)
|
|
17
|
-
from urllib.parse import quote, urlparse, urlsplit, urlunparse
|
|
17
|
+
from urllib.parse import quote, unquote, urlparse, urlsplit, urlunparse
|
|
18
18
|
from uuid import uuid4
|
|
19
19
|
|
|
20
20
|
import fsspec # pyright: ignore[reportMissingTypeStubs]
|
|
@@ -22,7 +22,7 @@ from anyio import run_process
|
|
|
22
22
|
from pydantic import SecretStr
|
|
23
23
|
|
|
24
24
|
from prefect._internal.concurrency.api import create_call, from_async
|
|
25
|
-
from prefect._internal.urls import strip_auth_from_url
|
|
25
|
+
from prefect._internal.urls import strip_auth_from_url, strip_auth_from_urls_in_text
|
|
26
26
|
from prefect.blocks.core import Block, BlockNotSavedError
|
|
27
27
|
from prefect.blocks.system import Secret
|
|
28
28
|
from prefect.filesystems import ReadableDeploymentStorage, WritableDeploymentStorage
|
|
@@ -499,6 +499,21 @@ class GitRepository:
|
|
|
499
499
|
else exc
|
|
500
500
|
)
|
|
501
501
|
safe_url = strip_auth_from_url(self._url)
|
|
502
|
+
sanitized_stderr = strip_auth_from_urls_in_text(
|
|
503
|
+
_decode_stderr(exc),
|
|
504
|
+
extra_secrets=_url_auth_secrets(self._url, repository_url),
|
|
505
|
+
)
|
|
506
|
+
# Surface the raw git error at DEBUG so users can opt in via log
|
|
507
|
+
# level when the hint patterns don't match. The exception chain is
|
|
508
|
+
# suppressed above when credentials are present, so DEBUG is the
|
|
509
|
+
# only way to see the actual git output in that case.
|
|
510
|
+
if sanitized_stderr:
|
|
511
|
+
self._logger.debug(
|
|
512
|
+
"git clone failed (exit %d) for %r: %s",
|
|
513
|
+
exc.returncode,
|
|
514
|
+
safe_url,
|
|
515
|
+
sanitized_stderr.strip(),
|
|
516
|
+
)
|
|
502
517
|
error_message = (
|
|
503
518
|
f"Failed to clone repository {safe_url!r} with exit code"
|
|
504
519
|
f" {exc.returncode}."
|
|
@@ -506,6 +521,14 @@ class GitRepository:
|
|
|
506
521
|
hint = _get_git_clone_error_hint(exc)
|
|
507
522
|
if hint:
|
|
508
523
|
error_message += f" {hint}"
|
|
524
|
+
elif sanitized_stderr:
|
|
525
|
+
# No pattern matched -- surface the actual git error so the
|
|
526
|
+
# user doesn't have to enable DEBUG to know what went wrong.
|
|
527
|
+
snippet = sanitized_stderr.strip().splitlines()
|
|
528
|
+
# Keep the last few lines; git's final 'fatal:' line is usually
|
|
529
|
+
# the actionable one.
|
|
530
|
+
tail = " | ".join(snippet[-3:])
|
|
531
|
+
error_message += f" git stderr: {tail}"
|
|
509
532
|
raise RuntimeError(error_message) from exc_chain
|
|
510
533
|
|
|
511
534
|
if self._commit_sha:
|
|
@@ -985,15 +1008,34 @@ _GIT_CLONE_ERROR_HINTS: list[tuple[str, str]] = [
|
|
|
985
1008
|
]
|
|
986
1009
|
|
|
987
1010
|
|
|
1011
|
+
def _decode_stderr(exc: subprocess.CalledProcessError) -> str:
|
|
1012
|
+
"""Decode a CalledProcessError's stderr to text, tolerating bytes/None."""
|
|
1013
|
+
if not exc.stderr:
|
|
1014
|
+
return ""
|
|
1015
|
+
if isinstance(exc.stderr, bytes):
|
|
1016
|
+
return exc.stderr.decode("utf-8", errors="replace")
|
|
1017
|
+
return str(exc.stderr)
|
|
1018
|
+
|
|
1019
|
+
|
|
1020
|
+
def _url_auth_secrets(*urls: str) -> list[str]:
|
|
1021
|
+
"""Extract userinfo values from URLs so echoed auth can be redacted."""
|
|
1022
|
+
secrets: list[str] = []
|
|
1023
|
+
seen: set[str] = set()
|
|
1024
|
+
for url in urls:
|
|
1025
|
+
parsed = urlparse(url)
|
|
1026
|
+
for value in (parsed.username, parsed.password):
|
|
1027
|
+
if not value:
|
|
1028
|
+
continue
|
|
1029
|
+
for secret in (value, unquote(value)):
|
|
1030
|
+
if secret and secret not in seen:
|
|
1031
|
+
secrets.append(secret)
|
|
1032
|
+
seen.add(secret)
|
|
1033
|
+
return secrets
|
|
1034
|
+
|
|
1035
|
+
|
|
988
1036
|
def _get_git_clone_error_hint(exc: subprocess.CalledProcessError) -> str | None:
|
|
989
1037
|
"""Extract a resolution hint from a git clone CalledProcessError's stderr."""
|
|
990
|
-
stderr =
|
|
991
|
-
if exc.stderr:
|
|
992
|
-
stderr = (
|
|
993
|
-
exc.stderr.decode("utf-8", errors="replace")
|
|
994
|
-
if isinstance(exc.stderr, bytes)
|
|
995
|
-
else str(exc.stderr)
|
|
996
|
-
)
|
|
1038
|
+
stderr = _decode_stderr(exc)
|
|
997
1039
|
for pattern, hint in _GIT_CLONE_ERROR_HINTS:
|
|
998
1040
|
if pattern.lower() in stderr.lower():
|
|
999
1041
|
return hint
|
{prefect_client-3.7.4.dev3 → prefect_client-3.7.5}/src/prefect/server/api/background_workers.py
RENAMED
|
@@ -14,6 +14,7 @@ from prefect.server.models.work_queues import mark_work_queues_ready
|
|
|
14
14
|
from prefect.server.services.cancellation_cleanup import (
|
|
15
15
|
cancel_child_task_runs,
|
|
16
16
|
cancel_subflow_run,
|
|
17
|
+
handle_cancelling_timeout,
|
|
17
18
|
)
|
|
18
19
|
from prefect.server.services.db_vacuum import (
|
|
19
20
|
vacuum_events_with_retention_overrides,
|
|
@@ -40,6 +41,7 @@ task_functions: list[Callable[..., Any]] = [
|
|
|
40
41
|
delete_task_run_logs,
|
|
41
42
|
delete_flow_run_logs,
|
|
42
43
|
# Find-and-flood pattern tasks used by perpetual services
|
|
44
|
+
handle_cancelling_timeout,
|
|
43
45
|
cancel_child_task_runs,
|
|
44
46
|
cancel_subflow_run,
|
|
45
47
|
fail_expired_pause,
|
|
@@ -311,7 +311,11 @@ async def update_deployment(
|
|
|
311
311
|
)
|
|
312
312
|
try:
|
|
313
313
|
deployment.check_valid_configuration(work_pool.base_job_template)
|
|
314
|
-
except (
|
|
314
|
+
except (
|
|
315
|
+
MissingVariableError,
|
|
316
|
+
jsonschema.exceptions.ValidationError,
|
|
317
|
+
ValidationError,
|
|
318
|
+
) as exc:
|
|
315
319
|
raise HTTPException(
|
|
316
320
|
status_code=status.HTTP_409_CONFLICT,
|
|
317
321
|
detail=f"Error creating deployment: {exc!r}",
|