prefect-client 3.6.26.dev5__tar.gz → 3.6.27.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/PKG-INFO +2 -2
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/pyproject.toml +1 -1
- prefect_client-3.6.27.dev1/src/prefect/_build_info.py +5 -0
- prefect_client-3.6.27.dev1/src/prefect/_experimental/_launchers.py +106 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/__init__.py +52 -17
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/flows.py +34 -6
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_starter_engine.py +6 -3
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/runner.py +2 -2
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/_datetime.py +8 -1
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/AGENTS.md +3 -1
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/processutils.py +78 -9
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/AGENTS.md +8 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/base.py +19 -6
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/process.py +2 -2
- prefect_client-3.6.26.dev5/src/prefect/_build_info.py +0 -5
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/.gitignore +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/LICENSE +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/README.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/_version_checking.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/context.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/runner.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/engine.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/futures.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/main.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/results.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/serializers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/states.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/asyncutils.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/callables.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/engine.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/filesystem.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/templating.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/workers/utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: prefect-client
|
|
3
|
-
Version: 3.6.
|
|
3
|
+
Version: 3.6.27.dev1
|
|
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
|
|
@@ -61,7 +61,7 @@ Requires-Dist: toml>=0.10.0
|
|
|
61
61
|
Requires-Dist: typing-extensions<5.0.0,>=4.10.0
|
|
62
62
|
Requires-Dist: uvicorn!=0.29.0,>=0.14.0
|
|
63
63
|
Requires-Dist: websockets<17.0,>=15.0.1
|
|
64
|
-
Requires-Dist: whenever<0.
|
|
64
|
+
Requires-Dist: whenever<0.11.0,>=0.7.3; python_version >= '3.13'
|
|
65
65
|
Provides-Extra: notifications
|
|
66
66
|
Requires-Dist: apprise<2.0.0,>=1.1.0; extra == 'notifications'
|
|
67
67
|
Description-Content-Type: text/markdown
|
|
@@ -65,7 +65,7 @@ dependencies = [
|
|
|
65
65
|
"typing_extensions>=4.10.0,<5.0.0",
|
|
66
66
|
"uvicorn>=0.14.0,!=0.29.0",
|
|
67
67
|
"websockets>=15.0.1,<17.0",
|
|
68
|
-
"whenever>=0.7.3,<0.
|
|
68
|
+
"whenever>=0.7.3,<0.11.0; python_version>='3.13'",
|
|
69
69
|
]
|
|
70
70
|
[project.urls]
|
|
71
71
|
Changelog = "https://github.com/PrefectHQ/prefect/releases"
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from copy import deepcopy
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from prefect._experimental.bundles import (
|
|
8
|
+
BundleLauncher,
|
|
9
|
+
BundleLauncherOverride,
|
|
10
|
+
BundleLauncherSide,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def validate_bundle_step_launcher(
|
|
15
|
+
launcher: Any, *, field_name: str = "launcher"
|
|
16
|
+
) -> list[str]:
|
|
17
|
+
if not isinstance(launcher, list) or not launcher:
|
|
18
|
+
raise ValueError(f"{field_name} must be a non-empty list[str]")
|
|
19
|
+
|
|
20
|
+
normalized: list[str] = []
|
|
21
|
+
for i, item in enumerate(launcher):
|
|
22
|
+
if not isinstance(item, str) or not item.strip():
|
|
23
|
+
raise ValueError(f"{field_name}[{i}] must be a non-empty string")
|
|
24
|
+
normalized.append(item)
|
|
25
|
+
|
|
26
|
+
return normalized
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def normalize_launcher(
|
|
30
|
+
launcher: BundleLauncher | None,
|
|
31
|
+
) -> BundleLauncherOverride | None:
|
|
32
|
+
if launcher is None:
|
|
33
|
+
return None
|
|
34
|
+
|
|
35
|
+
if isinstance(launcher, list):
|
|
36
|
+
normalized_launcher = validate_bundle_step_launcher(
|
|
37
|
+
launcher, field_name="launcher"
|
|
38
|
+
)
|
|
39
|
+
return {
|
|
40
|
+
"upload": normalized_launcher.copy(),
|
|
41
|
+
"execution": normalized_launcher.copy(),
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if not isinstance(launcher, dict):
|
|
45
|
+
raise TypeError(
|
|
46
|
+
"launcher must be a list[str] or a mapping with 'upload'/'execution' keys"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
allowed_keys = {"upload", "execution"}
|
|
50
|
+
invalid_keys = sorted(set(launcher) - allowed_keys)
|
|
51
|
+
if invalid_keys:
|
|
52
|
+
raise ValueError(
|
|
53
|
+
f"launcher may only specify 'upload' and 'execution'; got {invalid_keys!r}"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
if not launcher:
|
|
57
|
+
raise ValueError(
|
|
58
|
+
"launcher must specify at least one of 'upload' or 'execution'"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
normalized: BundleLauncherOverride = {}
|
|
62
|
+
for side in ("upload", "execution"):
|
|
63
|
+
if side in launcher:
|
|
64
|
+
normalized[side] = validate_bundle_step_launcher(
|
|
65
|
+
launcher[side],
|
|
66
|
+
field_name=f"launcher[{side!r}]",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
return normalized
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def get_launcher_for_side(
|
|
73
|
+
launcher: BundleLauncher | None,
|
|
74
|
+
side: BundleLauncherSide,
|
|
75
|
+
) -> list[str] | None:
|
|
76
|
+
normalized = normalize_launcher(launcher)
|
|
77
|
+
if normalized is None:
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
launcher = normalized.get(side)
|
|
81
|
+
return launcher.copy() if launcher is not None else None
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def resolve_bundle_step_with_launcher(
|
|
85
|
+
step: dict[str, Any],
|
|
86
|
+
launcher: BundleLauncher | None,
|
|
87
|
+
side: BundleLauncherSide,
|
|
88
|
+
) -> dict[str, Any]:
|
|
89
|
+
resolved_step = deepcopy(step)
|
|
90
|
+
resolved_launcher = get_launcher_for_side(launcher, side)
|
|
91
|
+
|
|
92
|
+
if resolved_launcher is None:
|
|
93
|
+
return resolved_step
|
|
94
|
+
|
|
95
|
+
step_keys = list(resolved_step.keys())
|
|
96
|
+
if len(step_keys) != 1:
|
|
97
|
+
return resolved_step
|
|
98
|
+
|
|
99
|
+
function_args = resolved_step[step_keys[0]]
|
|
100
|
+
if not isinstance(function_args, dict):
|
|
101
|
+
return resolved_step
|
|
102
|
+
|
|
103
|
+
function_args["launcher"] = resolved_launcher
|
|
104
|
+
function_args.pop("requires", None)
|
|
105
|
+
|
|
106
|
+
return resolved_step
|
|
@@ -19,7 +19,7 @@ from pathlib import Path
|
|
|
19
19
|
from types import ModuleType
|
|
20
20
|
from typing import Any, TypedDict
|
|
21
21
|
|
|
22
|
-
from typing_extensions import NotRequired
|
|
22
|
+
from typing_extensions import Literal, NotRequired, TypeAlias
|
|
23
23
|
|
|
24
24
|
import anyio
|
|
25
25
|
import cloudpickle # pyright: ignore[reportMissingTypeStubs]
|
|
@@ -34,11 +34,23 @@ from prefect.settings.context import get_current_settings
|
|
|
34
34
|
from prefect.settings.models.root import Settings
|
|
35
35
|
from prefect.utilities.slugify import slugify
|
|
36
36
|
|
|
37
|
+
from prefect._experimental._launchers import validate_bundle_step_launcher
|
|
38
|
+
|
|
37
39
|
from .execute import execute_bundle_from_file
|
|
38
40
|
from ._file_collector import FileCollector
|
|
39
41
|
from ._ignore_filter import IgnoreFilter, check_sensitive_files
|
|
40
42
|
from ._zip_builder import ZipBuilder
|
|
41
43
|
|
|
44
|
+
BundleLauncherSide = Literal["upload", "execution"]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class BundleLauncherOverride(TypedDict, total=False):
|
|
48
|
+
upload: list[str]
|
|
49
|
+
execution: list[str]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
BundleLauncher: TypeAlias = list[str] | BundleLauncherOverride
|
|
53
|
+
|
|
42
54
|
logger: logging.Logger = get_logger(__name__)
|
|
43
55
|
|
|
44
56
|
|
|
@@ -57,6 +69,21 @@ def _get_uv_path() -> str:
|
|
|
57
69
|
return "uv"
|
|
58
70
|
|
|
59
71
|
|
|
72
|
+
def _called_process_error_message(exc: subprocess.CalledProcessError) -> str:
|
|
73
|
+
for stream in (exc.stderr, exc.output):
|
|
74
|
+
if isinstance(stream, bytes):
|
|
75
|
+
message = stream.decode("utf-8", errors="replace").strip()
|
|
76
|
+
elif isinstance(stream, str):
|
|
77
|
+
message = stream.strip()
|
|
78
|
+
else:
|
|
79
|
+
continue
|
|
80
|
+
|
|
81
|
+
if message:
|
|
82
|
+
return message
|
|
83
|
+
|
|
84
|
+
return str(exc)
|
|
85
|
+
|
|
86
|
+
|
|
60
87
|
class SerializedBundle(TypedDict):
|
|
61
88
|
"""
|
|
62
89
|
A serialized bundle is a serialized function, context, and flow run that can be
|
|
@@ -579,12 +606,6 @@ def convert_step_to_command(
|
|
|
579
606
|
Returns:
|
|
580
607
|
A list of strings representing the command to run the step.
|
|
581
608
|
"""
|
|
582
|
-
# Start with uv run
|
|
583
|
-
command = ["uv", "run"]
|
|
584
|
-
|
|
585
|
-
if quiet:
|
|
586
|
-
command.append("--quiet")
|
|
587
|
-
|
|
588
609
|
step_keys = list(step.keys())
|
|
589
610
|
|
|
590
611
|
if len(step_keys) != 1:
|
|
@@ -592,24 +613,38 @@ def convert_step_to_command(
|
|
|
592
613
|
|
|
593
614
|
function_fqn = step_keys[0]
|
|
594
615
|
function_args = step[function_fqn]
|
|
595
|
-
|
|
596
|
-
# Add the `--with` argument to handle dependencies for running the step
|
|
597
616
|
requires: list[str] | str = function_args.get("requires", [])
|
|
617
|
+
launcher = function_args.get("launcher")
|
|
618
|
+
|
|
598
619
|
if isinstance(requires, str):
|
|
599
620
|
requires = [requires]
|
|
600
|
-
if requires:
|
|
601
|
-
command.extend(["--with", ",".join(requires)])
|
|
602
621
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
622
|
+
if launcher is not None:
|
|
623
|
+
command = validate_bundle_step_launcher(launcher)
|
|
624
|
+
if requires:
|
|
625
|
+
raise ValueError(
|
|
626
|
+
"Bundle step launcher cannot be combined with step requirements"
|
|
627
|
+
)
|
|
628
|
+
else:
|
|
629
|
+
command = ["uv", "run"]
|
|
630
|
+
|
|
631
|
+
if quiet:
|
|
632
|
+
command.append("--quiet")
|
|
633
|
+
|
|
634
|
+
# Add the `--with` argument to handle dependencies for running the step
|
|
635
|
+
if requires:
|
|
636
|
+
command.extend(["--with", ",".join(requires)])
|
|
637
|
+
|
|
638
|
+
# Add the `--python` argument to handle the Python version for running the step
|
|
639
|
+
python_version = sys.version_info
|
|
640
|
+
command.extend(["--python", f"{python_version.major}.{python_version.minor}"])
|
|
606
641
|
|
|
607
642
|
# Add the `-m` argument to defined the function to run
|
|
608
643
|
command.extend(["-m", function_fqn])
|
|
609
644
|
|
|
610
645
|
# Add any arguments with values defined in the step
|
|
611
646
|
for arg_name, arg_value in function_args.items():
|
|
612
|
-
if arg_name
|
|
647
|
+
if arg_name in {"launcher", "requires"}:
|
|
613
648
|
continue
|
|
614
649
|
|
|
615
650
|
command.extend([f"--{slugify(arg_name)}", arg_value])
|
|
@@ -681,7 +716,7 @@ def upload_bundle_to_storage(
|
|
|
681
716
|
)
|
|
682
717
|
|
|
683
718
|
except subprocess.CalledProcessError as e:
|
|
684
|
-
raise RuntimeError(e
|
|
719
|
+
raise RuntimeError(_called_process_error_message(e)) from e
|
|
685
720
|
|
|
686
721
|
|
|
687
722
|
async def aupload_bundle_to_storage(
|
|
@@ -749,7 +784,7 @@ async def aupload_bundle_to_storage(
|
|
|
749
784
|
)
|
|
750
785
|
|
|
751
786
|
except subprocess.CalledProcessError as e:
|
|
752
|
-
raise RuntimeError(e
|
|
787
|
+
raise RuntimeError(_called_process_error_message(e)) from e
|
|
753
788
|
|
|
754
789
|
|
|
755
790
|
__all__ = [
|
|
@@ -47,6 +47,10 @@ from exceptiongroup import BaseExceptionGroup, ExceptionGroup
|
|
|
47
47
|
from rich.console import Console
|
|
48
48
|
from typing_extensions import Literal, ParamSpec
|
|
49
49
|
|
|
50
|
+
from prefect._experimental._launchers import (
|
|
51
|
+
normalize_launcher,
|
|
52
|
+
resolve_bundle_step_with_launcher,
|
|
53
|
+
)
|
|
50
54
|
from prefect._experimental.sla.objects import SlaTypes
|
|
51
55
|
from prefect._internal.concurrency.api import create_call, from_async, from_sync
|
|
52
56
|
from prefect._versioning import VersionType
|
|
@@ -96,12 +100,14 @@ from prefect.utilities.collections import listrepr, visit_collection
|
|
|
96
100
|
from prefect.utilities.filesystem import relative_path_to_current_platform
|
|
97
101
|
from prefect.utilities.hashing import file_hash
|
|
98
102
|
from prefect.utilities.importtools import import_object, safe_load_namespace
|
|
103
|
+
from prefect.utilities.processutils import command_to_string
|
|
99
104
|
|
|
100
105
|
from ._internal.compatibility.async_dispatch import async_dispatch, is_in_async_context
|
|
101
106
|
from ._internal.pydantic.v2_schema import is_v2_type
|
|
102
107
|
from ._internal.pydantic.validated_func import ValidatedFunction
|
|
103
108
|
|
|
104
109
|
if TYPE_CHECKING:
|
|
110
|
+
from prefect._experimental.bundles import BundleLauncher, BundleLauncherOverride
|
|
105
111
|
from prefect.docker.docker_image import DockerImage
|
|
106
112
|
from prefect.workers.base import BaseWorker
|
|
107
113
|
|
|
@@ -2276,6 +2282,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2276
2282
|
infrastructure the flow will run on.
|
|
2277
2283
|
job_variables: Infrastructure configuration that will override the base job
|
|
2278
2284
|
configuration of the work pool.
|
|
2285
|
+
launcher: Optional upload and execution launcher overrides.
|
|
2279
2286
|
worker_cls: The class of the worker to use to spin up infrastructure and submit
|
|
2280
2287
|
the flow to it.
|
|
2281
2288
|
"""
|
|
@@ -2286,6 +2293,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2286
2293
|
work_pool: str,
|
|
2287
2294
|
job_variables: dict[str, Any],
|
|
2288
2295
|
worker_cls: type["BaseWorker[Any, Any, Any]"],
|
|
2296
|
+
launcher: BundleLauncher | None = None,
|
|
2289
2297
|
include_files: Sequence[str] | None = None,
|
|
2290
2298
|
**kwargs: Any,
|
|
2291
2299
|
):
|
|
@@ -2293,6 +2301,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2293
2301
|
self.work_pool = work_pool
|
|
2294
2302
|
self.job_variables = job_variables
|
|
2295
2303
|
self.worker_cls = worker_cls
|
|
2304
|
+
self.launcher: BundleLauncherOverride | None = normalize_launcher(launcher)
|
|
2296
2305
|
self.include_files: list[str] | None = (
|
|
2297
2306
|
list(include_files) if include_files is not None else None
|
|
2298
2307
|
)
|
|
@@ -2579,18 +2588,28 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2579
2588
|
else:
|
|
2580
2589
|
flow = self
|
|
2581
2590
|
|
|
2591
|
+
upload_step = work_pool.storage_configuration.bundle_upload_step
|
|
2592
|
+
execute_step = work_pool.storage_configuration.bundle_execution_step
|
|
2593
|
+
assert upload_step is not None
|
|
2594
|
+
assert execute_step is not None
|
|
2595
|
+
|
|
2596
|
+
upload_step = resolve_bundle_step_with_launcher(
|
|
2597
|
+
upload_step, self.launcher, "upload"
|
|
2598
|
+
)
|
|
2599
|
+
execute_step = resolve_bundle_step_with_launcher(
|
|
2600
|
+
execute_step, self.launcher, "execution"
|
|
2601
|
+
)
|
|
2602
|
+
|
|
2582
2603
|
bundle_key = str(uuid.uuid4())
|
|
2583
2604
|
upload_command = convert_step_to_command(
|
|
2584
|
-
|
|
2605
|
+
upload_step,
|
|
2585
2606
|
bundle_key,
|
|
2586
2607
|
quiet=True,
|
|
2587
2608
|
)
|
|
2588
|
-
execute_command = convert_step_to_command(
|
|
2589
|
-
work_pool.storage_configuration.bundle_execution_step, bundle_key
|
|
2590
|
-
)
|
|
2609
|
+
execute_command = convert_step_to_command(execute_step, bundle_key)
|
|
2591
2610
|
|
|
2592
2611
|
job_variables = (self.job_variables or {}) | {
|
|
2593
|
-
"command":
|
|
2612
|
+
"command": command_to_string(execute_command)
|
|
2594
2613
|
}
|
|
2595
2614
|
|
|
2596
2615
|
# Create a parent task run if this is a child flow run to ensure it shows up as a child flow in the UI
|
|
@@ -2625,7 +2644,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2625
2644
|
bundle_key,
|
|
2626
2645
|
upload_command,
|
|
2627
2646
|
zip_path=result["zip_path"],
|
|
2628
|
-
upload_step=
|
|
2647
|
+
upload_step=upload_step,
|
|
2629
2648
|
)
|
|
2630
2649
|
|
|
2631
2650
|
# Set flow run to scheduled now that the bundle is uploaded and ready to be executed
|
|
@@ -2659,6 +2678,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2659
2678
|
on_crashed: Optional[list[FlowStateHook[P, R]]] = None,
|
|
2660
2679
|
on_running: Optional[list[FlowStateHook[P, R]]] = None,
|
|
2661
2680
|
job_variables: Optional[dict[str, Any]] = None,
|
|
2681
|
+
launcher: BundleLauncher | None = NotSet, # type: ignore
|
|
2662
2682
|
include_files: Optional[list[str]] = NotSet, # type: ignore
|
|
2663
2683
|
) -> "InfrastructureBoundFlow[P, R]":
|
|
2664
2684
|
new_flow = super().with_options(
|
|
@@ -2689,6 +2709,7 @@ class InfrastructureBoundFlow(Flow[P, R]):
|
|
|
2689
2709
|
job_variables=job_variables
|
|
2690
2710
|
if job_variables is not None
|
|
2691
2711
|
else self.job_variables,
|
|
2712
|
+
launcher=launcher if launcher is not NotSet else self.launcher,
|
|
2692
2713
|
include_files=include_files
|
|
2693
2714
|
if include_files is not NotSet
|
|
2694
2715
|
else self.include_files,
|
|
@@ -2701,6 +2722,7 @@ def bind_flow_to_infrastructure(
|
|
|
2701
2722
|
work_pool: str,
|
|
2702
2723
|
worker_cls: type["BaseWorker[Any, Any, Any]"],
|
|
2703
2724
|
job_variables: dict[str, Any] | None = None,
|
|
2725
|
+
launcher: BundleLauncher | None = None,
|
|
2704
2726
|
include_files: Sequence[str] | None = None,
|
|
2705
2727
|
) -> InfrastructureBoundFlow[P, R]:
|
|
2706
2728
|
new = InfrastructureBoundFlow[P, R](
|
|
@@ -2708,11 +2730,17 @@ def bind_flow_to_infrastructure(
|
|
|
2708
2730
|
work_pool=work_pool,
|
|
2709
2731
|
job_variables=job_variables or {},
|
|
2710
2732
|
worker_cls=worker_cls,
|
|
2733
|
+
launcher=launcher,
|
|
2711
2734
|
include_files=include_files,
|
|
2712
2735
|
)
|
|
2713
2736
|
# Copy all attributes from the original flow
|
|
2714
2737
|
for attr, value in flow.__dict__.items():
|
|
2715
2738
|
setattr(new, attr, value)
|
|
2739
|
+
new.work_pool = work_pool
|
|
2740
|
+
new.job_variables = job_variables or {}
|
|
2741
|
+
new.worker_cls = worker_cls
|
|
2742
|
+
new.launcher = normalize_launcher(launcher)
|
|
2743
|
+
new.include_files = list(include_files) if include_files is not None else None
|
|
2716
2744
|
return new
|
|
2717
2745
|
|
|
2718
2746
|
|
{prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/runner/_starter_engine.py
RENAMED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
-
import shlex
|
|
5
4
|
import subprocess
|
|
6
5
|
import sys
|
|
7
6
|
from pathlib import Path
|
|
@@ -12,7 +11,11 @@ import anyio.abc
|
|
|
12
11
|
|
|
13
12
|
from prefect.runner._process_manager import ProcessHandle
|
|
14
13
|
from prefect.settings import get_current_settings
|
|
15
|
-
from prefect.utilities.processutils import
|
|
14
|
+
from prefect.utilities.processutils import (
|
|
15
|
+
command_from_string,
|
|
16
|
+
get_sys_executable,
|
|
17
|
+
run_process,
|
|
18
|
+
)
|
|
16
19
|
|
|
17
20
|
if TYPE_CHECKING:
|
|
18
21
|
from prefect.client.schemas.objects import FlowRun
|
|
@@ -59,7 +62,7 @@ class EngineCommandStarter:
|
|
|
59
62
|
if self._command is None:
|
|
60
63
|
runner_command = [get_sys_executable(), "-m", "prefect.engine"]
|
|
61
64
|
else:
|
|
62
|
-
runner_command =
|
|
65
|
+
runner_command = command_from_string(self._command)
|
|
63
66
|
|
|
64
67
|
# We must add creationflags to a dict so it is only passed as a
|
|
65
68
|
# function parameter on Windows, because the presence of
|
|
@@ -39,7 +39,6 @@ import datetime
|
|
|
39
39
|
import logging
|
|
40
40
|
import multiprocessing.context
|
|
41
41
|
import os
|
|
42
|
-
import shlex
|
|
43
42
|
import shutil
|
|
44
43
|
import signal
|
|
45
44
|
import subprocess
|
|
@@ -135,6 +134,7 @@ from prefect.utilities.engine import ( # noqa: F401 (patch target)
|
|
|
135
134
|
propose_state_sync,
|
|
136
135
|
)
|
|
137
136
|
from prefect.utilities.processutils import (
|
|
137
|
+
command_from_string,
|
|
138
138
|
get_sys_executable,
|
|
139
139
|
run_process,
|
|
140
140
|
)
|
|
@@ -900,7 +900,7 @@ class Runner:
|
|
|
900
900
|
if command is None:
|
|
901
901
|
runner_command = [get_sys_executable(), "-m", "prefect.engine"]
|
|
902
902
|
else:
|
|
903
|
-
runner_command =
|
|
903
|
+
runner_command = command_from_string(command)
|
|
904
904
|
|
|
905
905
|
flow_run_logger = self._get_flow_run_logger(flow_run)
|
|
906
906
|
|
|
@@ -124,7 +124,14 @@ def now(
|
|
|
124
124
|
if isinstance(getattr(tz, "name", None), str):
|
|
125
125
|
tz = tz.name
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
zoned_datetime = ZonedDateTime.now(tz)
|
|
128
|
+
|
|
129
|
+
# `whenever` is deprecating `py_datetime()` in favor of `to_stdlib()`,
|
|
130
|
+
# but older releases in our supported range do not expose `to_stdlib()`.
|
|
131
|
+
if callable(to_stdlib := getattr(zoned_datetime, "to_stdlib", None)):
|
|
132
|
+
return to_stdlib()
|
|
133
|
+
|
|
134
|
+
return zoned_datetime.py_datetime()
|
|
128
135
|
else:
|
|
129
136
|
return pendulum.now(tz)
|
|
130
137
|
|
|
@@ -15,7 +15,7 @@ Does NOT include: server-specific utilities (`server/utilities/`), concurrency s
|
|
|
15
15
|
- `callables.py` — Function signature introspection and parameter coercion
|
|
16
16
|
- `collections.py` — Extended collection helpers (visit, flatten, remove nested keys)
|
|
17
17
|
- `annotations.py` — Custom Prefect type annotations used in flow/task signatures
|
|
18
|
-
- `processutils.py` — Subprocess execution
|
|
18
|
+
- `processutils.py` — Subprocess execution, output streaming, and command serialization helpers (`run_process`, `consume_process_output`, `stream_text`, `command_to_string`, `command_from_string`)
|
|
19
19
|
- `pydantic.py` — Pydantic v1/v2 compatibility shims
|
|
20
20
|
- `templating.py` — Jinja template utilities and `maybe_template()` detection
|
|
21
21
|
- `filesystem.py` — File filtering (`filter_files`), path normalization, and `tmpchdir` context manager
|
|
@@ -77,3 +77,5 @@ Handlers return `Placeholder` subclasses (e.g. `RemoveValue`, `InvalidJSON`, `In
|
|
|
77
77
|
- **Passing the same key in both an explicit parameter and a `**kwargs` dict raises `TypeError`.** `parameters_to_args_kwargs` detects when a VAR_KEYWORD (`**kwargs`) dict contains a key that also appears as an explicit parameter and raises rather than silently letting the variadic entry win. Exception: POSITIONAL_ONLY parameters are exempt because `fn(1, **{'a': 2})` is legal when `a` is positional-only.
|
|
78
78
|
- **`filter_files` with `include_dirs=True` (the default) always includes all ancestor directories of matched files**, even if those directories weren't directly matched by the ignore patterns. This ensures `shutil.copytree`'s `ignore_func` doesn't skip directories containing files that should be copied. Side effect: callers expecting only pathspec-matched entries will receive additional directory paths. The parent-dir expansion does NOT run when `include_dirs=False`.
|
|
79
79
|
- **Never access `EngineContext.run_results` directly via `id(obj)`.** Always call `get_state_for_result(obj)`.
|
|
80
|
+
- **`command_to_string` always uses POSIX quoting (`shlex.join`), even on Windows.** This is intentional for platform-neutral storage — bundle commands are serialized by one platform and may be deserialized by another. `command_from_string` uses a dual-path approach: if the string was POSIX-serialized by Prefect (round-trips cleanly through `shlex.split`/`shlex.join`), it uses POSIX parsing; otherwise it falls back to native Windows command-line parsing (`CommandLineToArgvW`). Do not use `" ".join(command)` or `shlex.split(command)` directly when working with stored Prefect commands — use these helpers instead.
|
|
81
|
+
- **`get_sys_executable()` no longer quotes the Python path on Windows.** It previously returned `'"path/to/python"'` (with embedded quotes) on Windows; now it returns the raw path. Code relying on the old quoted form (e.g., joining into a shell string) will break — use `subprocess.list2cmdline` or `command_to_string` for shell-safe serialization instead.
|
{prefect_client-3.6.26.dev5 → prefect_client-3.6.27.dev1}/src/prefect/utilities/processutils.py
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import os
|
|
3
|
+
import shlex
|
|
3
4
|
import signal
|
|
4
5
|
import subprocess
|
|
5
6
|
import sys
|
|
@@ -35,9 +36,24 @@ PrintFn: TypeAlias = Callable[[str], object]
|
|
|
35
36
|
T = TypeVar("T", infer_variance=True)
|
|
36
37
|
|
|
37
38
|
if sys.platform == "win32":
|
|
38
|
-
from ctypes import
|
|
39
|
+
from ctypes import (
|
|
40
|
+
POINTER,
|
|
41
|
+
WINFUNCTYPE,
|
|
42
|
+
byref,
|
|
43
|
+
c_int,
|
|
44
|
+
c_uint,
|
|
45
|
+
c_void_p,
|
|
46
|
+
c_wchar_p,
|
|
47
|
+
windll,
|
|
48
|
+
)
|
|
39
49
|
|
|
40
50
|
_windows_process_group_pids = set()
|
|
51
|
+
_command_line_to_argv = windll.shell32.CommandLineToArgvW
|
|
52
|
+
_command_line_to_argv.argtypes = [c_wchar_p, POINTER(c_int)]
|
|
53
|
+
_command_line_to_argv.restype = POINTER(c_wchar_p)
|
|
54
|
+
_local_free = windll.kernel32.LocalFree
|
|
55
|
+
_local_free.argtypes = [c_void_p]
|
|
56
|
+
_local_free.restype = c_void_p
|
|
41
57
|
|
|
42
58
|
@WINFUNCTYPE(c_int, c_uint)
|
|
43
59
|
def _win32_ctrl_handler(dwCtrlType: object) -> int:
|
|
@@ -185,6 +201,65 @@ if sys.platform == "win32":
|
|
|
185
201
|
)
|
|
186
202
|
|
|
187
203
|
|
|
204
|
+
def _parse_prefect_serialized_command(command: str) -> list[str] | None:
|
|
205
|
+
"""Return argv for strings produced by `command_to_string`, if any."""
|
|
206
|
+
try:
|
|
207
|
+
parts = shlex.split(command, posix=True)
|
|
208
|
+
except ValueError:
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
if shlex.join(parts) != command:
|
|
212
|
+
return None
|
|
213
|
+
|
|
214
|
+
return parts
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
if sys.platform == "win32":
|
|
218
|
+
|
|
219
|
+
def _split_windows_command_string(command: str) -> list[str]:
|
|
220
|
+
argc = c_int(0)
|
|
221
|
+
argv = _command_line_to_argv(c_wchar_p(command), byref(argc))
|
|
222
|
+
if not argv:
|
|
223
|
+
raise OSError("CommandLineToArgvW failed to parse command string.")
|
|
224
|
+
try:
|
|
225
|
+
return [argv[index] for index in range(argc.value)]
|
|
226
|
+
finally:
|
|
227
|
+
_local_free(argv)
|
|
228
|
+
|
|
229
|
+
else:
|
|
230
|
+
|
|
231
|
+
def _split_windows_command_string(command: str) -> list[str]:
|
|
232
|
+
# Preserve pre-existing behavior for local tests on non-Windows hosts.
|
|
233
|
+
return shlex.split(command, posix=False)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def command_to_string(command: list[str]) -> str:
|
|
237
|
+
"""
|
|
238
|
+
Serialize a command list to a platform-neutral string.
|
|
239
|
+
|
|
240
|
+
We use POSIX shell quoting so stored commands round-trip across platforms
|
|
241
|
+
when paired with `command_from_string`.
|
|
242
|
+
"""
|
|
243
|
+
return shlex.join(command)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def command_from_string(command: str) -> list[str]:
|
|
247
|
+
"""
|
|
248
|
+
Parse a command string back into argv tokens.
|
|
249
|
+
|
|
250
|
+
Prefect-owned command strings use POSIX shell quoting. Other command
|
|
251
|
+
strings keep native parsing so existing Windows configuration still works.
|
|
252
|
+
"""
|
|
253
|
+
serialized_command = _parse_prefect_serialized_command(command)
|
|
254
|
+
if serialized_command is not None:
|
|
255
|
+
return serialized_command
|
|
256
|
+
|
|
257
|
+
if sys.platform == "win32":
|
|
258
|
+
return _split_windows_command_string(command)
|
|
259
|
+
|
|
260
|
+
return shlex.split(command, posix=True)
|
|
261
|
+
|
|
262
|
+
|
|
188
263
|
@asynccontextmanager
|
|
189
264
|
async def open_process(
|
|
190
265
|
command: list[str], **kwargs: Any
|
|
@@ -206,7 +281,7 @@ async def open_process(
|
|
|
206
281
|
)
|
|
207
282
|
|
|
208
283
|
if sys.platform == "win32":
|
|
209
|
-
command =
|
|
284
|
+
command = subprocess.list2cmdline(command)
|
|
210
285
|
process = await _open_anyio_process(command, **kwargs)
|
|
211
286
|
else:
|
|
212
287
|
process = await anyio.open_process(command, **kwargs)
|
|
@@ -473,10 +548,4 @@ def setup_signal_handlers_worker(
|
|
|
473
548
|
|
|
474
549
|
|
|
475
550
|
def get_sys_executable() -> str:
|
|
476
|
-
|
|
477
|
-
if os.name == "nt":
|
|
478
|
-
executable_path = f'"{sys.executable}"'
|
|
479
|
-
else:
|
|
480
|
-
executable_path = sys.executable
|
|
481
|
-
|
|
482
|
-
return executable_path
|
|
551
|
+
return sys.executable
|
|
@@ -26,6 +26,14 @@ Workers stamp two env vars into `os.environ` for their own process, so all API r
|
|
|
26
26
|
|
|
27
27
|
These are separate from the per-flow-run attribution vars injected into the child process environment by `prepare_for_flow_run(worker_name=..., worker_id=...)`.
|
|
28
28
|
|
|
29
|
+
## Bundle Launcher Override
|
|
30
|
+
|
|
31
|
+
When a flow is decorated with an infrastructure decorator (`@docker`, `@ecs`, `@kubernetes`, etc.) and a `launcher` argument is supplied, `InfrastructureBoundFlow` stores a normalized `BundleLauncherOverride` on `flow.launcher`. `BaseWorker.submit()` extracts this via `getattr(flow, "launcher", None)` and calls `resolve_bundle_step_with_launcher(step, launcher, side)` before converting steps to commands.
|
|
32
|
+
|
|
33
|
+
**Non-obvious:** the launcher replaces the `uv run ...` prefix entirely. With a launcher, the resulting command is `[*launcher, "-m", "<module>", "--key", "<path>"]` rather than `["uv", "run", "--with", "...", "--python", "X.Y", "-m", "<module>", "--key", "<path>"]`. Launchers and `requires` are mutually exclusive — `convert_step_to_command` raises `ValueError` if a step has both.
|
|
34
|
+
|
|
35
|
+
Work-pool-level launchers are configured via `prefect work-pool storage configure s3|gcs|azure --launcher <executable>` and are stored in the step dict itself. Flow-level launchers (via the decorator) are resolved at submit time and win over the work-pool step configuration.
|
|
36
|
+
|
|
29
37
|
## Anti-Patterns
|
|
30
38
|
|
|
31
39
|
- Do not set `PREFECT__WORKER_NAME` / `PREFECT__WORKER_ID` in `os.environ` from outside `BaseWorker` — setup/teardown own this lifecycle.
|