prefect-client 3.8.9.dev6__tar.gz → 3.9.0__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.8.9.dev6 → prefect_client-3.9.0}/PKG-INFO +7 -6
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/pyproject.toml +7 -5
- prefect_client-3.9.0/src/prefect/_build_info.py +5 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/deprecated.py +5 -3
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/services.py +33 -6
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/runner.py +85 -10
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/__init__.py +2 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/actions.py +62 -2
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/schemas/automations.py +23 -11
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/flow_runs.py +1 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/flows.py +5 -5
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/futures.py +2 -2
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/AGENTS.md +2 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/handlers.py +40 -9
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/AGENTS.md +4 -13
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_process_manager.py +9 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_scheduled_run_poller.py +1 -2
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_starter_bundle.py +0 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_starter_direct.py +0 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_starter_engine.py +2 -3
- prefect_client-3.9.0/src/prefect/runner/runner.py +918 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/server.py +1 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runtime/flow_run.py +7 -2
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/concurrency_limits_v2.py +3 -3
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/flow_runs.py +1 -2
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/ui/flow_runs.py +1 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/ui/flows.py +2 -2
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/ui/task_runs.py +4 -2
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/_types.py +1 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/deployments.py +11 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/task_engine.py +11 -8
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/tasks.py +19 -8
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/types/__init__.py +22 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/types/_datetime.py +80 -28
- prefect_client-3.9.0/src/prefect/types/_datetime_deprecations.py +332 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/callables/__init__.py +12 -3
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/collections.py +1 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/pydantic.py +2 -1
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/AGENTS.md +2 -2
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/process.py +16 -25
- prefect_client-3.8.9.dev6/src/prefect/_build_info.py +0 -5
- prefect_client-3.8.9.dev6/src/prefect/runner/runner.py +0 -1891
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/.gitignore +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/LICENSE +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/README.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/hatch_build.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/__main__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/_observation_delivery.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/attempt_control.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/schemas/_registry.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/server_maintenance.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/agent.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/automations.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/bundles/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/bundles/_zip_builder.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/base.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/context.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/engine.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/related.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/main.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/plugins.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/py.typed +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/results.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_uv_command.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_workspace_hook_runner.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_workspace_runtime.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_workspace_runtime_bootstrap.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/_workspace_supervisor.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/schedules.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/serializers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/_ui_static.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/server/worker_channel.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/states.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/transactions.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/types/names.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/templating/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/variables.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/_worker_channel/_sync.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.9.0
|
|
4
4
|
Summary: Workflow orchestration and management.
|
|
5
5
|
Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
|
|
6
6
|
Project-URL: Documentation, https://docs.prefect.io
|
|
@@ -18,17 +18,19 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.13
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
21
22
|
Classifier: Topic :: Software Development :: Libraries
|
|
22
|
-
Requires-Python: <3.
|
|
23
|
+
Requires-Python: <3.16,>=3.11
|
|
23
24
|
Requires-Dist: amplitude-analytics<2.0.0,>=1.2.1
|
|
24
25
|
Requires-Dist: anyio<5.0.0,>=4.4.0
|
|
25
26
|
Requires-Dist: asgi-lifespan<3.0,>=1.0
|
|
26
27
|
Requires-Dist: cachetools<8.0,>=5.3
|
|
28
|
+
Requires-Dist: certifi>=2026.10.19
|
|
27
29
|
Requires-Dist: cloudpickle<4.0,>=2.0
|
|
28
30
|
Requires-Dist: coolname<6.0.0,>=1.0.4
|
|
29
31
|
Requires-Dist: dateparser<2.0.0,>=1.1.1
|
|
30
32
|
Requires-Dist: exceptiongroup>=1.0.0
|
|
31
|
-
Requires-Dist: fastapi<
|
|
33
|
+
Requires-Dist: fastapi<0.151,>=0.139.0
|
|
32
34
|
Requires-Dist: fsspec>=2022.5.0
|
|
33
35
|
Requires-Dist: graphviz>=0.20.1
|
|
34
36
|
Requires-Dist: griffe<3.0.0,>=0.49.0
|
|
@@ -53,15 +55,14 @@ Requires-Dist: pytz<2027,>=2021.1
|
|
|
53
55
|
Requires-Dist: pyyaml<7.0.0,>=5.4.1
|
|
54
56
|
Requires-Dist: rfc3339-validator<0.2.0,>=0.1.4
|
|
55
57
|
Requires-Dist: rich<16.0,>=11.0
|
|
56
|
-
Requires-Dist: ruamel-yaml
|
|
57
|
-
Requires-Dist: ruamel-yaml>=0.17.0
|
|
58
|
+
Requires-Dist: ruamel-yaml!=0.19.0,>=0.17.0
|
|
58
59
|
Requires-Dist: sniffio<2.0.0,>=1.3.0
|
|
59
60
|
Requires-Dist: starlette>=1.0.1
|
|
60
61
|
Requires-Dist: toml>=0.10.0
|
|
61
62
|
Requires-Dist: typing-extensions<5.0.0,>=4.10.0
|
|
62
63
|
Requires-Dist: uvicorn!=0.29.0,>=0.14.0
|
|
63
64
|
Requires-Dist: websockets<17.0,>=15.0.1
|
|
64
|
-
Requires-Dist: whenever<0.11.0,>=0.
|
|
65
|
+
Requires-Dist: whenever<0.11.0,>=0.10.5; python_version >= '3.13'
|
|
65
66
|
Provides-Extra: notifications
|
|
66
67
|
Requires-Dist: apprise<2.0.0,>=1.13.0; extra == 'notifications'
|
|
67
68
|
Description-Content-Type: text/markdown
|
|
@@ -7,7 +7,7 @@ name = "prefect-client"
|
|
|
7
7
|
dynamic = ["version"]
|
|
8
8
|
description = "Workflow orchestration and management."
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.11,<3.
|
|
10
|
+
requires-python = ">=3.11,<3.16"
|
|
11
11
|
license = { text = "Apache-2.0" }
|
|
12
12
|
authors = [{ name = "Prefect Technologies, Inc.", email = "help@prefect.io" }]
|
|
13
13
|
classifiers = [
|
|
@@ -20,6 +20,7 @@ classifiers = [
|
|
|
20
20
|
"Programming Language :: Python :: 3.12",
|
|
21
21
|
"Programming Language :: Python :: 3.13",
|
|
22
22
|
"Programming Language :: Python :: 3.14",
|
|
23
|
+
"Programming Language :: Python :: 3.15",
|
|
23
24
|
"Topic :: Software Development :: Libraries",
|
|
24
25
|
]
|
|
25
26
|
dependencies = [
|
|
@@ -28,11 +29,13 @@ dependencies = [
|
|
|
28
29
|
"anyio>=4.4.0,<5.0.0",
|
|
29
30
|
"asgi-lifespan>=1.0,<3.0",
|
|
30
31
|
"cachetools>=5.3,<8.0",
|
|
32
|
+
"certifi>=2026.10.19",
|
|
31
33
|
"cloudpickle>=2.0,<4.0",
|
|
32
34
|
"coolname>=1.0.4,<6.0.0",
|
|
33
35
|
"dateparser>=1.1.1,<2.0.0",
|
|
34
36
|
"exceptiongroup>=1.0.0",
|
|
35
|
-
|
|
37
|
+
# 0.151 rejects an explicit null for a body param with a default, and released clients send null
|
|
38
|
+
"fastapi>=0.139.0,<0.151",
|
|
36
39
|
"fsspec>=2022.5.0",
|
|
37
40
|
"graphviz>=0.20.1",
|
|
38
41
|
"griffe>=0.49.0,<3.0.0",
|
|
@@ -57,15 +60,14 @@ dependencies = [
|
|
|
57
60
|
"pyyaml>=5.4.1,<7.0.0",
|
|
58
61
|
"rfc3339-validator>=0.1.4,<0.2.0",
|
|
59
62
|
"rich>=11.0,<16.0",
|
|
60
|
-
"ruamel.yaml>=0.17.0",
|
|
61
|
-
"ruamel.yaml.clib>=0.2.8; platform_python_implementation == 'CPython'",
|
|
63
|
+
"ruamel.yaml>=0.17.0,!=0.19.0",
|
|
62
64
|
"sniffio>=1.3.0,<2.0.0",
|
|
63
65
|
"starlette>=1.0.1",
|
|
64
66
|
"toml>=0.10.0",
|
|
65
67
|
"typing_extensions>=4.10.0,<5.0.0",
|
|
66
68
|
"uvicorn>=0.14.0,!=0.29.0",
|
|
67
69
|
"websockets>=15.0.1,<17.0",
|
|
68
|
-
"whenever>=0.
|
|
70
|
+
"whenever>=0.10.5,<0.11.0; python_version>='3.13'",
|
|
69
71
|
]
|
|
70
72
|
[project.urls]
|
|
71
73
|
Changelog = "https://github.com/PrefectHQ/prefect/releases"
|
{prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/compatibility/deprecated.py
RENAMED
|
@@ -21,7 +21,7 @@ from typing import TYPE_CHECKING, Any, Callable, Optional, Union
|
|
|
21
21
|
from pydantic import BaseModel
|
|
22
22
|
from typing_extensions import ParamSpec, TypeAlias, TypeVar
|
|
23
23
|
|
|
24
|
-
from prefect.types._datetime import now
|
|
24
|
+
from prefect.types._datetime import _pendulum_call, now
|
|
25
25
|
from prefect.utilities.callables import get_call_parameters
|
|
26
26
|
from prefect.utilities.importtools import (
|
|
27
27
|
AliasedModuleDefinition,
|
|
@@ -96,14 +96,16 @@ def generate_deprecation_message(
|
|
|
96
96
|
if hasattr(PlainDateTime, "to_stdlib")
|
|
97
97
|
else PlainDateTime.from_py_datetime
|
|
98
98
|
)
|
|
99
|
-
|
|
99
|
+
# PlainDateTime requires a naive datetime; the warning only renders
|
|
100
|
+
# month and year, so any tzinfo on start_date is dropped.
|
|
101
|
+
_dt = _pdt_from_dt(start_date.replace(tzinfo=None)).add(months=6)
|
|
100
102
|
end_date = (
|
|
101
103
|
_dt.to_stdlib() if hasattr(_dt, "to_stdlib") else _dt.py_datetime()
|
|
102
104
|
)
|
|
103
105
|
else:
|
|
104
106
|
import pendulum
|
|
105
107
|
|
|
106
|
-
end_date = pendulum.instance(start_date)
|
|
108
|
+
end_date = _pendulum_call(pendulum.instance(start_date), "add", months=6)
|
|
107
109
|
|
|
108
110
|
if when:
|
|
109
111
|
when = " when " + when
|
{prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/_internal/concurrency/services.py
RENAMED
|
@@ -27,6 +27,11 @@ R = TypeVar("R", infer_variance=True)
|
|
|
27
27
|
# Track all active services for fork handling
|
|
28
28
|
_active_services: weakref.WeakSet[_QueueServiceBase[Any]] = weakref.WeakSet()
|
|
29
29
|
|
|
30
|
+
# Services take items that are already queued without leaving the event loop.
|
|
31
|
+
# Other services share the global loop, so a service working through a backlog
|
|
32
|
+
# yields to them after this many items in a row.
|
|
33
|
+
_READY_ITEMS_PER_YIELD = 256
|
|
34
|
+
|
|
30
35
|
|
|
31
36
|
def _reset_services_after_fork():
|
|
32
37
|
"""
|
|
@@ -73,6 +78,7 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
|
|
|
73
78
|
self._started: bool = False
|
|
74
79
|
self._key = hash((self.__class__, *args))
|
|
75
80
|
self._lock = threading.Lock()
|
|
81
|
+
self._ready_items_since_yield = 0
|
|
76
82
|
self._queue_get_thread = WorkerThread(
|
|
77
83
|
# TODO: This thread should not need to be a daemon but when it is not, it
|
|
78
84
|
# can prevent the interpreter from exiting.
|
|
@@ -184,14 +190,37 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
|
|
|
184
190
|
assert self._done_event is not None
|
|
185
191
|
self._done_event.set()
|
|
186
192
|
|
|
193
|
+
async def _get_item(self, timeout: Optional[float] = None) -> Optional[T]:
|
|
194
|
+
"""
|
|
195
|
+
Take the next item from the queue.
|
|
196
|
+
|
|
197
|
+
An item that is already queued is taken on the event loop. Only an empty
|
|
198
|
+
queue waits on the queue thread, which raises `queue.Empty` if `timeout`
|
|
199
|
+
passes first.
|
|
200
|
+
"""
|
|
201
|
+
if self._ready_items_since_yield >= _READY_ITEMS_PER_YIELD:
|
|
202
|
+
self._ready_items_since_yield = 0
|
|
203
|
+
await asyncio.sleep(0)
|
|
204
|
+
|
|
205
|
+
try:
|
|
206
|
+
item = self._queue.get_nowait()
|
|
207
|
+
except queue.Empty:
|
|
208
|
+
pass
|
|
209
|
+
else:
|
|
210
|
+
self._ready_items_since_yield += 1
|
|
211
|
+
return item
|
|
212
|
+
|
|
213
|
+
self._ready_items_since_yield = 0
|
|
214
|
+
return await self._queue_get_thread.submit(
|
|
215
|
+
create_call(self._queue.get, timeout=timeout)
|
|
216
|
+
).aresult()
|
|
217
|
+
|
|
187
218
|
async def _main_loop(self) -> None:
|
|
188
219
|
last_log_time = 0
|
|
189
220
|
log_interval = 4 # log every 4 seconds
|
|
190
221
|
|
|
191
222
|
while True:
|
|
192
|
-
item: Optional[T] = await self.
|
|
193
|
-
create_call(self._queue.get)
|
|
194
|
-
).aresult()
|
|
223
|
+
item: Optional[T] = await self._get_item()
|
|
195
224
|
|
|
196
225
|
if self._stopped:
|
|
197
226
|
current_time = asyncio.get_event_loop().time()
|
|
@@ -500,9 +529,7 @@ class BatchedQueueService(QueueService[T]):
|
|
|
500
529
|
deadline = get_deadline(self.min_interval)
|
|
501
530
|
while batch_size < self.max_batch_size:
|
|
502
531
|
try:
|
|
503
|
-
item = await self.
|
|
504
|
-
create_call(self._queue.get, timeout=get_timeout(deadline))
|
|
505
|
-
).aresult()
|
|
532
|
+
item = await self._get_item(timeout=get_timeout(deadline))
|
|
506
533
|
|
|
507
534
|
if item is None:
|
|
508
535
|
done = True
|
|
@@ -35,6 +35,8 @@ import importlib
|
|
|
35
35
|
import os
|
|
36
36
|
import sys
|
|
37
37
|
import tempfile
|
|
38
|
+
import warnings
|
|
39
|
+
from contextlib import suppress
|
|
38
40
|
from datetime import datetime, timedelta
|
|
39
41
|
from pathlib import Path
|
|
40
42
|
from typing import (
|
|
@@ -103,6 +105,7 @@ from prefect.schedules import Schedule
|
|
|
103
105
|
from prefect.settings import (
|
|
104
106
|
PREFECT_DEPLOYMENTS_DEFAULT_WORK_POOL_NAME,
|
|
105
107
|
PREFECT_UI_URL,
|
|
108
|
+
get_current_settings,
|
|
106
109
|
)
|
|
107
110
|
from prefect.types import ListOfNonEmptyStrings
|
|
108
111
|
from prefect.types.entrypoint import EntrypointType
|
|
@@ -125,6 +128,25 @@ if TYPE_CHECKING:
|
|
|
125
128
|
|
|
126
129
|
__all__ = ["RunnerDeployment"]
|
|
127
130
|
|
|
131
|
+
|
|
132
|
+
def _should_clear_empty_schedules() -> bool:
|
|
133
|
+
if get_current_settings().deployments.clear_schedules_on_empty:
|
|
134
|
+
return True
|
|
135
|
+
|
|
136
|
+
warnings.warn(
|
|
137
|
+
"Preserving existing schedules when an empty schedules list is provided "
|
|
138
|
+
"on redeployment is deprecated. A future release will clear schedules "
|
|
139
|
+
"by default after at least six months or three minor releases, whichever "
|
|
140
|
+
"is longer. The opt-in setting and this warning will then be removed. "
|
|
141
|
+
"Set PREFECT_DEPLOYMENTS_CLEAR_SCHEDULES_ON_EMPTY=true to opt in now. "
|
|
142
|
+
"To preserve existing schedules, omit schedules or use schedules=None "
|
|
143
|
+
"(schedules: null in prefect.yaml).",
|
|
144
|
+
FutureWarning,
|
|
145
|
+
stacklevel=3,
|
|
146
|
+
)
|
|
147
|
+
return False
|
|
148
|
+
|
|
149
|
+
|
|
128
150
|
_DEPLOYMENT_PARAMETER_SERIALIZER = TypeAdapter(
|
|
129
151
|
dict[str, Any],
|
|
130
152
|
config=ConfigDict(ser_json_timedelta="float"),
|
|
@@ -617,15 +639,21 @@ class RunnerDeployment(BaseModel):
|
|
|
617
639
|
deployment_id: UUID,
|
|
618
640
|
client: PrefectClient,
|
|
619
641
|
version_info: VersionInfo | None,
|
|
642
|
+
*,
|
|
643
|
+
preserve_schedules: bool = False,
|
|
620
644
|
):
|
|
621
645
|
parameter_openapi_schema = self._parameter_openapi_schema.model_dump(
|
|
622
646
|
exclude_unset=True
|
|
623
647
|
)
|
|
624
648
|
|
|
649
|
+
exclude = {"storage", "name", "flow_name", "triggers", "version_type"}
|
|
650
|
+
if preserve_schedules:
|
|
651
|
+
# Explicitly set schedules survive exclude_unset, even when empty.
|
|
652
|
+
exclude.add("schedules")
|
|
625
653
|
update_payload = self.model_dump(
|
|
626
654
|
mode="json",
|
|
627
655
|
exclude_unset=True,
|
|
628
|
-
exclude=
|
|
656
|
+
exclude=exclude,
|
|
629
657
|
)
|
|
630
658
|
|
|
631
659
|
if self.storage:
|
|
@@ -636,7 +664,7 @@ class RunnerDeployment(BaseModel):
|
|
|
636
664
|
else:
|
|
637
665
|
update_payload["pull_steps"] = None
|
|
638
666
|
|
|
639
|
-
if self.schedules:
|
|
667
|
+
if self.schedules and not preserve_schedules:
|
|
640
668
|
update_payload["schedules"] = [
|
|
641
669
|
schedule.model_dump(mode="json", exclude_unset=True)
|
|
642
670
|
for schedule in self._schedules_with_serialized_block_parameters() or []
|
|
@@ -669,15 +697,21 @@ class RunnerDeployment(BaseModel):
|
|
|
669
697
|
deployment_id: UUID,
|
|
670
698
|
client: SyncPrefectClient,
|
|
671
699
|
version_info: VersionInfo | None,
|
|
700
|
+
*,
|
|
701
|
+
preserve_schedules: bool = False,
|
|
672
702
|
):
|
|
673
703
|
parameter_openapi_schema = self._parameter_openapi_schema.model_dump(
|
|
674
704
|
exclude_unset=True
|
|
675
705
|
)
|
|
676
706
|
|
|
707
|
+
exclude = {"storage", "name", "flow_name", "triggers", "version_type"}
|
|
708
|
+
if preserve_schedules:
|
|
709
|
+
# Keep schedule exclusion in sync with _update above.
|
|
710
|
+
exclude.add("schedules")
|
|
677
711
|
update_payload = self.model_dump(
|
|
678
712
|
mode="json",
|
|
679
713
|
exclude_unset=True,
|
|
680
|
-
exclude=
|
|
714
|
+
exclude=exclude,
|
|
681
715
|
)
|
|
682
716
|
|
|
683
717
|
if self.storage:
|
|
@@ -688,7 +722,7 @@ class RunnerDeployment(BaseModel):
|
|
|
688
722
|
else:
|
|
689
723
|
update_payload["pull_steps"] = None
|
|
690
724
|
|
|
691
|
-
if self.schedules:
|
|
725
|
+
if self.schedules and not preserve_schedules:
|
|
692
726
|
update_payload["schedules"] = [
|
|
693
727
|
schedule.model_dump(mode="json", exclude_unset=True)
|
|
694
728
|
for schedule in self._schedules_with_serialized_block_parameters() or []
|
|
@@ -756,6 +790,9 @@ class RunnerDeployment(BaseModel):
|
|
|
756
790
|
Registers this deployment with the API and returns the deployment's ID.
|
|
757
791
|
|
|
758
792
|
Args:
|
|
793
|
+
schedules: Override the schedules for this deployment. On redeployment,
|
|
794
|
+
an empty list preserves schedules by default and emits a warning.
|
|
795
|
+
Set `PREFECT_DEPLOYMENTS_CLEAR_SCHEDULES_ON_EMPTY=true` to clear them.
|
|
759
796
|
work_pool_name: The name of the work pool to use for this
|
|
760
797
|
deployment.
|
|
761
798
|
image: The registry, name, and tag of the Docker image to
|
|
@@ -784,11 +821,29 @@ class RunnerDeployment(BaseModel):
|
|
|
784
821
|
self.job_variables["image"] = image
|
|
785
822
|
if work_pool_name:
|
|
786
823
|
self.work_pool_name = work_pool_name
|
|
787
|
-
|
|
824
|
+
clear_schedules = schedules == [] and _should_clear_empty_schedules()
|
|
825
|
+
if schedules or clear_schedules:
|
|
788
826
|
self.schedules = [
|
|
789
|
-
DeploymentScheduleUpdate(**schedule)
|
|
827
|
+
DeploymentScheduleUpdate(**schedule)
|
|
828
|
+
for schedule in schedules or []
|
|
790
829
|
]
|
|
791
|
-
|
|
830
|
+
await self._update(
|
|
831
|
+
deployment.id,
|
|
832
|
+
client,
|
|
833
|
+
version_info,
|
|
834
|
+
preserve_schedules=schedules == [] and not clear_schedules,
|
|
835
|
+
)
|
|
836
|
+
# The update API preserves empty-list updates when all existing
|
|
837
|
+
# schedules have slugs. Clear those explicitly after a successful update.
|
|
838
|
+
if clear_schedules and all(
|
|
839
|
+
schedule.slug is not None for schedule in deployment.schedules
|
|
840
|
+
):
|
|
841
|
+
for schedule in deployment.schedules:
|
|
842
|
+
with suppress(ObjectNotFound):
|
|
843
|
+
await client.delete_deployment_schedule(
|
|
844
|
+
deployment.id, schedule.id
|
|
845
|
+
)
|
|
846
|
+
return deployment.id
|
|
792
847
|
|
|
793
848
|
@async_dispatch(aapply)
|
|
794
849
|
def apply(
|
|
@@ -802,6 +857,9 @@ class RunnerDeployment(BaseModel):
|
|
|
802
857
|
Registers this deployment with the API and returns the deployment's ID.
|
|
803
858
|
|
|
804
859
|
Args:
|
|
860
|
+
schedules: Override the schedules for this deployment. On redeployment,
|
|
861
|
+
an empty list preserves schedules by default and emits a warning.
|
|
862
|
+
Set `PREFECT_DEPLOYMENTS_CLEAR_SCHEDULES_ON_EMPTY=true` to clear them.
|
|
805
863
|
work_pool_name: The name of the work pool to use for this
|
|
806
864
|
deployment.
|
|
807
865
|
image: The registry, name, and tag of the Docker image to
|
|
@@ -829,11 +887,28 @@ class RunnerDeployment(BaseModel):
|
|
|
829
887
|
self.job_variables["image"] = image
|
|
830
888
|
if work_pool_name:
|
|
831
889
|
self.work_pool_name = work_pool_name
|
|
832
|
-
|
|
890
|
+
clear_schedules = schedules == [] and _should_clear_empty_schedules()
|
|
891
|
+
if schedules or clear_schedules:
|
|
833
892
|
self.schedules = [
|
|
834
|
-
DeploymentScheduleUpdate(**schedule)
|
|
893
|
+
DeploymentScheduleUpdate(**schedule)
|
|
894
|
+
for schedule in schedules or []
|
|
835
895
|
]
|
|
836
|
-
|
|
896
|
+
self._update_sync(
|
|
897
|
+
deployment.id,
|
|
898
|
+
client,
|
|
899
|
+
version_info,
|
|
900
|
+
preserve_schedules=schedules == [] and not clear_schedules,
|
|
901
|
+
)
|
|
902
|
+
# Keep explicit clearing in sync with aapply above.
|
|
903
|
+
if clear_schedules and all(
|
|
904
|
+
schedule.slug is not None for schedule in deployment.schedules
|
|
905
|
+
):
|
|
906
|
+
for schedule in deployment.schedules:
|
|
907
|
+
with suppress(ObjectNotFound):
|
|
908
|
+
client.delete_deployment_schedule(
|
|
909
|
+
deployment.id, schedule.id
|
|
910
|
+
)
|
|
911
|
+
return deployment.id
|
|
837
912
|
|
|
838
913
|
async def _create_slas(self, deployment_id: UUID, client: PrefectClient):
|
|
839
914
|
if not isinstance(self._sla, list):
|
|
@@ -42,6 +42,7 @@ from .actions import (
|
|
|
42
42
|
PauseAutomation,
|
|
43
43
|
ResumeAutomation,
|
|
44
44
|
DeclareIncident,
|
|
45
|
+
UnknownAction,
|
|
45
46
|
)
|
|
46
47
|
from .clients import get_events_client, get_events_subscriber
|
|
47
48
|
from .subscribers import FlowRunSubscriber
|
|
@@ -90,6 +91,7 @@ __all__ = [
|
|
|
90
91
|
"PauseAutomation",
|
|
91
92
|
"ResumeAutomation",
|
|
92
93
|
"DeclareIncident",
|
|
94
|
+
"UnknownAction",
|
|
93
95
|
"emit_event",
|
|
94
96
|
"get_events_client",
|
|
95
97
|
"get_events_subscriber",
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import abc
|
|
2
2
|
from datetime import timedelta
|
|
3
|
-
from typing import Any, Dict, Optional, Union
|
|
3
|
+
from typing import Annotated, Any, ClassVar, Dict, Optional, Union, get_args
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
|
-
from pydantic import
|
|
6
|
+
from pydantic import (
|
|
7
|
+
ConfigDict,
|
|
8
|
+
Discriminator,
|
|
9
|
+
Field,
|
|
10
|
+
Tag,
|
|
11
|
+
field_validator,
|
|
12
|
+
model_validator,
|
|
13
|
+
)
|
|
7
14
|
from typing_extensions import Literal, Self, TypeAlias
|
|
8
15
|
|
|
9
16
|
from prefect._internal.schemas.bases import PrefectBaseModel
|
|
@@ -314,3 +321,56 @@ ActionTypes: TypeAlias = Union[
|
|
|
314
321
|
# Prefect Cloud only
|
|
315
322
|
DeclareIncident,
|
|
316
323
|
]
|
|
324
|
+
|
|
325
|
+
_KNOWN_ACTION_TYPES: frozenset[str] = frozenset(
|
|
326
|
+
action.model_fields["type"].default for action in get_args(ActionTypes)
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
class UnknownAction(Action):
|
|
331
|
+
"""An action whose type this version of Prefect does not recognize.
|
|
332
|
+
|
|
333
|
+
Prefect Cloud can add action types before a client release knows about
|
|
334
|
+
them. Reading an automation that uses one of these types returns this
|
|
335
|
+
model instead of failing. The model keeps every field of the action, so
|
|
336
|
+
updating the automation sends the action back unchanged.
|
|
337
|
+
"""
|
|
338
|
+
|
|
339
|
+
model_config: ClassVar[ConfigDict] = ConfigDict(extra="allow")
|
|
340
|
+
|
|
341
|
+
type: str = Field(
|
|
342
|
+
json_schema_extra={"not": {"enum": sorted(_KNOWN_ACTION_TYPES)}},
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
@field_validator("type")
|
|
346
|
+
@classmethod
|
|
347
|
+
def _type_is_not_known(cls, value: str) -> str:
|
|
348
|
+
if value in _KNOWN_ACTION_TYPES:
|
|
349
|
+
raise ValueError(
|
|
350
|
+
f"{value!r} is a known action type and cannot be an UnknownAction"
|
|
351
|
+
)
|
|
352
|
+
return value
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def _action_discriminator(value: Any) -> str:
|
|
356
|
+
"""Sends an action with an unrecognized `type` to `UnknownAction` and every
|
|
357
|
+
other action, including one with no `type`, to `ActionTypes`."""
|
|
358
|
+
if isinstance(value, UnknownAction):
|
|
359
|
+
return "unknown"
|
|
360
|
+
action_type = (
|
|
361
|
+
value.get("type") if isinstance(value, dict) else getattr(value, "type", None)
|
|
362
|
+
)
|
|
363
|
+
if isinstance(action_type, str) and action_type not in _KNOWN_ACTION_TYPES:
|
|
364
|
+
return "unknown"
|
|
365
|
+
return "known"
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
ActionTypesOrUnknown: TypeAlias = Annotated[
|
|
369
|
+
Union[
|
|
370
|
+
Annotated[ActionTypes, Tag("known")],
|
|
371
|
+
Annotated[UnknownAction, Tag("unknown")],
|
|
372
|
+
],
|
|
373
|
+
Discriminator(_action_discriminator),
|
|
374
|
+
]
|
|
375
|
+
"""The action types an automation read from the API may contain: any of
|
|
376
|
+
`ActionTypes`, or an `UnknownAction` for a type this version does not know"""
|
{prefect_client-3.8.9.dev6 → prefect_client-3.9.0}/src/prefect/events/schemas/automations.py
RENAMED
|
@@ -22,17 +22,22 @@ from pydantic import (
|
|
|
22
22
|
Field,
|
|
23
23
|
PrivateAttr,
|
|
24
24
|
Tag,
|
|
25
|
+
TypeAdapter,
|
|
26
|
+
ValidationError,
|
|
25
27
|
field_validator,
|
|
26
28
|
model_validator,
|
|
27
29
|
)
|
|
28
30
|
from typing_extensions import Self, TypeAlias
|
|
29
31
|
|
|
30
32
|
from prefect._internal.schemas.bases import PrefectBaseModel
|
|
31
|
-
from prefect.events.actions import ActionTypes, RunDeployment
|
|
33
|
+
from prefect.events.actions import ActionTypes, ActionTypesOrUnknown, RunDeployment
|
|
34
|
+
from prefect.types import DurationOrSecondsTimeDelta
|
|
32
35
|
from prefect.utilities.collections import AutoEnum
|
|
33
36
|
|
|
34
37
|
from .events import ResourceSpecification
|
|
35
38
|
|
|
39
|
+
_timedelta_adapter: TypeAdapter[timedelta] = TypeAdapter(timedelta)
|
|
40
|
+
|
|
36
41
|
# Dict form accepted by ResourceSpecification via Pydantic coercion
|
|
37
42
|
ResourceSpecificationDict: TypeAlias = Dict[str, Union[str, List[str]]]
|
|
38
43
|
|
|
@@ -96,7 +101,7 @@ class Trigger(PrefectBaseModel, abc.ABC, extra="ignore"): # type: ignore[call-a
|
|
|
96
101
|
description=getattr(self, "description", ""),
|
|
97
102
|
enabled=getattr(self, "enabled", True),
|
|
98
103
|
trigger=trigger,
|
|
99
|
-
actions=self.actions(),
|
|
104
|
+
actions=list(self.actions()),
|
|
100
105
|
owner_resource=self.owner_resource(),
|
|
101
106
|
)
|
|
102
107
|
|
|
@@ -196,7 +201,7 @@ class EventTrigger(ResourceTrigger):
|
|
|
196
201
|
"triggers)"
|
|
197
202
|
),
|
|
198
203
|
)
|
|
199
|
-
within:
|
|
204
|
+
within: DurationOrSecondsTimeDelta = Field(
|
|
200
205
|
default=timedelta(seconds=0),
|
|
201
206
|
ge=timedelta(seconds=0),
|
|
202
207
|
description=(
|
|
@@ -220,8 +225,15 @@ class EventTrigger(ResourceTrigger):
|
|
|
220
225
|
posture: Optional[Posture] = data.get("posture")
|
|
221
226
|
within: Optional[timedelta] = data.get("within")
|
|
222
227
|
|
|
223
|
-
if isinstance(within,
|
|
224
|
-
|
|
228
|
+
if within is not None and not isinstance(within, timedelta):
|
|
229
|
+
# Parse the raw value the same way the field would, so that every
|
|
230
|
+
# form pydantic accepts for a timedelta reaches the comparisons
|
|
231
|
+
# below as a timedelta.
|
|
232
|
+
try:
|
|
233
|
+
within = _timedelta_adapter.validate_python(within)
|
|
234
|
+
except ValidationError:
|
|
235
|
+
# The field validation reports the unparsable value.
|
|
236
|
+
return data
|
|
225
237
|
|
|
226
238
|
if posture == Posture.Proactive:
|
|
227
239
|
if not within or within == timedelta(0):
|
|
@@ -294,7 +306,7 @@ class MetricTriggerQuery(PrefectBaseModel):
|
|
|
294
306
|
"the query result against the threshold value."
|
|
295
307
|
),
|
|
296
308
|
)
|
|
297
|
-
range:
|
|
309
|
+
range: DurationOrSecondsTimeDelta = Field(
|
|
298
310
|
timedelta(seconds=300), # defaults to 5 minutes
|
|
299
311
|
description=(
|
|
300
312
|
"The lookback duration (seconds) for a metric query. This duration is "
|
|
@@ -302,7 +314,7 @@ class MetricTriggerQuery(PrefectBaseModel):
|
|
|
302
314
|
"The minimum value is 300 seconds (5 minutes)."
|
|
303
315
|
),
|
|
304
316
|
)
|
|
305
|
-
firing_for:
|
|
317
|
+
firing_for: DurationOrSecondsTimeDelta = Field(
|
|
306
318
|
timedelta(seconds=300), # defaults to 5 minutes
|
|
307
319
|
description=(
|
|
308
320
|
"The duration (seconds) for which the metric query must breach "
|
|
@@ -356,7 +368,7 @@ class CompositeTrigger(Trigger, abc.ABC):
|
|
|
356
368
|
|
|
357
369
|
type: Literal["compound", "sequence"]
|
|
358
370
|
triggers: List["TriggerTypes"]
|
|
359
|
-
within: Optional[
|
|
371
|
+
within: Optional[DurationOrSecondsTimeDelta] = Field(
|
|
360
372
|
None,
|
|
361
373
|
description=(
|
|
362
374
|
"The time period over which the events must occur. For Reactive triggers, "
|
|
@@ -486,17 +498,17 @@ class AutomationCore(PrefectBaseModel, extra="ignore"): # type: ignore[call-arg
|
|
|
486
498
|
),
|
|
487
499
|
)
|
|
488
500
|
|
|
489
|
-
actions: List[
|
|
501
|
+
actions: List[ActionTypesOrUnknown] = Field(
|
|
490
502
|
default=...,
|
|
491
503
|
description="The actions to perform when this Automation triggers",
|
|
492
504
|
)
|
|
493
505
|
|
|
494
|
-
actions_on_trigger: List[
|
|
506
|
+
actions_on_trigger: List[ActionTypesOrUnknown] = Field(
|
|
495
507
|
default_factory=list,
|
|
496
508
|
description="The actions to perform when an Automation goes into a triggered state",
|
|
497
509
|
)
|
|
498
510
|
|
|
499
|
-
actions_on_resolve: List[
|
|
511
|
+
actions_on_resolve: List[ActionTypesOrUnknown] = Field(
|
|
500
512
|
default_factory=list,
|
|
501
513
|
description="The actions to perform when an Automation goes into a resolving state",
|
|
502
514
|
)
|
|
@@ -273,7 +273,7 @@ async def apause_flow_run(
|
|
|
273
273
|
if wait_for_input:
|
|
274
274
|
# The flow run wanted input, so we need to load it and return it
|
|
275
275
|
# to the user.
|
|
276
|
-
await wait_for_input.aload(run_input_keyset)
|
|
276
|
+
return await wait_for_input.aload(run_input_keyset)
|
|
277
277
|
|
|
278
278
|
return
|
|
279
279
|
|
|
@@ -578,11 +578,11 @@ class Flow(Generic[P, R]):
|
|
|
578
578
|
else self.cache_result_in_memory
|
|
579
579
|
),
|
|
580
580
|
log_prints=log_prints if log_prints is not NotSet else self.log_prints,
|
|
581
|
-
on_completion=on_completion or self.on_completion_hooks,
|
|
582
|
-
on_failure=on_failure or self.on_failure_hooks,
|
|
583
|
-
on_cancellation=on_cancellation or self.on_cancellation_hooks,
|
|
584
|
-
on_crashed=on_crashed or self.on_crashed_hooks,
|
|
585
|
-
on_running=on_running or self.on_running_hooks,
|
|
581
|
+
on_completion=on_completion or copy(self.on_completion_hooks),
|
|
582
|
+
on_failure=on_failure or copy(self.on_failure_hooks),
|
|
583
|
+
on_cancellation=on_cancellation or copy(self.on_cancellation_hooks),
|
|
584
|
+
on_crashed=on_crashed or copy(self.on_crashed_hooks),
|
|
585
|
+
on_running=on_running or copy(self.on_running_hooks),
|
|
586
586
|
)
|
|
587
587
|
new_flow._storage = self._storage
|
|
588
588
|
new_flow._entrypoint = self._entrypoint
|
|
@@ -584,7 +584,7 @@ class PrefectFutureList(list[PrefectFuture[R]], Iterator[PrefectFuture[R]]):
|
|
|
584
584
|
timeout_message = (
|
|
585
585
|
f"Timed out waiting for all futures to complete within {timeout} seconds"
|
|
586
586
|
)
|
|
587
|
-
deadline = time.monotonic() + timeout if timeout
|
|
587
|
+
deadline = time.monotonic() + timeout if timeout else None
|
|
588
588
|
|
|
589
589
|
try:
|
|
590
590
|
# `as_completed` de-duplicates internally; each unique future is
|
|
@@ -638,7 +638,7 @@ def as_completed(
|
|
|
638
638
|
pending = unique_futures
|
|
639
639
|
deadline: float | None = None
|
|
640
640
|
try:
|
|
641
|
-
with timeout_context(timeout, timeout_exc_type=_WaitTimeoutError):
|
|
641
|
+
with timeout_context(timeout or None, timeout_exc_type=_WaitTimeoutError):
|
|
642
642
|
done = {f for f in unique_futures if f._final_state} # type: ignore[privateUsage]
|
|
643
643
|
pending = unique_futures - done
|
|
644
644
|
yield from done
|
|
@@ -41,7 +41,8 @@ Key invariants:
|
|
|
41
41
|
|
|
42
42
|
`APILogWorker` is a **singleton per unique settings tuple** `(BATCH_SIZE, API_URL, MAX_LOG_SIZE)`. A new settings combination creates a new worker instance.
|
|
43
43
|
|
|
44
|
-
- `max_batch_size = max(BATCH_SIZE - MAX_LOG_SIZE,
|
|
44
|
+
- `max_batch_size = max(BATCH_SIZE - MAX_LOG_SIZE - 1, 1)` — a batch stops taking logs at this size, which leaves room for one more max-size log and the request body's opening bracket. Requests stay within `BATCH_SIZE` whenever `BATCH_SIZE >= MAX_LOG_SIZE + 2`; below that, each request holds one log.
|
|
45
|
+
- `APILogWorker.send()` serializes each log dict to compact JSON (orjson) right away, dropping the `__payload_size__` key that `prepare()` adds. The queue holds only those bytes, and `_handle_batch` posts them joined, without serializing again. Changes to a dict after `send()` are not sent. Process-pool workers still forward dicts through `_api_log_sink`; the parent serializes them when it calls `send()`.
|
|
45
46
|
- `APILogHandler.prepare()` truncates oversized logs with a buffer; `WorkerAPILogHandler.prepare()` raises `ValueError` instead (no truncation)
|
|
46
47
|
|
|
47
48
|
**Flush deadlock guard:** `APILogHandler.flush()` detects if called from within an event loop and avoids blocking via `from_sync.call_soon_in_new_thread()`. Do not call `flush()` synchronously from async code without this guard.
|