prefect-client 3.7.1.dev9__tar.gz → 3.7.2__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.1.dev9 → prefect_client-3.7.2}/PKG-INFO +1 -1
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/AGENTS.md +2 -1
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/__init__.py +5 -0
- prefect_client-3.7.2/src/prefect/_build_info.py +5 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/automations.py +2 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/notifications.py +18 -2
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/__init__.py +16 -1
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_zip_builder.py +32 -25
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/_leases.py +10 -2
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/__init__.py +2 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/actions.py +7 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/clients.py +1 -1
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/subscribers.py +1 -1
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/flow_engine.py +64 -44
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/handlers.py +6 -3
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/results.py +4 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_scheduled_run_poller.py +5 -10
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/runner.py +17 -19
- prefect_client-3.7.2/src/prefect/server/api/_ui_static.py +85 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/clients.py +3 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/server.py +4 -22
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/work_queues.py +18 -1
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/workers.py +366 -17
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/sources.py +7 -1
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/_datetime.py +30 -1
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/templating/__init__.py +146 -92
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/_protocol.py +4 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/_sync.py +31 -11
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/base.py +1 -3
- prefect_client-3.7.1.dev9/src/prefect/_build_info.py +0 -5
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/.gitignore +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/LICENSE +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/README.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/hatch_build.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/pyproject.toml +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/__main__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_flow_run_suspension.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/ast_utils.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/buildx.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/control_listener.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/deprecated.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/engine.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/git.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/launchers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/metrics.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/observers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/apply.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/collections.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/diagnostics.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/manager.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/spec.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/plugins/startup.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/result_records.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schema.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/states.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/version_checking.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/versioning.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/waiters.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/agent.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_file_collector.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_path_resolver.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/bundles/execute.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/base.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/schemas/worker_channel.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/context.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/engine.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/related.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/flows.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/futures.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/_filelock.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/main.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/plugins.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/py.typed +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_cancel_finalizer.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_control_channel.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_workspace_resolver.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_workspace_starter.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/schedules.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/serializers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/plugins.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/states.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/tasks.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/transactions.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/types/names.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/asyncutils/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/callables/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/callables/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/engine/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/engine/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/filesystem/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/processutils/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/processutils/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/templating/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/variables.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_cleanup.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_cleanup_handlers.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/__init__.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/_state.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/_worker_channel/_transport.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/workers/utilities.py +0 -0
|
@@ -23,13 +23,14 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
|
|
|
23
23
|
- **Engine ordering matters.** The engines apply features (retries, caching, result persistence, transactions) in a specific order. Changing the order or forgetting a feature in one engine path is the most common source of breakage.
|
|
24
24
|
- **Set run metadata before state transitions.** Any run attribute that event subscribers observe at the moment of a state transition (e.g., custom `flow_run_name`) must be persisted to the server *before* `set_state()` is called for that transition. Metadata set after the call appears stale to subscribers of that state event.
|
|
25
25
|
- **Sync and async must stay in sync.** Both `flow_engine.py` and `task_engine.py` have sync and async paths. Any behavior change must be applied to both.
|
|
26
|
-
- **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences between whenever 0.7.x–0.9.x and ≥ 0.10.0. The `_WHENEVER_NEW_API` flag (True when whenever ≥ 0.10.0) guards version-specific code. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Violations will silently break on whichever whenever version the helpers weren't written for.
|
|
26
|
+
- **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences between whenever 0.7.x–0.9.x and ≥ 0.10.0. The `_WHENEVER_NEW_API` flag (True when whenever ≥ 0.10.0) guards version-specific code. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Violations will silently break on whichever whenever version the helpers weren't written for.
|
|
27
27
|
- **Flow and task engines advance state differently.** The flow engine makes blocking API calls to the server to propose and advance states. The task engine emits `prefect.task_run.*` events (delivered via WebSockets) but advances state locally through `set_state` calls with polling/backoff — do not assume the two engines work the same way.
|
|
28
28
|
- **Flow state transitions go through the server.** The flow engine proposes states to the server, which accepts or rejects them via orchestration rules. The task engine, by contrast, manages state transitions locally via `set_state` and emits `prefect.task_run.*` events — it does not propose states to the server.
|
|
29
29
|
- **`ProcessPoolTaskRunner` requires picklable data across subprocess boundaries.** `PrefectFuture` objects are not picklable and cannot be passed to worker subprocesses. Any `wait_for` futures must be waited on in the parent process and converted to `State` objects before submission. The subprocess task engine handles `State` objects via `resolve_to_final_result`, which raises `UpstreamTaskError` for non-completed upstreams.
|
|
30
30
|
- **`ProcessPoolTaskRunner` instances may be deserialized without `__init__` running.** When a runner is pickled and restored in a subprocess, `__init__` is not called, so instance attributes set there may be absent. Access any such attribute via `getattr(self, "_attr", default)` rather than `self._attr` directly — both in the property getter and in `duplicate()`. The `subprocess_message_processor_factories` property demonstrates the required pattern.
|
|
31
31
|
- **`ThreadPoolTaskRunner` is cloudpickled when a flow run is dispatched to a subprocess.** `threading.Lock` and other non-picklable thread primitives must be dropped in `__getstate__` and rebuilt in `__setstate__`. Any new instance state added to this class must be evaluated for picklability.
|
|
32
32
|
- **Nested task submissions on a bounded `ThreadPoolTaskRunner` can deadlock.** When a worker task submits children and blocks on `.result()` while all `max_workers` threads are busy, the pool starves. `_warn_if_nested_submit_would_deadlock` detects this and emits a one-time warning — preserve this detection when changing pool management.
|
|
33
|
+
- **Result storage resolves through three tiers, potentially making an API call.** `get_default_result_storage()` checks: (1) `PREFECT_DEFAULT_RESULT_STORAGE_BLOCK` setting, (2) server-configured default block (API call to the server's Configuration store), (3) local storage path. The API call is silently suppressed on any HTTP error. Engines use `_get_default_persist_result()` — not `should_persist_result()` — at context setup time to auto-enable persistence when a server default block is configured. Do not swap `_get_default_persist_result()` back to `should_persist_result()` in engine initialization paths; `should_persist_result()` does not consult the server default.
|
|
33
34
|
- **`ResultRecordMetadata` tolerates unknown serializer types.** When loading persisted metadata, an unrecognized serializer `type` is converted to an `UnknownSerializer` placeholder rather than raising `ValidationError`. This allows inspecting result metadata when the serializer implementation is unavailable in the current environment. However, known serializer types with invalid fields still raise `ValidationError`. `UnknownSerializer.dumps()` and `UnknownSerializer.loads()` raise `RuntimeError` — the tolerance is for inspection only, not actual serialization/deserialization.
|
|
34
35
|
- **Flow-run suspension is enforced at orchestration boundaries.** Suspension is delivered via `FlowRunSuspensionRequest` and raised with `raise_if_flow_run_suspension_requested()`. When changing engines, futures, task runners, or generator execution, check before returning control to flow user code or proposing a flow state that could leave `Suspended`; keep sync/async paths aligned and avoid per-boundary API reads.
|
|
35
36
|
|
|
@@ -113,6 +113,11 @@ def _initialize_plugins() -> None:
|
|
|
113
113
|
# Re-raise SystemExit from strict mode
|
|
114
114
|
raise
|
|
115
115
|
except Exception as e:
|
|
116
|
+
from pydantic_settings.exceptions import SettingsError
|
|
117
|
+
|
|
118
|
+
if isinstance(e, SettingsError):
|
|
119
|
+
return
|
|
120
|
+
|
|
116
121
|
# Log but don't crash on plugin errors
|
|
117
122
|
try:
|
|
118
123
|
from prefect.logging import get_logger
|
|
@@ -11,6 +11,7 @@ from prefect.events.actions import (
|
|
|
11
11
|
CancelFlowRun,
|
|
12
12
|
ChangeFlowRunState,
|
|
13
13
|
DeclareIncident,
|
|
14
|
+
DeleteFlowRun,
|
|
14
15
|
DoNothing,
|
|
15
16
|
PauseAutomation,
|
|
16
17
|
PauseDeployment,
|
|
@@ -61,6 +62,7 @@ __all__ = [
|
|
|
61
62
|
"PauseDeployment",
|
|
62
63
|
"ResumeDeployment",
|
|
63
64
|
"CancelFlowRun",
|
|
65
|
+
"DeleteFlowRun",
|
|
64
66
|
"ChangeFlowRunState",
|
|
65
67
|
"PauseWorkQueue",
|
|
66
68
|
"ResumeWorkQueue",
|
|
@@ -57,7 +57,15 @@ class AbstractAppriseNotificationBlock(NotificationBlock, ABC):
|
|
|
57
57
|
body: str,
|
|
58
58
|
subject: str | None = None,
|
|
59
59
|
) -> None:
|
|
60
|
-
|
|
60
|
+
apprise_logger = logging.getLogger("apprise")
|
|
61
|
+
root_logger = logging.getLogger()
|
|
62
|
+
|
|
63
|
+
if apprise_logger.level == logging.NOTSET:
|
|
64
|
+
log_level = root_logger.getEffectiveLevel()
|
|
65
|
+
else:
|
|
66
|
+
log_level = max(apprise_logger.level, root_logger.getEffectiveLevel())
|
|
67
|
+
|
|
68
|
+
with LogEavesdropper("apprise", level=log_level) as eavesdropper:
|
|
61
69
|
result = await self._apprise_client.async_notify( # pyright: ignore[reportUnknownMemberType] incomplete type hints in apprise
|
|
62
70
|
body=body,
|
|
63
71
|
title=subject or "",
|
|
@@ -72,7 +80,15 @@ class AbstractAppriseNotificationBlock(NotificationBlock, ABC):
|
|
|
72
80
|
body: str,
|
|
73
81
|
subject: str | None = None,
|
|
74
82
|
) -> None:
|
|
75
|
-
|
|
83
|
+
apprise_logger = logging.getLogger("apprise")
|
|
84
|
+
root_logger = logging.getLogger()
|
|
85
|
+
|
|
86
|
+
if apprise_logger.level == logging.NOTSET:
|
|
87
|
+
log_level = root_logger.getEffectiveLevel()
|
|
88
|
+
else:
|
|
89
|
+
log_level = max(apprise_logger.level, root_logger.getEffectiveLevel())
|
|
90
|
+
|
|
91
|
+
with LogEavesdropper("apprise", level=log_level) as eavesdropper:
|
|
76
92
|
result = self._apprise_client.notify( # pyright: ignore[reportUnknownMemberType] incomplete type hints in apprise
|
|
77
93
|
body=body,
|
|
78
94
|
title=subject or "",
|
|
@@ -593,8 +593,23 @@ def execute_bundle_in_subprocess(
|
|
|
593
593
|
|
|
594
594
|
# Install dependencies if necessary
|
|
595
595
|
if dependencies := bundle.get("dependencies"):
|
|
596
|
+
dep_lines = [line.strip() for line in dependencies.split("\n") if line.strip()]
|
|
597
|
+
validated_deps: list[str] = []
|
|
598
|
+
for dep_line in dep_lines:
|
|
599
|
+
if dep_line.startswith("-"):
|
|
600
|
+
raise ValueError(
|
|
601
|
+
f"Invalid dependency (command-line flags are not allowed): {dep_line!r}"
|
|
602
|
+
)
|
|
603
|
+
try:
|
|
604
|
+
Requirement(dep_line)
|
|
605
|
+
except InvalidRequirement as e:
|
|
606
|
+
raise ValueError(
|
|
607
|
+
f"Invalid PEP 508 dependency specifier: {dep_line!r}"
|
|
608
|
+
) from e
|
|
609
|
+
validated_deps.append(dep_line)
|
|
610
|
+
|
|
596
611
|
subprocess.check_call(
|
|
597
|
-
[_get_uv_path(), "pip", "install", *
|
|
612
|
+
[_get_uv_path(), "pip", "install", *validated_deps],
|
|
598
613
|
# Copy the current environment to ensure we install into the correct venv
|
|
599
614
|
env=os.environ,
|
|
600
615
|
)
|
|
@@ -11,6 +11,7 @@ from __future__ import annotations
|
|
|
11
11
|
import hashlib
|
|
12
12
|
import logging
|
|
13
13
|
import shutil
|
|
14
|
+
import struct
|
|
14
15
|
import tempfile
|
|
15
16
|
import zipfile
|
|
16
17
|
from dataclasses import dataclass
|
|
@@ -32,7 +33,8 @@ class ZipResult:
|
|
|
32
33
|
|
|
33
34
|
Attributes:
|
|
34
35
|
zip_path: Path to the temporary zip file.
|
|
35
|
-
sha256_hash:
|
|
36
|
+
sha256_hash: SHA256 hex digest of the canonical bundled file contents
|
|
37
|
+
(paths, modes, and bytes), not the raw zip archive bytes.
|
|
36
38
|
storage_key: Content-addressed storage key in format "files/{hash}.zip".
|
|
37
39
|
size_bytes: Size of the zip file in bytes.
|
|
38
40
|
"""
|
|
@@ -95,16 +97,40 @@ class ZipBuilder:
|
|
|
95
97
|
self._temp_dir = tempfile.mkdtemp(prefix="prefect-zip-")
|
|
96
98
|
zip_path = Path(self._temp_dir) / "files.zip"
|
|
97
99
|
|
|
98
|
-
# Build the zip
|
|
100
|
+
# Build the zip and compute the content hash in a single pass so
|
|
101
|
+
# that every file is read exactly once, avoiding race conditions
|
|
102
|
+
# where a source file could change between the zip write and the
|
|
103
|
+
# hash computation.
|
|
104
|
+
hasher = hashlib.sha256()
|
|
105
|
+
hasher.update(b"prefect-bundle-files-v1\0")
|
|
106
|
+
|
|
99
107
|
with zipfile.ZipFile(zip_path, "w", compression=zipfile.ZIP_DEFLATED) as zf:
|
|
100
108
|
for file_path in sorted_files:
|
|
101
|
-
# Compute relative path with forward slashes
|
|
102
109
|
rel_path = file_path.relative_to(self.base_dir)
|
|
103
110
|
arcname = str(rel_path).replace("\\", "/")
|
|
104
|
-
zf.write(file_path, arcname)
|
|
105
111
|
|
|
106
|
-
|
|
107
|
-
|
|
112
|
+
file_stat = file_path.stat()
|
|
113
|
+
|
|
114
|
+
arcname_bytes = arcname.encode("utf-8")
|
|
115
|
+
hasher.update(struct.pack(">I", len(arcname_bytes)))
|
|
116
|
+
hasher.update(arcname_bytes)
|
|
117
|
+
hasher.update(struct.pack(">I", file_stat.st_mode & 0xFFFF))
|
|
118
|
+
hasher.update(struct.pack(">Q", file_stat.st_size))
|
|
119
|
+
|
|
120
|
+
zip_info = zipfile.ZipInfo.from_file(file_path, arcname)
|
|
121
|
+
zip_info.compress_type = zipfile.ZIP_DEFLATED
|
|
122
|
+
with (
|
|
123
|
+
file_path.open("rb") as src,
|
|
124
|
+
zf.open(zip_info, "w") as dest,
|
|
125
|
+
):
|
|
126
|
+
while True:
|
|
127
|
+
chunk = src.read(HASH_CHUNK_SIZE)
|
|
128
|
+
if not chunk:
|
|
129
|
+
break
|
|
130
|
+
dest.write(chunk)
|
|
131
|
+
hasher.update(chunk)
|
|
132
|
+
|
|
133
|
+
sha256_hash = hasher.hexdigest()
|
|
108
134
|
|
|
109
135
|
# Get file size
|
|
110
136
|
size_bytes = zip_path.stat().st_size
|
|
@@ -123,25 +149,6 @@ class ZipBuilder:
|
|
|
123
149
|
size_bytes=size_bytes,
|
|
124
150
|
)
|
|
125
151
|
|
|
126
|
-
def _compute_hash(self, zip_path: Path) -> str:
|
|
127
|
-
"""
|
|
128
|
-
Compute SHA256 hash of a file using chunked reading.
|
|
129
|
-
|
|
130
|
-
Args:
|
|
131
|
-
zip_path: Path to the file to hash.
|
|
132
|
-
|
|
133
|
-
Returns:
|
|
134
|
-
Lowercase hex digest of the SHA256 hash.
|
|
135
|
-
"""
|
|
136
|
-
hasher = hashlib.sha256()
|
|
137
|
-
with open(zip_path, "rb") as f:
|
|
138
|
-
while True:
|
|
139
|
-
chunk = f.read(HASH_CHUNK_SIZE)
|
|
140
|
-
if not chunk:
|
|
141
|
-
break
|
|
142
|
-
hasher.update(chunk)
|
|
143
|
-
return hasher.hexdigest()
|
|
144
|
-
|
|
145
152
|
def _emit_size_warning(
|
|
146
153
|
self, zip_path: Path, files: list[Path], size_bytes: int
|
|
147
154
|
) -> None:
|
|
@@ -143,9 +143,14 @@ def _start_lease_renewal_thread(
|
|
|
143
143
|
stop_event = threading.Event()
|
|
144
144
|
renewal_ctx = contextvars.copy_context()
|
|
145
145
|
|
|
146
|
-
def
|
|
146
|
+
def _run_with_failure_handler() -> None:
|
|
147
|
+
# Runs inside renewal_ctx so the failure handler also sees the
|
|
148
|
+
# copied flow/task run contextvars; otherwise get_run_logger() in
|
|
149
|
+
# _handle_lease_renewal_failure can't find the run context and the
|
|
150
|
+
# message falls back to the plain "prefect.concurrency" logger,
|
|
151
|
+
# never reaching the run logs API.
|
|
147
152
|
try:
|
|
148
|
-
|
|
153
|
+
_lease_renewal_loop(lease_id, lease_duration, stop_event)
|
|
149
154
|
except Exception as exc:
|
|
150
155
|
if not stop_event.is_set():
|
|
151
156
|
_handle_lease_renewal_failure(
|
|
@@ -156,6 +161,9 @@ def _start_lease_renewal_thread(
|
|
|
156
161
|
cancel_scope,
|
|
157
162
|
)
|
|
158
163
|
|
|
164
|
+
def renewal_loop() -> None:
|
|
165
|
+
renewal_ctx.run(_run_with_failure_handler)
|
|
166
|
+
|
|
159
167
|
thread = threading.Thread(
|
|
160
168
|
target=renewal_loop,
|
|
161
169
|
daemon=True,
|
|
@@ -31,6 +31,7 @@ from .actions import (
|
|
|
31
31
|
ResumeDeployment,
|
|
32
32
|
ChangeFlowRunState,
|
|
33
33
|
CancelFlowRun,
|
|
34
|
+
DeleteFlowRun,
|
|
34
35
|
SuspendFlowRun,
|
|
35
36
|
CallWebhook,
|
|
36
37
|
SendNotification,
|
|
@@ -78,6 +79,7 @@ __all__ = [
|
|
|
78
79
|
"ResumeDeployment",
|
|
79
80
|
"ChangeFlowRunState",
|
|
80
81
|
"CancelFlowRun",
|
|
82
|
+
"DeleteFlowRun",
|
|
81
83
|
"SuspendFlowRun",
|
|
82
84
|
"CallWebhook",
|
|
83
85
|
"SendNotification",
|
|
@@ -126,6 +126,12 @@ class CancelFlowRun(Action):
|
|
|
126
126
|
type: Literal["cancel-flow-run"] = "cancel-flow-run"
|
|
127
127
|
|
|
128
128
|
|
|
129
|
+
class DeleteFlowRun(Action):
|
|
130
|
+
"""Deletes a flow run associated with the trigger"""
|
|
131
|
+
|
|
132
|
+
type: Literal["delete-flow-run"] = "delete-flow-run"
|
|
133
|
+
|
|
134
|
+
|
|
129
135
|
class ResumeFlowRun(Action):
|
|
130
136
|
"""Resumes a flow run associated with the trigger"""
|
|
131
137
|
|
|
@@ -294,6 +300,7 @@ ActionTypes: TypeAlias = Union[
|
|
|
294
300
|
ResumeDeployment,
|
|
295
301
|
ResumeFlowRun,
|
|
296
302
|
CancelFlowRun,
|
|
303
|
+
DeleteFlowRun,
|
|
297
304
|
ChangeFlowRunState,
|
|
298
305
|
PauseWorkQueue,
|
|
299
306
|
ResumeWorkQueue,
|
|
@@ -31,7 +31,7 @@ from websockets.exceptions import (
|
|
|
31
31
|
import prefect.types._datetime
|
|
32
32
|
from prefect._internal.version_checking import check_server_version
|
|
33
33
|
from prefect._internal.websockets import websocket_connect
|
|
34
|
-
from prefect.events import Event
|
|
34
|
+
from prefect.events.schemas.events import Event
|
|
35
35
|
from prefect.logging import get_logger
|
|
36
36
|
from prefect.settings import (
|
|
37
37
|
PREFECT_API_KEY,
|
|
@@ -13,9 +13,9 @@ from typing_extensions import Self
|
|
|
13
13
|
|
|
14
14
|
from prefect.client.schemas.filters import LogFilter, LogFilterFlowRunId
|
|
15
15
|
from prefect.client.schemas.objects import TERMINAL_STATES, Log, StateType
|
|
16
|
-
from prefect.events import Event
|
|
17
16
|
from prefect.events.clients import get_events_subscriber
|
|
18
17
|
from prefect.events.filters import EventAnyResourceFilter, EventFilter
|
|
18
|
+
from prefect.events.schemas.events import Event
|
|
19
19
|
from prefect.logging.clients import get_logs_subscriber
|
|
20
20
|
|
|
21
21
|
if TYPE_CHECKING:
|
|
@@ -909,10 +909,15 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
909
909
|
This method attempts to load an existing flow run for a subflow task
|
|
910
910
|
run, if appropriate.
|
|
911
911
|
|
|
912
|
-
If the parent task run is in a final
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
912
|
+
If the parent task run is in a final state, we return the existing
|
|
913
|
+
subflow run to avoid re-execution (unless the parent is being rerun
|
|
914
|
+
and the subflow did not complete, in which case a fresh run is
|
|
915
|
+
desired).
|
|
916
|
+
|
|
917
|
+
If the parent task run is in a non-final state (e.g. still Running
|
|
918
|
+
after a process restart), we also look for an existing subflow run
|
|
919
|
+
to reattach to, preventing duplicate subflow runs from being created
|
|
920
|
+
under the same parent task run.
|
|
916
921
|
|
|
917
922
|
If no existing flow run is found, or if the subflow should be rerun,
|
|
918
923
|
then no flow run is returned.
|
|
@@ -926,27 +931,32 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
926
931
|
else False
|
|
927
932
|
)
|
|
928
933
|
|
|
929
|
-
# if the parent task run is in a final but not completed state, and
|
|
930
|
-
# not rerunning, then retrieve the most recent flow run instead of
|
|
931
|
-
# creating a new one. This effectively loads a cached flow run for
|
|
932
|
-
# situations where we are confident the flow should not be run
|
|
933
|
-
# again.
|
|
934
934
|
assert isinstance(parent_task_run.state, State)
|
|
935
|
-
|
|
936
|
-
|
|
935
|
+
|
|
936
|
+
# If the user explicitly triggered a re-run and the subflow did not
|
|
937
|
+
# complete, allow a fresh subflow to be created.
|
|
938
|
+
if (
|
|
939
|
+
parent_task_run.state.is_final()
|
|
940
|
+
and rerunning
|
|
941
|
+
and not parent_task_run.state.is_completed()
|
|
937
942
|
):
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
943
|
+
return None
|
|
944
|
+
|
|
945
|
+
# Look for an existing subflow run attached to this parent task run.
|
|
946
|
+
flow_runs = client.read_flow_runs(
|
|
947
|
+
flow_run_filter=FlowRunFilter(
|
|
948
|
+
parent_task_run_id={"any_": [parent_task_run.id]}
|
|
949
|
+
),
|
|
950
|
+
sort=FlowRunSort.EXPECTED_START_TIME_DESC,
|
|
951
|
+
limit=1,
|
|
952
|
+
)
|
|
953
|
+
if flow_runs:
|
|
954
|
+
loaded_flow_run = flow_runs[0]
|
|
955
|
+
# When the parent task run is final the subflow has already
|
|
956
|
+
# finished; cache the result so the engine skips re-execution.
|
|
957
|
+
if parent_task_run.state.is_final():
|
|
948
958
|
self._return_value = loaded_flow_run.state
|
|
949
|
-
|
|
959
|
+
return loaded_flow_run
|
|
950
960
|
|
|
951
961
|
def create_flow_run(self, client: SyncPrefectClient) -> FlowRun:
|
|
952
962
|
flow_run_ctx = FlowRunContext.get()
|
|
@@ -1594,10 +1604,15 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1594
1604
|
This method attempts to load an existing flow run for a subflow task
|
|
1595
1605
|
run, if appropriate.
|
|
1596
1606
|
|
|
1597
|
-
If the parent task run is in a final
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1607
|
+
If the parent task run is in a final state, we return the existing
|
|
1608
|
+
subflow run to avoid re-execution (unless the parent is being rerun
|
|
1609
|
+
and the subflow did not complete, in which case a fresh run is
|
|
1610
|
+
desired).
|
|
1611
|
+
|
|
1612
|
+
If the parent task run is in a non-final state (e.g. still Running
|
|
1613
|
+
after a process restart), we also look for an existing subflow run
|
|
1614
|
+
to reattach to, preventing duplicate subflow runs from being created
|
|
1615
|
+
under the same parent task run.
|
|
1601
1616
|
|
|
1602
1617
|
If no existing flow run is found, or if the subflow should be rerun,
|
|
1603
1618
|
then no flow run is returned.
|
|
@@ -1611,27 +1626,32 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1611
1626
|
else False
|
|
1612
1627
|
)
|
|
1613
1628
|
|
|
1614
|
-
# if the parent task run is in a final but not completed state, and
|
|
1615
|
-
# not rerunning, then retrieve the most recent flow run instead of
|
|
1616
|
-
# creating a new one. This effectively loads a cached flow run for
|
|
1617
|
-
# situations where we are confident the flow should not be run
|
|
1618
|
-
# again.
|
|
1619
1629
|
assert isinstance(parent_task_run.state, State)
|
|
1620
|
-
|
|
1621
|
-
|
|
1630
|
+
|
|
1631
|
+
# If the user explicitly triggered a re-run and the subflow did not
|
|
1632
|
+
# complete, allow a fresh subflow to be created.
|
|
1633
|
+
if (
|
|
1634
|
+
parent_task_run.state.is_final()
|
|
1635
|
+
and rerunning
|
|
1636
|
+
and not parent_task_run.state.is_completed()
|
|
1622
1637
|
):
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1638
|
+
return None
|
|
1639
|
+
|
|
1640
|
+
# Look for an existing subflow run attached to this parent task run.
|
|
1641
|
+
flow_runs = await client.read_flow_runs(
|
|
1642
|
+
flow_run_filter=FlowRunFilter(
|
|
1643
|
+
parent_task_run_id={"any_": [parent_task_run.id]}
|
|
1644
|
+
),
|
|
1645
|
+
sort=FlowRunSort.EXPECTED_START_TIME_DESC,
|
|
1646
|
+
limit=1,
|
|
1647
|
+
)
|
|
1648
|
+
if flow_runs:
|
|
1649
|
+
loaded_flow_run = flow_runs[0]
|
|
1650
|
+
# When the parent task run is final the subflow has already
|
|
1651
|
+
# finished; cache the result so the engine skips re-execution.
|
|
1652
|
+
if parent_task_run.state.is_final():
|
|
1633
1653
|
self._return_value = loaded_flow_run.state
|
|
1634
|
-
|
|
1654
|
+
return loaded_flow_run
|
|
1635
1655
|
|
|
1636
1656
|
async def create_flow_run(self, client: PrefectClient) -> FlowRun:
|
|
1637
1657
|
flow_run_ctx = FlowRunContext.get()
|
|
@@ -16,7 +16,6 @@ from rich.highlighter import Highlighter, NullHighlighter
|
|
|
16
16
|
from rich.theme import Theme
|
|
17
17
|
from typing_extensions import Self
|
|
18
18
|
|
|
19
|
-
import prefect.context
|
|
20
19
|
from prefect._internal.concurrency.api import create_call, from_sync
|
|
21
20
|
from prefect._internal.concurrency.event_loop import get_running_loop
|
|
22
21
|
from prefect._internal.concurrency.services import BatchedQueueService
|
|
@@ -161,7 +160,9 @@ class APILogHandler(logging.Handler):
|
|
|
161
160
|
Send a log to the `APILogWorker`
|
|
162
161
|
"""
|
|
163
162
|
try:
|
|
164
|
-
|
|
163
|
+
from prefect.context import get_settings_context
|
|
164
|
+
|
|
165
|
+
profile = get_settings_context()
|
|
165
166
|
|
|
166
167
|
if not profile.settings.logging.to_api.enabled:
|
|
167
168
|
return # Respect the global settings toggle
|
|
@@ -214,7 +215,9 @@ class APILogHandler(logging.Handler):
|
|
|
214
215
|
|
|
215
216
|
if not flow_run_id:
|
|
216
217
|
try:
|
|
217
|
-
|
|
218
|
+
from prefect.context import get_run_context
|
|
219
|
+
|
|
220
|
+
context = get_run_context()
|
|
218
221
|
except MissingContextError:
|
|
219
222
|
raise MissingContextError(
|
|
220
223
|
f"Logger {record.name!r} attempted to send logs to the API without"
|
|
@@ -699,6 +699,8 @@ class ResultStore(BaseModel):
|
|
|
699
699
|
except Exception:
|
|
700
700
|
return False
|
|
701
701
|
else:
|
|
702
|
+
if self.result_storage is None:
|
|
703
|
+
self.result_storage = await aget_default_result_storage()
|
|
702
704
|
try:
|
|
703
705
|
content = await call_explicitly_async_block_method(
|
|
704
706
|
self.result_storage, "read_path", (key,), {}
|
|
@@ -742,6 +744,8 @@ class ResultStore(BaseModel):
|
|
|
742
744
|
except Exception:
|
|
743
745
|
return False
|
|
744
746
|
else:
|
|
747
|
+
if self.result_storage is None:
|
|
748
|
+
self.result_storage = get_default_result_storage(_sync=True)
|
|
745
749
|
try:
|
|
746
750
|
content = call_explicitly_sync_block_method(
|
|
747
751
|
self.result_storage, "read_path", (key,), {}
|
{prefect_client-3.7.1.dev9 → prefect_client-3.7.2}/src/prefect/runner/_scheduled_run_poller.py
RENAMED
|
@@ -126,7 +126,6 @@ class ScheduledRunPoller:
|
|
|
126
126
|
),
|
|
127
127
|
)
|
|
128
128
|
|
|
129
|
-
submitted_ids: set[UUID] = set()
|
|
130
129
|
for flow_run in submittable_flow_runs:
|
|
131
130
|
if flow_run.id in self._submitting_flow_run_ids:
|
|
132
131
|
continue
|
|
@@ -135,13 +134,12 @@ class ScheduledRunPoller:
|
|
|
135
134
|
except anyio.WouldBlock:
|
|
136
135
|
break # sorted: no earlier run fits
|
|
137
136
|
self._submitting_flow_run_ids.add(flow_run.id)
|
|
138
|
-
submitted_ids.add(flow_run.id)
|
|
139
137
|
task_group.start_soon(self._submit_run, flow_run, task_group, slot_token)
|
|
140
138
|
|
|
141
139
|
skipped_count = sum(
|
|
142
140
|
1
|
|
143
141
|
for r in submittable_flow_runs
|
|
144
|
-
if r.id not in self._submitting_flow_run_ids
|
|
142
|
+
if r.id not in self._submitting_flow_run_ids
|
|
145
143
|
)
|
|
146
144
|
if skipped_count > 0:
|
|
147
145
|
self._logger.info("%d scheduled runs skipped (at capacity)", skipped_count)
|
|
@@ -182,18 +180,15 @@ class ScheduledRunPoller:
|
|
|
182
180
|
pull_interval = getattr(storage, "pull_interval", None)
|
|
183
181
|
if storage and isinstance(pull_interval, (int, float)) and pull_interval:
|
|
184
182
|
last_adhoc_pull = getattr(storage, "last_adhoc_pull", None)
|
|
185
|
-
if (
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
< datetime.datetime.now()
|
|
189
|
-
- datetime.timedelta(seconds=storage.pull_interval)
|
|
190
|
-
):
|
|
183
|
+
if last_adhoc_pull is None or last_adhoc_pull < now(
|
|
184
|
+
"UTC"
|
|
185
|
+
) - datetime.timedelta(seconds=storage.pull_interval):
|
|
191
186
|
self._logger.debug(
|
|
192
187
|
"Performing adhoc pull of code for flow run %s",
|
|
193
188
|
flow_run.id,
|
|
194
189
|
)
|
|
195
190
|
await storage.pull_code()
|
|
196
|
-
storage.last_adhoc_pull =
|
|
191
|
+
storage.last_adhoc_pull = now("UTC")
|
|
197
192
|
|
|
198
193
|
executor = FlowRunExecutor(
|
|
199
194
|
flow_run=flow_run,
|
|
@@ -129,6 +129,7 @@ from prefect.settings import (
|
|
|
129
129
|
from prefect.states import (
|
|
130
130
|
AwaitingRetry,
|
|
131
131
|
)
|
|
132
|
+
from prefect.types._datetime import now
|
|
132
133
|
from prefect.types.entrypoint import EntrypointType
|
|
133
134
|
from prefect.utilities.annotations import NotSet
|
|
134
135
|
from prefect.utilities.asyncutils import (
|
|
@@ -214,7 +215,7 @@ class Runner:
|
|
|
214
215
|
def goodbye_flow(name):
|
|
215
216
|
print(f"goodbye {name}")
|
|
216
217
|
|
|
217
|
-
if __name__ == "__main__"
|
|
218
|
+
if __name__ == "__main__":
|
|
218
219
|
runner = Runner(name="my-runner")
|
|
219
220
|
|
|
220
221
|
# Will be runnable via the API
|
|
@@ -613,17 +614,17 @@ class Runner:
|
|
|
613
614
|
def goodbye_flow(name):
|
|
614
615
|
print(f"goodbye {name}")
|
|
615
616
|
|
|
616
|
-
|
|
617
|
-
|
|
617
|
+
if __name__ == "__main__":
|
|
618
|
+
runner = Runner(name="my-runner")
|
|
618
619
|
|
|
619
|
-
|
|
620
|
-
|
|
620
|
+
# Will be runnable via the API
|
|
621
|
+
runner.add_flow(hello_flow)
|
|
621
622
|
|
|
622
|
-
|
|
623
|
-
|
|
623
|
+
# Run on a cron schedule
|
|
624
|
+
runner.add_flow(goodbye_flow, schedule={"cron": "0 * * * *"})
|
|
624
625
|
|
|
625
|
-
|
|
626
|
-
|
|
626
|
+
asyncio.run(runner.start())
|
|
627
|
+
```
|
|
627
628
|
"""
|
|
628
629
|
from prefect.runner.server import start_webserver
|
|
629
630
|
|
|
@@ -780,9 +781,9 @@ class Runner:
|
|
|
780
781
|
# The process may be a multiprocessing.context.SpawnProcess, in which case it will have an `exitcode` attribute
|
|
781
782
|
# but no `returncode` attribute
|
|
782
783
|
if (
|
|
783
|
-
getattr(process, "returncode", None)
|
|
784
|
-
|
|
785
|
-
)
|
|
784
|
+
getattr(process, "returncode", None) is None
|
|
785
|
+
and getattr(process, "exitcode", None) is None
|
|
786
|
+
):
|
|
786
787
|
await self._add_flow_run_process_map_entry(
|
|
787
788
|
flow_run.id, ProcessMapEntry(pid=process.pid, flow_run=flow_run)
|
|
788
789
|
)
|
|
@@ -1051,19 +1052,16 @@ class Runner:
|
|
|
1051
1052
|
# adhoc pull hasn't been performed in the last pull_interval
|
|
1052
1053
|
# TODO: Explore integrating this behavior with global concurrency.
|
|
1053
1054
|
last_adhoc_pull = getattr(storage, "last_adhoc_pull", None)
|
|
1054
|
-
if (
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
< datetime.datetime.now()
|
|
1058
|
-
- datetime.timedelta(seconds=storage.pull_interval)
|
|
1059
|
-
):
|
|
1055
|
+
if last_adhoc_pull is None or last_adhoc_pull < now(
|
|
1056
|
+
"UTC"
|
|
1057
|
+
) - datetime.timedelta(seconds=storage.pull_interval):
|
|
1060
1058
|
self._logger.debug(
|
|
1061
1059
|
"Performing adhoc pull of code for flow run %s with storage %r",
|
|
1062
1060
|
flow_run.id,
|
|
1063
1061
|
storage,
|
|
1064
1062
|
)
|
|
1065
1063
|
await storage.pull_code()
|
|
1066
|
-
setattr(storage, "last_adhoc_pull",
|
|
1064
|
+
setattr(storage, "last_adhoc_pull", now("UTC"))
|
|
1067
1065
|
|
|
1068
1066
|
handed_off = False
|
|
1069
1067
|
|