hatchet-sdk 0.47.1__py3-none-any.whl → 1.0.0a1__py3-none-any.whl
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.
Potentially problematic release.
This version of hatchet-sdk might be problematic. Click here for more details.
- hatchet_sdk/__init__.py +45 -25
- hatchet_sdk/client.py +19 -94
- hatchet_sdk/clients/admin.py +309 -389
- hatchet_sdk/clients/dispatcher/action_listener.py +131 -109
- hatchet_sdk/clients/dispatcher/dispatcher.py +39 -37
- hatchet_sdk/clients/durable_event_listener.py +327 -0
- hatchet_sdk/clients/event_ts.py +23 -10
- hatchet_sdk/clients/events.py +96 -99
- hatchet_sdk/clients/rest/__init__.py +35 -0
- hatchet_sdk/clients/rest/api/__init__.py +2 -0
- hatchet_sdk/clients/rest/api/log_api.py +258 -0
- hatchet_sdk/clients/rest/api/task_api.py +2200 -0
- hatchet_sdk/clients/rest/api/workflow_runs_api.py +1274 -116
- hatchet_sdk/clients/rest/api_client.py +1 -1
- hatchet_sdk/clients/rest/configuration.py +8 -1
- hatchet_sdk/clients/rest/exceptions.py +21 -0
- hatchet_sdk/clients/rest/models/__init__.py +33 -0
- hatchet_sdk/clients/rest/models/tenant.py +4 -0
- hatchet_sdk/clients/rest/models/tenant_version.py +37 -0
- hatchet_sdk/clients/rest/models/update_tenant_request.py +7 -0
- hatchet_sdk/clients/rest/models/v1_cancel_task_request.py +104 -0
- hatchet_sdk/clients/rest/models/v1_dag_children.py +102 -0
- hatchet_sdk/clients/rest/models/v1_log_line.py +94 -0
- hatchet_sdk/clients/rest/models/v1_log_line_level.py +39 -0
- hatchet_sdk/clients/rest/models/v1_log_line_list.py +110 -0
- hatchet_sdk/clients/rest/models/v1_replay_task_request.py +104 -0
- hatchet_sdk/clients/rest/models/v1_task.py +174 -0
- hatchet_sdk/clients/rest/models/v1_task_event.py +118 -0
- hatchet_sdk/clients/rest/models/v1_task_event_list.py +110 -0
- hatchet_sdk/clients/rest/models/v1_task_event_type.py +55 -0
- hatchet_sdk/clients/rest/models/v1_task_filter.py +106 -0
- hatchet_sdk/clients/rest/models/v1_task_point_metric.py +92 -0
- hatchet_sdk/clients/rest/models/v1_task_point_metrics.py +100 -0
- hatchet_sdk/clients/rest/models/v1_task_run_metric.py +88 -0
- hatchet_sdk/clients/rest/models/v1_task_run_status.py +40 -0
- hatchet_sdk/clients/rest/models/v1_task_status.py +40 -0
- hatchet_sdk/clients/rest/models/v1_task_summary.py +228 -0
- hatchet_sdk/clients/rest/models/v1_task_summary_list.py +110 -0
- hatchet_sdk/clients/rest/models/v1_trigger_workflow_run_request.py +95 -0
- hatchet_sdk/clients/rest/models/v1_workflow_run.py +171 -0
- hatchet_sdk/clients/rest/models/v1_workflow_run_details.py +145 -0
- hatchet_sdk/clients/rest/models/v1_workflow_run_display_name.py +98 -0
- hatchet_sdk/clients/rest/models/v1_workflow_run_display_name_list.py +114 -0
- hatchet_sdk/clients/rest/models/v1_workflow_type.py +37 -0
- hatchet_sdk/clients/rest/models/workflow_run_shape_item_for_workflow_run_details.py +104 -0
- hatchet_sdk/clients/rest/rest.py +37 -26
- hatchet_sdk/clients/rest/tenacity_utils.py +1 -1
- hatchet_sdk/clients/rest_client.py +153 -116
- hatchet_sdk/clients/run_event_listener.py +65 -60
- hatchet_sdk/clients/workflow_listener.py +75 -66
- hatchet_sdk/config.py +117 -0
- hatchet_sdk/connection.py +27 -13
- hatchet_sdk/context/__init__.py +0 -1
- hatchet_sdk/context/context.py +118 -280
- hatchet_sdk/contracts/dispatcher_pb2_grpc.py +1 -1
- hatchet_sdk/contracts/events_pb2.py +2 -2
- hatchet_sdk/contracts/events_pb2_grpc.py +1 -1
- hatchet_sdk/contracts/v1/dispatcher_pb2.py +36 -0
- hatchet_sdk/contracts/v1/dispatcher_pb2.pyi +38 -0
- hatchet_sdk/contracts/v1/dispatcher_pb2_grpc.py +145 -0
- hatchet_sdk/contracts/v1/shared/condition_pb2.py +39 -0
- hatchet_sdk/contracts/v1/shared/condition_pb2.pyi +72 -0
- hatchet_sdk/contracts/v1/shared/condition_pb2_grpc.py +29 -0
- hatchet_sdk/contracts/v1/workflows_pb2.py +67 -0
- hatchet_sdk/contracts/v1/workflows_pb2.pyi +228 -0
- hatchet_sdk/contracts/v1/workflows_pb2_grpc.py +234 -0
- hatchet_sdk/contracts/workflows_pb2_grpc.py +1 -1
- hatchet_sdk/features/cron.py +43 -57
- hatchet_sdk/features/scheduled.py +60 -74
- hatchet_sdk/hatchet.py +491 -218
- hatchet_sdk/labels.py +4 -6
- hatchet_sdk/metadata.py +1 -1
- hatchet_sdk/opentelemetry/instrumentor.py +17 -18
- hatchet_sdk/rate_limit.py +40 -55
- hatchet_sdk/runnables/contextvars.py +12 -0
- hatchet_sdk/runnables/standalone.py +194 -0
- hatchet_sdk/runnables/task.py +144 -0
- hatchet_sdk/runnables/types.py +138 -0
- hatchet_sdk/runnables/workflow.py +764 -0
- hatchet_sdk/token.py +13 -9
- hatchet_sdk/utils/aio_utils.py +0 -119
- hatchet_sdk/utils/proto_enums.py +47 -0
- hatchet_sdk/utils/timedelta_to_expression.py +23 -0
- hatchet_sdk/utils/typing.py +10 -2
- hatchet_sdk/v0/__init__.py +251 -0
- hatchet_sdk/v0/client.py +119 -0
- hatchet_sdk/v0/clients/admin.py +541 -0
- hatchet_sdk/v0/clients/dispatcher/action_listener.py +422 -0
- hatchet_sdk/v0/clients/dispatcher/dispatcher.py +204 -0
- hatchet_sdk/v0/clients/event_ts.py +28 -0
- hatchet_sdk/v0/clients/events.py +182 -0
- hatchet_sdk/v0/clients/rest/__init__.py +307 -0
- hatchet_sdk/v0/clients/rest/api/__init__.py +19 -0
- hatchet_sdk/v0/clients/rest/api/api_token_api.py +858 -0
- hatchet_sdk/v0/clients/rest/api/default_api.py +2259 -0
- hatchet_sdk/v0/clients/rest/api/event_api.py +2548 -0
- hatchet_sdk/v0/clients/rest/api/github_api.py +331 -0
- hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +483 -0
- hatchet_sdk/v0/clients/rest/api/log_api.py +449 -0
- hatchet_sdk/v0/clients/rest/api/metadata_api.py +728 -0
- hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +423 -0
- hatchet_sdk/v0/clients/rest/api/slack_api.py +577 -0
- hatchet_sdk/v0/clients/rest/api/sns_api.py +872 -0
- hatchet_sdk/v0/clients/rest/api/step_run_api.py +2202 -0
- hatchet_sdk/v0/clients/rest/api/tenant_api.py +4430 -0
- hatchet_sdk/v0/clients/rest/api/user_api.py +2888 -0
- hatchet_sdk/v0/clients/rest/api/worker_api.py +858 -0
- hatchet_sdk/v0/clients/rest/api/workflow_api.py +6312 -0
- hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +1932 -0
- hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +610 -0
- hatchet_sdk/v0/clients/rest/api_client.py +759 -0
- hatchet_sdk/v0/clients/rest/api_response.py +22 -0
- hatchet_sdk/v0/clients/rest/configuration.py +611 -0
- hatchet_sdk/v0/clients/rest/exceptions.py +200 -0
- hatchet_sdk/v0/clients/rest/models/__init__.py +274 -0
- hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/api_error.py +102 -0
- hatchet_sdk/v0/clients/rest/models/api_errors.py +100 -0
- hatchet_sdk/v0/clients/rest/models/api_meta.py +144 -0
- hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +85 -0
- hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +88 -0
- hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +90 -0
- hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +98 -0
- hatchet_sdk/v0/clients/rest/models/api_token.py +105 -0
- hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +100 -0
- hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +110 -0
- hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +39 -0
- hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +92 -0
- hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +83 -0
- hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +98 -0
- hatchet_sdk/v0/clients/rest/models/create_event_request.py +95 -0
- hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +83 -0
- hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +86 -0
- hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +84 -0
- hatchet_sdk/v0/clients/rest/models/cron_workflows.py +131 -0
- hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +37 -0
- hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +37 -0
- hatchet_sdk/v0/clients/rest/models/event.py +143 -0
- hatchet_sdk/v0/clients/rest/models/event_data.py +83 -0
- hatchet_sdk/v0/clients/rest/models/event_key_list.py +98 -0
- hatchet_sdk/v0/clients/rest/models/event_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +37 -0
- hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +36 -0
- hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +85 -0
- hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +116 -0
- hatchet_sdk/v0/clients/rest/models/events.py +110 -0
- hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +100 -0
- hatchet_sdk/v0/clients/rest/models/github_app_installation.py +107 -0
- hatchet_sdk/v0/clients/rest/models/github_branch.py +86 -0
- hatchet_sdk/v0/clients/rest/models/github_repo.py +86 -0
- hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +83 -0
- hatchet_sdk/v0/clients/rest/models/job.py +132 -0
- hatchet_sdk/v0/clients/rest/models/job_run.py +176 -0
- hatchet_sdk/v0/clients/rest/models/job_run_status.py +41 -0
- hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +106 -0
- hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +110 -0
- hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +112 -0
- hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +100 -0
- hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +110 -0
- hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +110 -0
- hatchet_sdk/v0/clients/rest/models/log_line.py +94 -0
- hatchet_sdk/v0/clients/rest/models/log_line_level.py +39 -0
- hatchet_sdk/v0/clients/rest/models/log_line_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +37 -0
- hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +36 -0
- hatchet_sdk/v0/clients/rest/models/pagination_response.py +95 -0
- hatchet_sdk/v0/clients/rest/models/pull_request.py +112 -0
- hatchet_sdk/v0/clients/rest/models/pull_request_state.py +37 -0
- hatchet_sdk/v0/clients/rest/models/queue_metrics.py +97 -0
- hatchet_sdk/v0/clients/rest/models/rate_limit.py +117 -0
- hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +37 -0
- hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +38 -0
- hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +118 -0
- hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/replay_event_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +100 -0
- hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +92 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +42 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +149 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +37 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +37 -0
- hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +113 -0
- hatchet_sdk/v0/clients/rest/models/slack_webhook.py +127 -0
- hatchet_sdk/v0/clients/rest/models/sns_integration.py +114 -0
- hatchet_sdk/v0/clients/rest/models/step.py +123 -0
- hatchet_sdk/v0/clients/rest/models/step_run.py +202 -0
- hatchet_sdk/v0/clients/rest/models/step_run_archive.py +142 -0
- hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/step_run_diff.py +91 -0
- hatchet_sdk/v0/clients/rest/models/step_run_event.py +122 -0
- hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +52 -0
- hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +38 -0
- hatchet_sdk/v0/clients/rest/models/step_run_status.py +44 -0
- hatchet_sdk/v0/clients/rest/models/tenant.py +118 -0
- hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +98 -0
- hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +112 -0
- hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +143 -0
- hatchet_sdk/v0/clients/rest/models/tenant_invite.py +120 -0
- hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/tenant_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/tenant_member.py +123 -0
- hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +38 -0
- hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +116 -0
- hatchet_sdk/v0/clients/rest/models/tenant_resource.py +40 -0
- hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +135 -0
- hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +102 -0
- hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +83 -0
- hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +91 -0
- hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +137 -0
- hatchet_sdk/v0/clients/rest/models/update_worker_request.py +87 -0
- hatchet_sdk/v0/clients/rest/models/user.py +126 -0
- hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +88 -0
- hatchet_sdk/v0/clients/rest/models/user_login_request.py +86 -0
- hatchet_sdk/v0/clients/rest/models/user_register_request.py +91 -0
- hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +86 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker.py +100 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +94 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +98 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +102 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +110 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +102 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +104 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +38 -0
- hatchet_sdk/v0/clients/rest/models/worker.py +239 -0
- hatchet_sdk/v0/clients/rest/models/worker_label.py +102 -0
- hatchet_sdk/v0/clients/rest/models/worker_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +103 -0
- hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +38 -0
- hatchet_sdk/v0/clients/rest/models/worker_type.py +38 -0
- hatchet_sdk/v0/clients/rest/models/workflow.py +165 -0
- hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +107 -0
- hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +136 -0
- hatchet_sdk/v0/clients/rest/models/workflow_kind.py +38 -0
- hatchet_sdk/v0/clients/rest/models/workflow_list.py +120 -0
- hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +97 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run.py +188 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +85 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +37 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +39 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +186 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +42 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +112 -0
- hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +94 -0
- hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +104 -0
- hatchet_sdk/v0/clients/rest/models/workflow_tag.py +84 -0
- hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +86 -0
- hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +86 -0
- hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +141 -0
- hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/workflow_version.py +170 -0
- hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +114 -0
- hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +85 -0
- hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +123 -0
- hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +95 -0
- hatchet_sdk/v0/clients/rest/rest.py +187 -0
- hatchet_sdk/v0/clients/rest/tenacity_utils.py +39 -0
- hatchet_sdk/v0/clients/rest_client.py +622 -0
- hatchet_sdk/v0/clients/run_event_listener.py +260 -0
- hatchet_sdk/v0/clients/workflow_listener.py +277 -0
- hatchet_sdk/v0/connection.py +63 -0
- hatchet_sdk/v0/context/__init__.py +1 -0
- hatchet_sdk/v0/context/context.py +446 -0
- hatchet_sdk/v0/context/worker_context.py +28 -0
- hatchet_sdk/v0/contracts/dispatcher_pb2.py +102 -0
- hatchet_sdk/v0/contracts/dispatcher_pb2.pyi +387 -0
- hatchet_sdk/v0/contracts/dispatcher_pb2_grpc.py +621 -0
- hatchet_sdk/v0/contracts/events_pb2.py +46 -0
- hatchet_sdk/v0/contracts/events_pb2.pyi +87 -0
- hatchet_sdk/v0/contracts/events_pb2_grpc.py +274 -0
- hatchet_sdk/v0/contracts/workflows_pb2.py +80 -0
- hatchet_sdk/v0/contracts/workflows_pb2.pyi +312 -0
- hatchet_sdk/v0/contracts/workflows_pb2_grpc.py +277 -0
- hatchet_sdk/v0/features/cron.py +286 -0
- hatchet_sdk/v0/features/scheduled.py +248 -0
- hatchet_sdk/v0/hatchet.py +310 -0
- hatchet_sdk/v0/labels.py +10 -0
- hatchet_sdk/v0/logger.py +13 -0
- hatchet_sdk/v0/metadata.py +2 -0
- hatchet_sdk/v0/opentelemetry/instrumentor.py +396 -0
- hatchet_sdk/v0/rate_limit.py +126 -0
- hatchet_sdk/v0/token.py +27 -0
- hatchet_sdk/v0/utils/aio_utils.py +137 -0
- hatchet_sdk/v0/utils/backoff.py +9 -0
- hatchet_sdk/v0/utils/typing.py +12 -0
- hatchet_sdk/{v2 → v0/v2}/callable.py +8 -8
- hatchet_sdk/{v2 → v0/v2}/concurrency.py +2 -2
- hatchet_sdk/{v2 → v0/v2}/hatchet.py +10 -10
- hatchet_sdk/v0/worker/__init__.py +1 -0
- hatchet_sdk/v0/worker/action_listener_process.py +294 -0
- hatchet_sdk/v0/worker/runner/run_loop_manager.py +112 -0
- hatchet_sdk/v0/worker/runner/runner.py +460 -0
- hatchet_sdk/v0/worker/runner/utils/capture_logs.py +81 -0
- hatchet_sdk/v0/worker/worker.py +391 -0
- hatchet_sdk/{workflow.py → v0/workflow.py} +4 -4
- hatchet_sdk/v0/workflow_run.py +59 -0
- hatchet_sdk/waits.py +120 -0
- hatchet_sdk/worker/__init__.py +0 -1
- hatchet_sdk/worker/action_listener_process.py +80 -55
- hatchet_sdk/worker/runner/run_loop_manager.py +46 -34
- hatchet_sdk/worker/runner/runner.py +82 -87
- hatchet_sdk/worker/runner/utils/capture_logs.py +26 -23
- hatchet_sdk/worker/worker.py +172 -149
- hatchet_sdk/workflow_run.py +7 -21
- {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/METADATA +2 -2
- hatchet_sdk-1.0.0a1.dist-info/RECORD +505 -0
- {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/entry_points.txt +2 -0
- hatchet_sdk/utils/serialization.py +0 -18
- hatchet_sdk-0.47.1.dist-info/RECORD +0 -237
- /hatchet_sdk/{loader.py → v0/loader.py} +0 -0
- /hatchet_sdk/{semver.py → v0/semver.py} +0 -0
- /hatchet_sdk/{utils → v0/utils}/types.py +0 -0
- /hatchet_sdk/{worker → v0/worker}/runner/utils/error_with_traceback.py +0 -0
- {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/WHEEL +0 -0
hatchet_sdk/labels.py
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
from
|
|
1
|
+
from pydantic import BaseModel
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
class DesiredWorkerLabel(
|
|
4
|
+
class DesiredWorkerLabel(BaseModel):
|
|
5
5
|
value: str | int
|
|
6
|
-
required: bool
|
|
6
|
+
required: bool = False
|
|
7
7
|
weight: int | None = None
|
|
8
|
-
comparator: int | None =
|
|
9
|
-
None # _ClassVar[WorkerLabelComparator] TODO figure out type
|
|
10
|
-
)
|
|
8
|
+
comparator: int | None = None
|
hatchet_sdk/metadata.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
def get_metadata(token: str):
|
|
1
|
+
def get_metadata(token: str) -> list[tuple[str, str]]:
|
|
2
2
|
return [("authorization", "bearer " + token)]
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
from importlib.metadata import version
|
|
2
2
|
from typing import Any, Callable, Collection, Coroutine
|
|
3
3
|
|
|
4
|
+
from hatchet_sdk.utils.typing import JSONSerializableMapping
|
|
5
|
+
|
|
4
6
|
try:
|
|
5
7
|
from opentelemetry.context import Context
|
|
6
8
|
from opentelemetry.instrumentation.instrumentor import ( # type: ignore[attr-defined]
|
|
@@ -28,7 +30,7 @@ import hatchet_sdk
|
|
|
28
30
|
from hatchet_sdk.clients.admin import (
|
|
29
31
|
AdminClient,
|
|
30
32
|
TriggerWorkflowOptions,
|
|
31
|
-
|
|
33
|
+
WorkflowRunTriggerConfig,
|
|
32
34
|
)
|
|
33
35
|
from hatchet_sdk.clients.dispatcher.action_listener import Action
|
|
34
36
|
from hatchet_sdk.clients.events import (
|
|
@@ -66,7 +68,9 @@ def create_traceparent() -> str | None:
|
|
|
66
68
|
return carrier.get("traceparent")
|
|
67
69
|
|
|
68
70
|
|
|
69
|
-
def parse_carrier_from_metadata(
|
|
71
|
+
def parse_carrier_from_metadata(
|
|
72
|
+
metadata: JSONSerializableMapping | None,
|
|
73
|
+
) -> Context | None:
|
|
70
74
|
"""
|
|
71
75
|
Parses OpenTelemetry trace context from a metadata dictionary.
|
|
72
76
|
|
|
@@ -202,7 +206,7 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
|
|
|
202
206
|
|
|
203
207
|
wrap_function_wrapper(
|
|
204
208
|
hatchet_sdk,
|
|
205
|
-
"clients.admin.
|
|
209
|
+
"clients.admin.AdminClient.aio_run_workflow",
|
|
206
210
|
self._wrap_async_run_workflow,
|
|
207
211
|
)
|
|
208
212
|
|
|
@@ -214,7 +218,7 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
|
|
|
214
218
|
|
|
215
219
|
wrap_function_wrapper(
|
|
216
220
|
hatchet_sdk,
|
|
217
|
-
"clients.admin.
|
|
221
|
+
"clients.admin.AdminClient.aio_run_workflows",
|
|
218
222
|
self._wrap_async_run_workflows,
|
|
219
223
|
)
|
|
220
224
|
|
|
@@ -348,14 +352,12 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
|
|
|
348
352
|
def _wrap_run_workflows(
|
|
349
353
|
self,
|
|
350
354
|
wrapped: Callable[
|
|
351
|
-
[list[
|
|
355
|
+
[list[WorkflowRunTriggerConfig]],
|
|
356
|
+
list[WorkflowRunRef],
|
|
352
357
|
],
|
|
353
358
|
instance: AdminClient,
|
|
354
|
-
args: tuple[
|
|
355
|
-
|
|
356
|
-
TriggerWorkflowOptions | None,
|
|
357
|
-
],
|
|
358
|
-
kwargs: dict[str, list[WorkflowRunDict] | TriggerWorkflowOptions | None],
|
|
359
|
+
args: tuple[list[WorkflowRunTriggerConfig],],
|
|
360
|
+
kwargs: dict[str, list[WorkflowRunTriggerConfig]],
|
|
359
361
|
) -> list[WorkflowRunRef]:
|
|
360
362
|
with self._tracer.start_as_current_span(
|
|
361
363
|
"hatchet.run_workflows",
|
|
@@ -366,15 +368,12 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
|
|
|
366
368
|
async def _wrap_async_run_workflows(
|
|
367
369
|
self,
|
|
368
370
|
wrapped: Callable[
|
|
369
|
-
[list[
|
|
371
|
+
[list[WorkflowRunTriggerConfig]],
|
|
370
372
|
Coroutine[None, None, list[WorkflowRunRef]],
|
|
371
373
|
],
|
|
372
374
|
instance: AdminClient,
|
|
373
|
-
args: tuple[
|
|
374
|
-
|
|
375
|
-
TriggerWorkflowOptions | None,
|
|
376
|
-
],
|
|
377
|
-
kwargs: dict[str, list[WorkflowRunDict] | TriggerWorkflowOptions | None],
|
|
375
|
+
args: tuple[list[WorkflowRunTriggerConfig],],
|
|
376
|
+
kwargs: dict[str, list[WorkflowRunTriggerConfig]],
|
|
378
377
|
) -> list[WorkflowRunRef]:
|
|
379
378
|
with self._tracer.start_as_current_span(
|
|
380
379
|
"hatchet.run_workflows",
|
|
@@ -391,6 +390,6 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
|
|
|
391
390
|
unwrap(hatchet_sdk, "clients.events.EventClient.push")
|
|
392
391
|
unwrap(hatchet_sdk, "clients.events.EventClient.bulk_push")
|
|
393
392
|
unwrap(hatchet_sdk, "clients.admin.AdminClient.run_workflow")
|
|
394
|
-
unwrap(hatchet_sdk, "clients.admin.
|
|
393
|
+
unwrap(hatchet_sdk, "clients.admin.AdminClient.aio_run_workflow")
|
|
395
394
|
unwrap(hatchet_sdk, "clients.admin.AdminClient.run_workflows")
|
|
396
|
-
unwrap(hatchet_sdk, "clients.admin.
|
|
395
|
+
unwrap(hatchet_sdk, "clients.admin.AdminClient.aio_run_workflows")
|
hatchet_sdk/rate_limit.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
from
|
|
2
|
-
from typing import Union
|
|
1
|
+
from enum import Enum
|
|
3
2
|
|
|
4
|
-
from celpy import CELEvalError, Environment
|
|
3
|
+
from celpy import CELEvalError, Environment # type: ignore
|
|
4
|
+
from pydantic import BaseModel, model_validator
|
|
5
5
|
|
|
6
|
-
from hatchet_sdk.contracts.workflows_pb2 import
|
|
6
|
+
from hatchet_sdk.contracts.v1.workflows_pb2 import CreateTaskRateLimit
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
def validate_cel_expression(expr: str) -> bool:
|
|
@@ -15,7 +15,7 @@ def validate_cel_expression(expr: str) -> bool:
|
|
|
15
15
|
return False
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class RateLimitDuration:
|
|
18
|
+
class RateLimitDuration(str, Enum):
|
|
19
19
|
SECOND = "SECOND"
|
|
20
20
|
MINUTE = "MINUTE"
|
|
21
21
|
HOUR = "HOUR"
|
|
@@ -25,8 +25,7 @@ class RateLimitDuration:
|
|
|
25
25
|
YEAR = "YEAR"
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
class RateLimit:
|
|
28
|
+
class RateLimit(BaseModel):
|
|
30
29
|
"""
|
|
31
30
|
Represents a rate limit configuration for a step in a workflow.
|
|
32
31
|
|
|
@@ -40,7 +39,6 @@ class RateLimit:
|
|
|
40
39
|
units (int or str, default=1): The number of units or a CEL expression for dynamic unit calculation.
|
|
41
40
|
limit (int or str, optional): The rate limit value or a CEL expression for dynamic limit calculation.
|
|
42
41
|
duration (str, default=RateLimitDuration.MINUTE): The window duration of the rate limit.
|
|
43
|
-
key (str, optional): Deprecated. Use static_key instead.
|
|
44
42
|
|
|
45
43
|
Usage:
|
|
46
44
|
1. Static rate limit:
|
|
@@ -61,62 +59,49 @@ class RateLimit:
|
|
|
61
59
|
|
|
62
60
|
Raises:
|
|
63
61
|
ValueError: If invalid combinations of attributes are provided or if CEL expressions are invalid.
|
|
64
|
-
DeprecationWarning: If the deprecated 'key' attribute is used.
|
|
65
62
|
"""
|
|
66
63
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
limit: Union[int, str, None] = None
|
|
64
|
+
static_key: str | None = None
|
|
65
|
+
dynamic_key: str | None = None
|
|
66
|
+
units: str | int = 1
|
|
67
|
+
limit: int | str | None = None
|
|
72
68
|
duration: RateLimitDuration = RateLimitDuration.MINUTE
|
|
73
69
|
|
|
74
|
-
|
|
70
|
+
@model_validator(mode="after")
|
|
71
|
+
def validate_rate_limit(self) -> "RateLimit":
|
|
72
|
+
if self.dynamic_key and self.static_key:
|
|
73
|
+
raise ValueError("Cannot have both static key and dynamic key set")
|
|
75
74
|
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
if self.dynamic_key and not validate_cel_expression(self.dynamic_key):
|
|
76
|
+
raise ValueError(f"Invalid CEL expression: {self.dynamic_key}")
|
|
77
|
+
|
|
78
|
+
if not isinstance(self.units, int) and not validate_cel_expression(self.units):
|
|
79
|
+
raise ValueError(f"Invalid CEL expression: {self.units}")
|
|
80
|
+
|
|
81
|
+
if (
|
|
82
|
+
self.limit
|
|
83
|
+
and not isinstance(self.limit, int)
|
|
84
|
+
and not validate_cel_expression(self.limit)
|
|
85
|
+
):
|
|
86
|
+
raise ValueError(f"Invalid CEL expression: {self.limit}")
|
|
87
|
+
|
|
88
|
+
if self.dynamic_key and not self.limit:
|
|
89
|
+
raise ValueError("CEL based keys requires limit to be set")
|
|
90
|
+
|
|
91
|
+
return self
|
|
92
|
+
|
|
93
|
+
def to_proto(self) -> CreateTaskRateLimit:
|
|
78
94
|
key = self.static_key
|
|
79
95
|
key_expression = self.dynamic_key
|
|
80
96
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if key_expression is not None:
|
|
88
|
-
if key is not None:
|
|
89
|
-
raise ValueError("Cannot have both static key and dynamic key set")
|
|
90
|
-
|
|
91
|
-
key = key_expression
|
|
92
|
-
if not validate_cel_expression(key_expression):
|
|
93
|
-
raise ValueError(f"Invalid CEL expression: {key_expression}")
|
|
94
|
-
|
|
95
|
-
# juggle the units and units_expr fields
|
|
96
|
-
units = None
|
|
97
|
-
units_expression = None
|
|
98
|
-
if isinstance(self.units, int):
|
|
99
|
-
units = self.units
|
|
100
|
-
else:
|
|
101
|
-
if not validate_cel_expression(self.units):
|
|
102
|
-
raise ValueError(f"Invalid CEL expression: {self.units}")
|
|
103
|
-
units_expression = self.units
|
|
104
|
-
|
|
105
|
-
# juggle the limit and limit_expr fields
|
|
106
|
-
limit_expression = None
|
|
107
|
-
|
|
108
|
-
if self.limit:
|
|
109
|
-
if isinstance(self.limit, int):
|
|
110
|
-
limit_expression = f"{self.limit}"
|
|
111
|
-
else:
|
|
112
|
-
if not validate_cel_expression(self.limit):
|
|
113
|
-
raise ValueError(f"Invalid CEL expression: {self.limit}")
|
|
114
|
-
limit_expression = self.limit
|
|
115
|
-
|
|
116
|
-
if key_expression is not None and limit_expression is None:
|
|
117
|
-
raise ValueError("CEL based keys requires limit to be set")
|
|
97
|
+
key = self.static_key or self.dynamic_key
|
|
98
|
+
|
|
99
|
+
units = self.units if isinstance(self.units, int) else None
|
|
100
|
+
units_expression = None if isinstance(self.units, int) else self.units
|
|
101
|
+
|
|
102
|
+
limit_expression = None if not self.limit else str(self.limit)
|
|
118
103
|
|
|
119
|
-
|
|
104
|
+
return CreateTaskRateLimit(
|
|
120
105
|
key=key,
|
|
121
106
|
key_expr=key_expression,
|
|
122
107
|
units=units,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from collections import Counter
|
|
3
|
+
from contextvars import ContextVar
|
|
4
|
+
|
|
5
|
+
ctx_workflow_run_id: ContextVar[str | None] = ContextVar(
|
|
6
|
+
"ctx_workflow_run_id", default=None
|
|
7
|
+
)
|
|
8
|
+
ctx_step_run_id: ContextVar[str | None] = ContextVar("ctx_step_run_id", default=None)
|
|
9
|
+
ctx_worker_id: ContextVar[str | None] = ContextVar("ctx_worker_id", default=None)
|
|
10
|
+
|
|
11
|
+
workflow_spawn_indices = Counter[str]()
|
|
12
|
+
spawn_index_lock = asyncio.Lock()
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Any, Generic, cast, get_type_hints
|
|
4
|
+
|
|
5
|
+
from google.protobuf import timestamp_pb2
|
|
6
|
+
|
|
7
|
+
from hatchet_sdk.clients.admin import (
|
|
8
|
+
ScheduleTriggerWorkflowOptions,
|
|
9
|
+
TriggerWorkflowOptions,
|
|
10
|
+
WorkflowRunTriggerConfig,
|
|
11
|
+
)
|
|
12
|
+
from hatchet_sdk.clients.rest.models.cron_workflows import CronWorkflows
|
|
13
|
+
from hatchet_sdk.contracts.workflows_pb2 import WorkflowVersion
|
|
14
|
+
from hatchet_sdk.runnables.task import Task
|
|
15
|
+
from hatchet_sdk.runnables.types import R, TWorkflowInput
|
|
16
|
+
from hatchet_sdk.runnables.workflow import BaseWorkflow, Workflow
|
|
17
|
+
from hatchet_sdk.utils.aio_utils import get_active_event_loop
|
|
18
|
+
from hatchet_sdk.utils.typing import JSONSerializableMapping, is_basemodel_subclass
|
|
19
|
+
from hatchet_sdk.workflow_run import WorkflowRunRef
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TaskRunRef(Generic[TWorkflowInput, R]):
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
standalone: "Standalone[TWorkflowInput, R]",
|
|
26
|
+
workflow_run_ref: WorkflowRunRef,
|
|
27
|
+
):
|
|
28
|
+
self._s = standalone
|
|
29
|
+
self._wrr = workflow_run_ref
|
|
30
|
+
|
|
31
|
+
async def aio_result(self) -> R:
|
|
32
|
+
result = await self._wrr.workflow_listener.result(self._wrr.workflow_run_id)
|
|
33
|
+
return self._s._extract_result(result)
|
|
34
|
+
|
|
35
|
+
def result(self) -> R:
|
|
36
|
+
coro = self._wrr.workflow_listener.result(self._wrr.workflow_run_id)
|
|
37
|
+
|
|
38
|
+
loop = get_active_event_loop()
|
|
39
|
+
|
|
40
|
+
if loop is None:
|
|
41
|
+
loop = asyncio.new_event_loop()
|
|
42
|
+
asyncio.set_event_loop(loop)
|
|
43
|
+
try:
|
|
44
|
+
result = loop.run_until_complete(coro)
|
|
45
|
+
finally:
|
|
46
|
+
asyncio.set_event_loop(None)
|
|
47
|
+
else:
|
|
48
|
+
result = loop.run_until_complete(coro)
|
|
49
|
+
|
|
50
|
+
return self._s._extract_result(result)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class Standalone(BaseWorkflow[TWorkflowInput], Generic[TWorkflowInput, R]):
|
|
54
|
+
def __init__(
|
|
55
|
+
self, workflow: Workflow[TWorkflowInput], task: Task[TWorkflowInput, R]
|
|
56
|
+
) -> None:
|
|
57
|
+
super().__init__(config=workflow.config, client=workflow.client)
|
|
58
|
+
|
|
59
|
+
## NOTE: This is a hack to assign the task back to the base workflow,
|
|
60
|
+
## since the decorator to mutate the tasks is not being called.
|
|
61
|
+
self._default_tasks = [task]
|
|
62
|
+
|
|
63
|
+
self._workflow = workflow
|
|
64
|
+
self._task = task
|
|
65
|
+
|
|
66
|
+
return_type = get_type_hints(self._task.fn).get("return")
|
|
67
|
+
|
|
68
|
+
self._output_validator = (
|
|
69
|
+
return_type if is_basemodel_subclass(return_type) else None
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
self.config = self._workflow.config
|
|
73
|
+
|
|
74
|
+
def _extract_result(self, result: dict[str, Any]) -> R:
|
|
75
|
+
output = result.get(self._task.name)
|
|
76
|
+
|
|
77
|
+
if not self._output_validator:
|
|
78
|
+
return cast(R, output)
|
|
79
|
+
|
|
80
|
+
return cast(R, self._output_validator.model_validate(output))
|
|
81
|
+
|
|
82
|
+
def run(
|
|
83
|
+
self,
|
|
84
|
+
input: TWorkflowInput | None = None,
|
|
85
|
+
options: TriggerWorkflowOptions = TriggerWorkflowOptions(),
|
|
86
|
+
) -> R:
|
|
87
|
+
return self._extract_result(self._workflow.run(input, options))
|
|
88
|
+
|
|
89
|
+
async def aio_run(
|
|
90
|
+
self,
|
|
91
|
+
input: TWorkflowInput | None = None,
|
|
92
|
+
options: TriggerWorkflowOptions = TriggerWorkflowOptions(),
|
|
93
|
+
) -> R:
|
|
94
|
+
result = await self._workflow.aio_run(input, options)
|
|
95
|
+
return self._extract_result(result)
|
|
96
|
+
|
|
97
|
+
def run_no_wait(
|
|
98
|
+
self,
|
|
99
|
+
input: TWorkflowInput | None = None,
|
|
100
|
+
options: TriggerWorkflowOptions = TriggerWorkflowOptions(),
|
|
101
|
+
) -> TaskRunRef[TWorkflowInput, R]:
|
|
102
|
+
ref = self._workflow.run_no_wait(input, options)
|
|
103
|
+
|
|
104
|
+
return TaskRunRef[TWorkflowInput, R](self, ref)
|
|
105
|
+
|
|
106
|
+
async def aio_run_no_wait(
|
|
107
|
+
self,
|
|
108
|
+
input: TWorkflowInput | None = None,
|
|
109
|
+
options: TriggerWorkflowOptions = TriggerWorkflowOptions(),
|
|
110
|
+
) -> TaskRunRef[TWorkflowInput, R]:
|
|
111
|
+
ref = await self._workflow.aio_run_no_wait(input, options)
|
|
112
|
+
|
|
113
|
+
return TaskRunRef[TWorkflowInput, R](self, ref)
|
|
114
|
+
|
|
115
|
+
def run_many(self, workflows: list[WorkflowRunTriggerConfig]) -> list[R]:
|
|
116
|
+
return [
|
|
117
|
+
self._extract_result(result)
|
|
118
|
+
for result in self._workflow.run_many(workflows)
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
async def aio_run_many(self, workflows: list[WorkflowRunTriggerConfig]) -> list[R]:
|
|
122
|
+
return [
|
|
123
|
+
self._extract_result(result)
|
|
124
|
+
for result in await self._workflow.aio_run_many(workflows)
|
|
125
|
+
]
|
|
126
|
+
|
|
127
|
+
def run_many_no_wait(
|
|
128
|
+
self, workflows: list[WorkflowRunTriggerConfig]
|
|
129
|
+
) -> list[TaskRunRef[TWorkflowInput, R]]:
|
|
130
|
+
refs = self._workflow.run_many_no_wait(workflows)
|
|
131
|
+
|
|
132
|
+
return [TaskRunRef[TWorkflowInput, R](self, ref) for ref in refs]
|
|
133
|
+
|
|
134
|
+
async def aio_run_many_no_wait(
|
|
135
|
+
self, workflows: list[WorkflowRunTriggerConfig]
|
|
136
|
+
) -> list[TaskRunRef[TWorkflowInput, R]]:
|
|
137
|
+
refs = await self._workflow.aio_run_many_no_wait(workflows)
|
|
138
|
+
|
|
139
|
+
return [TaskRunRef[TWorkflowInput, R](self, ref) for ref in refs]
|
|
140
|
+
|
|
141
|
+
def schedule(
|
|
142
|
+
self,
|
|
143
|
+
schedules: list[datetime],
|
|
144
|
+
input: TWorkflowInput | None = None,
|
|
145
|
+
options: ScheduleTriggerWorkflowOptions = ScheduleTriggerWorkflowOptions(),
|
|
146
|
+
) -> WorkflowVersion:
|
|
147
|
+
return self._workflow.schedule(
|
|
148
|
+
schedules=schedules,
|
|
149
|
+
input=input,
|
|
150
|
+
options=options,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
async def aio_schedule(
|
|
154
|
+
self,
|
|
155
|
+
schedules: list[datetime | timestamp_pb2.Timestamp],
|
|
156
|
+
input: TWorkflowInput,
|
|
157
|
+
options: ScheduleTriggerWorkflowOptions = ScheduleTriggerWorkflowOptions(),
|
|
158
|
+
) -> WorkflowVersion:
|
|
159
|
+
return await self._workflow.aio_schedule(
|
|
160
|
+
schedules=schedules,
|
|
161
|
+
input=input,
|
|
162
|
+
options=options,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
def create_cron(
|
|
166
|
+
self,
|
|
167
|
+
cron_name: str,
|
|
168
|
+
expression: str,
|
|
169
|
+
input: TWorkflowInput,
|
|
170
|
+
additional_metadata: JSONSerializableMapping,
|
|
171
|
+
) -> CronWorkflows:
|
|
172
|
+
return self._workflow.create_cron(
|
|
173
|
+
cron_name=cron_name,
|
|
174
|
+
expression=expression,
|
|
175
|
+
input=input,
|
|
176
|
+
additional_metadata=additional_metadata,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
async def aio_create_cron(
|
|
180
|
+
self,
|
|
181
|
+
cron_name: str,
|
|
182
|
+
expression: str,
|
|
183
|
+
input: TWorkflowInput,
|
|
184
|
+
additional_metadata: JSONSerializableMapping,
|
|
185
|
+
) -> CronWorkflows:
|
|
186
|
+
return await self._workflow.aio_create_cron(
|
|
187
|
+
cron_name=cron_name,
|
|
188
|
+
expression=expression,
|
|
189
|
+
input=input,
|
|
190
|
+
additional_metadata=additional_metadata,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
def to_task(self) -> Task[TWorkflowInput, R]:
|
|
194
|
+
return self._task
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
from typing import (
|
|
2
|
+
TYPE_CHECKING,
|
|
3
|
+
Any,
|
|
4
|
+
Awaitable,
|
|
5
|
+
Callable,
|
|
6
|
+
Generic,
|
|
7
|
+
TypeVar,
|
|
8
|
+
Union,
|
|
9
|
+
cast,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
from hatchet_sdk.context.context import Context, DurableContext
|
|
13
|
+
from hatchet_sdk.contracts.v1.workflows_pb2 import (
|
|
14
|
+
CreateTaskRateLimit,
|
|
15
|
+
DesiredWorkerLabels,
|
|
16
|
+
)
|
|
17
|
+
from hatchet_sdk.runnables.types import (
|
|
18
|
+
DEFAULT_EXECUTION_TIMEOUT,
|
|
19
|
+
DEFAULT_SCHEDULE_TIMEOUT,
|
|
20
|
+
ConcurrencyExpression,
|
|
21
|
+
R,
|
|
22
|
+
StepType,
|
|
23
|
+
TWorkflowInput,
|
|
24
|
+
is_async_fn,
|
|
25
|
+
is_durable_sync_fn,
|
|
26
|
+
is_sync_fn,
|
|
27
|
+
)
|
|
28
|
+
from hatchet_sdk.utils.timedelta_to_expression import Duration
|
|
29
|
+
from hatchet_sdk.waits import Condition, OrGroup
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from hatchet_sdk.runnables.workflow import Workflow
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
T = TypeVar("T")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def fall_back_to_default(value: T, default: T, fallback_value: T) -> T:
|
|
39
|
+
## If the value is not the default, it's set
|
|
40
|
+
if value != default:
|
|
41
|
+
return value
|
|
42
|
+
|
|
43
|
+
## Otherwise, it's unset, so return the fallback value
|
|
44
|
+
return fallback_value
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class Task(Generic[TWorkflowInput, R]):
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
_fn: Union[
|
|
51
|
+
Callable[[TWorkflowInput, Context], R]
|
|
52
|
+
| Callable[[TWorkflowInput, Context], Awaitable[R]],
|
|
53
|
+
Callable[[TWorkflowInput, DurableContext], R]
|
|
54
|
+
| Callable[[TWorkflowInput, DurableContext], Awaitable[R]],
|
|
55
|
+
],
|
|
56
|
+
is_durable: bool,
|
|
57
|
+
type: StepType,
|
|
58
|
+
workflow: "Workflow[TWorkflowInput]",
|
|
59
|
+
name: str,
|
|
60
|
+
execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
|
|
61
|
+
schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
|
|
62
|
+
parents: "list[Task[TWorkflowInput, Any]]" = [],
|
|
63
|
+
retries: int = 0,
|
|
64
|
+
rate_limits: list[CreateTaskRateLimit] = [],
|
|
65
|
+
desired_worker_labels: dict[str, DesiredWorkerLabels] = {},
|
|
66
|
+
backoff_factor: float | None = None,
|
|
67
|
+
backoff_max_seconds: int | None = None,
|
|
68
|
+
concurrency: list[ConcurrencyExpression] = [],
|
|
69
|
+
wait_for: list[Condition | OrGroup] = [],
|
|
70
|
+
skip_if: list[Condition | OrGroup] = [],
|
|
71
|
+
cancel_if: list[Condition | OrGroup] = [],
|
|
72
|
+
) -> None:
|
|
73
|
+
self.is_durable = is_durable
|
|
74
|
+
|
|
75
|
+
self.fn = _fn
|
|
76
|
+
self.is_async_function = is_async_fn(self.fn) # type: ignore
|
|
77
|
+
|
|
78
|
+
self.workflow = workflow
|
|
79
|
+
|
|
80
|
+
self.type = type
|
|
81
|
+
self.execution_timeout = fall_back_to_default(
|
|
82
|
+
execution_timeout, DEFAULT_EXECUTION_TIMEOUT, DEFAULT_EXECUTION_TIMEOUT
|
|
83
|
+
)
|
|
84
|
+
self.schedule_timeout = fall_back_to_default(
|
|
85
|
+
schedule_timeout, DEFAULT_SCHEDULE_TIMEOUT, DEFAULT_SCHEDULE_TIMEOUT
|
|
86
|
+
)
|
|
87
|
+
self.name = name
|
|
88
|
+
self.parents = parents
|
|
89
|
+
self.retries = retries
|
|
90
|
+
self.rate_limits = rate_limits
|
|
91
|
+
self.desired_worker_labels = desired_worker_labels
|
|
92
|
+
self.backoff_factor = backoff_factor
|
|
93
|
+
self.backoff_max_seconds = backoff_max_seconds
|
|
94
|
+
self.concurrency = concurrency
|
|
95
|
+
|
|
96
|
+
self.wait_for = self._flatten_conditions(wait_for)
|
|
97
|
+
self.skip_if = self._flatten_conditions(skip_if)
|
|
98
|
+
self.cancel_if = self._flatten_conditions(cancel_if)
|
|
99
|
+
|
|
100
|
+
def _flatten_conditions(
|
|
101
|
+
self, conditions: list[Condition | OrGroup]
|
|
102
|
+
) -> list[Condition]:
|
|
103
|
+
flattened: list[Condition] = []
|
|
104
|
+
|
|
105
|
+
for condition in conditions:
|
|
106
|
+
if isinstance(condition, OrGroup):
|
|
107
|
+
for or_condition in condition.conditions:
|
|
108
|
+
or_condition.base.or_group_id = condition.or_group_id
|
|
109
|
+
|
|
110
|
+
flattened.extend(condition.conditions)
|
|
111
|
+
else:
|
|
112
|
+
flattened.append(condition)
|
|
113
|
+
|
|
114
|
+
return flattened
|
|
115
|
+
|
|
116
|
+
def call(self, ctx: Context | DurableContext) -> R:
|
|
117
|
+
if self.is_async_function:
|
|
118
|
+
raise TypeError(f"{self.name} is not a sync function. Use `acall` instead.")
|
|
119
|
+
|
|
120
|
+
workflow_input = self.workflow._get_workflow_input(ctx)
|
|
121
|
+
|
|
122
|
+
if self.is_durable:
|
|
123
|
+
fn = cast(Callable[[TWorkflowInput, DurableContext], R], self.fn)
|
|
124
|
+
if is_durable_sync_fn(fn):
|
|
125
|
+
return fn(workflow_input, cast(DurableContext, ctx))
|
|
126
|
+
else:
|
|
127
|
+
fn = cast(Callable[[TWorkflowInput, Context], R], self.fn)
|
|
128
|
+
if is_sync_fn(fn):
|
|
129
|
+
return fn(workflow_input, cast(Context, ctx))
|
|
130
|
+
|
|
131
|
+
raise TypeError(f"{self.name} is not a sync function. Use `acall` instead.")
|
|
132
|
+
|
|
133
|
+
async def aio_call(self, ctx: Context | DurableContext) -> R:
|
|
134
|
+
if not self.is_async_function:
|
|
135
|
+
raise TypeError(
|
|
136
|
+
f"{self.name} is not an async function. Use `call` instead."
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
workflow_input = self.workflow._get_workflow_input(ctx)
|
|
140
|
+
|
|
141
|
+
if is_async_fn(self.fn): # type: ignore
|
|
142
|
+
return await self.fn(workflow_input, cast(Context, ctx)) # type: ignore
|
|
143
|
+
|
|
144
|
+
raise TypeError(f"{self.name} is not an async function. Use `call` instead.")
|