prefect-client 2.18.1__tar.gz → 2.18.3__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-2.18.1/src/prefect_client.egg-info → prefect-client-2.18.3}/PKG-INFO +1 -1
- {prefect-client-2.18.1 → prefect-client-2.18.3}/setup.cfg +2 -4
- prefect-client-2.18.3/src/prefect/automations.py +162 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/orchestration.py +29 -11
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/schemas/objects.py +11 -8
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/engine.py +17 -1
- prefect-client-2.18.3/src/prefect/events/cli/automations.py +324 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/clients.py +3 -2
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/filters.py +1 -1
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/schemas/automations.py +2 -2
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/schemas/deployment_triggers.py +1 -1
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/schemas/events.py +11 -4
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/schemas/labelling.py +1 -1
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/flows.py +14 -11
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/input/run_input.py +3 -1
- prefect-client-2.18.3/src/prefect/new_flow_engine.py +480 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/new_task_engine.py +159 -45
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +1 -1
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/settings.py +21 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/tasks.py +134 -24
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/asyncutils.py +16 -12
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/workers/process.py +2 -1
- {prefect-client-2.18.1 → prefect-client-2.18.3/src/prefect_client.egg-info}/PKG-INFO +1 -1
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect_client.egg-info/SOURCES.txt +1 -0
- prefect-client-2.18.1/src/prefect/events/cli/automations.py +0 -201
- prefect-client-2.18.1/src/prefect/new_flow_engine.py +0 -293
- {prefect-client-2.18.1 → prefect-client-2.18.3}/LICENSE +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/MANIFEST.in +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/README.md +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/requirements-client.txt +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/requirements-dev.txt +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/requirements.txt +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/setup.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/.prefectignore +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/_logging.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/compatibility/experimental.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/_base_model.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/_compat.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/_flags.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/_types.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/annotations/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/annotations/pendulum.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/config_dict.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/field_validator.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_construct.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_copy.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_dump.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_dump_json.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_fields.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_fields_set.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_json_schema.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_rebuild.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_validate.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_validate_json.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/model_validator.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/utilities/type_adapter.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pydantic/v2_validated_func.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/pytz.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/applications.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/background.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/concurrency.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/datastructures.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/dependencies/models.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/dependencies/utils.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/encoders.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/exception_handlers.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/exceptions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/logger.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/middleware/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/middleware/cors.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/middleware/gzip.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/middleware/trustedhost.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/middleware/wsgi.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/openapi/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/openapi/constants.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/openapi/docs.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/openapi/models.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/openapi/utils.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/param_functions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/params.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/requests.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/responses.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/routing.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/security/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/security/api_key.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/security/base.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/security/http.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/security/oauth2.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/security/utils.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/staticfiles.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/templating.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/testclient.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/types.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/utils.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/fastapi/websockets.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/_compat.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/_exception_handler.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/_utils.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/applications.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/authentication.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/background.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/concurrency.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/config.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/convertors.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/datastructures.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/endpoints.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/exceptions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/formparsers.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/authentication.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/base.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/cors.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/errors.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/exceptions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/gzip.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/httpsredirect.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/sessions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/trustedhost.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/middleware/wsgi.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/requests.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/responses.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/routing.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/schemas.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/staticfiles.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/status.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/templating.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/testclient.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/types.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_vendor/starlette/websockets.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/_version.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/agent.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/artifacts.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/blocks/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/blocks/abstract.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/blocks/core.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/blocks/fields.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/blocks/kubernetes.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/blocks/notifications.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/blocks/system.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/blocks/webhook.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/base.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/cloud.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/collections.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/constants.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/schemas/actions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/schemas/filters.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/schemas/responses.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/subscriptions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/client/utilities.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/concurrency/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/concurrency/events.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/concurrency/services.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/concurrency/sync.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/context.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/base.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/deployments.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/runner.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/schedules.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/steps/core.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deprecated/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deprecated/data_documents.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deprecated/packaging/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deprecated/packaging/base.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deprecated/packaging/docker.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deprecated/packaging/file.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deprecated/packaging/orion.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/deprecated/packaging/serializers.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/actions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/cli/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/instrument.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/related.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/utilities.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/events/worker.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/exceptions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/filesystems.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/flow_runs.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/futures.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/base.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/container.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/kubernetes.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/process.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/input/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/input/actions.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/logging/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/logging/configuration.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/logging/filters.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/logging/formatters.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/logging/handlers.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/logging/highlighters.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/logging/loggers.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/logging/logging.yml +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/manifests.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/plugins.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/profiles.toml +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/py.typed +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/pydantic/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/pydantic/main.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/results.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runner/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runner/runner.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runner/server.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runner/storage.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runner/submit.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runner/utils.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runtime/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runtime/deployment.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runtime/flow_run.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/runtime/task_run.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/serializers.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/software/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/software/base.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/software/conda.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/software/pip.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/software/python.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/states.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/task_engine.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/task_runners.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/task_server.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/types/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/annotations.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/callables.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/collections.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/compat.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/context.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/dispatch.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/engine.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/filesystem.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/hashing.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/importtools.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/math.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/names.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/processutils.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/pydantic.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/services.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/slugify.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/templating.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/text.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/utilities/visualization.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/variables.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/workers/__init__.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/workers/base.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/workers/block.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/workers/server.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect/workers/utilities.py +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect_client.egg-info/dependency_links.txt +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect_client.egg-info/requires.txt +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/src/prefect_client.egg-info/top_level.txt +0 -0
- {prefect-client-2.18.1 → prefect-client-2.18.3}/versioneer.py +0 -0
@@ -56,10 +56,8 @@ filterwarnings =
|
|
56
56
|
[mypy]
|
57
57
|
plugins =
|
58
58
|
pydantic.mypy
|
59
|
-
|
60
|
-
|
61
|
-
src/prefect/events/,
|
62
|
-
src/prefect/input/
|
59
|
+
ignore_missing_imports = True
|
60
|
+
follow_imports = skip
|
63
61
|
|
64
62
|
[mypy-ruamel]
|
65
63
|
ignore_missing_imports = True
|
@@ -0,0 +1,162 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
from uuid import UUID
|
3
|
+
|
4
|
+
from pydantic import Field
|
5
|
+
from typing_extensions import Self
|
6
|
+
|
7
|
+
from prefect.client.utilities import get_or_create_client
|
8
|
+
from prefect.events.schemas.automations import (
|
9
|
+
AutomationCore,
|
10
|
+
CompositeTrigger,
|
11
|
+
CompoundTrigger,
|
12
|
+
EventTrigger,
|
13
|
+
MetricTrigger,
|
14
|
+
MetricTriggerOperator,
|
15
|
+
MetricTriggerQuery,
|
16
|
+
Posture,
|
17
|
+
PrefectMetric,
|
18
|
+
ResourceSpecification,
|
19
|
+
ResourceTrigger,
|
20
|
+
SequenceTrigger,
|
21
|
+
Trigger,
|
22
|
+
)
|
23
|
+
from prefect.exceptions import PrefectHTTPStatusError
|
24
|
+
from prefect.utilities.asyncutils import sync_compatible
|
25
|
+
|
26
|
+
__all__ = [
|
27
|
+
"AutomationCore",
|
28
|
+
"EventTrigger",
|
29
|
+
"ResourceTrigger",
|
30
|
+
"Posture",
|
31
|
+
"Trigger",
|
32
|
+
"ResourceSpecification",
|
33
|
+
"MetricTriggerOperator",
|
34
|
+
"MetricTrigger",
|
35
|
+
"PrefectMetric",
|
36
|
+
"CompositeTrigger",
|
37
|
+
"SequenceTrigger",
|
38
|
+
"CompoundTrigger",
|
39
|
+
"MetricTriggerQuery",
|
40
|
+
]
|
41
|
+
|
42
|
+
|
43
|
+
class Automation(AutomationCore):
|
44
|
+
id: Optional[UUID] = Field(default=None, description="The ID of this automation")
|
45
|
+
|
46
|
+
@sync_compatible
|
47
|
+
async def create(self: Self) -> Self:
|
48
|
+
"""
|
49
|
+
Create a new automation.
|
50
|
+
|
51
|
+
auto_to_create = Automation(
|
52
|
+
name="woodchonk",
|
53
|
+
trigger=EventTrigger(
|
54
|
+
expect={"animal.walked"},
|
55
|
+
match={
|
56
|
+
"genus": "Marmota",
|
57
|
+
"species": "monax",
|
58
|
+
},
|
59
|
+
posture="Reactive",
|
60
|
+
threshold=3,
|
61
|
+
within=timedelta(seconds=10),
|
62
|
+
),
|
63
|
+
actions=[CancelFlowRun()]
|
64
|
+
)
|
65
|
+
created_automation = auto_to_create.create()
|
66
|
+
"""
|
67
|
+
client, _ = get_or_create_client()
|
68
|
+
automation = AutomationCore(**self.dict(exclude={"id"}))
|
69
|
+
self.id = await client.create_automation(automation=automation)
|
70
|
+
return self
|
71
|
+
|
72
|
+
@sync_compatible
|
73
|
+
async def update(self: Self):
|
74
|
+
"""
|
75
|
+
Updates an existing automation.
|
76
|
+
auto = Automation.read(id=123)
|
77
|
+
auto.name = "new name"
|
78
|
+
auto.update()
|
79
|
+
"""
|
80
|
+
|
81
|
+
client, _ = get_or_create_client()
|
82
|
+
automation = AutomationCore(**self.dict(exclude={"id", "owner_resource"}))
|
83
|
+
await client.update_automation(automation_id=self.id, automation=automation)
|
84
|
+
|
85
|
+
@classmethod
|
86
|
+
@sync_compatible
|
87
|
+
async def read(
|
88
|
+
cls: Self, id: Optional[UUID] = None, name: Optional[str] = None
|
89
|
+
) -> Self:
|
90
|
+
"""
|
91
|
+
Read an automation by ID or name.
|
92
|
+
automation = Automation.read(name="woodchonk")
|
93
|
+
|
94
|
+
or
|
95
|
+
|
96
|
+
automation = Automation.read(id=UUID("b3514963-02b1-47a5-93d1-6eeb131041cb"))
|
97
|
+
"""
|
98
|
+
if id and name:
|
99
|
+
raise ValueError("Only one of id or name can be provided")
|
100
|
+
if not id and not name:
|
101
|
+
raise ValueError("One of id or name must be provided")
|
102
|
+
client, _ = get_or_create_client()
|
103
|
+
if id:
|
104
|
+
try:
|
105
|
+
automation = await client.read_automation(automation_id=id)
|
106
|
+
except PrefectHTTPStatusError as exc:
|
107
|
+
if exc.response.status_code == 404:
|
108
|
+
raise ValueError(f"Automation with ID {id!r} not found")
|
109
|
+
return Automation(**automation.dict())
|
110
|
+
else:
|
111
|
+
automation = await client.read_automations_by_name(name=name)
|
112
|
+
if len(automation) > 0:
|
113
|
+
return Automation(**automation[0].dict()) if automation else None
|
114
|
+
else:
|
115
|
+
raise ValueError(f"Automation with name {name!r} not found")
|
116
|
+
|
117
|
+
@sync_compatible
|
118
|
+
async def delete(self: Self) -> bool:
|
119
|
+
"""
|
120
|
+
auto = Automation.read(id = 123)
|
121
|
+
auto.delete()
|
122
|
+
"""
|
123
|
+
try:
|
124
|
+
client, _ = get_or_create_client()
|
125
|
+
await client.delete_automation(self.id)
|
126
|
+
return True
|
127
|
+
except PrefectHTTPStatusError as exc:
|
128
|
+
if exc.response.status_code == 404:
|
129
|
+
return False
|
130
|
+
raise
|
131
|
+
|
132
|
+
@sync_compatible
|
133
|
+
async def disable(self: Self) -> bool:
|
134
|
+
"""
|
135
|
+
Disable an automation.
|
136
|
+
auto = Automation.read(id = 123)
|
137
|
+
auto.disable()
|
138
|
+
"""
|
139
|
+
try:
|
140
|
+
client, _ = get_or_create_client()
|
141
|
+
await client.pause_automation(self.id)
|
142
|
+
return True
|
143
|
+
except PrefectHTTPStatusError as exc:
|
144
|
+
if exc.response.status_code == 404:
|
145
|
+
return False
|
146
|
+
raise
|
147
|
+
|
148
|
+
@sync_compatible
|
149
|
+
async def enable(self: Self) -> bool:
|
150
|
+
"""
|
151
|
+
Enable an automation.
|
152
|
+
auto = Automation.read(id = 123)
|
153
|
+
auto.enable()
|
154
|
+
"""
|
155
|
+
try:
|
156
|
+
client, _ = get_or_create_client()
|
157
|
+
await client.resume_automation("asd")
|
158
|
+
return True
|
159
|
+
except PrefectHTTPStatusError as exc:
|
160
|
+
if exc.response.status_code == 404:
|
161
|
+
return False
|
162
|
+
raise
|
@@ -623,12 +623,12 @@ class PrefectClient:
|
|
623
623
|
async def create_flow_run(
|
624
624
|
self,
|
625
625
|
flow: "FlowObject",
|
626
|
-
name: str = None,
|
626
|
+
name: Optional[str] = None,
|
627
627
|
parameters: Optional[Dict[str, Any]] = None,
|
628
628
|
context: Optional[Dict[str, Any]] = None,
|
629
|
-
tags: Iterable[str] = None,
|
630
|
-
parent_task_run_id: UUID = None,
|
631
|
-
state: "prefect.states.State" = None,
|
629
|
+
tags: Optional[Iterable[str]] = None,
|
630
|
+
parent_task_run_id: Optional[UUID] = None,
|
631
|
+
state: Optional["prefect.states.State"] = None,
|
632
632
|
) -> FlowRun:
|
633
633
|
"""
|
634
634
|
Create a flow run for a flow.
|
@@ -3161,6 +3161,16 @@ class PrefectClient:
|
|
3161
3161
|
|
3162
3162
|
return UUID(response.json()["id"])
|
3163
3163
|
|
3164
|
+
async def update_automation(self, automation_id: UUID, automation: AutomationCore):
|
3165
|
+
"""Updates an automation in Prefect Cloud."""
|
3166
|
+
if not self.server_type.supports_automations():
|
3167
|
+
self._raise_for_unsupported_automations()
|
3168
|
+
response = await self._client.put(
|
3169
|
+
f"/automations/{automation_id}",
|
3170
|
+
json=automation.dict(json_compatible=True, exclude_unset=True),
|
3171
|
+
)
|
3172
|
+
response.raise_for_status
|
3173
|
+
|
3164
3174
|
async def read_automations(self) -> List[Automation]:
|
3165
3175
|
if not self.server_type.supports_automations():
|
3166
3176
|
self._raise_for_unsupported_automations()
|
@@ -3169,16 +3179,24 @@ class PrefectClient:
|
|
3169
3179
|
response.raise_for_status()
|
3170
3180
|
return pydantic.parse_obj_as(List[Automation], response.json())
|
3171
3181
|
|
3172
|
-
async def find_automation(
|
3173
|
-
|
3174
|
-
|
3175
|
-
|
3176
|
-
|
3182
|
+
async def find_automation(
|
3183
|
+
self, id_or_name: Union[str, UUID], exit_if_not_found: bool = True
|
3184
|
+
) -> Optional[Automation]:
|
3185
|
+
if isinstance(id_or_name, str):
|
3186
|
+
try:
|
3187
|
+
id = UUID(id_or_name)
|
3188
|
+
except ValueError:
|
3189
|
+
id = None
|
3190
|
+
elif isinstance(id_or_name, UUID):
|
3191
|
+
id = id_or_name
|
3177
3192
|
|
3178
3193
|
if id:
|
3179
|
-
|
3180
|
-
|
3194
|
+
try:
|
3195
|
+
automation = await self.read_automation(id)
|
3181
3196
|
return automation
|
3197
|
+
except prefect.exceptions.HTTPStatusError as e:
|
3198
|
+
if e.response.status_code == status.HTTP_404_NOT_FOUND:
|
3199
|
+
raise prefect.exceptions.ObjectNotFound(http_exc=e) from e
|
3182
3200
|
|
3183
3201
|
automations = await self.read_automations()
|
3184
3202
|
|
@@ -53,6 +53,7 @@ if TYPE_CHECKING:
|
|
53
53
|
from prefect.deprecated.data_documents import DataDocument
|
54
54
|
from prefect.results import BaseResult
|
55
55
|
|
56
|
+
|
56
57
|
R = TypeVar("R")
|
57
58
|
|
58
59
|
|
@@ -120,20 +121,20 @@ class WorkQueueStatus(AutoEnum):
|
|
120
121
|
|
121
122
|
|
122
123
|
class StateDetails(PrefectBaseModel):
|
123
|
-
flow_run_id: UUID = None
|
124
|
-
task_run_id: UUID = None
|
124
|
+
flow_run_id: Optional[UUID] = None
|
125
|
+
task_run_id: Optional[UUID] = None
|
125
126
|
# for task runs that represent subflows, the subflow's run ID
|
126
|
-
child_flow_run_id: UUID = None
|
127
|
+
child_flow_run_id: Optional[UUID] = None
|
127
128
|
scheduled_time: DateTimeTZ = None
|
128
|
-
cache_key: str = None
|
129
|
+
cache_key: Optional[str] = None
|
129
130
|
cache_expiration: DateTimeTZ = None
|
130
131
|
untrackable_result: bool = False
|
131
132
|
pause_timeout: DateTimeTZ = None
|
132
133
|
pause_reschedule: bool = False
|
133
|
-
pause_key: str = None
|
134
|
+
pause_key: Optional[str] = None
|
134
135
|
run_input_keyset: Optional[Dict[str, str]] = None
|
135
|
-
refresh_cache: bool = None
|
136
|
-
retriable: bool = None
|
136
|
+
refresh_cache: Optional[bool] = None
|
137
|
+
retriable: Optional[bool] = None
|
137
138
|
transition_id: Optional[UUID] = None
|
138
139
|
task_parameters_id: Optional[UUID] = None
|
139
140
|
|
@@ -160,7 +161,9 @@ class State(ObjectBaseModel, Generic[R]):
|
|
160
161
|
def result(self: "State[R]", raise_on_failure: bool = False) -> Union[R, Exception]:
|
161
162
|
...
|
162
163
|
|
163
|
-
def result(
|
164
|
+
def result(
|
165
|
+
self, raise_on_failure: bool = True, fetch: Optional[bool] = None
|
166
|
+
) -> Union[R, Exception]:
|
164
167
|
"""
|
165
168
|
Retrieve the result attached to this state.
|
166
169
|
|
@@ -163,6 +163,7 @@ from prefect.logging.loggers import (
|
|
163
163
|
from prefect.results import ResultFactory, UnknownResult
|
164
164
|
from prefect.settings import (
|
165
165
|
PREFECT_DEBUG_MODE,
|
166
|
+
PREFECT_EXPERIMENTAL_ENABLE_NEW_ENGINE,
|
166
167
|
PREFECT_TASK_INTROSPECTION_WARN_THRESHOLD,
|
167
168
|
PREFECT_TASKS_REFRESH_CACHE,
|
168
169
|
PREFECT_UI_URL,
|
@@ -189,6 +190,7 @@ from prefect.utilities.annotations import allow_failure, quote, unmapped
|
|
189
190
|
from prefect.utilities.asyncutils import (
|
190
191
|
gather,
|
191
192
|
is_async_fn,
|
193
|
+
run_sync,
|
192
194
|
sync_compatible,
|
193
195
|
)
|
194
196
|
from prefect.utilities.callables import (
|
@@ -2433,7 +2435,21 @@ if __name__ == "__main__":
|
|
2433
2435
|
exit(1)
|
2434
2436
|
|
2435
2437
|
try:
|
2436
|
-
|
2438
|
+
if PREFECT_EXPERIMENTAL_ENABLE_NEW_ENGINE.value():
|
2439
|
+
from prefect.new_flow_engine import (
|
2440
|
+
load_flow_and_flow_run,
|
2441
|
+
run_flow,
|
2442
|
+
run_flow_sync,
|
2443
|
+
)
|
2444
|
+
|
2445
|
+
flow_run, flow = run_sync(load_flow_and_flow_run)
|
2446
|
+
# run the flow
|
2447
|
+
if flow.isasync:
|
2448
|
+
run_sync(run_flow(flow, flow_run=flow_run))
|
2449
|
+
else:
|
2450
|
+
run_flow_sync(flow, flow_run=flow_run)
|
2451
|
+
else:
|
2452
|
+
enter_flow_run_engine_from_subprocess(flow_run_id)
|
2437
2453
|
except Abort as exc:
|
2438
2454
|
engine_logger.info(
|
2439
2455
|
f"Engine execution of flow run '{flow_run_id}' aborted by orchestrator:"
|
@@ -0,0 +1,324 @@
|
|
1
|
+
"""
|
2
|
+
Command line interface for working with automations.
|
3
|
+
"""
|
4
|
+
|
5
|
+
import functools
|
6
|
+
from typing import Optional
|
7
|
+
from uuid import UUID
|
8
|
+
|
9
|
+
import orjson
|
10
|
+
import typer
|
11
|
+
import yaml as pyyaml
|
12
|
+
from rich.pretty import Pretty
|
13
|
+
from rich.table import Table
|
14
|
+
from rich.text import Text
|
15
|
+
|
16
|
+
from prefect.cli._types import PrefectTyper
|
17
|
+
from prefect.cli._utilities import exit_with_error, exit_with_success
|
18
|
+
from prefect.cli.root import app
|
19
|
+
from prefect.client.orchestration import get_client
|
20
|
+
from prefect.events.schemas.automations import Automation
|
21
|
+
from prefect.exceptions import PrefectHTTPStatusError
|
22
|
+
|
23
|
+
automations_app = PrefectTyper(
|
24
|
+
name="automation",
|
25
|
+
help="Commands for managing automations.",
|
26
|
+
)
|
27
|
+
app.add_typer(automations_app, aliases=["automations"])
|
28
|
+
|
29
|
+
|
30
|
+
def requires_automations(func):
|
31
|
+
@functools.wraps(func)
|
32
|
+
async def wrapper(*args, **kwargs):
|
33
|
+
try:
|
34
|
+
return await func(*args, **kwargs)
|
35
|
+
except RuntimeError as exc:
|
36
|
+
if "Enable experimental" in str(exc):
|
37
|
+
exit_with_error(str(exc))
|
38
|
+
raise
|
39
|
+
|
40
|
+
return wrapper
|
41
|
+
|
42
|
+
|
43
|
+
@automations_app.command()
|
44
|
+
@requires_automations
|
45
|
+
async def ls():
|
46
|
+
"""List all automations."""
|
47
|
+
async with get_client() as client:
|
48
|
+
automations = await client.read_automations()
|
49
|
+
|
50
|
+
table = Table(title="Automations", show_lines=True)
|
51
|
+
|
52
|
+
table.add_column("Automation")
|
53
|
+
table.add_column("Enabled")
|
54
|
+
table.add_column("Trigger")
|
55
|
+
table.add_column("Actions")
|
56
|
+
|
57
|
+
for automation in automations:
|
58
|
+
identifier_column = Text()
|
59
|
+
|
60
|
+
identifier_column.append(automation.name, style="white bold")
|
61
|
+
identifier_column.append("\n")
|
62
|
+
|
63
|
+
identifier_column.append(str(automation.id), style="cyan")
|
64
|
+
identifier_column.append("\n")
|
65
|
+
|
66
|
+
if automation.description:
|
67
|
+
identifier_column.append(automation.description, style="white")
|
68
|
+
identifier_column.append("\n")
|
69
|
+
|
70
|
+
if automation.actions_on_trigger or automation.actions_on_resolve:
|
71
|
+
actions = (
|
72
|
+
[
|
73
|
+
f"(trigger) {action.describe_for_cli()}"
|
74
|
+
for action in automation.actions
|
75
|
+
]
|
76
|
+
+ [
|
77
|
+
f"(trigger) {action.describe_for_cli()}"
|
78
|
+
for action in automation.actions_on_trigger
|
79
|
+
]
|
80
|
+
+ [
|
81
|
+
f"(resolve) {action.describe_for_cli()}"
|
82
|
+
for action in automation.actions
|
83
|
+
]
|
84
|
+
+ [
|
85
|
+
f"(resolve) {action.describe_for_cli()}"
|
86
|
+
for action in automation.actions_on_resolve
|
87
|
+
]
|
88
|
+
)
|
89
|
+
else:
|
90
|
+
actions = [action.describe_for_cli() for action in automation.actions]
|
91
|
+
|
92
|
+
table.add_row(
|
93
|
+
identifier_column,
|
94
|
+
str(automation.enabled),
|
95
|
+
automation.trigger.describe_for_cli(),
|
96
|
+
"\n".join(actions),
|
97
|
+
)
|
98
|
+
|
99
|
+
app.console.print(table)
|
100
|
+
|
101
|
+
|
102
|
+
@automations_app.command()
|
103
|
+
@requires_automations
|
104
|
+
async def inspect(
|
105
|
+
name: Optional[str] = typer.Argument(None, help="An automation's name"),
|
106
|
+
id: Optional[str] = typer.Option(None, "--id", help="An automation's id"),
|
107
|
+
yaml: bool = typer.Option(False, "--yaml", help="Output as YAML"),
|
108
|
+
json: bool = typer.Option(False, "--json", help="Output as JSON"),
|
109
|
+
):
|
110
|
+
"""
|
111
|
+
Inspect an automation.
|
112
|
+
|
113
|
+
Arguments:
|
114
|
+
|
115
|
+
name: the name of the automation to inspect
|
116
|
+
|
117
|
+
id: the id of the automation to inspect
|
118
|
+
|
119
|
+
yaml: output as YAML
|
120
|
+
|
121
|
+
json: output as JSON
|
122
|
+
|
123
|
+
Examples:
|
124
|
+
|
125
|
+
$ prefect automation inspect "my-automation"
|
126
|
+
|
127
|
+
$ prefect automation inspect --id "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
|
128
|
+
|
129
|
+
$ prefect automation inspect "my-automation" --yaml
|
130
|
+
|
131
|
+
$ prefect automation inspect "my-automation" --json
|
132
|
+
"""
|
133
|
+
if not id and not name:
|
134
|
+
exit_with_error("Please provide either a name or an id.")
|
135
|
+
|
136
|
+
if name:
|
137
|
+
async with get_client() as client:
|
138
|
+
automation = await client.read_automations_by_name(name=name)
|
139
|
+
if not automation:
|
140
|
+
exit_with_error(f"Automation {name!r} not found.")
|
141
|
+
|
142
|
+
elif id:
|
143
|
+
async with get_client() as client:
|
144
|
+
try:
|
145
|
+
uuid_id = UUID(id)
|
146
|
+
automation = await client.read_automation(uuid_id)
|
147
|
+
except (PrefectHTTPStatusError, ValueError):
|
148
|
+
exit_with_error(f"Automation with id {id!r} not found.")
|
149
|
+
|
150
|
+
if yaml or json:
|
151
|
+
if isinstance(automation, list):
|
152
|
+
automation = [a.dict(json_compatible=True) for a in automation]
|
153
|
+
elif isinstance(automation, Automation):
|
154
|
+
automation = automation.dict(json_compatible=True)
|
155
|
+
if yaml:
|
156
|
+
app.console.print(pyyaml.dump(automation, sort_keys=False))
|
157
|
+
elif json:
|
158
|
+
app.console.print(
|
159
|
+
orjson.dumps(automation, option=orjson.OPT_INDENT_2).decode()
|
160
|
+
)
|
161
|
+
else:
|
162
|
+
app.console.print(Pretty(automation))
|
163
|
+
|
164
|
+
|
165
|
+
@automations_app.command(aliases=["enable"])
|
166
|
+
@requires_automations
|
167
|
+
async def resume(
|
168
|
+
name: Optional[str] = typer.Argument(None, help="An automation's name"),
|
169
|
+
id: Optional[str] = typer.Option(None, "--id", help="An automation's id"),
|
170
|
+
):
|
171
|
+
"""
|
172
|
+
Resume an automation.
|
173
|
+
|
174
|
+
Arguments:
|
175
|
+
|
176
|
+
name: the name of the automation to resume
|
177
|
+
|
178
|
+
id: the id of the automation to resume
|
179
|
+
|
180
|
+
Examples:
|
181
|
+
|
182
|
+
$ prefect automation resume "my-automation"
|
183
|
+
|
184
|
+
$ prefect automation resume --id "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
|
185
|
+
"""
|
186
|
+
if not id and not name:
|
187
|
+
exit_with_error("Please provide either a name or an id.")
|
188
|
+
|
189
|
+
if name:
|
190
|
+
async with get_client() as client:
|
191
|
+
automation = await client.read_automations_by_name(name=name)
|
192
|
+
if not automation:
|
193
|
+
exit_with_error(
|
194
|
+
f"Automation with name {name!r} not found. You can also specify an id with the `--id` flag."
|
195
|
+
)
|
196
|
+
if len(automation) > 1:
|
197
|
+
if not typer.confirm(
|
198
|
+
f"Multiple automations found with name {name!r}. Do you want to resume all of them?",
|
199
|
+
default=False,
|
200
|
+
):
|
201
|
+
exit_with_error("Resume aborted.")
|
202
|
+
|
203
|
+
for a in automation:
|
204
|
+
await client.resume_automation(a.id)
|
205
|
+
exit_with_success(
|
206
|
+
f"Resumed automation(s) with name {name!r} and id(s) {', '.join([repr(str(a.id)) for a in automation])}."
|
207
|
+
)
|
208
|
+
|
209
|
+
elif id:
|
210
|
+
async with get_client() as client:
|
211
|
+
try:
|
212
|
+
uuid_id = UUID(id)
|
213
|
+
automation = await client.read_automation(uuid_id)
|
214
|
+
except (PrefectHTTPStatusError, ValueError):
|
215
|
+
exit_with_error(f"Automation with id {id!r} not found.")
|
216
|
+
await client.resume_automation(automation.id)
|
217
|
+
exit_with_success(f"Resumed automation with id {str(automation.id)!r}.")
|
218
|
+
|
219
|
+
|
220
|
+
@automations_app.command(aliases=["disable"])
|
221
|
+
@requires_automations
|
222
|
+
async def pause(
|
223
|
+
name: Optional[str] = typer.Argument(None, help="An automation's name"),
|
224
|
+
id: Optional[str] = typer.Option(None, "--id", help="An automation's id"),
|
225
|
+
):
|
226
|
+
"""
|
227
|
+
Pause an automation.
|
228
|
+
|
229
|
+
Arguments:
|
230
|
+
|
231
|
+
name: the name of the automation to pause
|
232
|
+
|
233
|
+
id: the id of the automation to pause
|
234
|
+
|
235
|
+
Examples:
|
236
|
+
|
237
|
+
$ prefect automation pause "my-automation"
|
238
|
+
|
239
|
+
$ prefect automation pause --id "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
|
240
|
+
"""
|
241
|
+
if not id and not name:
|
242
|
+
exit_with_error("Please provide either a name or an id.")
|
243
|
+
|
244
|
+
if name:
|
245
|
+
async with get_client() as client:
|
246
|
+
automation = await client.read_automations_by_name(name=name)
|
247
|
+
if not automation:
|
248
|
+
exit_with_error(
|
249
|
+
f"Automation with name {name!r} not found. You can also specify an id with the `--id` flag."
|
250
|
+
)
|
251
|
+
if len(automation) > 1:
|
252
|
+
if not typer.confirm(
|
253
|
+
f"Multiple automations found with name {name!r}. Do you want to pause all of them?",
|
254
|
+
default=False,
|
255
|
+
):
|
256
|
+
exit_with_error("Pause aborted.")
|
257
|
+
|
258
|
+
for a in automation:
|
259
|
+
await client.pause_automation(a.id)
|
260
|
+
exit_with_success(
|
261
|
+
f"Paused automation(s) with name {name!r} and id(s) {', '.join([repr(str(a.id)) for a in automation])}."
|
262
|
+
)
|
263
|
+
|
264
|
+
elif id:
|
265
|
+
async with get_client() as client:
|
266
|
+
try:
|
267
|
+
uuid_id = UUID(id)
|
268
|
+
automation = await client.read_automation(uuid_id)
|
269
|
+
except (PrefectHTTPStatusError, ValueError):
|
270
|
+
exit_with_error(f"Automation with id {id!r} not found.")
|
271
|
+
await client.pause_automation(automation.id)
|
272
|
+
exit_with_success(f"Paused automation with id {str(automation.id)!r}.")
|
273
|
+
|
274
|
+
|
275
|
+
@automations_app.command()
|
276
|
+
@requires_automations
|
277
|
+
async def delete(
|
278
|
+
name: Optional[str] = typer.Argument(None, help="An automation's name"),
|
279
|
+
id: Optional[str] = typer.Option(None, "--id", help="An automation's id"),
|
280
|
+
):
|
281
|
+
"""Delete an automation.
|
282
|
+
|
283
|
+
Arguments:
|
284
|
+
name: the name of the automation to delete
|
285
|
+
id: the id of the automation to delete
|
286
|
+
|
287
|
+
Examples:
|
288
|
+
$ prefect automation delete "my-automation"
|
289
|
+
$ prefect automation delete --id "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
|
290
|
+
"""
|
291
|
+
|
292
|
+
async with get_client() as client:
|
293
|
+
if not id and not name:
|
294
|
+
exit_with_error("Please provide either a name or an id.")
|
295
|
+
|
296
|
+
if id:
|
297
|
+
automation = await client.read_automation(id)
|
298
|
+
if not automation:
|
299
|
+
exit_with_error(f"Automation with id {id!r} not found.")
|
300
|
+
if not typer.confirm(
|
301
|
+
(f"Are you sure you want to delete automation with id {id!r}?"),
|
302
|
+
default=False,
|
303
|
+
):
|
304
|
+
exit_with_error("Deletion aborted.")
|
305
|
+
await client.delete_automation(id)
|
306
|
+
exit_with_success(f"Deleted automation with id {id!r}")
|
307
|
+
|
308
|
+
elif name:
|
309
|
+
automation = await client.read_automations_by_name(name=name)
|
310
|
+
if not automation:
|
311
|
+
exit_with_error(
|
312
|
+
f"Automation {name!r} not found. You can also specify an id with the `--id` flag."
|
313
|
+
)
|
314
|
+
elif len(automation) > 1:
|
315
|
+
exit_with_error(
|
316
|
+
f"Multiple automations found with name {name!r}. Please specify an id with the `--id` flag instead."
|
317
|
+
)
|
318
|
+
if not typer.confirm(
|
319
|
+
(f"Are you sure you want to delete automation with name {name!r}?"),
|
320
|
+
default=False,
|
321
|
+
):
|
322
|
+
exit_with_error("Deletion aborted.")
|
323
|
+
await client.delete_automation(automation[0].id)
|
324
|
+
exit_with_success(f"Deleted automation with name {name!r}")
|
@@ -11,6 +11,7 @@ from typing import (
|
|
11
11
|
Optional,
|
12
12
|
Tuple,
|
13
13
|
Type,
|
14
|
+
cast,
|
14
15
|
)
|
15
16
|
from uuid import UUID
|
16
17
|
|
@@ -377,7 +378,7 @@ SEEN_EVENTS_TTL = 120
|
|
377
378
|
|
378
379
|
class PrefectEventSubscriber:
|
379
380
|
"""
|
380
|
-
Subscribes to a Prefect
|
381
|
+
Subscribes to a Prefect event stream, yielding events as they occur.
|
381
382
|
|
382
383
|
Example:
|
383
384
|
|
@@ -412,7 +413,7 @@ class PrefectEventSubscriber:
|
|
412
413
|
the client should attempt to reconnect
|
413
414
|
"""
|
414
415
|
if not api_url:
|
415
|
-
api_url = PREFECT_API_URL.value()
|
416
|
+
api_url = cast(str, PREFECT_API_URL.value())
|
416
417
|
self._api_key = None
|
417
418
|
|
418
419
|
from prefect.events.filters import EventFilter
|
@@ -43,7 +43,7 @@ class AutomationFilter(PrefectBaseModel):
|
|
43
43
|
)
|
44
44
|
|
45
45
|
|
46
|
-
class EventDataFilter(PrefectBaseModel, extra="forbid"):
|
46
|
+
class EventDataFilter(PrefectBaseModel, extra="forbid"): # type: ignore[call-arg]
|
47
47
|
"""A base class for filtering event data."""
|
48
48
|
|
49
49
|
_top_level_filter: "EventFilter | None" = PrivateAttr(None)
|