prefect-client 3.7.3.dev7__tar.gz → 3.7.4__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.3.dev7 → prefect_client-3.7.4}/PKG-INFO +1 -1
- prefect_client-3.7.4/src/prefect/_build_info.py +5 -0
- prefect_client-3.7.4/src/prefect/_internal/urls.py +57 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_automations/client.py +38 -4
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/base.py +27 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/filters.py +22 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_workspace_starter.py +76 -4
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/runner.py +1 -1
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/storage.py +51 -9
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/workers.py +59 -3
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/AGENTS.md +2 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/_types.py +3 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/services.py +31 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/worker_channel.py +4 -4
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/pydantic.py +2 -1
- prefect_client-3.7.3.dev7/src/prefect/_build_info.py +0 -5
- prefect_client-3.7.3.dev7/src/prefect/_internal/urls.py +0 -29
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/.gitignore +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/LICENSE +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/README.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/hatch_build.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/pyproject.toml +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/__main__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/agent.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/automations.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/base.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/context.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/engine.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/related.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/flows.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/futures.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/main.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/plugins.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/py.typed +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/results.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/schedules.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/serializers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/states.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/tasks.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/transactions.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/types/names.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/variables.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/workers/utilities.py +0 -0
|
@@ -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
|
|
@@ -10,6 +10,8 @@ from prefect.exceptions import ObjectNotFound
|
|
|
10
10
|
if TYPE_CHECKING:
|
|
11
11
|
from uuid import UUID
|
|
12
12
|
|
|
13
|
+
from prefect.client.schemas.sorting import AutomationSort
|
|
14
|
+
from prefect.events.filters import AutomationFilter
|
|
13
15
|
from prefect.events.schemas.automations import Automation, AutomationCore
|
|
14
16
|
|
|
15
17
|
|
|
@@ -37,8 +39,24 @@ class AutomationClient(BaseClient):
|
|
|
37
39
|
)
|
|
38
40
|
response.raise_for_status()
|
|
39
41
|
|
|
40
|
-
def read_automations(
|
|
41
|
-
|
|
42
|
+
def read_automations(
|
|
43
|
+
self,
|
|
44
|
+
*,
|
|
45
|
+
automations: "AutomationFilter | None" = None,
|
|
46
|
+
sort: "AutomationSort | None" = None,
|
|
47
|
+
limit: int | None = None,
|
|
48
|
+
offset: int = 0,
|
|
49
|
+
) -> list["Automation"]:
|
|
50
|
+
body: dict[str, object] = {
|
|
51
|
+
"automations": (
|
|
52
|
+
automations.model_dump(mode="json") if automations else None
|
|
53
|
+
),
|
|
54
|
+
"sort": sort,
|
|
55
|
+
"limit": limit,
|
|
56
|
+
"offset": offset,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
response = self.request("POST", "/automations/filter", json=body)
|
|
42
60
|
response.raise_for_status()
|
|
43
61
|
from prefect.events.schemas.automations import Automation
|
|
44
62
|
|
|
@@ -196,8 +214,24 @@ class AutomationAsyncClient(BaseAsyncClient):
|
|
|
196
214
|
)
|
|
197
215
|
response.raise_for_status()
|
|
198
216
|
|
|
199
|
-
async def read_automations(
|
|
200
|
-
|
|
217
|
+
async def read_automations(
|
|
218
|
+
self,
|
|
219
|
+
*,
|
|
220
|
+
automations: "AutomationFilter | None" = None,
|
|
221
|
+
sort: "AutomationSort | None" = None,
|
|
222
|
+
limit: int | None = None,
|
|
223
|
+
offset: int = 0,
|
|
224
|
+
) -> list["Automation"]:
|
|
225
|
+
body: dict[str, object] = {
|
|
226
|
+
"automations": (
|
|
227
|
+
automations.model_dump(mode="json") if automations else None
|
|
228
|
+
),
|
|
229
|
+
"sort": sort,
|
|
230
|
+
"limit": limit,
|
|
231
|
+
"offset": offset,
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
response = await self.request("POST", "/automations/filter", json=body)
|
|
201
235
|
response.raise_for_status()
|
|
202
236
|
from prefect.events.schemas.automations import Automation
|
|
203
237
|
|
|
@@ -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,
|
|
@@ -32,6 +32,25 @@ class AutomationFilterName(PrefectBaseModel):
|
|
|
32
32
|
)
|
|
33
33
|
|
|
34
34
|
|
|
35
|
+
class AutomationFilterTags(PrefectBaseModel):
|
|
36
|
+
"""Filter by `Automation.tags`."""
|
|
37
|
+
|
|
38
|
+
all_: Optional[list[str]] = Field(
|
|
39
|
+
default=None,
|
|
40
|
+
examples=[["tag-1", "tag-2"]],
|
|
41
|
+
description="A list of tags. Automations will be returned only if their tags are a superset of the list",
|
|
42
|
+
)
|
|
43
|
+
any_: Optional[list[str]] = Field(
|
|
44
|
+
default=None,
|
|
45
|
+
examples=[["tag-1", "tag-2"]],
|
|
46
|
+
description="A list of tags. Automations will be returned if their tags contain any of the tags in the list",
|
|
47
|
+
)
|
|
48
|
+
is_null_: Optional[bool] = Field(
|
|
49
|
+
default=None,
|
|
50
|
+
description="If true, only include automations without tags",
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
35
54
|
class AutomationFilter(PrefectBaseModel):
|
|
36
55
|
name: Optional[AutomationFilterName] = Field(
|
|
37
56
|
default=None, description="Filter criteria for `Automation.name`"
|
|
@@ -39,6 +58,9 @@ class AutomationFilter(PrefectBaseModel):
|
|
|
39
58
|
created: Optional[AutomationFilterCreated] = Field(
|
|
40
59
|
default=None, description="Filter criteria for `Automation.created`"
|
|
41
60
|
)
|
|
61
|
+
tags: Optional[AutomationFilterTags] = Field(
|
|
62
|
+
default=None, description="Filter criteria for `Automation.tags`"
|
|
63
|
+
)
|
|
42
64
|
|
|
43
65
|
|
|
44
66
|
class EventDataFilter(PrefectBaseModel, extra="forbid"): # type: ignore[call-arg]
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import functools
|
|
3
4
|
import os
|
|
4
5
|
import shutil
|
|
6
|
+
import site
|
|
5
7
|
import subprocess
|
|
6
8
|
import sys
|
|
9
|
+
import sysconfig
|
|
7
10
|
from contextlib import contextmanager
|
|
8
11
|
from pathlib import Path
|
|
9
12
|
from typing import TYPE_CHECKING, Any, Iterable, Iterator
|
|
@@ -109,14 +112,83 @@ def _workspace_sys_path(workspace: PreparedWorkspace) -> list[str]:
|
|
|
109
112
|
return entries
|
|
110
113
|
|
|
111
114
|
|
|
115
|
+
@functools.lru_cache(maxsize=1)
|
|
116
|
+
def _stdlib_prefixes() -> tuple[str, ...]:
|
|
117
|
+
"""Resolved stdlib directory prefixes whose children should not land on PYTHONPATH."""
|
|
118
|
+
roots: set[str] = set()
|
|
119
|
+
paths = sysconfig.get_paths()
|
|
120
|
+
for key in ("stdlib", "platstdlib"):
|
|
121
|
+
val = paths.get(key)
|
|
122
|
+
if val:
|
|
123
|
+
roots.add(str(Path(val).resolve()))
|
|
124
|
+
return tuple(sorted(roots))
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@functools.lru_cache(maxsize=1)
|
|
128
|
+
def _site_packages_dirs() -> tuple[str, ...]:
|
|
129
|
+
"""Resolved site-packages directories that should always be kept."""
|
|
130
|
+
dirs: set[str] = set()
|
|
131
|
+
paths = sysconfig.get_paths()
|
|
132
|
+
for key in ("purelib", "platlib"):
|
|
133
|
+
val = paths.get(key)
|
|
134
|
+
if val:
|
|
135
|
+
dirs.add(str(Path(val).resolve()))
|
|
136
|
+
try:
|
|
137
|
+
for sp in site.getsitepackages():
|
|
138
|
+
dirs.add(str(Path(sp).resolve()))
|
|
139
|
+
except AttributeError:
|
|
140
|
+
pass
|
|
141
|
+
try:
|
|
142
|
+
usp = site.getusersitepackages()
|
|
143
|
+
if isinstance(usp, str):
|
|
144
|
+
dirs.add(str(Path(usp).resolve()))
|
|
145
|
+
except AttributeError:
|
|
146
|
+
pass
|
|
147
|
+
return tuple(sorted(dirs))
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _is_stdlib_path(entry: str) -> bool:
|
|
151
|
+
"""True when *entry* is a stdlib, lib-dynload, or stdlib zip path.
|
|
152
|
+
|
|
153
|
+
Site-packages directories that live under the stdlib tree are kept.
|
|
154
|
+
Only interpreter stdlib zip archives next to stdlib directories are filtered;
|
|
155
|
+
user archives like `/app/python_deps.zip` are preserved.
|
|
156
|
+
"""
|
|
157
|
+
if not entry:
|
|
158
|
+
return False
|
|
159
|
+
|
|
160
|
+
resolved_path = Path(entry).resolve()
|
|
161
|
+
resolved = str(resolved_path)
|
|
162
|
+
|
|
163
|
+
for sp in _site_packages_dirs():
|
|
164
|
+
if resolved == sp or resolved.startswith(sp + os.sep):
|
|
165
|
+
return False
|
|
166
|
+
|
|
167
|
+
for root in _stdlib_prefixes():
|
|
168
|
+
if resolved == root or resolved.startswith(root + os.sep):
|
|
169
|
+
return True
|
|
170
|
+
|
|
171
|
+
interpreter_zip_name = f"python{sys.version_info.major}{sys.version_info.minor}.zip"
|
|
172
|
+
if resolved_path.name == interpreter_zip_name:
|
|
173
|
+
resolved_parent = str(resolved_path.parent)
|
|
174
|
+
stdlib_parents = {str(Path(r).parent) for r in _stdlib_prefixes()}
|
|
175
|
+
if resolved_parent in stdlib_parents:
|
|
176
|
+
return True
|
|
177
|
+
|
|
178
|
+
return False
|
|
179
|
+
|
|
180
|
+
|
|
112
181
|
def workspace_environment(workspace: PreparedWorkspace) -> dict[str, str]:
|
|
113
182
|
environment = dict(workspace.environment)
|
|
114
|
-
pythonpath_entries =
|
|
183
|
+
pythonpath_entries: list[str] = []
|
|
184
|
+
candidate_entries = _workspace_sys_path(workspace)
|
|
115
185
|
existing_pythonpath = environment.get("PYTHONPATH")
|
|
116
186
|
if existing_pythonpath:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
187
|
+
candidate_entries.extend(existing_pythonpath.split(os.pathsep))
|
|
188
|
+
|
|
189
|
+
for entry in candidate_entries:
|
|
190
|
+
if entry and entry not in pythonpath_entries and not _is_stdlib_path(entry):
|
|
191
|
+
pythonpath_entries.append(entry)
|
|
120
192
|
|
|
121
193
|
environment["PYTHONPATH"] = os.pathsep.join(pythonpath_entries)
|
|
122
194
|
return environment
|
|
@@ -1701,7 +1701,7 @@ class Runner:
|
|
|
1701
1701
|
):
|
|
1702
1702
|
return self._deployment_registry.get_flow(flow_run.deployment_id)
|
|
1703
1703
|
return await load_flow_from_flow_run(
|
|
1704
|
-
|
|
1704
|
+
flow_run, storage_base_path=str(self._tmp_dir)
|
|
1705
1705
|
)
|
|
1706
1706
|
|
|
1707
1707
|
self._hook_runner = HookRunner(resolve_flow=_resolve_flow_for_hooks)
|
|
@@ -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
|
|
@@ -25,8 +25,10 @@ import prefect.server.models as models
|
|
|
25
25
|
import prefect.server.schemas as schemas
|
|
26
26
|
from prefect._internal.uuid7 import uuid7
|
|
27
27
|
from prefect.client.schemas.worker_channel import (
|
|
28
|
+
CLEANUP_DELIVERY_CAPABILITY,
|
|
28
29
|
WORK_POOL_SNAPSHOT_CAPABILITY,
|
|
29
30
|
WORKER_HEARTBEAT_CAPABILITY,
|
|
31
|
+
WorkerChannelCapability,
|
|
30
32
|
WorkerChannelCloseReason,
|
|
31
33
|
WorkerChannelProtocolError,
|
|
32
34
|
WorkerHelloFrame,
|
|
@@ -48,6 +50,10 @@ from prefect.server.schemas.statuses import WorkQueueStatus
|
|
|
48
50
|
from prefect.server.utilities import subscriptions
|
|
49
51
|
from prefect.server.utilities import worker_channel as worker_channel_utils
|
|
50
52
|
from prefect.server.utilities.server import PrefectRouter
|
|
53
|
+
from prefect.server.worker_communication.cleanup_queue import (
|
|
54
|
+
WorkerCleanupQueue,
|
|
55
|
+
get_worker_cleanup_queue,
|
|
56
|
+
)
|
|
51
57
|
from prefect.types import DateTime
|
|
52
58
|
from prefect.types._datetime import now
|
|
53
59
|
|
|
@@ -61,7 +67,7 @@ router: PrefectRouter = PrefectRouter(
|
|
|
61
67
|
)
|
|
62
68
|
logger: Logger = get_logger("prefect.server.api.workers")
|
|
63
69
|
|
|
64
|
-
|
|
70
|
+
_OSS_WORKER_CHANNEL_REQUIRED_CAPABILITIES: list[WorkerChannelCapability] = [
|
|
65
71
|
WORKER_HEARTBEAT_CAPABILITY,
|
|
66
72
|
WORK_POOL_SNAPSHOT_CAPABILITY,
|
|
67
73
|
]
|
|
@@ -183,6 +189,26 @@ class WorkerChannelWorkPoolUpdateEvent:
|
|
|
183
189
|
changed_fields: dict[str, dict[str, Any]]
|
|
184
190
|
|
|
185
191
|
|
|
192
|
+
def _worker_requested_cleanup_delivery(hello: WorkerHelloFrame) -> bool:
|
|
193
|
+
return (
|
|
194
|
+
CLEANUP_DELIVERY_CAPABILITY in hello.payload.requested_capabilities
|
|
195
|
+
and bool(hello.payload.handled_cleanup_kinds)
|
|
196
|
+
and hello.payload.max_cleanup_concurrency > 0
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _accepted_worker_channel_capabilities(
|
|
201
|
+
hello: WorkerHelloFrame,
|
|
202
|
+
*,
|
|
203
|
+
cleanup_queue_available: bool,
|
|
204
|
+
) -> list[WorkerChannelCapability]:
|
|
205
|
+
accepted = list(_OSS_WORKER_CHANNEL_REQUIRED_CAPABILITIES)
|
|
206
|
+
if cleanup_queue_available and _worker_requested_cleanup_delivery(hello):
|
|
207
|
+
accepted.append(CLEANUP_DELIVERY_CAPABILITY)
|
|
208
|
+
|
|
209
|
+
return accepted
|
|
210
|
+
|
|
211
|
+
|
|
186
212
|
async def _receive_worker_hello(websocket: WebSocket) -> WorkerHelloFrame:
|
|
187
213
|
try:
|
|
188
214
|
message = await websocket.receive_json()
|
|
@@ -290,6 +316,7 @@ async def _build_worker_ready_frame(
|
|
|
290
316
|
session: AsyncSession,
|
|
291
317
|
work_pool_name: str,
|
|
292
318
|
hello: WorkerHelloFrame,
|
|
319
|
+
cleanup_queue_available: bool,
|
|
293
320
|
) -> tuple[WorkerReadyFrame, WorkerChannelWorkPoolUpdateEvent | None]:
|
|
294
321
|
try:
|
|
295
322
|
selected_channel_version = select_worker_channel_version(
|
|
@@ -371,7 +398,10 @@ async def _build_worker_ready_frame(
|
|
|
371
398
|
)
|
|
372
399
|
|
|
373
400
|
requested_capabilities = list(dict.fromkeys(hello.payload.requested_capabilities))
|
|
374
|
-
accepted =
|
|
401
|
+
accepted = _accepted_worker_channel_capabilities(
|
|
402
|
+
hello,
|
|
403
|
+
cleanup_queue_available=cleanup_queue_available,
|
|
404
|
+
)
|
|
375
405
|
accepted_set = set(accepted)
|
|
376
406
|
rejected = [
|
|
377
407
|
capability
|
|
@@ -393,7 +423,11 @@ async def _build_worker_ready_frame(
|
|
|
393
423
|
),
|
|
394
424
|
"accepted_capabilities": accepted,
|
|
395
425
|
"rejected_capabilities": rejected,
|
|
396
|
-
"effective_max_cleanup_concurrency":
|
|
426
|
+
"effective_max_cleanup_concurrency": (
|
|
427
|
+
hello.payload.max_cleanup_concurrency
|
|
428
|
+
if CLEANUP_DELIVERY_CAPABILITY in accepted_set
|
|
429
|
+
else 0
|
|
430
|
+
),
|
|
397
431
|
"resolved_work_queues": [
|
|
398
432
|
{"id": work_queue.id, "name": work_queue.name}
|
|
399
433
|
for work_queue in work_queues
|
|
@@ -1058,6 +1092,16 @@ async def worker_channel_connect(
|
|
|
1058
1092
|
|
|
1059
1093
|
try:
|
|
1060
1094
|
hello = await _receive_worker_hello(websocket)
|
|
1095
|
+
cleanup_queue: WorkerCleanupQueue | None = None
|
|
1096
|
+
if _worker_requested_cleanup_delivery(hello):
|
|
1097
|
+
try:
|
|
1098
|
+
cleanup_queue = get_worker_cleanup_queue()
|
|
1099
|
+
except Exception:
|
|
1100
|
+
logger.exception(
|
|
1101
|
+
"Worker cleanup delivery queue initialization failed; "
|
|
1102
|
+
"rejecting cleanup delivery capability"
|
|
1103
|
+
)
|
|
1104
|
+
|
|
1061
1105
|
async with worker_channel_utils.messaging.ephemeral_subscription(
|
|
1062
1106
|
worker_channel_utils.WORKER_CHANNEL_SNAPSHOT_TOPIC,
|
|
1063
1107
|
) as consumer_kwargs:
|
|
@@ -1066,6 +1110,7 @@ async def worker_channel_connect(
|
|
|
1066
1110
|
session=session,
|
|
1067
1111
|
work_pool_name=work_pool_name,
|
|
1068
1112
|
hello=hello,
|
|
1113
|
+
cleanup_queue_available=cleanup_queue is not None,
|
|
1069
1114
|
)
|
|
1070
1115
|
|
|
1071
1116
|
if work_pool_update_event is not None:
|
|
@@ -1094,6 +1139,17 @@ async def worker_channel_connect(
|
|
|
1094
1139
|
work_pool_id=ready.payload.initial_snapshot.work_pool.id,
|
|
1095
1140
|
consumer_id=hello.payload.consumer_id,
|
|
1096
1141
|
worker_name=hello.payload.worker_name,
|
|
1142
|
+
cleanup_queue=(
|
|
1143
|
+
cleanup_queue
|
|
1144
|
+
if CLEANUP_DELIVERY_CAPABILITY
|
|
1145
|
+
in ready.payload.accepted_capabilities
|
|
1146
|
+
else None
|
|
1147
|
+
),
|
|
1148
|
+
cleanup_kinds=tuple(hello.payload.handled_cleanup_kinds),
|
|
1149
|
+
cleanup_work_queue_ids=tuple(
|
|
1150
|
+
work_queue.id for work_queue in ready.payload.resolved_work_queues
|
|
1151
|
+
),
|
|
1152
|
+
max_cleanup_concurrency=ready.payload.effective_max_cleanup_concurrency,
|
|
1097
1153
|
)
|
|
1098
1154
|
await connection.run(ready, consumer_kwargs)
|
|
1099
1155
|
|
|
@@ -118,3 +118,5 @@ from prefect.settings.context import get_current_settings
|
|
|
118
118
|
settings = get_current_settings()
|
|
119
119
|
value = settings.server.services.my_service.my_setting
|
|
120
120
|
```
|
|
121
|
+
|
|
122
|
+
`temporary_settings()` accepts both legacy `Setting` objects and dotted-path string keys (e.g., `"server.api.host"`) or uppercase env var names (e.g., `"PREFECT_SERVER_API_HOST"`). Prefer string keys in new tests to avoid importing legacy `Setting` objects.
|
|
@@ -140,6 +140,9 @@ SettingAccessor: TypeAlias = Literal[
|
|
|
140
140
|
"server.register_blocks_on_start",
|
|
141
141
|
"server.services.cancellation_cleanup.enabled",
|
|
142
142
|
"server.services.cancellation_cleanup.loop_seconds",
|
|
143
|
+
"server.services.cleanup_reconciler.batch_size",
|
|
144
|
+
"server.services.cleanup_reconciler.enabled",
|
|
145
|
+
"server.services.cleanup_reconciler.loop_seconds",
|
|
143
146
|
"server.services.db_vacuum.batch_size",
|
|
144
147
|
"server.services.db_vacuum.enabled",
|
|
145
148
|
"server.services.db_vacuum.event_retention_overrides",
|
{prefect_client-3.7.3.dev7 → prefect_client-3.7.4}/src/prefect/settings/models/server/services.py
RENAMED
|
@@ -542,6 +542,33 @@ class ServerServicesRepossessorSettings(ServicesBaseSetting):
|
|
|
542
542
|
)
|
|
543
543
|
|
|
544
544
|
|
|
545
|
+
class ServerServicesCleanupReconcilerSettings(ServicesBaseSetting):
|
|
546
|
+
"""
|
|
547
|
+
Settings for controlling the cleanup reconciler service.
|
|
548
|
+
"""
|
|
549
|
+
|
|
550
|
+
model_config: ClassVar[SettingsConfigDict] = build_settings_config(
|
|
551
|
+
("server", "services", "cleanup_reconciler")
|
|
552
|
+
)
|
|
553
|
+
|
|
554
|
+
enabled: bool = Field(
|
|
555
|
+
default=True,
|
|
556
|
+
description="Whether or not to start the cleanup reconciler service in the server application.",
|
|
557
|
+
)
|
|
558
|
+
|
|
559
|
+
loop_seconds: float = Field(
|
|
560
|
+
default=5,
|
|
561
|
+
gt=0,
|
|
562
|
+
description="The cleanup reconciler service will look for expired cleanup message leases this often. Defaults to `5`.",
|
|
563
|
+
)
|
|
564
|
+
|
|
565
|
+
batch_size: int = Field(
|
|
566
|
+
default=100,
|
|
567
|
+
gt=0,
|
|
568
|
+
description="The maximum number of expired cleanup message leases to process per service loop. Defaults to `100`.",
|
|
569
|
+
)
|
|
570
|
+
|
|
571
|
+
|
|
545
572
|
class ServerServicesTaskRunRecorderSettings(ServicesBaseSetting):
|
|
546
573
|
"""
|
|
547
574
|
Settings for controlling the task run recorder service
|
|
@@ -677,6 +704,10 @@ class ServerServicesSettings(PrefectBaseSettings):
|
|
|
677
704
|
default_factory=ServerServicesRepossessorSettings,
|
|
678
705
|
description="Settings for controlling the repossessor service",
|
|
679
706
|
)
|
|
707
|
+
cleanup_reconciler: ServerServicesCleanupReconcilerSettings = Field(
|
|
708
|
+
default_factory=ServerServicesCleanupReconcilerSettings,
|
|
709
|
+
description="Settings for controlling the cleanup reconciler service",
|
|
710
|
+
)
|
|
680
711
|
task_run_recorder: ServerServicesTaskRunRecorderSettings = Field(
|
|
681
712
|
default_factory=ServerServicesTaskRunRecorderSettings,
|
|
682
713
|
description="Settings for controlling the task run recorder service",
|
|
@@ -20,8 +20,8 @@ class ServerWorkerChannelSettings(PrefectBaseSettings):
|
|
|
20
20
|
description=(
|
|
21
21
|
"The module to use for storing worker cleanup delivery messages. "
|
|
22
22
|
"The default in-memory backend stores messages, leases, wakeups, "
|
|
23
|
-
"and dead-letter entries only in the current server process; use
|
|
24
|
-
"
|
|
23
|
+
"and dead-letter entries only in the current server process; use "
|
|
24
|
+
"an external storage module for high availability or restart-safe "
|
|
25
25
|
"cleanup delivery."
|
|
26
26
|
),
|
|
27
27
|
)
|
|
@@ -47,8 +47,8 @@ class ServerWorkerChannelSettings(PrefectBaseSettings):
|
|
|
47
47
|
description=(
|
|
48
48
|
"How long completed cleanup idempotency records are retained after "
|
|
49
49
|
"acknowledgement. None keeps them for the lifetime of the current "
|
|
50
|
-
"server process. The in-memory backend does not survive restart; "
|
|
51
|
-
"
|
|
50
|
+
"server process. The in-memory backend does not survive restart; use "
|
|
51
|
+
"external storage for high availability or restart-safe cleanup "
|
|
52
52
|
"idempotency."
|
|
53
53
|
),
|
|
54
54
|
)
|
|
@@ -333,7 +333,8 @@ def parse_obj_as(
|
|
|
333
333
|
origin: Optional[Any] = get_origin(type_)
|
|
334
334
|
if origin is list and isinstance(data, dict):
|
|
335
335
|
values_dict: dict[Any, Any] = data
|
|
336
|
-
|
|
336
|
+
if values_dict:
|
|
337
|
+
data = next(iter(values_dict.values()))
|
|
337
338
|
|
|
338
339
|
parser: Callable[[Any], T] = getattr(adapter, f"validate_{mode}")
|
|
339
340
|
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
from urllib.parse import urlparse, urlunparse
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def strip_auth_from_url(url: str) -> str:
|
|
5
|
-
"""
|
|
6
|
-
Remove authentication credentials (username/password) from a URL.
|
|
7
|
-
|
|
8
|
-
Useful for sanitizing URLs before including them in error messages
|
|
9
|
-
or logs to avoid leaking secrets.
|
|
10
|
-
"""
|
|
11
|
-
parsed = urlparse(url)
|
|
12
|
-
|
|
13
|
-
if not parsed.hostname:
|
|
14
|
-
return url
|
|
15
|
-
|
|
16
|
-
netloc = parsed.hostname
|
|
17
|
-
if parsed.port:
|
|
18
|
-
netloc = f"{netloc}:{parsed.port}"
|
|
19
|
-
|
|
20
|
-
return urlunparse(
|
|
21
|
-
(
|
|
22
|
-
parsed.scheme,
|
|
23
|
-
netloc,
|
|
24
|
-
parsed.path,
|
|
25
|
-
parsed.params,
|
|
26
|
-
parsed.query,
|
|
27
|
-
parsed.fragment,
|
|
28
|
-
)
|
|
29
|
-
)
|