Skip to content

Commit 4829e3a

Browse files
vdusekclaude
andcommitted
refactor: Use Pydantic request models and simplify base client internals
- Replace inline dicts in resource clients with Pydantic request models for type-safe request construction - Move payload cleanup (None filtering) into base class as _clean_json_payload, replacing filter_none_values utility - Simplify _create/_update signatures to accept **kwargs - Add proper type conversions for list[dict] → list[Model], str → AnyUrl, dict → TaskInput - Remove _representations.py (orphaned after Pydantic model migration) - Remove enum_to_value utility (redundant with StrEnum) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 8ff80a2 commit 4829e3a

26 files changed

Lines changed: 510 additions & 851 deletions

src/apify_client/_consts.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
DEFAULT_MIN_DELAY_BETWEEN_RETRIES = timedelta(milliseconds=500)
2626
"""Default minimum delay between retries."""
2727

28-
2928
DEFAULT_WAIT_FOR_FINISH = timedelta(seconds=999999)
3029
"""Default maximum wait time for job completion (effectively infinite)."""
3130

src/apify_client/_models.py

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
2-
# filename: https://docs.apify.com/api/openapi.json
3-
# timestamp: 2026-02-24T08:34:43+00:00
2+
# filename: openapi.json
3+
# timestamp: 2026-02-24T14:39:16+00:00
44

55
from __future__ import annotations
66

@@ -258,14 +258,45 @@ class FreeActorPricingInfo(CommonActorPricingInfo):
258258
pricing_model: Annotated[Literal['FREE'], Field(alias='pricingModel')]
259259

260260

261+
class ActorPermissionLevel(StrEnum):
262+
"""Determines permissions that the Actor requires to run. For more information, see the [Actor permissions documentation](https://docs.apify.com/platform/actors/development/permissions)."""
263+
264+
LIMITED_PERMISSIONS = 'LIMITED_PERMISSIONS'
265+
FULL_PERMISSIONS = 'FULL_PERMISSIONS'
266+
267+
261268
class DefaultRunOptions(BaseModel):
262269
model_config = ConfigDict(
263270
extra='allow',
264271
)
265-
build: Annotated[str, Field(examples=['latest'])]
272+
build: Annotated[str | None, Field(examples=['latest'])] = None
266273
timeout_secs: Annotated[int | None, Field(alias='timeoutSecs', examples=[3600])] = None
267-
memory_mbytes: Annotated[int, Field(alias='memoryMbytes', examples=[2048])]
274+
memory_mbytes: Annotated[int | None, Field(alias='memoryMbytes', examples=[2048])] = None
268275
restart_on_error: Annotated[bool | None, Field(alias='restartOnError', examples=[False])] = None
276+
max_items: Annotated[int | None, Field(alias='maxItems')] = None
277+
force_permission_level: Annotated[ActorPermissionLevel | None, Field(alias='forcePermissionLevel')] = None
278+
279+
280+
class ActorStandby(BaseModel):
281+
model_config = ConfigDict(
282+
extra='allow',
283+
)
284+
is_enabled: Annotated[bool | None, Field(alias='isEnabled')] = None
285+
desired_requests_per_actor_run: Annotated[int | None, Field(alias='desiredRequestsPerActorRun')] = None
286+
max_requests_per_actor_run: Annotated[int | None, Field(alias='maxRequestsPerActorRun')] = None
287+
idle_timeout_secs: Annotated[int | None, Field(alias='idleTimeoutSecs')] = None
288+
build: str | None = None
289+
memory_mbytes: Annotated[int | None, Field(alias='memoryMbytes')] = None
290+
disable_standby_fields_override: Annotated[bool | None, Field(alias='disableStandbyFieldsOverride')] = None
291+
should_pass_actor_input: Annotated[bool | None, Field(alias='shouldPassActorInput')] = None
292+
293+
294+
class ExampleRunInput(BaseModel):
295+
model_config = ConfigDict(
296+
extra='allow',
297+
)
298+
body: Annotated[str | None, Field(examples=['{ "helloWorld": 123 }'])] = None
299+
content_type: Annotated[str | None, Field(alias='contentType', examples=['application/json; charset=utf-8'])] = None
269300

270301

271302
class CreateActorRequest(BaseModel):
@@ -292,21 +323,9 @@ class CreateActorRequest(BaseModel):
292323
] = None
293324
categories: list[str] | None = None
294325
default_run_options: Annotated[DefaultRunOptions | None, Field(alias='defaultRunOptions')] = None
295-
296-
297-
class ActorPermissionLevel(StrEnum):
298-
"""Determines permissions that the Actor requires to run. For more information, see the [Actor permissions documentation](https://docs.apify.com/platform/actors/development/permissions)."""
299-
300-
LIMITED_PERMISSIONS = 'LIMITED_PERMISSIONS'
301-
FULL_PERMISSIONS = 'FULL_PERMISSIONS'
302-
303-
304-
class ExampleRunInput(BaseModel):
305-
model_config = ConfigDict(
306-
extra='allow',
307-
)
308-
body: Annotated[str, Field(examples=['{ "helloWorld": 123 }'])]
309-
content_type: Annotated[str, Field(alias='contentType', examples=['application/json; charset=utf-8'])]
326+
actor_standby: Annotated[ActorStandby | None, Field(alias='actorStandby')] = None
327+
example_run_input: Annotated[ExampleRunInput | None, Field(alias='exampleRunInput')] = None
328+
is_deprecated: Annotated[bool | None, Field(alias='isDeprecated')] = None
310329

311330

312331
class TaggedBuildInfo(BaseModel):
@@ -367,6 +386,7 @@ class Actor(BaseModel):
367386
"""
368387
A brief, LLM-generated readme summary
369388
"""
389+
actor_standby: Annotated[ActorStandby | None, Field(alias='actorStandby')] = None
370390

371391

372392
class ActorResponse(BaseModel):
@@ -415,15 +435,15 @@ class UpdateActorRequest(BaseModel):
415435
model_config = ConfigDict(
416436
extra='allow',
417437
)
418-
name: Annotated[str, Field(examples=['MyActor'])]
438+
name: Annotated[str | None, Field(examples=['MyActor'])] = None
419439
description: Annotated[str | None, Field(examples=['My favourite actor!'])] = None
420-
is_public: Annotated[bool, Field(alias='isPublic', examples=[False])]
440+
is_public: Annotated[bool | None, Field(alias='isPublic', examples=[False])] = None
421441
actor_permission_level: Annotated[ActorPermissionLevel | None, Field(alias='actorPermissionLevel')] = None
422442
seo_title: Annotated[str | None, Field(alias='seoTitle', examples=['My actor'])] = None
423443
seo_description: Annotated[str | None, Field(alias='seoDescription', examples=['My actor is the best'])] = None
424444
title: Annotated[str | None, Field(examples=['My Actor'])] = None
425445
restart_on_error: Annotated[bool | None, Field(alias='restartOnError', examples=[False])] = None
426-
versions: list[CreateOrUpdateVersionRequest]
446+
versions: list[CreateOrUpdateVersionRequest] | None = None
427447
pricing_infos: Annotated[
428448
list[
429449
PayPerEventActorPricingInfo
@@ -481,6 +501,9 @@ class UpdateActorRequest(BaseModel):
481501
```
482502
483503
"""
504+
actor_standby: Annotated[ActorStandby | None, Field(alias='actorStandby')] = None
505+
example_run_input: Annotated[ExampleRunInput | None, Field(alias='exampleRunInput')] = None
506+
is_deprecated: Annotated[bool | None, Field(alias='isDeprecated')] = None
484507

485508

486509
class ListOfVersions(BaseModel):
@@ -566,9 +589,7 @@ class ExampleWebhookDispatch(BaseModel):
566589
extra='allow',
567590
)
568591
status: WebhookDispatchStatus
569-
finished_at: Annotated[AwareDatetime | None, Field(alias='finishedAt', examples=['2019-12-13T08:36:13.202Z'])] = (
570-
None
571-
)
592+
finished_at: Annotated[AwareDatetime, Field(alias='finishedAt', examples=['2019-12-13T08:36:13.202Z'])]
572593

573594

574595
class WebhookStats(BaseModel):
@@ -1178,6 +1199,7 @@ class TaskOptions(BaseModel):
11781199
timeout_secs: Annotated[int | None, Field(alias='timeoutSecs', examples=[300])] = None
11791200
memory_mbytes: Annotated[int | None, Field(alias='memoryMbytes', examples=[128])] = None
11801201
restart_on_error: Annotated[bool | None, Field(alias='restartOnError', examples=[False])] = None
1202+
max_items: Annotated[int | None, Field(alias='maxItems')] = None
11811203

11821204

11831205
class TaskInput(BaseModel):
@@ -1199,6 +1221,8 @@ class CreateTaskRequest(BaseModel):
11991221
name: Annotated[str, Field(examples=['my-task'])]
12001222
options: TaskOptions | None = None
12011223
input: TaskInput | None = None
1224+
title: str | None = None
1225+
actor_standby: Annotated[ActorStandby | None, Field(alias='actorStandby')] = None
12021226

12031227

12041228
class Task(BaseModel):
@@ -1217,6 +1241,8 @@ class Task(BaseModel):
12171241
options: TaskOptions | None = None
12181242
input: TaskInput | None = None
12191243
standby_url: Annotated[AnyUrl | None, Field(alias='standbyUrl')] = None
1244+
title: str | None = None
1245+
actor_standby: Annotated[ActorStandby | None, Field(alias='actorStandby')] = None
12201246

12211247

12221248
class TaskResponse(BaseModel):
@@ -1232,17 +1258,11 @@ class UpdateTaskRequest(BaseModel):
12321258
model_config = ConfigDict(
12331259
extra='allow',
12341260
)
1235-
id: Annotated[str, Field(examples=['ZxLNxrRaZrSjuhT9y'])]
1236-
user_id: Annotated[str, Field(alias='userId', examples=['BPWZBd7Z9c746JAnF'])]
1237-
act_id: Annotated[str, Field(alias='actId', examples=['asADASadYvn4mBZmm'])]
1238-
name: Annotated[str, Field(examples=['my-task'])]
1239-
username: Annotated[str | None, Field(examples=['janedoe'])] = None
1240-
created_at: Annotated[AwareDatetime, Field(alias='createdAt', examples=['2018-10-26T07:23:14.855Z'])]
1241-
modified_at: Annotated[AwareDatetime, Field(alias='modifiedAt', examples=['2018-10-26T13:30:49.578Z'])]
1242-
removed_at: Annotated[AwareDatetime | None, Field(alias='removedAt')] = None
1243-
stats: TaskStats | None = None
1261+
name: Annotated[str | None, Field(examples=['my-task'])] = None
1262+
title: str | None = None
12441263
options: TaskOptions | None = None
12451264
input: TaskInput | None = None
1265+
actor_standby: Annotated[ActorStandby | None, Field(alias='actorStandby')] = None
12461266

12471267

12481268
class Webhook(BaseModel):
@@ -2504,6 +2524,7 @@ class ScheduleCreate(BaseModel):
25042524
cron_expression: Annotated[str | None, Field(alias='cronExpression', examples=['* * * * *'])] = None
25052525
timezone: Annotated[str | None, Field(examples=['UTC'])] = None
25062526
description: Annotated[str | None, Field(examples=['Schedule of actor ...'])] = None
2527+
title: str | None = None
25072528
actions: list[ScheduleCreateActions] | None = None
25082529

25092530

@@ -2534,6 +2555,7 @@ class Schedule(BaseModel):
25342555
modified_at: Annotated[AwareDatetime, Field(alias='modifiedAt', examples=['2019-12-20T06:33:11.202Z'])]
25352556
next_run_at: Annotated[AwareDatetime | None, Field(alias='nextRunAt', examples=['2019-04-12T07:34:10.202Z'])] = None
25362557
last_run_at: Annotated[AwareDatetime | None, Field(alias='lastRunAt', examples=['2019-04-12T07:33:10.202Z'])] = None
2558+
title: str | None = None
25372559
actions: list[ScheduleActions]
25382560

25392561

0 commit comments

Comments
 (0)