Skip to content

Commit 76bcf85

Browse files
committed
Add WebhookEventType and ActorJobStatus from Open API specs
1 parent 91ab38a commit 76bcf85

3 files changed

Lines changed: 44 additions & 13 deletions

File tree

src/apify_client/_models.py

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: openapi.json
3-
# timestamp: 2026-01-14T18:43:23+00:00
3+
# timestamp: 2026-01-14T19:13:07+00:00
44

55
from __future__ import annotations
66

@@ -370,6 +370,22 @@ class GetEnvVarResponse(BaseModel):
370370
data: EnvVar
371371

372372

373+
class WebhookEventType(Enum):
374+
"""Type of event that triggers the webhook."""
375+
376+
ACTOR_BUILD_ABORTED = 'ACTOR.BUILD.ABORTED'
377+
ACTOR_BUILD_CREATED = 'ACTOR.BUILD.CREATED'
378+
ACTOR_BUILD_FAILED = 'ACTOR.BUILD.FAILED'
379+
ACTOR_BUILD_SUCCEEDED = 'ACTOR.BUILD.SUCCEEDED'
380+
ACTOR_BUILD_TIMED_OUT = 'ACTOR.BUILD.TIMED_OUT'
381+
ACTOR_RUN_ABORTED = 'ACTOR.RUN.ABORTED'
382+
ACTOR_RUN_CREATED = 'ACTOR.RUN.CREATED'
383+
ACTOR_RUN_FAILED = 'ACTOR.RUN.FAILED'
384+
ACTOR_RUN_RESURRECTED = 'ACTOR.RUN.RESURRECTED'
385+
ACTOR_RUN_SUCCEEDED = 'ACTOR.RUN.SUCCEEDED'
386+
ACTOR_RUN_TIMED_OUT = 'ACTOR.RUN.TIMED_OUT'
387+
388+
373389
class WebhookCondition(BaseModel):
374390
actor_id: Annotated[str | None, Field(alias='actorId', examples=['hksJZtadYvn4mBuin'])] = None
375391
actor_task_id: Annotated[str | None, Field(alias='actorTaskId', examples=['asdLZtadYvn4mBZmm'])] = None
@@ -392,7 +408,7 @@ class WebhookShort(BaseModel):
392408
user_id: Annotated[str, Field(alias='userId', examples=['wRsJZtadYvn4mBZmm'])]
393409
is_ad_hoc: Annotated[bool | None, Field(alias='isAdHoc', examples=[False])] = None
394410
should_interpolate_strings: Annotated[bool | None, Field(alias='shouldInterpolateStrings', examples=[False])] = None
395-
event_types: Annotated[list[str], Field(alias='eventTypes', examples=[['ACTOR.RUN.SUCCEEDED']])]
411+
event_types: Annotated[list[WebhookEventType], Field(alias='eventTypes', examples=['ACTOR.RUN.SUCCEEDED'])]
396412
condition: WebhookCondition
397413
ignore_ssl_errors: Annotated[bool, Field(alias='ignoreSslErrors', examples=[False])]
398414
do_not_retry: Annotated[bool, Field(alias='doNotRetry', examples=[False])]
@@ -409,6 +425,19 @@ class GetListOfWebhooksResponse(BaseModel):
409425
data: ListOfWebhooks
410426

411427

428+
class ActorJobStatus(Enum):
429+
"""Status of an Actor job (run or build)."""
430+
431+
READY = 'READY'
432+
RUNNING = 'RUNNING'
433+
SUCCEEDED = 'SUCCEEDED'
434+
FAILED = 'FAILED'
435+
TIMING_OUT = 'TIMING-OUT'
436+
TIMED_OUT = 'TIMED-OUT'
437+
ABORTING = 'ABORTING'
438+
ABORTED = 'ABORTED'
439+
440+
412441
class BuildsMeta(BaseModel):
413442
origin: Annotated[str, Field(examples=['WEB'])]
414443
client_ip: Annotated[str | None, Field(alias='clientIp', examples=['172.234.12.34'])] = None
@@ -418,7 +447,7 @@ class BuildsMeta(BaseModel):
418447
class BuildShort(BaseModel):
419448
id: Annotated[str, Field(examples=['HG7ML7M8z78YcAPEB'])]
420449
act_id: Annotated[str | None, Field(alias='actId', examples=['janedoe~my-actor'])] = None
421-
status: Annotated[str, Field(examples=['SUCCEEDED'])]
450+
status: ActorJobStatus
422451
started_at: Annotated[str, Field(alias='startedAt', examples=['2019-11-30T07:34:24.202Z'])]
423452
finished_at: Annotated[str, Field(alias='finishedAt', examples=['2019-12-12T09:30:12.202Z'])]
424453
usage_total_usd: Annotated[float, Field(alias='usageTotalUsd', examples=[0.02])]
@@ -531,7 +560,7 @@ class Build(BaseModel):
531560
user_id: Annotated[str, Field(alias='userId', examples=['klmdEpoiojmdEMlk3'])]
532561
started_at: Annotated[str, Field(alias='startedAt', examples=['2019-11-30T07:34:24.202Z'])]
533562
finished_at: Annotated[str | None, Field(alias='finishedAt', examples=['2019-12-12T09:30:12.202Z'])] = None
534-
status: Annotated[str, Field(examples=['SUCCEEDED'])]
563+
status: ActorJobStatus
535564
meta: BuildsMeta
536565
stats: BuildStats | None = None
537566
options: BuildOptions | None = None
@@ -872,7 +901,7 @@ class RunShort(BaseModel):
872901
id: Annotated[str, Field(examples=['HG7ML7M8z78YcAPEB'])]
873902
act_id: Annotated[str, Field(alias='actId', examples=['HDSasDasz78YcAPEB'])]
874903
actor_task_id: Annotated[str | None, Field(alias='actorTaskId', examples=['KJHSKHausidyaJKHs'])] = None
875-
status: Annotated[str, Field(examples=['SUCCEEDED'])]
904+
status: ActorJobStatus
876905
started_at: Annotated[str, Field(alias='startedAt', examples=['2019-11-30T07:34:24.202Z'])]
877906
finished_at: Annotated[str, Field(alias='finishedAt', examples=['2019-12-12T09:30:12.202Z'])]
878907
build_id: Annotated[str, Field(alias='buildId', examples=['HG7ML7M8z78YcAPEB'])]
@@ -957,7 +986,7 @@ class Run(BaseModel):
957986
actor_task_id: Annotated[str | None, Field(alias='actorTaskId', examples=['KJHSKHausidyaJKHs'])] = None
958987
started_at: Annotated[str, Field(alias='startedAt', examples=['2019-11-30T07:34:24.202Z'])]
959988
finished_at: Annotated[str | None, Field(alias='finishedAt', examples=['2019-12-12T09:30:12.202Z'])] = None
960-
status: Annotated[str, Field(examples=['RUNNING'])]
989+
status: ActorJobStatus
961990
status_message: Annotated[str | None, Field(alias='statusMessage', examples=['Actor is running'])] = None
962991
is_status_message_terminal: Annotated[bool | None, Field(alias='isStatusMessageTerminal', examples=[False])] = None
963992
meta: RunMeta
@@ -1077,7 +1106,7 @@ class Webhook(BaseModel):
10771106
user_id: Annotated[str, Field(alias='userId', examples=['wRsJZtadYvn4mBZmm'])]
10781107
is_ad_hoc: Annotated[bool | None, Field(alias='isAdHoc', examples=[False])] = None
10791108
should_interpolate_strings: Annotated[bool | None, Field(alias='shouldInterpolateStrings', examples=[False])] = None
1080-
event_types: Annotated[list[str], Field(alias='eventTypes', examples=[['ACTOR.RUN.SUCCEEDED']])]
1109+
event_types: Annotated[list[WebhookEventType], Field(alias='eventTypes', examples=['ACTOR.RUN.SUCCEEDED'])]
10811110
condition: WebhookCondition
10821111
ignore_ssl_errors: Annotated[bool, Field(alias='ignoreSslErrors', examples=[False])]
10831112
do_not_retry: Annotated[bool | None, Field(alias='doNotRetry', examples=[False])] = None
@@ -1607,7 +1636,7 @@ class ProlongRequestLockResponse(BaseModel):
16071636

16081637
class WebhookCreate(BaseModel):
16091638
is_ad_hoc: Annotated[bool | None, Field(alias='isAdHoc', examples=[False])] = None
1610-
event_types: Annotated[list[str], Field(alias='eventTypes', examples=[['ACTOR.RUN.SUCCEEDED']])]
1639+
event_types: Annotated[list[WebhookEventType], Field(alias='eventTypes', examples=['ACTOR.RUN.SUCCEEDED'])]
16111640
condition: WebhookCondition
16121641
idempotency_key: Annotated[str | None, Field(alias='idempotencyKey', examples=['fdSJmdP3nfs7sfk3y'])] = None
16131642
ignore_ssl_errors: Annotated[bool | None, Field(alias='ignoreSslErrors', examples=[False])] = None
@@ -1633,7 +1662,9 @@ class GetWebhookResponse(BaseModel):
16331662

16341663
class WebhookUpdate(BaseModel):
16351664
is_ad_hoc: Annotated[bool | None, Field(alias='isAdHoc', examples=[False])] = None
1636-
event_types: Annotated[list[str] | None, Field(alias='eventTypes', examples=[['ACTOR.RUN.SUCCEEDED']])] = None
1665+
event_types: Annotated[
1666+
list[WebhookEventType] | None, Field(alias='eventTypes', examples=['ACTOR.RUN.SUCCEEDED'])
1667+
] = None
16371668
condition: WebhookCondition | None = None
16381669
ignore_ssl_errors: Annotated[bool | None, Field(alias='ignoreSslErrors', examples=[False])] = None
16391670
do_not_retry: Annotated[bool | None, Field(alias='doNotRetry', examples=[False])] = None

src/apify_client/_resource_clients/log.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ def _log_run_data(self, run_data: Run | None) -> bool:
415415
`True` if more data is expected, `False` otherwise.
416416
"""
417417
if run_data is not None:
418-
status = run_data.status if run_data.status else 'Unknown status'
418+
status = run_data.status.value if run_data.status else 'Unknown status'
419419
status_message = run_data.status_message or ''
420420
new_status_message = f'Status: {status}, Message: {status_message}'
421421

tests/unit/test_logging.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
from unittest.mock import patch
1010

1111
import pytest
12-
from apify_shared.consts import ActorJobStatus
1312
from werkzeug import Request, Response
1413

1514
from apify_client import ApifyClient, ApifyClientAsync
1615
from apify_client._logging import RedirectLogFormatter
16+
from apify_client._models import ActorJobStatus
1717
from apify_client._resource_clients.log import StatusMessageWatcher, StreamedLog
1818

1919
if TYPE_CHECKING:
@@ -82,15 +82,15 @@ def __init__(self) -> None:
8282
('Final message', ActorJobStatus.SUCCEEDED, True),
8383
]
8484

85-
def _create_minimal_run_data(self, message: str, status: str, *, is_terminal: bool) -> dict:
85+
def _create_minimal_run_data(self, message: str, status: ActorJobStatus, *, is_terminal: bool) -> dict:
8686
"""Create minimal valid Run data for testing."""
8787
return {
8888
'id': _MOCKED_RUN_ID,
8989
'actId': _MOCKED_ACTOR_ID,
9090
'userId': 'test_user_id',
9191
'startedAt': '2019-11-30T07:34:24.202Z',
9292
'finishedAt': '2019-12-12T09:30:12.202Z',
93-
'status': status,
93+
'status': status.value,
9494
'statusMessage': message,
9595
'isStatusMessageTerminal': is_terminal,
9696
'meta': {'origin': 'WEB'},

0 commit comments

Comments
 (0)