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.
Files changed (303) hide show
  1. hatchet_sdk/__init__.py +25 -16
  2. hatchet_sdk/client.py +14 -39
  3. hatchet_sdk/clients/admin.py +203 -362
  4. hatchet_sdk/clients/dispatcher/action_listener.py +106 -84
  5. hatchet_sdk/clients/dispatcher/dispatcher.py +21 -21
  6. hatchet_sdk/clients/event_ts.py +23 -10
  7. hatchet_sdk/clients/events.py +96 -99
  8. hatchet_sdk/clients/rest/__init__.py +24 -0
  9. hatchet_sdk/clients/rest/api/__init__.py +2 -0
  10. hatchet_sdk/clients/rest/api/task_api.py +2174 -0
  11. hatchet_sdk/clients/rest/api/workflow_runs_api.py +638 -106
  12. hatchet_sdk/clients/rest/api_client.py +1 -1
  13. hatchet_sdk/clients/rest/configuration.py +8 -1
  14. hatchet_sdk/clients/rest/exceptions.py +21 -0
  15. hatchet_sdk/clients/rest/models/__init__.py +22 -0
  16. hatchet_sdk/clients/rest/models/tenant.py +4 -0
  17. hatchet_sdk/clients/rest/models/tenant_version.py +37 -0
  18. hatchet_sdk/clients/rest/models/update_tenant_request.py +7 -0
  19. hatchet_sdk/clients/rest/models/v1_cancel_task_request.py +104 -0
  20. hatchet_sdk/clients/rest/models/v1_dag_children.py +102 -0
  21. hatchet_sdk/clients/rest/models/v1_replay_task_request.py +104 -0
  22. hatchet_sdk/clients/rest/models/v1_task.py +174 -0
  23. hatchet_sdk/clients/rest/models/v1_task_event.py +118 -0
  24. hatchet_sdk/clients/rest/models/v1_task_event_list.py +110 -0
  25. hatchet_sdk/clients/rest/models/v1_task_event_type.py +55 -0
  26. hatchet_sdk/clients/rest/models/v1_task_filter.py +106 -0
  27. hatchet_sdk/clients/rest/models/v1_task_point_metric.py +92 -0
  28. hatchet_sdk/clients/rest/models/v1_task_point_metrics.py +100 -0
  29. hatchet_sdk/clients/rest/models/v1_task_run_metric.py +88 -0
  30. hatchet_sdk/clients/rest/models/v1_task_run_status.py +40 -0
  31. hatchet_sdk/clients/rest/models/v1_task_status.py +40 -0
  32. hatchet_sdk/clients/rest/models/v1_task_summary.py +212 -0
  33. hatchet_sdk/clients/rest/models/v1_task_summary_list.py +110 -0
  34. hatchet_sdk/clients/rest/models/v1_workflow_run.py +171 -0
  35. hatchet_sdk/clients/rest/models/v1_workflow_run_details.py +145 -0
  36. hatchet_sdk/clients/rest/models/v1_workflow_type.py +37 -0
  37. hatchet_sdk/clients/rest/models/workflow_run_shape_item_for_workflow_run_details.py +99 -0
  38. hatchet_sdk/clients/rest/rest.py +37 -26
  39. hatchet_sdk/clients/rest/tenacity_utils.py +1 -1
  40. hatchet_sdk/clients/rest_client.py +141 -116
  41. hatchet_sdk/clients/run_event_listener.py +66 -60
  42. hatchet_sdk/clients/workflow_listener.py +75 -66
  43. hatchet_sdk/config.py +117 -0
  44. hatchet_sdk/connection.py +27 -13
  45. hatchet_sdk/context/__init__.py +0 -1
  46. hatchet_sdk/context/context.py +118 -218
  47. hatchet_sdk/features/cron.py +43 -57
  48. hatchet_sdk/features/scheduled.py +60 -74
  49. hatchet_sdk/hatchet.py +192 -195
  50. hatchet_sdk/labels.py +4 -6
  51. hatchet_sdk/metadata.py +1 -1
  52. hatchet_sdk/opentelemetry/instrumentor.py +9 -5
  53. hatchet_sdk/rate_limit.py +9 -18
  54. hatchet_sdk/token.py +13 -9
  55. hatchet_sdk/utils/aio_utils.py +0 -40
  56. hatchet_sdk/utils/proto_enums.py +54 -0
  57. hatchet_sdk/utils/typing.py +9 -1
  58. hatchet_sdk/v0/__init__.py +251 -0
  59. hatchet_sdk/v0/client.py +119 -0
  60. hatchet_sdk/v0/clients/admin.py +541 -0
  61. hatchet_sdk/v0/clients/dispatcher/action_listener.py +422 -0
  62. hatchet_sdk/v0/clients/dispatcher/dispatcher.py +204 -0
  63. hatchet_sdk/v0/clients/event_ts.py +28 -0
  64. hatchet_sdk/v0/clients/events.py +182 -0
  65. hatchet_sdk/v0/clients/rest/__init__.py +307 -0
  66. hatchet_sdk/v0/clients/rest/api/__init__.py +19 -0
  67. hatchet_sdk/v0/clients/rest/api/api_token_api.py +858 -0
  68. hatchet_sdk/v0/clients/rest/api/default_api.py +2259 -0
  69. hatchet_sdk/v0/clients/rest/api/event_api.py +2548 -0
  70. hatchet_sdk/v0/clients/rest/api/github_api.py +331 -0
  71. hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +483 -0
  72. hatchet_sdk/v0/clients/rest/api/log_api.py +449 -0
  73. hatchet_sdk/v0/clients/rest/api/metadata_api.py +728 -0
  74. hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +423 -0
  75. hatchet_sdk/v0/clients/rest/api/slack_api.py +577 -0
  76. hatchet_sdk/v0/clients/rest/api/sns_api.py +872 -0
  77. hatchet_sdk/v0/clients/rest/api/step_run_api.py +2202 -0
  78. hatchet_sdk/v0/clients/rest/api/tenant_api.py +4430 -0
  79. hatchet_sdk/v0/clients/rest/api/user_api.py +2888 -0
  80. hatchet_sdk/v0/clients/rest/api/worker_api.py +858 -0
  81. hatchet_sdk/v0/clients/rest/api/workflow_api.py +6312 -0
  82. hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +1932 -0
  83. hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +610 -0
  84. hatchet_sdk/v0/clients/rest/api_client.py +759 -0
  85. hatchet_sdk/v0/clients/rest/api_response.py +22 -0
  86. hatchet_sdk/v0/clients/rest/configuration.py +611 -0
  87. hatchet_sdk/v0/clients/rest/exceptions.py +200 -0
  88. hatchet_sdk/v0/clients/rest/models/__init__.py +274 -0
  89. hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +83 -0
  90. hatchet_sdk/v0/clients/rest/models/api_error.py +102 -0
  91. hatchet_sdk/v0/clients/rest/models/api_errors.py +100 -0
  92. hatchet_sdk/v0/clients/rest/models/api_meta.py +144 -0
  93. hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +85 -0
  94. hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +88 -0
  95. hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +90 -0
  96. hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +98 -0
  97. hatchet_sdk/v0/clients/rest/models/api_token.py +105 -0
  98. hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +100 -0
  99. hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +110 -0
  100. hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +85 -0
  101. hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +83 -0
  102. hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +39 -0
  103. hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +92 -0
  104. hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +83 -0
  105. hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +98 -0
  106. hatchet_sdk/v0/clients/rest/models/create_event_request.py +95 -0
  107. hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +83 -0
  108. hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +85 -0
  109. hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +83 -0
  110. hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +86 -0
  111. hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +84 -0
  112. hatchet_sdk/v0/clients/rest/models/cron_workflows.py +131 -0
  113. hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +110 -0
  114. hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +37 -0
  115. hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +37 -0
  116. hatchet_sdk/v0/clients/rest/models/event.py +143 -0
  117. hatchet_sdk/v0/clients/rest/models/event_data.py +83 -0
  118. hatchet_sdk/v0/clients/rest/models/event_key_list.py +98 -0
  119. hatchet_sdk/v0/clients/rest/models/event_list.py +110 -0
  120. hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +37 -0
  121. hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +36 -0
  122. hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +85 -0
  123. hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +116 -0
  124. hatchet_sdk/v0/clients/rest/models/events.py +110 -0
  125. hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +100 -0
  126. hatchet_sdk/v0/clients/rest/models/github_app_installation.py +107 -0
  127. hatchet_sdk/v0/clients/rest/models/github_branch.py +86 -0
  128. hatchet_sdk/v0/clients/rest/models/github_repo.py +86 -0
  129. hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +83 -0
  130. hatchet_sdk/v0/clients/rest/models/job.py +132 -0
  131. hatchet_sdk/v0/clients/rest/models/job_run.py +176 -0
  132. hatchet_sdk/v0/clients/rest/models/job_run_status.py +41 -0
  133. hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +106 -0
  134. hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +110 -0
  135. hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +112 -0
  136. hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +100 -0
  137. hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +110 -0
  138. hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +110 -0
  139. hatchet_sdk/v0/clients/rest/models/log_line.py +94 -0
  140. hatchet_sdk/v0/clients/rest/models/log_line_level.py +39 -0
  141. hatchet_sdk/v0/clients/rest/models/log_line_list.py +110 -0
  142. hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +37 -0
  143. hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +36 -0
  144. hatchet_sdk/v0/clients/rest/models/pagination_response.py +95 -0
  145. hatchet_sdk/v0/clients/rest/models/pull_request.py +112 -0
  146. hatchet_sdk/v0/clients/rest/models/pull_request_state.py +37 -0
  147. hatchet_sdk/v0/clients/rest/models/queue_metrics.py +97 -0
  148. hatchet_sdk/v0/clients/rest/models/rate_limit.py +117 -0
  149. hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +110 -0
  150. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +37 -0
  151. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +38 -0
  152. hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +118 -0
  153. hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +83 -0
  154. hatchet_sdk/v0/clients/rest/models/replay_event_request.py +85 -0
  155. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +85 -0
  156. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +100 -0
  157. hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +83 -0
  158. hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +92 -0
  159. hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +42 -0
  160. hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +149 -0
  161. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +110 -0
  162. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +37 -0
  163. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +37 -0
  164. hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +113 -0
  165. hatchet_sdk/v0/clients/rest/models/slack_webhook.py +127 -0
  166. hatchet_sdk/v0/clients/rest/models/sns_integration.py +114 -0
  167. hatchet_sdk/v0/clients/rest/models/step.py +123 -0
  168. hatchet_sdk/v0/clients/rest/models/step_run.py +202 -0
  169. hatchet_sdk/v0/clients/rest/models/step_run_archive.py +142 -0
  170. hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +110 -0
  171. hatchet_sdk/v0/clients/rest/models/step_run_diff.py +91 -0
  172. hatchet_sdk/v0/clients/rest/models/step_run_event.py +122 -0
  173. hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +110 -0
  174. hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +52 -0
  175. hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +38 -0
  176. hatchet_sdk/v0/clients/rest/models/step_run_status.py +44 -0
  177. hatchet_sdk/v0/clients/rest/models/tenant.py +118 -0
  178. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +98 -0
  179. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +112 -0
  180. hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +143 -0
  181. hatchet_sdk/v0/clients/rest/models/tenant_invite.py +120 -0
  182. hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +110 -0
  183. hatchet_sdk/v0/clients/rest/models/tenant_list.py +110 -0
  184. hatchet_sdk/v0/clients/rest/models/tenant_member.py +123 -0
  185. hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +110 -0
  186. hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +38 -0
  187. hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +116 -0
  188. hatchet_sdk/v0/clients/rest/models/tenant_resource.py +40 -0
  189. hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +135 -0
  190. hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +102 -0
  191. hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +83 -0
  192. hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +91 -0
  193. hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +83 -0
  194. hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +85 -0
  195. hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +137 -0
  196. hatchet_sdk/v0/clients/rest/models/update_worker_request.py +87 -0
  197. hatchet_sdk/v0/clients/rest/models/user.py +126 -0
  198. hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +88 -0
  199. hatchet_sdk/v0/clients/rest/models/user_login_request.py +86 -0
  200. hatchet_sdk/v0/clients/rest/models/user_register_request.py +91 -0
  201. hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +110 -0
  202. hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +86 -0
  203. hatchet_sdk/v0/clients/rest/models/webhook_worker.py +100 -0
  204. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +94 -0
  205. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +98 -0
  206. hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +102 -0
  207. hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +110 -0
  208. hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +102 -0
  209. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +104 -0
  210. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +38 -0
  211. hatchet_sdk/v0/clients/rest/models/worker.py +239 -0
  212. hatchet_sdk/v0/clients/rest/models/worker_label.py +102 -0
  213. hatchet_sdk/v0/clients/rest/models/worker_list.py +110 -0
  214. hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +103 -0
  215. hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +38 -0
  216. hatchet_sdk/v0/clients/rest/models/worker_type.py +38 -0
  217. hatchet_sdk/v0/clients/rest/models/workflow.py +165 -0
  218. hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +107 -0
  219. hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +136 -0
  220. hatchet_sdk/v0/clients/rest/models/workflow_kind.py +38 -0
  221. hatchet_sdk/v0/clients/rest/models/workflow_list.py +120 -0
  222. hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +97 -0
  223. hatchet_sdk/v0/clients/rest/models/workflow_run.py +188 -0
  224. hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +85 -0
  225. hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +110 -0
  226. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +37 -0
  227. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +39 -0
  228. hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +186 -0
  229. hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +42 -0
  230. hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +112 -0
  231. hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +85 -0
  232. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +94 -0
  233. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +104 -0
  234. hatchet_sdk/v0/clients/rest/models/workflow_tag.py +84 -0
  235. hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +86 -0
  236. hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +86 -0
  237. hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +141 -0
  238. hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +85 -0
  239. hatchet_sdk/v0/clients/rest/models/workflow_version.py +170 -0
  240. hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +114 -0
  241. hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +85 -0
  242. hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +123 -0
  243. hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +95 -0
  244. hatchet_sdk/v0/clients/rest/rest.py +187 -0
  245. hatchet_sdk/v0/clients/rest/tenacity_utils.py +39 -0
  246. hatchet_sdk/v0/clients/rest_client.py +613 -0
  247. hatchet_sdk/v0/clients/run_event_listener.py +260 -0
  248. hatchet_sdk/v0/clients/workflow_listener.py +277 -0
  249. hatchet_sdk/v0/connection.py +63 -0
  250. hatchet_sdk/v0/context/__init__.py +1 -0
  251. hatchet_sdk/v0/context/context.py +446 -0
  252. hatchet_sdk/v0/context/worker_context.py +28 -0
  253. hatchet_sdk/v0/contracts/dispatcher_pb2.py +102 -0
  254. hatchet_sdk/v0/contracts/dispatcher_pb2.pyi +387 -0
  255. hatchet_sdk/v0/contracts/dispatcher_pb2_grpc.py +621 -0
  256. hatchet_sdk/v0/contracts/events_pb2.py +46 -0
  257. hatchet_sdk/v0/contracts/events_pb2.pyi +87 -0
  258. hatchet_sdk/v0/contracts/events_pb2_grpc.py +274 -0
  259. hatchet_sdk/v0/contracts/workflows_pb2.py +80 -0
  260. hatchet_sdk/v0/contracts/workflows_pb2.pyi +312 -0
  261. hatchet_sdk/v0/contracts/workflows_pb2_grpc.py +277 -0
  262. hatchet_sdk/v0/features/cron.py +286 -0
  263. hatchet_sdk/v0/features/scheduled.py +248 -0
  264. hatchet_sdk/v0/hatchet.py +310 -0
  265. hatchet_sdk/v0/labels.py +10 -0
  266. hatchet_sdk/v0/logger.py +13 -0
  267. hatchet_sdk/v0/metadata.py +2 -0
  268. hatchet_sdk/v0/opentelemetry/instrumentor.py +396 -0
  269. hatchet_sdk/v0/rate_limit.py +126 -0
  270. hatchet_sdk/v0/semver.py +30 -0
  271. hatchet_sdk/v0/token.py +27 -0
  272. hatchet_sdk/v0/utils/aio_utils.py +137 -0
  273. hatchet_sdk/v0/utils/backoff.py +9 -0
  274. hatchet_sdk/v0/utils/typing.py +12 -0
  275. hatchet_sdk/{v2 → v0/v2}/callable.py +8 -8
  276. hatchet_sdk/{v2 → v0/v2}/concurrency.py +2 -2
  277. hatchet_sdk/{v2 → v0/v2}/hatchet.py +10 -10
  278. hatchet_sdk/v0/worker/__init__.py +1 -0
  279. hatchet_sdk/v0/worker/action_listener_process.py +278 -0
  280. hatchet_sdk/v0/worker/runner/run_loop_manager.py +112 -0
  281. hatchet_sdk/v0/worker/runner/runner.py +460 -0
  282. hatchet_sdk/v0/worker/runner/utils/capture_logs.py +81 -0
  283. hatchet_sdk/v0/worker/runner/utils/error_with_traceback.py +6 -0
  284. hatchet_sdk/v0/worker/worker.py +391 -0
  285. hatchet_sdk/v0/workflow.py +261 -0
  286. hatchet_sdk/v0/workflow_run.py +59 -0
  287. hatchet_sdk/worker/__init__.py +0 -1
  288. hatchet_sdk/worker/action_listener_process.py +36 -33
  289. hatchet_sdk/worker/runner/run_loop_manager.py +18 -16
  290. hatchet_sdk/worker/runner/runner.py +32 -60
  291. hatchet_sdk/worker/runner/utils/capture_logs.py +25 -14
  292. hatchet_sdk/worker/runner/utils/error_with_traceback.py +1 -1
  293. hatchet_sdk/worker/worker.py +61 -75
  294. hatchet_sdk/workflow.py +473 -207
  295. hatchet_sdk/workflow_run.py +5 -18
  296. {hatchet_sdk-0.47.0.dist-info → hatchet_sdk-1.0.0.dist-info}/METADATA +2 -1
  297. hatchet_sdk-1.0.0.dist-info/RECORD +485 -0
  298. hatchet_sdk/utils/serialization.py +0 -18
  299. hatchet_sdk-0.47.0.dist-info/RECORD +0 -237
  300. /hatchet_sdk/{loader.py → v0/loader.py} +0 -0
  301. /hatchet_sdk/{utils → v0/utils}/types.py +0 -0
  302. {hatchet_sdk-0.47.0.dist-info → hatchet_sdk-1.0.0.dist-info}/WHEEL +0 -0
  303. {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, Optional, ParamSpec, Type, TypeVar, Union
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.loader import ClientConfig, ConfigLoader
17
+ from hatchet_sdk.logger import logger
20
18
  from hatchet_sdk.rate_limit import RateLimit
21
- from hatchet_sdk.v2.callable import HatchetCallable
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
- WorkflowInterface,
33
- WorkflowMeta,
34
- WorkflowStepProtocol,
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
- def __init__(self, config: ClientConfig = ClientConfig()):
193
- _config: ClientConfig = ConfigLoader(".").load_client_config(config)
194
- self.rest = RestApi(_config.server_url, _config.token, _config.tenant_id)
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: Optional[Client] = None,
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
- concurrency = staticmethod(concurrency)
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
- workflow = staticmethod(workflow)
154
+ return inner
290
155
 
291
- step = staticmethod(step)
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
- on_failure_step = staticmethod(on_failure_step)
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 typing import TypedDict
1
+ from pydantic import BaseModel
2
2
 
3
3
 
4
- class DesiredWorkerLabel(TypedDict, total=False):
4
+ class DesiredWorkerLabel(BaseModel):
5
5
  value: str | int
6
- required: bool | None = None
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(metadata: dict[str, str] | None) -> Context | None:
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.AdminClientAioImpl.run_workflow",
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.AdminClientAioImpl.run_workflows",
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.AdminClientAioImpl.run_workflow")
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.AdminClientAioImpl.run_workflows")
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 typing import Union
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
- key: Union[str, None] = None
68
- static_key: Union[str, None] = None
69
- dynamic_key: Union[str, None] = None
70
- units: Union[int, str] = 1
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
- return claims.get("sub")
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) -> (str, 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.get("server_url"), claims.get("grpc_broadcast_address")
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 claims
31
+ return Claims.model_validate_json(claims_data)
@@ -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.