hatchet-sdk 0.47.0__py3-none-any.whl → 1.0.0__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.
- hatchet_sdk/__init__.py +25 -16
- hatchet_sdk/client.py +14 -39
- hatchet_sdk/clients/admin.py +203 -362
- hatchet_sdk/clients/dispatcher/action_listener.py +106 -84
- hatchet_sdk/clients/dispatcher/dispatcher.py +21 -21
- hatchet_sdk/clients/event_ts.py +23 -10
- hatchet_sdk/clients/events.py +96 -99
- hatchet_sdk/clients/rest/__init__.py +24 -0
- hatchet_sdk/clients/rest/api/__init__.py +2 -0
- hatchet_sdk/clients/rest/api/task_api.py +2174 -0
- hatchet_sdk/clients/rest/api/workflow_runs_api.py +638 -106
- 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 +22 -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_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 +212 -0
- hatchet_sdk/clients/rest/models/v1_task_summary_list.py +110 -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_type.py +37 -0
- hatchet_sdk/clients/rest/models/workflow_run_shape_item_for_workflow_run_details.py +99 -0
- hatchet_sdk/clients/rest/rest.py +37 -26
- hatchet_sdk/clients/rest/tenacity_utils.py +1 -1
- hatchet_sdk/clients/rest_client.py +141 -116
- hatchet_sdk/clients/run_event_listener.py +66 -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 -218
- hatchet_sdk/features/cron.py +43 -57
- hatchet_sdk/features/scheduled.py +60 -74
- hatchet_sdk/hatchet.py +192 -195
- hatchet_sdk/labels.py +4 -6
- hatchet_sdk/metadata.py +1 -1
- hatchet_sdk/opentelemetry/instrumentor.py +9 -5
- hatchet_sdk/rate_limit.py +9 -18
- hatchet_sdk/token.py +13 -9
- hatchet_sdk/utils/aio_utils.py +0 -40
- hatchet_sdk/utils/proto_enums.py +54 -0
- hatchet_sdk/utils/typing.py +9 -1
- 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 +613 -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/semver.py +30 -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 +278 -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/runner/utils/error_with_traceback.py +6 -0
- hatchet_sdk/v0/worker/worker.py +391 -0
- hatchet_sdk/v0/workflow.py +261 -0
- hatchet_sdk/v0/workflow_run.py +59 -0
- hatchet_sdk/worker/__init__.py +0 -1
- hatchet_sdk/worker/action_listener_process.py +36 -33
- hatchet_sdk/worker/runner/run_loop_manager.py +18 -16
- hatchet_sdk/worker/runner/runner.py +32 -60
- hatchet_sdk/worker/runner/utils/capture_logs.py +25 -14
- hatchet_sdk/worker/runner/utils/error_with_traceback.py +1 -1
- hatchet_sdk/worker/worker.py +61 -75
- hatchet_sdk/workflow.py +473 -207
- hatchet_sdk/workflow_run.py +5 -18
- {hatchet_sdk-0.47.0.dist-info → hatchet_sdk-1.0.0.dist-info}/METADATA +2 -1
- hatchet_sdk-1.0.0.dist-info/RECORD +485 -0
- hatchet_sdk/utils/serialization.py +0 -18
- hatchet_sdk-0.47.0.dist-info/RECORD +0 -237
- /hatchet_sdk/{loader.py → v0/loader.py} +0 -0
- /hatchet_sdk/{utils → v0/utils}/types.py +0 -0
- {hatchet_sdk-0.47.0.dist-info → hatchet_sdk-1.0.0.dist-info}/WHEEL +0 -0
- {hatchet_sdk-0.47.0.dist-info → hatchet_sdk-1.0.0.dist-info}/entry_points.txt +0 -0
hatchet_sdk/hatchet.py
CHANGED
|
@@ -1,197 +1,46 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Any, Callable,
|
|
4
|
-
|
|
5
|
-
from pydantic import BaseModel
|
|
6
|
-
from typing_extensions import deprecated
|
|
3
|
+
from typing import Any, Callable, Type, TypeVar, cast, overload
|
|
7
4
|
|
|
5
|
+
from hatchet_sdk.client import Client, new_client, new_client_raw
|
|
6
|
+
from hatchet_sdk.clients.admin import AdminClient
|
|
7
|
+
from hatchet_sdk.clients.dispatcher.dispatcher import DispatcherClient
|
|
8
|
+
from hatchet_sdk.clients.events import EventClient
|
|
8
9
|
from hatchet_sdk.clients.rest_client import RestApi
|
|
10
|
+
from hatchet_sdk.clients.run_event_listener import RunEventListenerClient
|
|
11
|
+
from hatchet_sdk.config import ClientConfig
|
|
9
12
|
from hatchet_sdk.context.context import Context
|
|
10
|
-
from hatchet_sdk.contracts.workflows_pb2 import
|
|
11
|
-
ConcurrencyLimitStrategy,
|
|
12
|
-
CreateStepRateLimit,
|
|
13
|
-
DesiredWorkerLabels,
|
|
14
|
-
StickyStrategy,
|
|
15
|
-
)
|
|
13
|
+
from hatchet_sdk.contracts.workflows_pb2 import DesiredWorkerLabels
|
|
16
14
|
from hatchet_sdk.features.cron import CronClient
|
|
17
15
|
from hatchet_sdk.features.scheduled import ScheduledClient
|
|
18
16
|
from hatchet_sdk.labels import DesiredWorkerLabel
|
|
19
|
-
from hatchet_sdk.
|
|
17
|
+
from hatchet_sdk.logger import logger
|
|
20
18
|
from hatchet_sdk.rate_limit import RateLimit
|
|
21
|
-
from hatchet_sdk.
|
|
22
|
-
|
|
23
|
-
from .client import Client, new_client, new_client_raw
|
|
24
|
-
from .clients.admin import AdminClient
|
|
25
|
-
from .clients.dispatcher.dispatcher import DispatcherClient
|
|
26
|
-
from .clients.events import EventClient
|
|
27
|
-
from .clients.run_event_listener import RunEventListenerClient
|
|
28
|
-
from .logger import logger
|
|
29
|
-
from .worker.worker import Worker
|
|
30
|
-
from .workflow import (
|
|
19
|
+
from hatchet_sdk.worker.worker import Worker
|
|
20
|
+
from hatchet_sdk.workflow import (
|
|
31
21
|
ConcurrencyExpression,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
EmptyModel,
|
|
23
|
+
Step,
|
|
24
|
+
StepType,
|
|
25
|
+
StickyStrategy,
|
|
26
|
+
Task,
|
|
27
|
+
TWorkflowInput,
|
|
28
|
+
WorkflowConfig,
|
|
29
|
+
WorkflowDeclaration,
|
|
35
30
|
)
|
|
36
31
|
|
|
37
|
-
T = TypeVar("T", bound=BaseModel)
|
|
38
32
|
R = TypeVar("R")
|
|
39
|
-
P = ParamSpec("P")
|
|
40
|
-
|
|
41
|
-
TWorkflow = TypeVar("TWorkflow", bound=object)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def workflow(
|
|
45
|
-
name: str = "",
|
|
46
|
-
on_events: list[str] | None = None,
|
|
47
|
-
on_crons: list[str] | None = None,
|
|
48
|
-
version: str = "",
|
|
49
|
-
timeout: str = "60m",
|
|
50
|
-
schedule_timeout: str = "5m",
|
|
51
|
-
sticky: Union[StickyStrategy.Value, None] = None, # type: ignore[name-defined]
|
|
52
|
-
default_priority: int | None = None,
|
|
53
|
-
concurrency: ConcurrencyExpression | None = None,
|
|
54
|
-
input_validator: Type[T] | None = None,
|
|
55
|
-
) -> Callable[[Type[TWorkflow]], WorkflowMeta]:
|
|
56
|
-
on_events = on_events or []
|
|
57
|
-
on_crons = on_crons or []
|
|
58
|
-
|
|
59
|
-
def inner(cls: Type[TWorkflow]) -> WorkflowMeta:
|
|
60
|
-
nonlocal name
|
|
61
|
-
name = name or str(cls.__name__)
|
|
62
|
-
|
|
63
|
-
setattr(cls, "on_events", on_events)
|
|
64
|
-
setattr(cls, "on_crons", on_crons)
|
|
65
|
-
setattr(cls, "name", name)
|
|
66
|
-
setattr(cls, "version", version)
|
|
67
|
-
setattr(cls, "timeout", timeout)
|
|
68
|
-
setattr(cls, "schedule_timeout", schedule_timeout)
|
|
69
|
-
setattr(cls, "sticky", sticky)
|
|
70
|
-
setattr(cls, "default_priority", default_priority)
|
|
71
|
-
setattr(cls, "concurrency_expression", concurrency)
|
|
72
|
-
|
|
73
|
-
# Define a new class with the same name and bases as the original, but
|
|
74
|
-
# with WorkflowMeta as its metaclass
|
|
75
|
-
|
|
76
|
-
## TODO: Figure out how to type this metaclass correctly
|
|
77
|
-
setattr(cls, "input_validator", input_validator)
|
|
78
|
-
|
|
79
|
-
return WorkflowMeta(name, cls.__bases__, dict(cls.__dict__))
|
|
80
|
-
|
|
81
|
-
return inner
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
def step(
|
|
85
|
-
name: str = "",
|
|
86
|
-
timeout: str = "",
|
|
87
|
-
parents: list[str] | None = None,
|
|
88
|
-
retries: int = 0,
|
|
89
|
-
rate_limits: list[RateLimit] | None = None,
|
|
90
|
-
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
91
|
-
backoff_factor: float | None = None,
|
|
92
|
-
backoff_max_seconds: int | None = None,
|
|
93
|
-
) -> Callable[[Callable[P, R]], Callable[P, R]]:
|
|
94
|
-
parents = parents or []
|
|
95
|
-
|
|
96
|
-
def inner(func: Callable[P, R]) -> Callable[P, R]:
|
|
97
|
-
limits = None
|
|
98
|
-
if rate_limits:
|
|
99
|
-
limits = [rate_limit._req for rate_limit in rate_limits or []]
|
|
100
|
-
|
|
101
|
-
setattr(func, "_step_name", name.lower() or str(func.__name__).lower())
|
|
102
|
-
setattr(func, "_step_parents", parents)
|
|
103
|
-
setattr(func, "_step_timeout", timeout)
|
|
104
|
-
setattr(func, "_step_retries", retries)
|
|
105
|
-
setattr(func, "_step_rate_limits", limits)
|
|
106
|
-
setattr(func, "_step_backoff_factor", backoff_factor)
|
|
107
|
-
setattr(func, "_step_backoff_max_seconds", backoff_max_seconds)
|
|
108
|
-
|
|
109
|
-
def create_label(d: DesiredWorkerLabel) -> DesiredWorkerLabels:
|
|
110
|
-
value = d["value"] if "value" in d else None
|
|
111
|
-
return DesiredWorkerLabels(
|
|
112
|
-
strValue=str(value) if not isinstance(value, int) else None,
|
|
113
|
-
intValue=value if isinstance(value, int) else None,
|
|
114
|
-
required=d["required"] if "required" in d else None, # type: ignore[arg-type]
|
|
115
|
-
weight=d["weight"] if "weight" in d else None,
|
|
116
|
-
comparator=d["comparator"] if "comparator" in d else None, # type: ignore[arg-type]
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
setattr(
|
|
120
|
-
func,
|
|
121
|
-
"_step_desired_worker_labels",
|
|
122
|
-
{key: create_label(d) for key, d in desired_worker_labels.items()},
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
return func
|
|
126
|
-
|
|
127
|
-
return inner
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def on_failure_step(
|
|
131
|
-
name: str = "",
|
|
132
|
-
timeout: str = "",
|
|
133
|
-
retries: int = 0,
|
|
134
|
-
rate_limits: list[RateLimit] | None = None,
|
|
135
|
-
backoff_factor: float | None = None,
|
|
136
|
-
backoff_max_seconds: int | None = None,
|
|
137
|
-
) -> Callable[..., Any]:
|
|
138
|
-
def inner(func: Callable[[Context], Any]) -> Callable[[Context], Any]:
|
|
139
|
-
limits = None
|
|
140
|
-
if rate_limits:
|
|
141
|
-
limits = [
|
|
142
|
-
CreateStepRateLimit(key=rate_limit.static_key, units=rate_limit.units) # type: ignore[arg-type]
|
|
143
|
-
for rate_limit in rate_limits or []
|
|
144
|
-
]
|
|
145
|
-
|
|
146
|
-
setattr(
|
|
147
|
-
func, "_on_failure_step_name", name.lower() or str(func.__name__).lower()
|
|
148
|
-
)
|
|
149
|
-
setattr(func, "_on_failure_step_timeout", timeout)
|
|
150
|
-
setattr(func, "_on_failure_step_retries", retries)
|
|
151
|
-
setattr(func, "_on_failure_step_rate_limits", limits)
|
|
152
|
-
setattr(func, "_on_failure_step_backoff_factor", backoff_factor)
|
|
153
|
-
setattr(func, "_on_failure_step_backoff_max_seconds", backoff_max_seconds)
|
|
154
|
-
|
|
155
|
-
return func
|
|
156
|
-
|
|
157
|
-
return inner
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def concurrency(
|
|
161
|
-
name: str = "",
|
|
162
|
-
max_runs: int = 1,
|
|
163
|
-
limit_strategy: ConcurrencyLimitStrategy = ConcurrencyLimitStrategy.CANCEL_IN_PROGRESS,
|
|
164
|
-
) -> Callable[..., Any]:
|
|
165
|
-
def inner(func: Callable[[Context], Any]) -> Callable[[Context], Any]:
|
|
166
|
-
setattr(
|
|
167
|
-
func,
|
|
168
|
-
"_concurrency_fn_name",
|
|
169
|
-
name.lower() or str(func.__name__).lower(),
|
|
170
|
-
)
|
|
171
|
-
setattr(func, "_concurrency_max_runs", max_runs)
|
|
172
|
-
setattr(func, "_concurrency_limit_strategy", limit_strategy)
|
|
173
|
-
|
|
174
|
-
return func
|
|
175
|
-
|
|
176
|
-
return inner
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
class HatchetRest:
|
|
180
|
-
"""
|
|
181
|
-
Main client for interacting with the Hatchet API.
|
|
182
|
-
|
|
183
|
-
This class provides access to various client interfaces and utility methods
|
|
184
|
-
for working with Hatchet via the REST API,
|
|
185
|
-
|
|
186
|
-
Attributes:
|
|
187
|
-
rest (RestApi): Interface for REST API operations.
|
|
188
|
-
"""
|
|
189
33
|
|
|
190
|
-
rest: RestApi
|
|
191
34
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
35
|
+
def transform_desired_worker_label(d: DesiredWorkerLabel) -> DesiredWorkerLabels:
|
|
36
|
+
value = d.value
|
|
37
|
+
return DesiredWorkerLabels(
|
|
38
|
+
strValue=value if not isinstance(value, int) else None,
|
|
39
|
+
intValue=value if isinstance(value, int) else None,
|
|
40
|
+
required=d.required,
|
|
41
|
+
weight=d.weight,
|
|
42
|
+
comparator=d.comparator, # type: ignore[arg-type]
|
|
43
|
+
)
|
|
195
44
|
|
|
196
45
|
|
|
197
46
|
class Hatchet:
|
|
@@ -227,7 +76,7 @@ class Hatchet:
|
|
|
227
76
|
def __init__(
|
|
228
77
|
self,
|
|
229
78
|
debug: bool = False,
|
|
230
|
-
client:
|
|
79
|
+
client: Client | None = None,
|
|
231
80
|
config: ClientConfig = ClientConfig(),
|
|
232
81
|
):
|
|
233
82
|
"""
|
|
@@ -238,24 +87,14 @@ class Hatchet:
|
|
|
238
87
|
client (Optional[Client], optional): A pre-configured Client instance. Defaults to None.
|
|
239
88
|
config (ClientConfig, optional): Configuration for creating a new Client. Defaults to ClientConfig().
|
|
240
89
|
"""
|
|
241
|
-
if client is not None:
|
|
242
|
-
self._client = client
|
|
243
|
-
else:
|
|
244
|
-
self._client = new_client(config, debug)
|
|
245
90
|
|
|
246
91
|
if debug:
|
|
247
92
|
logger.setLevel(logging.DEBUG)
|
|
248
93
|
|
|
94
|
+
self._client = client if client else new_client(config, debug)
|
|
249
95
|
self.cron = CronClient(self._client)
|
|
250
96
|
self.scheduled = ScheduledClient(self._client)
|
|
251
97
|
|
|
252
|
-
@property
|
|
253
|
-
@deprecated(
|
|
254
|
-
"Direct access to client is deprecated and will be removed in a future version. Use specific client properties (Hatchet.admin, Hatchet.dispatcher, Hatchet.event, Hatchet.rest) instead. [0.32.0]",
|
|
255
|
-
)
|
|
256
|
-
def client(self) -> Client:
|
|
257
|
-
return self._client
|
|
258
|
-
|
|
259
98
|
@property
|
|
260
99
|
def admin(self) -> AdminClient:
|
|
261
100
|
return self._client.admin
|
|
@@ -284,13 +123,108 @@ class Hatchet:
|
|
|
284
123
|
def tenant_id(self) -> str:
|
|
285
124
|
return self._client.config.tenant_id
|
|
286
125
|
|
|
287
|
-
|
|
126
|
+
def step(
|
|
127
|
+
self,
|
|
128
|
+
name: str = "",
|
|
129
|
+
timeout: str = "60m",
|
|
130
|
+
parents: list[str] = [],
|
|
131
|
+
retries: int = 0,
|
|
132
|
+
rate_limits: list[RateLimit] = [],
|
|
133
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
134
|
+
backoff_factor: float | None = None,
|
|
135
|
+
backoff_max_seconds: int | None = None,
|
|
136
|
+
) -> Callable[[Callable[[Any, Context], R]], Step[R]]:
|
|
137
|
+
def inner(func: Callable[[Any, Context], R]) -> Step[R]:
|
|
138
|
+
return Step(
|
|
139
|
+
fn=func,
|
|
140
|
+
type=StepType.DEFAULT,
|
|
141
|
+
name=name.lower() or str(func.__name__).lower(),
|
|
142
|
+
timeout=timeout,
|
|
143
|
+
parents=parents,
|
|
144
|
+
retries=retries,
|
|
145
|
+
rate_limits=[r for rate_limit in rate_limits if (r := rate_limit._req)],
|
|
146
|
+
desired_worker_labels={
|
|
147
|
+
key: transform_desired_worker_label(d)
|
|
148
|
+
for key, d in desired_worker_labels.items()
|
|
149
|
+
},
|
|
150
|
+
backoff_factor=backoff_factor,
|
|
151
|
+
backoff_max_seconds=backoff_max_seconds,
|
|
152
|
+
)
|
|
288
153
|
|
|
289
|
-
|
|
154
|
+
return inner
|
|
290
155
|
|
|
291
|
-
|
|
156
|
+
def on_failure_step(
|
|
157
|
+
self,
|
|
158
|
+
name: str = "",
|
|
159
|
+
timeout: str = "60m",
|
|
160
|
+
parents: list[str] = [],
|
|
161
|
+
retries: int = 0,
|
|
162
|
+
rate_limits: list[RateLimit] = [],
|
|
163
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
164
|
+
backoff_factor: float | None = None,
|
|
165
|
+
backoff_max_seconds: int | None = None,
|
|
166
|
+
) -> Callable[[Callable[[Any, Context], R]], Step[R]]:
|
|
167
|
+
def inner(func: Callable[[Any, Context], R]) -> Step[R]:
|
|
168
|
+
return Step(
|
|
169
|
+
fn=func,
|
|
170
|
+
type=StepType.ON_FAILURE,
|
|
171
|
+
name=name.lower() or str(func.__name__).lower(),
|
|
172
|
+
timeout=timeout,
|
|
173
|
+
parents=parents,
|
|
174
|
+
retries=retries,
|
|
175
|
+
rate_limits=[r for rate_limit in rate_limits if (r := rate_limit._req)],
|
|
176
|
+
desired_worker_labels={
|
|
177
|
+
key: transform_desired_worker_label(d)
|
|
178
|
+
for key, d in desired_worker_labels.items()
|
|
179
|
+
},
|
|
180
|
+
backoff_factor=backoff_factor,
|
|
181
|
+
backoff_max_seconds=backoff_max_seconds,
|
|
182
|
+
)
|
|
292
183
|
|
|
293
|
-
|
|
184
|
+
return inner
|
|
185
|
+
|
|
186
|
+
def task(
|
|
187
|
+
self,
|
|
188
|
+
name: str = "",
|
|
189
|
+
on_events: list[str] = [],
|
|
190
|
+
on_crons: list[str] = [],
|
|
191
|
+
version: str = "",
|
|
192
|
+
timeout: str = "60m",
|
|
193
|
+
schedule_timeout: str = "5m",
|
|
194
|
+
sticky: StickyStrategy | None = None,
|
|
195
|
+
retries: int = 0,
|
|
196
|
+
rate_limits: list[RateLimit] = [],
|
|
197
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
198
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
199
|
+
on_failure: Task[Any, Any] | None = None,
|
|
200
|
+
default_priority: int = 1,
|
|
201
|
+
input_validator: Type[TWorkflowInput] | None = None,
|
|
202
|
+
backoff_factor: float | None = None,
|
|
203
|
+
backoff_max_seconds: int | None = None,
|
|
204
|
+
) -> Callable[[Callable[[Context], R]], Task[R, TWorkflowInput]]:
|
|
205
|
+
def inner(func: Callable[[Context], R]) -> Task[R, TWorkflowInput]:
|
|
206
|
+
return Task[R, TWorkflowInput](
|
|
207
|
+
func,
|
|
208
|
+
hatchet=self,
|
|
209
|
+
name=name,
|
|
210
|
+
on_events=on_events,
|
|
211
|
+
on_crons=on_crons,
|
|
212
|
+
version=version,
|
|
213
|
+
timeout=timeout,
|
|
214
|
+
schedule_timeout=schedule_timeout,
|
|
215
|
+
sticky=sticky,
|
|
216
|
+
retries=retries,
|
|
217
|
+
rate_limits=rate_limits,
|
|
218
|
+
desired_worker_labels=desired_worker_labels,
|
|
219
|
+
concurrency=concurrency,
|
|
220
|
+
on_failure=on_failure,
|
|
221
|
+
default_priority=default_priority,
|
|
222
|
+
input_validator=input_validator,
|
|
223
|
+
backoff_factor=backoff_factor,
|
|
224
|
+
backoff_max_seconds=backoff_max_seconds,
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
return inner
|
|
294
228
|
|
|
295
229
|
def worker(
|
|
296
230
|
self, name: str, max_runs: int | None = None, labels: dict[str, str | int] = {}
|
|
@@ -308,3 +242,66 @@ class Hatchet:
|
|
|
308
242
|
debug=self._client.debug,
|
|
309
243
|
owned_loop=loop is None,
|
|
310
244
|
)
|
|
245
|
+
|
|
246
|
+
@overload
|
|
247
|
+
def declare_workflow(
|
|
248
|
+
self,
|
|
249
|
+
*,
|
|
250
|
+
name: str = "",
|
|
251
|
+
on_events: list[str] = [],
|
|
252
|
+
on_crons: list[str] = [],
|
|
253
|
+
version: str = "",
|
|
254
|
+
timeout: str = "60m",
|
|
255
|
+
schedule_timeout: str = "5m",
|
|
256
|
+
sticky: StickyStrategy | None = None,
|
|
257
|
+
default_priority: int = 1,
|
|
258
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
259
|
+
input_validator: None = None,
|
|
260
|
+
) -> WorkflowDeclaration[EmptyModel]: ...
|
|
261
|
+
|
|
262
|
+
@overload
|
|
263
|
+
def declare_workflow(
|
|
264
|
+
self,
|
|
265
|
+
*,
|
|
266
|
+
name: str = "",
|
|
267
|
+
on_events: list[str] = [],
|
|
268
|
+
on_crons: list[str] = [],
|
|
269
|
+
version: str = "",
|
|
270
|
+
timeout: str = "60m",
|
|
271
|
+
schedule_timeout: str = "5m",
|
|
272
|
+
sticky: StickyStrategy | None = None,
|
|
273
|
+
default_priority: int = 1,
|
|
274
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
275
|
+
input_validator: Type[TWorkflowInput],
|
|
276
|
+
) -> WorkflowDeclaration[TWorkflowInput]: ...
|
|
277
|
+
|
|
278
|
+
def declare_workflow(
|
|
279
|
+
self,
|
|
280
|
+
*,
|
|
281
|
+
name: str = "",
|
|
282
|
+
on_events: list[str] = [],
|
|
283
|
+
on_crons: list[str] = [],
|
|
284
|
+
version: str = "",
|
|
285
|
+
timeout: str = "60m",
|
|
286
|
+
schedule_timeout: str = "5m",
|
|
287
|
+
sticky: StickyStrategy | None = None,
|
|
288
|
+
default_priority: int = 1,
|
|
289
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
290
|
+
input_validator: Type[TWorkflowInput] | None = None,
|
|
291
|
+
) -> WorkflowDeclaration[EmptyModel] | WorkflowDeclaration[TWorkflowInput]:
|
|
292
|
+
return WorkflowDeclaration[TWorkflowInput](
|
|
293
|
+
WorkflowConfig(
|
|
294
|
+
name=name,
|
|
295
|
+
on_events=on_events,
|
|
296
|
+
on_crons=on_crons,
|
|
297
|
+
version=version,
|
|
298
|
+
timeout=timeout,
|
|
299
|
+
schedule_timeout=schedule_timeout,
|
|
300
|
+
sticky=sticky,
|
|
301
|
+
default_priority=default_priority,
|
|
302
|
+
concurrency=concurrency,
|
|
303
|
+
input_validator=input_validator
|
|
304
|
+
or cast(Type[TWorkflowInput], EmptyModel),
|
|
305
|
+
),
|
|
306
|
+
self,
|
|
307
|
+
)
|
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]
|
|
@@ -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
|
|
|
@@ -391,6 +395,6 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
|
|
|
391
395
|
unwrap(hatchet_sdk, "clients.events.EventClient.push")
|
|
392
396
|
unwrap(hatchet_sdk, "clients.events.EventClient.bulk_push")
|
|
393
397
|
unwrap(hatchet_sdk, "clients.admin.AdminClient.run_workflow")
|
|
394
|
-
unwrap(hatchet_sdk, "clients.admin.
|
|
398
|
+
unwrap(hatchet_sdk, "clients.admin.AdminClient.aio_run_workflow")
|
|
395
399
|
unwrap(hatchet_sdk, "clients.admin.AdminClient.run_workflows")
|
|
396
|
-
unwrap(hatchet_sdk, "clients.admin.
|
|
400
|
+
unwrap(hatchet_sdk, "clients.admin.AdminClient.aio_run_workflows")
|
hatchet_sdk/rate_limit.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
|
-
from
|
|
2
|
+
from enum import Enum
|
|
3
3
|
|
|
4
|
-
from celpy import CELEvalError, Environment
|
|
4
|
+
from celpy import CELEvalError, Environment # type: ignore
|
|
5
5
|
|
|
6
6
|
from hatchet_sdk.contracts.workflows_pb2 import CreateStepRateLimit
|
|
7
7
|
|
|
@@ -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"
|
|
@@ -40,7 +40,6 @@ class RateLimit:
|
|
|
40
40
|
units (int or str, default=1): The number of units or a CEL expression for dynamic unit calculation.
|
|
41
41
|
limit (int or str, optional): The rate limit value or a CEL expression for dynamic limit calculation.
|
|
42
42
|
duration (str, default=RateLimitDuration.MINUTE): The window duration of the rate limit.
|
|
43
|
-
key (str, optional): Deprecated. Use static_key instead.
|
|
44
43
|
|
|
45
44
|
Usage:
|
|
46
45
|
1. Static rate limit:
|
|
@@ -61,29 +60,21 @@ class RateLimit:
|
|
|
61
60
|
|
|
62
61
|
Raises:
|
|
63
62
|
ValueError: If invalid combinations of attributes are provided or if CEL expressions are invalid.
|
|
64
|
-
DeprecationWarning: If the deprecated 'key' attribute is used.
|
|
65
63
|
"""
|
|
66
64
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
limit: Union[int, str, None] = None
|
|
65
|
+
static_key: str | None = None
|
|
66
|
+
dynamic_key: str | None = None
|
|
67
|
+
units: str | int = 1
|
|
68
|
+
limit: int | str | None = None
|
|
72
69
|
duration: RateLimitDuration = RateLimitDuration.MINUTE
|
|
73
70
|
|
|
74
|
-
_req: CreateStepRateLimit = None
|
|
71
|
+
_req: CreateStepRateLimit | None = None
|
|
75
72
|
|
|
76
|
-
def __post_init__(self):
|
|
73
|
+
def __post_init__(self) -> None:
|
|
77
74
|
# juggle the key and key_expr fields
|
|
78
75
|
key = self.static_key
|
|
79
76
|
key_expression = self.dynamic_key
|
|
80
77
|
|
|
81
|
-
if self.key is not None:
|
|
82
|
-
DeprecationWarning(
|
|
83
|
-
"key is deprecated and will be removed in a future release, please use static_key instead"
|
|
84
|
-
)
|
|
85
|
-
key = self.key
|
|
86
|
-
|
|
87
78
|
if key_expression is not None:
|
|
88
79
|
if key is not None:
|
|
89
80
|
raise ValueError("Cannot have both static key and dynamic key set")
|
hatchet_sdk/token.py
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import base64
|
|
2
|
-
import json
|
|
3
2
|
|
|
3
|
+
from pydantic import BaseModel
|
|
4
4
|
|
|
5
|
-
def get_tenant_id_from_jwt(token: str) -> str:
|
|
6
|
-
claims = extract_claims_from_jwt(token)
|
|
7
5
|
|
|
8
|
-
|
|
6
|
+
class Claims(BaseModel):
|
|
7
|
+
sub: str
|
|
8
|
+
server_url: str
|
|
9
|
+
grpc_broadcast_address: str
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_tenant_id_from_jwt(token: str) -> str:
|
|
13
|
+
return extract_claims_from_jwt(token).sub
|
|
9
14
|
|
|
10
15
|
|
|
11
|
-
def get_addresses_from_jwt(token: str) ->
|
|
16
|
+
def get_addresses_from_jwt(token: str) -> tuple[str, str]:
|
|
12
17
|
claims = extract_claims_from_jwt(token)
|
|
13
18
|
|
|
14
|
-
return claims.
|
|
19
|
+
return claims.server_url, claims.grpc_broadcast_address
|
|
15
20
|
|
|
16
21
|
|
|
17
|
-
def extract_claims_from_jwt(token: str):
|
|
22
|
+
def extract_claims_from_jwt(token: str) -> Claims:
|
|
18
23
|
parts = token.split(".")
|
|
19
24
|
if len(parts) != 3:
|
|
20
25
|
raise ValueError("Invalid token format")
|
|
@@ -22,6 +27,5 @@ def extract_claims_from_jwt(token: str):
|
|
|
22
27
|
claims_part = parts[1]
|
|
23
28
|
claims_part += "=" * ((4 - len(claims_part) % 4) % 4) # Padding for base64 decoding
|
|
24
29
|
claims_data = base64.urlsafe_b64decode(claims_part)
|
|
25
|
-
claims = json.loads(claims_data)
|
|
26
30
|
|
|
27
|
-
return
|
|
31
|
+
return Claims.model_validate_json(claims_data)
|
hatchet_sdk/utils/aio_utils.py
CHANGED
|
@@ -2,7 +2,6 @@ import asyncio
|
|
|
2
2
|
import inspect
|
|
3
3
|
from concurrent.futures import Executor
|
|
4
4
|
from functools import partial, wraps
|
|
5
|
-
from threading import Thread
|
|
6
5
|
from typing import Any
|
|
7
6
|
|
|
8
7
|
|
|
@@ -81,45 +80,6 @@ def sync_to_async(func: Any) -> Any:
|
|
|
81
80
|
return run
|
|
82
81
|
|
|
83
82
|
|
|
84
|
-
class EventLoopThread:
|
|
85
|
-
"""A class that manages an asyncio event loop running in a separate thread."""
|
|
86
|
-
|
|
87
|
-
def __init__(self) -> None:
|
|
88
|
-
"""
|
|
89
|
-
Initializes the EventLoopThread by creating an event loop
|
|
90
|
-
and setting up a thread to run the loop.
|
|
91
|
-
"""
|
|
92
|
-
self.loop = asyncio.new_event_loop()
|
|
93
|
-
self.thread = Thread(target=self.run_loop_in_thread, args=(self.loop,))
|
|
94
|
-
|
|
95
|
-
def __enter__(self, *a, **kw) -> asyncio.AbstractEventLoop:
|
|
96
|
-
"""
|
|
97
|
-
Starts the thread running the event loop when entering the context.
|
|
98
|
-
|
|
99
|
-
Returns:
|
|
100
|
-
asyncio.AbstractEventLoop: The event loop running in the separate thread.
|
|
101
|
-
"""
|
|
102
|
-
self.thread.start()
|
|
103
|
-
return self.loop
|
|
104
|
-
|
|
105
|
-
def __exit__(self, *a, **kw) -> None:
|
|
106
|
-
"""
|
|
107
|
-
Stops the event loop and joins the thread when exiting the context.
|
|
108
|
-
"""
|
|
109
|
-
self.loop.call_soon_threadsafe(self.loop.stop)
|
|
110
|
-
self.thread.join()
|
|
111
|
-
|
|
112
|
-
def run_loop_in_thread(self, loop: asyncio.AbstractEventLoop) -> None:
|
|
113
|
-
"""
|
|
114
|
-
Sets the event loop for the current thread and runs it forever.
|
|
115
|
-
|
|
116
|
-
Args:
|
|
117
|
-
loop (asyncio.AbstractEventLoop): The event loop to run.
|
|
118
|
-
"""
|
|
119
|
-
asyncio.set_event_loop(loop)
|
|
120
|
-
loop.run_forever()
|
|
121
|
-
|
|
122
|
-
|
|
123
83
|
def get_active_event_loop() -> asyncio.AbstractEventLoop | None:
|
|
124
84
|
"""
|
|
125
85
|
Get the active event loop.
|