hatchet-sdk 1.18.1__py3-none-any.whl → 1.19.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.
Potentially problematic release.
This version of hatchet-sdk might be problematic. Click here for more details.
- {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.19.0.dist-info}/METADATA +2 -3
- {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.19.0.dist-info}/RECORD +4 -225
- hatchet_sdk/v0/__init__.py +0 -251
- hatchet_sdk/v0/client.py +0 -119
- hatchet_sdk/v0/clients/admin.py +0 -541
- hatchet_sdk/v0/clients/dispatcher/action_listener.py +0 -422
- hatchet_sdk/v0/clients/dispatcher/dispatcher.py +0 -204
- hatchet_sdk/v0/clients/event_ts.py +0 -28
- hatchet_sdk/v0/clients/events.py +0 -182
- hatchet_sdk/v0/clients/rest/__init__.py +0 -307
- hatchet_sdk/v0/clients/rest/api/__init__.py +0 -19
- hatchet_sdk/v0/clients/rest/api/api_token_api.py +0 -858
- hatchet_sdk/v0/clients/rest/api/default_api.py +0 -2259
- hatchet_sdk/v0/clients/rest/api/event_api.py +0 -2548
- hatchet_sdk/v0/clients/rest/api/github_api.py +0 -331
- hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +0 -483
- hatchet_sdk/v0/clients/rest/api/log_api.py +0 -449
- hatchet_sdk/v0/clients/rest/api/metadata_api.py +0 -728
- hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +0 -423
- hatchet_sdk/v0/clients/rest/api/slack_api.py +0 -577
- hatchet_sdk/v0/clients/rest/api/sns_api.py +0 -872
- hatchet_sdk/v0/clients/rest/api/step_run_api.py +0 -2202
- hatchet_sdk/v0/clients/rest/api/tenant_api.py +0 -4430
- hatchet_sdk/v0/clients/rest/api/user_api.py +0 -2888
- hatchet_sdk/v0/clients/rest/api/worker_api.py +0 -858
- hatchet_sdk/v0/clients/rest/api/workflow_api.py +0 -6312
- hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +0 -1932
- hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +0 -610
- hatchet_sdk/v0/clients/rest/api_client.py +0 -759
- hatchet_sdk/v0/clients/rest/api_response.py +0 -22
- hatchet_sdk/v0/clients/rest/configuration.py +0 -611
- hatchet_sdk/v0/clients/rest/exceptions.py +0 -200
- hatchet_sdk/v0/clients/rest/models/__init__.py +0 -274
- hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +0 -83
- hatchet_sdk/v0/clients/rest/models/api_error.py +0 -102
- hatchet_sdk/v0/clients/rest/models/api_errors.py +0 -100
- hatchet_sdk/v0/clients/rest/models/api_meta.py +0 -144
- hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +0 -85
- hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +0 -88
- hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +0 -90
- hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +0 -98
- hatchet_sdk/v0/clients/rest/models/api_token.py +0 -105
- hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +0 -100
- hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +0 -110
- hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +0 -85
- hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +0 -83
- hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +0 -39
- hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +0 -92
- hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +0 -83
- hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +0 -98
- hatchet_sdk/v0/clients/rest/models/create_event_request.py +0 -95
- hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +0 -83
- hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +0 -85
- hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +0 -83
- hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +0 -86
- hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +0 -84
- hatchet_sdk/v0/clients/rest/models/cron_workflows.py +0 -131
- hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +0 -37
- hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +0 -37
- hatchet_sdk/v0/clients/rest/models/event.py +0 -143
- hatchet_sdk/v0/clients/rest/models/event_data.py +0 -83
- hatchet_sdk/v0/clients/rest/models/event_key_list.py +0 -98
- hatchet_sdk/v0/clients/rest/models/event_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +0 -37
- hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +0 -36
- hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +0 -85
- hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +0 -116
- hatchet_sdk/v0/clients/rest/models/events.py +0 -110
- hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +0 -100
- hatchet_sdk/v0/clients/rest/models/github_app_installation.py +0 -107
- hatchet_sdk/v0/clients/rest/models/github_branch.py +0 -86
- hatchet_sdk/v0/clients/rest/models/github_repo.py +0 -86
- hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +0 -83
- hatchet_sdk/v0/clients/rest/models/job.py +0 -132
- hatchet_sdk/v0/clients/rest/models/job_run.py +0 -176
- hatchet_sdk/v0/clients/rest/models/job_run_status.py +0 -41
- hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +0 -106
- hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +0 -110
- hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +0 -112
- hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +0 -100
- hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +0 -110
- hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +0 -110
- hatchet_sdk/v0/clients/rest/models/log_line.py +0 -94
- hatchet_sdk/v0/clients/rest/models/log_line_level.py +0 -39
- hatchet_sdk/v0/clients/rest/models/log_line_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +0 -37
- hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +0 -36
- hatchet_sdk/v0/clients/rest/models/pagination_response.py +0 -95
- hatchet_sdk/v0/clients/rest/models/pull_request.py +0 -112
- hatchet_sdk/v0/clients/rest/models/pull_request_state.py +0 -37
- hatchet_sdk/v0/clients/rest/models/queue_metrics.py +0 -97
- hatchet_sdk/v0/clients/rest/models/rate_limit.py +0 -117
- hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +0 -37
- hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +0 -38
- hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +0 -118
- hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +0 -83
- hatchet_sdk/v0/clients/rest/models/replay_event_request.py +0 -85
- hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +0 -85
- hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +0 -100
- hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +0 -83
- hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +0 -92
- hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +0 -42
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +0 -149
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +0 -37
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +0 -37
- hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +0 -113
- hatchet_sdk/v0/clients/rest/models/slack_webhook.py +0 -127
- hatchet_sdk/v0/clients/rest/models/sns_integration.py +0 -114
- hatchet_sdk/v0/clients/rest/models/step.py +0 -123
- hatchet_sdk/v0/clients/rest/models/step_run.py +0 -202
- hatchet_sdk/v0/clients/rest/models/step_run_archive.py +0 -142
- hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/step_run_diff.py +0 -91
- hatchet_sdk/v0/clients/rest/models/step_run_event.py +0 -122
- hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +0 -52
- hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +0 -38
- hatchet_sdk/v0/clients/rest/models/step_run_status.py +0 -44
- hatchet_sdk/v0/clients/rest/models/tenant.py +0 -118
- hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +0 -98
- hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +0 -112
- hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +0 -143
- hatchet_sdk/v0/clients/rest/models/tenant_invite.py +0 -120
- hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/tenant_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/tenant_member.py +0 -123
- hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +0 -38
- hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +0 -116
- hatchet_sdk/v0/clients/rest/models/tenant_resource.py +0 -40
- hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +0 -135
- hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +0 -102
- hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +0 -83
- hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +0 -91
- hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +0 -83
- hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +0 -85
- hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +0 -137
- hatchet_sdk/v0/clients/rest/models/update_worker_request.py +0 -87
- hatchet_sdk/v0/clients/rest/models/user.py +0 -126
- hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +0 -88
- hatchet_sdk/v0/clients/rest/models/user_login_request.py +0 -86
- hatchet_sdk/v0/clients/rest/models/user_register_request.py +0 -91
- hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +0 -86
- hatchet_sdk/v0/clients/rest/models/webhook_worker.py +0 -100
- hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +0 -94
- hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +0 -98
- hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +0 -102
- hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +0 -110
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +0 -102
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +0 -104
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +0 -38
- hatchet_sdk/v0/clients/rest/models/worker.py +0 -239
- hatchet_sdk/v0/clients/rest/models/worker_label.py +0 -102
- hatchet_sdk/v0/clients/rest/models/worker_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +0 -103
- hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +0 -38
- hatchet_sdk/v0/clients/rest/models/worker_type.py +0 -38
- hatchet_sdk/v0/clients/rest/models/workflow.py +0 -165
- hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +0 -107
- hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +0 -136
- hatchet_sdk/v0/clients/rest/models/workflow_kind.py +0 -38
- hatchet_sdk/v0/clients/rest/models/workflow_list.py +0 -120
- hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +0 -97
- hatchet_sdk/v0/clients/rest/models/workflow_run.py +0 -188
- hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +0 -85
- hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +0 -110
- hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +0 -37
- hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +0 -39
- hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +0 -186
- hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +0 -42
- hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +0 -112
- hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +0 -85
- hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +0 -94
- hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +0 -104
- hatchet_sdk/v0/clients/rest/models/workflow_tag.py +0 -84
- hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +0 -86
- hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +0 -86
- hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +0 -141
- hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +0 -85
- hatchet_sdk/v0/clients/rest/models/workflow_version.py +0 -170
- hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +0 -114
- hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +0 -85
- hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +0 -123
- hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +0 -95
- hatchet_sdk/v0/clients/rest/rest.py +0 -187
- hatchet_sdk/v0/clients/rest/tenacity_utils.py +0 -39
- hatchet_sdk/v0/clients/rest_client.py +0 -622
- hatchet_sdk/v0/clients/run_event_listener.py +0 -260
- hatchet_sdk/v0/clients/workflow_listener.py +0 -277
- hatchet_sdk/v0/connection.py +0 -63
- hatchet_sdk/v0/context/__init__.py +0 -1
- hatchet_sdk/v0/context/context.py +0 -446
- hatchet_sdk/v0/context/worker_context.py +0 -28
- hatchet_sdk/v0/features/cron.py +0 -286
- hatchet_sdk/v0/features/scheduled.py +0 -248
- hatchet_sdk/v0/hatchet.py +0 -310
- hatchet_sdk/v0/labels.py +0 -10
- hatchet_sdk/v0/loader.py +0 -244
- hatchet_sdk/v0/metadata.py +0 -2
- hatchet_sdk/v0/opentelemetry/instrumentor.py +0 -393
- hatchet_sdk/v0/rate_limit.py +0 -126
- hatchet_sdk/v0/semver.py +0 -30
- hatchet_sdk/v0/token.py +0 -27
- hatchet_sdk/v0/utils/aio_utils.py +0 -137
- hatchet_sdk/v0/utils/backoff.py +0 -9
- hatchet_sdk/v0/utils/types.py +0 -8
- hatchet_sdk/v0/utils/typing.py +0 -12
- hatchet_sdk/v0/v2/callable.py +0 -202
- hatchet_sdk/v0/v2/concurrency.py +0 -47
- hatchet_sdk/v0/v2/hatchet.py +0 -224
- hatchet_sdk/v0/worker/__init__.py +0 -1
- hatchet_sdk/v0/worker/action_listener_process.py +0 -294
- hatchet_sdk/v0/worker/runner/run_loop_manager.py +0 -112
- hatchet_sdk/v0/worker/runner/runner.py +0 -460
- hatchet_sdk/v0/worker/runner/utils/capture_logs.py +0 -81
- hatchet_sdk/v0/worker/runner/utils/error_with_traceback.py +0 -6
- hatchet_sdk/v0/worker/worker.py +0 -391
- hatchet_sdk/v0/workflow.py +0 -261
- hatchet_sdk/v0/workflow_run.py +0 -59
- {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.19.0.dist-info}/WHEEL +0 -0
- {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.19.0.dist-info}/entry_points.txt +0 -0
hatchet_sdk/v0/hatchet.py
DELETED
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
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
|
|
7
|
-
|
|
8
|
-
from hatchet_sdk.contracts.workflows_pb2 import (
|
|
9
|
-
ConcurrencyLimitStrategy,
|
|
10
|
-
CreateStepRateLimit,
|
|
11
|
-
DesiredWorkerLabels,
|
|
12
|
-
StickyStrategy,
|
|
13
|
-
)
|
|
14
|
-
from hatchet_sdk.v0.clients.rest_client import RestApi
|
|
15
|
-
from hatchet_sdk.v0.context.context import Context
|
|
16
|
-
from hatchet_sdk.v0.features.cron import CronClient
|
|
17
|
-
from hatchet_sdk.v0.features.scheduled import ScheduledClient
|
|
18
|
-
from hatchet_sdk.v0.labels import DesiredWorkerLabel
|
|
19
|
-
from hatchet_sdk.v0.loader import ClientConfig, ConfigLoader
|
|
20
|
-
from hatchet_sdk.v0.rate_limit import RateLimit
|
|
21
|
-
from hatchet_sdk.v0.v2.callable import HatchetCallable
|
|
22
|
-
|
|
23
|
-
from ..logger import logger
|
|
24
|
-
from .client import Client, new_client, new_client_raw
|
|
25
|
-
from .clients.admin import AdminClient
|
|
26
|
-
from .clients.dispatcher.dispatcher import DispatcherClient
|
|
27
|
-
from .clients.events import EventClient
|
|
28
|
-
from .clients.run_event_listener import RunEventListenerClient
|
|
29
|
-
from .worker.worker import Worker
|
|
30
|
-
from .workflow import (
|
|
31
|
-
ConcurrencyExpression,
|
|
32
|
-
WorkflowInterface,
|
|
33
|
-
WorkflowMeta,
|
|
34
|
-
WorkflowStepProtocol,
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
T = TypeVar("T", bound=BaseModel)
|
|
38
|
-
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
|
-
|
|
190
|
-
rest: RestApi
|
|
191
|
-
|
|
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)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
class Hatchet:
|
|
198
|
-
"""
|
|
199
|
-
Main client for interacting with the Hatchet SDK.
|
|
200
|
-
|
|
201
|
-
This class provides access to various client interfaces and utility methods
|
|
202
|
-
for working with Hatchet workers, workflows, and steps.
|
|
203
|
-
|
|
204
|
-
Attributes:
|
|
205
|
-
cron (CronClient): Interface for cron trigger operations.
|
|
206
|
-
|
|
207
|
-
admin (AdminClient): Interface for administrative operations.
|
|
208
|
-
dispatcher (DispatcherClient): Interface for dispatching operations.
|
|
209
|
-
event (EventClient): Interface for event-related operations.
|
|
210
|
-
rest (RestApi): Interface for REST API operations.
|
|
211
|
-
"""
|
|
212
|
-
|
|
213
|
-
_client: Client
|
|
214
|
-
cron: CronClient
|
|
215
|
-
scheduled: ScheduledClient
|
|
216
|
-
|
|
217
|
-
@classmethod
|
|
218
|
-
def from_environment(
|
|
219
|
-
cls, defaults: ClientConfig = ClientConfig(), **kwargs: Any
|
|
220
|
-
) -> "Hatchet":
|
|
221
|
-
return cls(client=new_client(defaults), **kwargs)
|
|
222
|
-
|
|
223
|
-
@classmethod
|
|
224
|
-
def from_config(cls, config: ClientConfig, **kwargs: Any) -> "Hatchet":
|
|
225
|
-
return cls(client=new_client_raw(config), **kwargs)
|
|
226
|
-
|
|
227
|
-
def __init__(
|
|
228
|
-
self,
|
|
229
|
-
debug: bool = False,
|
|
230
|
-
client: Optional[Client] = None,
|
|
231
|
-
config: ClientConfig = ClientConfig(),
|
|
232
|
-
):
|
|
233
|
-
"""
|
|
234
|
-
Initialize a new Hatchet instance.
|
|
235
|
-
|
|
236
|
-
Args:
|
|
237
|
-
debug (bool, optional): Enable debug logging.
|
|
238
|
-
client (Optional[Client], optional): A pre-configured Client instance.
|
|
239
|
-
config (ClientConfig, optional): Configuration for creating a new Client.
|
|
240
|
-
"""
|
|
241
|
-
if client is not None:
|
|
242
|
-
self._client = client
|
|
243
|
-
else:
|
|
244
|
-
self._client = new_client(config, debug)
|
|
245
|
-
|
|
246
|
-
if debug:
|
|
247
|
-
logger.setLevel(logging.DEBUG)
|
|
248
|
-
|
|
249
|
-
self.cron = CronClient(self._client)
|
|
250
|
-
self.scheduled = ScheduledClient(self._client)
|
|
251
|
-
|
|
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
|
-
@property
|
|
260
|
-
def admin(self) -> AdminClient:
|
|
261
|
-
return self._client.admin
|
|
262
|
-
|
|
263
|
-
@property
|
|
264
|
-
def dispatcher(self) -> DispatcherClient:
|
|
265
|
-
return self._client.dispatcher
|
|
266
|
-
|
|
267
|
-
@property
|
|
268
|
-
def event(self) -> EventClient:
|
|
269
|
-
return self._client.event
|
|
270
|
-
|
|
271
|
-
@property
|
|
272
|
-
def rest(self) -> RestApi:
|
|
273
|
-
return self._client.rest
|
|
274
|
-
|
|
275
|
-
@property
|
|
276
|
-
def listener(self) -> RunEventListenerClient:
|
|
277
|
-
return self._client.listener
|
|
278
|
-
|
|
279
|
-
@property
|
|
280
|
-
def config(self) -> ClientConfig:
|
|
281
|
-
return self._client.config
|
|
282
|
-
|
|
283
|
-
@property
|
|
284
|
-
def tenant_id(self) -> str:
|
|
285
|
-
return self._client.config.tenant_id
|
|
286
|
-
|
|
287
|
-
concurrency = staticmethod(concurrency)
|
|
288
|
-
|
|
289
|
-
workflow = staticmethod(workflow)
|
|
290
|
-
|
|
291
|
-
step = staticmethod(step)
|
|
292
|
-
|
|
293
|
-
on_failure_step = staticmethod(on_failure_step)
|
|
294
|
-
|
|
295
|
-
def worker(
|
|
296
|
-
self, name: str, max_runs: int | None = None, labels: dict[str, str | int] = {}
|
|
297
|
-
) -> Worker:
|
|
298
|
-
try:
|
|
299
|
-
loop = asyncio.get_running_loop()
|
|
300
|
-
except RuntimeError:
|
|
301
|
-
loop = None
|
|
302
|
-
|
|
303
|
-
return Worker(
|
|
304
|
-
name=name,
|
|
305
|
-
max_runs=max_runs,
|
|
306
|
-
labels=labels,
|
|
307
|
-
config=self._client.config,
|
|
308
|
-
debug=self._client.debug,
|
|
309
|
-
owned_loop=loop is None,
|
|
310
|
-
)
|
hatchet_sdk/v0/labels.py
DELETED
hatchet_sdk/v0/loader.py
DELETED
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
from logging import Logger, getLogger
|
|
3
|
-
from typing import Dict, Optional
|
|
4
|
-
from warnings import warn
|
|
5
|
-
|
|
6
|
-
import yaml
|
|
7
|
-
|
|
8
|
-
from .token import get_addresses_from_jwt, get_tenant_id_from_jwt
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class ClientTLSConfig:
|
|
12
|
-
def __init__(
|
|
13
|
-
self,
|
|
14
|
-
tls_strategy: str,
|
|
15
|
-
cert_file: str,
|
|
16
|
-
key_file: str,
|
|
17
|
-
ca_file: str,
|
|
18
|
-
server_name: str,
|
|
19
|
-
):
|
|
20
|
-
self.tls_strategy = tls_strategy
|
|
21
|
-
self.cert_file = cert_file
|
|
22
|
-
self.key_file = key_file
|
|
23
|
-
self.ca_file = ca_file
|
|
24
|
-
self.server_name = server_name
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class ClientConfig:
|
|
28
|
-
logInterceptor: Logger
|
|
29
|
-
|
|
30
|
-
def __init__(
|
|
31
|
-
self,
|
|
32
|
-
tenant_id: str = None,
|
|
33
|
-
tls_config: ClientTLSConfig = None,
|
|
34
|
-
token: str = None,
|
|
35
|
-
host_port: str = "localhost:7070",
|
|
36
|
-
server_url: str = "https://app.dev.hatchet-tools.com",
|
|
37
|
-
namespace: str = None,
|
|
38
|
-
listener_v2_timeout: int = None,
|
|
39
|
-
logger: Logger = None,
|
|
40
|
-
grpc_max_recv_message_length: int = 4 * 1024 * 1024, # 4MB
|
|
41
|
-
grpc_max_send_message_length: int = 4 * 1024 * 1024, # 4MB
|
|
42
|
-
worker_healthcheck_port: int | None = None,
|
|
43
|
-
worker_healthcheck_enabled: bool | None = None,
|
|
44
|
-
worker_preset_labels: dict[str, str] = {},
|
|
45
|
-
enable_force_kill_sync_threads: bool = False,
|
|
46
|
-
):
|
|
47
|
-
self.tenant_id = tenant_id
|
|
48
|
-
self.tls_config = tls_config
|
|
49
|
-
self.host_port = host_port
|
|
50
|
-
self.token = token
|
|
51
|
-
self.server_url = server_url
|
|
52
|
-
self.namespace = ""
|
|
53
|
-
self.logInterceptor = logger
|
|
54
|
-
self.grpc_max_recv_message_length = grpc_max_recv_message_length
|
|
55
|
-
self.grpc_max_send_message_length = grpc_max_send_message_length
|
|
56
|
-
self.worker_healthcheck_port = worker_healthcheck_port
|
|
57
|
-
self.worker_healthcheck_enabled = worker_healthcheck_enabled
|
|
58
|
-
self.worker_preset_labels = worker_preset_labels
|
|
59
|
-
self.enable_force_kill_sync_threads = enable_force_kill_sync_threads
|
|
60
|
-
|
|
61
|
-
if not self.logInterceptor:
|
|
62
|
-
self.logInterceptor = getLogger()
|
|
63
|
-
|
|
64
|
-
# case on whether the namespace already has a trailing underscore
|
|
65
|
-
if namespace and not namespace.endswith("_"):
|
|
66
|
-
self.namespace = f"{namespace}_"
|
|
67
|
-
elif namespace:
|
|
68
|
-
self.namespace = namespace
|
|
69
|
-
|
|
70
|
-
self.namespace = self.namespace.lower()
|
|
71
|
-
|
|
72
|
-
self.listener_v2_timeout = listener_v2_timeout
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class ConfigLoader:
|
|
76
|
-
def __init__(self, directory: str):
|
|
77
|
-
self.directory = directory
|
|
78
|
-
|
|
79
|
-
def load_client_config(self, defaults: ClientConfig) -> ClientConfig:
|
|
80
|
-
config_file_path = os.path.join(self.directory, "client.yaml")
|
|
81
|
-
config_data: object = {"tls": {}}
|
|
82
|
-
|
|
83
|
-
# determine if client.yaml exists
|
|
84
|
-
if os.path.exists(config_file_path):
|
|
85
|
-
with open(config_file_path, "r") as file:
|
|
86
|
-
config_data = yaml.safe_load(file)
|
|
87
|
-
|
|
88
|
-
def get_config_value(key, env_var):
|
|
89
|
-
if key in config_data:
|
|
90
|
-
return config_data[key]
|
|
91
|
-
|
|
92
|
-
if self._get_env_var(env_var) is not None:
|
|
93
|
-
return self._get_env_var(env_var)
|
|
94
|
-
|
|
95
|
-
return getattr(defaults, key, None)
|
|
96
|
-
|
|
97
|
-
namespace = get_config_value("namespace", "HATCHET_CLIENT_NAMESPACE")
|
|
98
|
-
|
|
99
|
-
tenant_id = get_config_value("tenantId", "HATCHET_CLIENT_TENANT_ID")
|
|
100
|
-
token = get_config_value("token", "HATCHET_CLIENT_TOKEN")
|
|
101
|
-
listener_v2_timeout = get_config_value(
|
|
102
|
-
"listener_v2_timeout", "HATCHET_CLIENT_LISTENER_V2_TIMEOUT"
|
|
103
|
-
)
|
|
104
|
-
listener_v2_timeout = int(listener_v2_timeout) if listener_v2_timeout else None
|
|
105
|
-
|
|
106
|
-
if not token:
|
|
107
|
-
raise ValueError(
|
|
108
|
-
"Token must be set via HATCHET_CLIENT_TOKEN environment variable"
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
host_port = get_config_value("hostPort", "HATCHET_CLIENT_HOST_PORT")
|
|
112
|
-
server_url: str | None = None
|
|
113
|
-
|
|
114
|
-
grpc_max_recv_message_length = get_config_value(
|
|
115
|
-
"grpc_max_recv_message_length",
|
|
116
|
-
"HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH",
|
|
117
|
-
)
|
|
118
|
-
grpc_max_send_message_length = get_config_value(
|
|
119
|
-
"grpc_max_send_message_length",
|
|
120
|
-
"HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH",
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
if grpc_max_recv_message_length:
|
|
124
|
-
grpc_max_recv_message_length = int(grpc_max_recv_message_length)
|
|
125
|
-
|
|
126
|
-
if grpc_max_send_message_length:
|
|
127
|
-
grpc_max_send_message_length = int(grpc_max_send_message_length)
|
|
128
|
-
|
|
129
|
-
if not host_port:
|
|
130
|
-
# extract host and port from token
|
|
131
|
-
server_url, grpc_broadcast_address = get_addresses_from_jwt(token)
|
|
132
|
-
host_port = grpc_broadcast_address
|
|
133
|
-
|
|
134
|
-
if not tenant_id:
|
|
135
|
-
tenant_id = get_tenant_id_from_jwt(token)
|
|
136
|
-
|
|
137
|
-
tls_config = self._load_tls_config(config_data["tls"], host_port)
|
|
138
|
-
|
|
139
|
-
worker_healthcheck_port = int(
|
|
140
|
-
get_config_value(
|
|
141
|
-
"worker_healthcheck_port", "HATCHET_CLIENT_WORKER_HEALTHCHECK_PORT"
|
|
142
|
-
)
|
|
143
|
-
or 8001
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
worker_healthcheck_enabled = (
|
|
147
|
-
str(
|
|
148
|
-
get_config_value(
|
|
149
|
-
"worker_healthcheck_port",
|
|
150
|
-
"HATCHET_CLIENT_WORKER_HEALTHCHECK_ENABLED",
|
|
151
|
-
)
|
|
152
|
-
)
|
|
153
|
-
== "True"
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
# Add preset labels to the worker config
|
|
157
|
-
worker_preset_labels: dict[str, str] = defaults.worker_preset_labels
|
|
158
|
-
|
|
159
|
-
autoscaling_target = get_config_value(
|
|
160
|
-
"autoscaling_target", "HATCHET_CLIENT_AUTOSCALING_TARGET"
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
if autoscaling_target:
|
|
164
|
-
worker_preset_labels["hatchet-autoscaling-target"] = autoscaling_target
|
|
165
|
-
|
|
166
|
-
legacy_otlp_headers = get_config_value(
|
|
167
|
-
"otel_exporter_otlp_endpoint", "HATCHET_CLIENT_OTEL_EXPORTER_OTLP_ENDPOINT"
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
legacy_otlp_headers = get_config_value(
|
|
171
|
-
"otel_exporter_otlp_headers", "HATCHET_CLIENT_OTEL_EXPORTER_OTLP_HEADERS"
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
if legacy_otlp_headers or legacy_otlp_headers:
|
|
175
|
-
warn(
|
|
176
|
-
"The `otel_exporter_otlp_*` fields are no longer supported as of SDK version `0.46.0`. Please see the documentation on OpenTelemetry at https://docs.hatchet.run/home/features/opentelemetry for more information on how to migrate to the new `HatchetInstrumentor`."
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
enable_force_kill_sync_threads = bool(
|
|
180
|
-
get_config_value(
|
|
181
|
-
"enable_force_kill_sync_threads",
|
|
182
|
-
"HATCHET_CLIENT_ENABLE_FORCE_KILL_SYNC_THREADS",
|
|
183
|
-
)
|
|
184
|
-
== "True"
|
|
185
|
-
or False
|
|
186
|
-
)
|
|
187
|
-
return ClientConfig(
|
|
188
|
-
tenant_id=tenant_id,
|
|
189
|
-
tls_config=tls_config,
|
|
190
|
-
token=token,
|
|
191
|
-
host_port=host_port,
|
|
192
|
-
server_url=server_url,
|
|
193
|
-
namespace=namespace,
|
|
194
|
-
listener_v2_timeout=listener_v2_timeout,
|
|
195
|
-
logger=defaults.logInterceptor,
|
|
196
|
-
grpc_max_recv_message_length=grpc_max_recv_message_length,
|
|
197
|
-
grpc_max_send_message_length=grpc_max_send_message_length,
|
|
198
|
-
worker_healthcheck_port=worker_healthcheck_port,
|
|
199
|
-
worker_healthcheck_enabled=worker_healthcheck_enabled,
|
|
200
|
-
worker_preset_labels=worker_preset_labels,
|
|
201
|
-
enable_force_kill_sync_threads=enable_force_kill_sync_threads,
|
|
202
|
-
)
|
|
203
|
-
|
|
204
|
-
def _load_tls_config(self, tls_data: Dict, host_port) -> ClientTLSConfig:
|
|
205
|
-
tls_strategy = (
|
|
206
|
-
tls_data["tlsStrategy"]
|
|
207
|
-
if "tlsStrategy" in tls_data
|
|
208
|
-
else self._get_env_var("HATCHET_CLIENT_TLS_STRATEGY")
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
if not tls_strategy:
|
|
212
|
-
tls_strategy = "tls"
|
|
213
|
-
|
|
214
|
-
cert_file = (
|
|
215
|
-
tls_data["tlsCertFile"]
|
|
216
|
-
if "tlsCertFile" in tls_data
|
|
217
|
-
else self._get_env_var("HATCHET_CLIENT_TLS_CERT_FILE")
|
|
218
|
-
)
|
|
219
|
-
key_file = (
|
|
220
|
-
tls_data["tlsKeyFile"]
|
|
221
|
-
if "tlsKeyFile" in tls_data
|
|
222
|
-
else self._get_env_var("HATCHET_CLIENT_TLS_KEY_FILE")
|
|
223
|
-
)
|
|
224
|
-
ca_file = (
|
|
225
|
-
tls_data["tlsRootCAFile"]
|
|
226
|
-
if "tlsRootCAFile" in tls_data
|
|
227
|
-
else self._get_env_var("HATCHET_CLIENT_TLS_ROOT_CA_FILE")
|
|
228
|
-
)
|
|
229
|
-
|
|
230
|
-
server_name = (
|
|
231
|
-
tls_data["tlsServerName"]
|
|
232
|
-
if "tlsServerName" in tls_data
|
|
233
|
-
else self._get_env_var("HATCHET_CLIENT_TLS_SERVER_NAME")
|
|
234
|
-
)
|
|
235
|
-
|
|
236
|
-
# if server_name is not set, use the host from the host_port
|
|
237
|
-
if not server_name:
|
|
238
|
-
server_name = host_port.split(":")[0]
|
|
239
|
-
|
|
240
|
-
return ClientTLSConfig(tls_strategy, cert_file, key_file, ca_file, server_name)
|
|
241
|
-
|
|
242
|
-
@staticmethod
|
|
243
|
-
def _get_env_var(env_var: str, default: Optional[str] = None) -> str:
|
|
244
|
-
return os.environ.get(env_var, default)
|
hatchet_sdk/v0/metadata.py
DELETED