diff --git a/docs/02_concepts/code/10_architecture_imports.py b/docs/02_concepts/code/10_architecture_imports.py index c2eaf4ce..c462b2f9 100644 --- a/docs/02_concepts/code/10_architecture_imports.py +++ b/docs/02_concepts/code/10_architecture_imports.py @@ -1,4 +1,4 @@ -from apify_client import ( +from apify_client.http_clients import ( HttpClient, HttpClientAsync, HttpResponse, diff --git a/docs/02_concepts/code/10_plugging_in_async.py b/docs/02_concepts/code/10_plugging_in_async.py index 0a9b6b2d..331f0b62 100644 --- a/docs/02_concepts/code/10_plugging_in_async.py +++ b/docs/02_concepts/code/10_plugging_in_async.py @@ -1,6 +1,8 @@ from typing import Any -from apify_client import ApifyClientAsync, HttpClientAsync, HttpResponse, Timeout +from apify_client import ApifyClientAsync +from apify_client.http_clients import HttpClientAsync, HttpResponse +from apify_client.types import Timeout TOKEN = 'MY-APIFY-TOKEN' diff --git a/docs/02_concepts/code/10_plugging_in_sync.py b/docs/02_concepts/code/10_plugging_in_sync.py index 3c964d5e..386281ae 100644 --- a/docs/02_concepts/code/10_plugging_in_sync.py +++ b/docs/02_concepts/code/10_plugging_in_sync.py @@ -1,6 +1,8 @@ from typing import Any -from apify_client import ApifyClient, HttpClient, HttpResponse, Timeout +from apify_client import ApifyClient +from apify_client.http_clients import HttpClient, HttpResponse +from apify_client.types import Timeout TOKEN = 'MY-APIFY-TOKEN' diff --git a/docs/03_guides/code/05_custom_http_client_async.py b/docs/03_guides/code/05_custom_http_client_async.py index e6ebcdd1..7a70d444 100644 --- a/docs/03_guides/code/05_custom_http_client_async.py +++ b/docs/03_guides/code/05_custom_http_client_async.py @@ -1,11 +1,15 @@ from __future__ import annotations import asyncio -from typing import Any +from typing import TYPE_CHECKING, Any import httpx -from apify_client import ApifyClientAsync, HttpClientAsync, HttpResponse, Timeout +from apify_client import ApifyClientAsync +from apify_client.http_clients import HttpClientAsync, HttpResponse + +if TYPE_CHECKING: + from apify_client.types import Timeout TOKEN = 'MY-APIFY-TOKEN' diff --git a/docs/03_guides/code/05_custom_http_client_sync.py b/docs/03_guides/code/05_custom_http_client_sync.py index d196d6b6..ca499e50 100644 --- a/docs/03_guides/code/05_custom_http_client_sync.py +++ b/docs/03_guides/code/05_custom_http_client_sync.py @@ -1,10 +1,14 @@ from __future__ import annotations -from typing import Any +from typing import TYPE_CHECKING, Any import httpx -from apify_client import ApifyClient, HttpClient, HttpResponse, Timeout +from apify_client import ApifyClient +from apify_client.http_clients import HttpClient, HttpResponse + +if TYPE_CHECKING: + from apify_client.types import Timeout TOKEN = 'MY-APIFY-TOKEN' diff --git a/docs/04_upgrading/upgrading_to_v3.mdx b/docs/04_upgrading/upgrading_to_v3.mdx index c5caeebb..255718c5 100644 --- a/docs/04_upgrading/upgrading_to_v3.mdx +++ b/docs/04_upgrading/upgrading_to_v3.mdx @@ -112,7 +112,8 @@ The HTTP layer is now abstracted behind `HttpClie To use a custom HTTP client, implement the `call()` method and pass the instance via the `ApifyClient.with_custom_http_client()` class method: ```python -from apify_client import ApifyClient, HttpClient, HttpResponse, Timeout +from apify_client import ApifyClient +from apify_client.http_clients import HttpClient, HttpResponse class MyHttpClient(HttpClient): def call(self, *, method, url, headers=None, params=None, @@ -127,6 +128,8 @@ client = ApifyClient.with_custom_http_client( The response must satisfy the `HttpResponse` protocol (properties: `status_code`, `text`, `content`, `headers`; methods: `json()`, `read()`, `close()`, `iter_bytes()`). Many popular libraries like `httpx` already satisfy this protocol out of the box. +The HTTP base classes, the `HttpResponse` protocol, and the default `ImpitHttpClient` / `ImpitHttpClientAsync` implementations live in the `apify_client.http_clients` submodule. The `Timeout` alias used on the `call()` signature lives in `apify_client.types`. + For a full walkthrough and working examples, see the [Custom HTTP clients](/docs/concepts/custom-http-clients) concept page and the [Custom HTTP client](/docs/guides/custom-http-client-httpx) guide. ## Tiered timeout system diff --git a/src/apify_client/__init__.py b/src/apify_client/__init__.py index 3add76db..97534ce3 100644 --- a/src/apify_client/__init__.py +++ b/src/apify_client/__init__.py @@ -1,25 +1,11 @@ from importlib import metadata from ._apify_client import ApifyClient, ApifyClientAsync -from ._http_clients import ( - HttpClient, - HttpClientAsync, - HttpResponse, - ImpitHttpClient, - ImpitHttpClientAsync, -) -from ._types import Timeout __version__ = metadata.version('apify-client') __all__ = [ 'ApifyClient', 'ApifyClientAsync', - 'HttpClient', - 'HttpClientAsync', - 'HttpResponse', - 'ImpitHttpClient', - 'ImpitHttpClientAsync', - 'Timeout', '__version__', ] diff --git a/src/apify_client/_apify_client.py b/src/apify_client/_apify_client.py index c10f4424..30137aa8 100644 --- a/src/apify_client/_apify_client.py +++ b/src/apify_client/_apify_client.py @@ -15,7 +15,6 @@ DEFAULT_TIMEOUT_SHORT, ) from apify_client._docs import docs_group -from apify_client._http_clients import HttpClient, HttpClientAsync, ImpitHttpClient, ImpitHttpClientAsync from apify_client._resource_clients import ( ActorClient, ActorClientAsync, @@ -74,6 +73,7 @@ ) from apify_client._statistics import ClientStatistics from apify_client._utils import check_custom_headers +from apify_client.http_clients import HttpClient, HttpClientAsync, ImpitHttpClient, ImpitHttpClientAsync if TYPE_CHECKING: from datetime import timedelta @@ -224,7 +224,8 @@ def with_custom_http_client( ### Usage ```python - from apify_client import ApifyClient, HttpClient, HttpResponse + from apify_client import ApifyClient + from apify_client.http_clients import HttpClient, HttpResponse class MyHttpClient(HttpClient): def call(self, *, method, url, **kwargs) -> HttpResponse: @@ -577,7 +578,8 @@ def with_custom_http_client( ### Usage ```python - from apify_client import ApifyClientAsync, HttpClientAsync, HttpResponse + from apify_client import ApifyClientAsync + from apify_client.http_clients import HttpClientAsync, HttpResponse class MyHttpClient(HttpClientAsync): async def call(self, *, method, url, **kwargs) -> HttpResponse: diff --git a/src/apify_client/_resource_clients/_resource_client.py b/src/apify_client/_resource_clients/_resource_client.py index f2e34104..59060572 100644 --- a/src/apify_client/_resource_clients/_resource_client.py +++ b/src/apify_client/_resource_clients/_resource_client.py @@ -4,12 +4,11 @@ import time from datetime import UTC, datetime, timedelta from functools import cached_property -from typing import TYPE_CHECKING, Any, get_args +from typing import TYPE_CHECKING, Any, Literal, get_args from apify_client._consts import DEFAULT_WAIT_FOR_FINISH, DEFAULT_WAIT_WHEN_JOB_NOT_EXIST from apify_client._docs import docs_group from apify_client._logging import WithLogDetailsClient -from apify_client._types import TerminalActorJobStatus from apify_client._utils import ( catch_not_found_for_resource_or_throw, catch_not_found_or_throw, @@ -21,10 +20,13 @@ if TYPE_CHECKING: from apify_client._client_registry import ClientRegistry, ClientRegistryAsync - from apify_client._http_clients import HttpClient, HttpClientAsync - from apify_client._types import Timeout + from apify_client.http_clients import HttpClient, HttpClientAsync + from apify_client.types import Timeout -_TERMINAL_STATUSES: frozenset[TerminalActorJobStatus] = frozenset(get_args(TerminalActorJobStatus)) +_TerminalActorJobStatus = Literal['SUCCEEDED', 'FAILED', 'TIMED-OUT', 'ABORTED'] +"""Subset of `ActorJobStatus` values that indicate the job has finished and will not change again.""" + +_TERMINAL_STATUSES: frozenset[_TerminalActorJobStatus] = frozenset(get_args(_TerminalActorJobStatus)) class ResourceClientBase(metaclass=WithLogDetailsClient): diff --git a/src/apify_client/_resource_clients/actor.py b/src/apify_client/_resource_clients/actor.py index e0ba33fe..150c7038 100644 --- a/src/apify_client/_resource_clients/actor.py +++ b/src/apify_client/_resource_clients/actor.py @@ -52,7 +52,7 @@ WebhookCollectionClient, WebhookCollectionClientAsync, ) - from apify_client._types import Timeout, WebhooksList + from apify_client.types import Timeout, WebhooksList _PricingInfo = ( PayPerEventActorPricingInfo diff --git a/src/apify_client/_resource_clients/actor_collection.py b/src/apify_client/_resource_clients/actor_collection.py index 9fbdb928..e63adbdf 100644 --- a/src/apify_client/_resource_clients/actor_collection.py +++ b/src/apify_client/_resource_clients/actor_collection.py @@ -22,7 +22,7 @@ from datetime import timedelta from apify_client._models import ActorShort - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/actor_env_var.py b/src/apify_client/_resource_clients/actor_env_var.py index 58e0ac8b..9d04018a 100644 --- a/src/apify_client/_resource_clients/actor_env_var.py +++ b/src/apify_client/_resource_clients/actor_env_var.py @@ -7,7 +7,7 @@ from apify_client._resource_clients._resource_client import ResourceClient, ResourceClientAsync if TYPE_CHECKING: - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/actor_env_var_collection.py b/src/apify_client/_resource_clients/actor_env_var_collection.py index 081e4c0e..2a013d35 100644 --- a/src/apify_client/_resource_clients/actor_env_var_collection.py +++ b/src/apify_client/_resource_clients/actor_env_var_collection.py @@ -9,7 +9,7 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator, Iterator - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/actor_version.py b/src/apify_client/_resource_clients/actor_version.py index 7a4a3acf..497adfa0 100644 --- a/src/apify_client/_resource_clients/actor_version.py +++ b/src/apify_client/_resource_clients/actor_version.py @@ -23,7 +23,7 @@ ActorEnvVarCollectionClient, ActorEnvVarCollectionClientAsync, ) - from apify_client._types import Timeout + from apify_client.types import Timeout _source_file_list_adapter = TypeAdapter(list[SourceCodeFile | SourceCodeFolder]) diff --git a/src/apify_client/_resource_clients/actor_version_collection.py b/src/apify_client/_resource_clients/actor_version_collection.py index 23026db5..7a74277e 100644 --- a/src/apify_client/_resource_clients/actor_version_collection.py +++ b/src/apify_client/_resource_clients/actor_version_collection.py @@ -21,7 +21,7 @@ from collections.abc import AsyncIterator, Iterator from apify_client._literals import VersionSourceType - from apify_client._types import Timeout + from apify_client.types import Timeout _source_file_list_adapter = TypeAdapter(list[SourceCodeFile | SourceCodeFolder]) diff --git a/src/apify_client/_resource_clients/build.py b/src/apify_client/_resource_clients/build.py index 1ae73de1..ed68fbe6 100644 --- a/src/apify_client/_resource_clients/build.py +++ b/src/apify_client/_resource_clients/build.py @@ -11,7 +11,7 @@ from datetime import timedelta from apify_client._resource_clients import LogClient, LogClientAsync - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/build_collection.py b/src/apify_client/_resource_clients/build_collection.py index ad90c4de..ea7dd773 100644 --- a/src/apify_client/_resource_clients/build_collection.py +++ b/src/apify_client/_resource_clients/build_collection.py @@ -11,7 +11,7 @@ from collections.abc import AsyncIterator, Iterator from apify_client._models import BuildShort - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/dataset.py b/src/apify_client/_resource_clients/dataset.py index b023efad..faefdaf1 100644 --- a/src/apify_client/_resource_clients/dataset.py +++ b/src/apify_client/_resource_clients/dataset.py @@ -20,9 +20,9 @@ from collections.abc import AsyncIterator, Iterator from datetime import timedelta - from apify_client._http_clients import HttpResponse from apify_client._literals import GeneralAccess - from apify_client._types import JsonSerializable, Timeout + from apify_client.http_clients import HttpResponse + from apify_client.types import JsonSerializable, Timeout @docs_group('Other') diff --git a/src/apify_client/_resource_clients/dataset_collection.py b/src/apify_client/_resource_clients/dataset_collection.py index c194bd80..af1cedd0 100644 --- a/src/apify_client/_resource_clients/dataset_collection.py +++ b/src/apify_client/_resource_clients/dataset_collection.py @@ -17,7 +17,7 @@ from apify_client._literals import StorageOwnership from apify_client._models import DatasetListItem - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/key_value_store.py b/src/apify_client/_resource_clients/key_value_store.py index f371bf91..5b83bbb8 100644 --- a/src/apify_client/_resource_clients/key_value_store.py +++ b/src/apify_client/_resource_clients/key_value_store.py @@ -29,9 +29,9 @@ from collections.abc import AsyncIterator, Iterator from datetime import timedelta - from apify_client._http_clients import HttpResponse from apify_client._literals import GeneralAccess - from apify_client._types import Timeout + from apify_client.http_clients import HttpResponse + from apify_client.types import Timeout def _parse_get_record_response(response: HttpResponse) -> Any: diff --git a/src/apify_client/_resource_clients/key_value_store_collection.py b/src/apify_client/_resource_clients/key_value_store_collection.py index b4bf506d..0fa0bb32 100644 --- a/src/apify_client/_resource_clients/key_value_store_collection.py +++ b/src/apify_client/_resource_clients/key_value_store_collection.py @@ -16,7 +16,7 @@ from collections.abc import AsyncIterator, Iterator from apify_client._literals import StorageOwnership - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/log.py b/src/apify_client/_resource_clients/log.py index e92bd037..723b0312 100644 --- a/src/apify_client/_resource_clients/log.py +++ b/src/apify_client/_resource_clients/log.py @@ -11,8 +11,8 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator, Iterator - from apify_client._http_clients import HttpResponse - from apify_client._types import Timeout + from apify_client.http_clients import HttpResponse + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/request_queue.py b/src/apify_client/_resource_clients/request_queue.py index 8bf31fb6..70613d0b 100644 --- a/src/apify_client/_resource_clients/request_queue.py +++ b/src/apify_client/_resource_clients/request_queue.py @@ -46,7 +46,7 @@ from apify_client._literals import GeneralAccess from apify_client._typeddicts import RequestDict, RequestDraftDeleteDict, RequestDraftDict - from apify_client._types import Timeout + from apify_client.types import Timeout _RQ_MAX_REQUESTS_PER_BATCH = 25 _MAX_PAYLOAD_SIZE_BYTES = 9 * 1024 * 1024 # 9 MB diff --git a/src/apify_client/_resource_clients/request_queue_collection.py b/src/apify_client/_resource_clients/request_queue_collection.py index 3239e30e..c358e713 100644 --- a/src/apify_client/_resource_clients/request_queue_collection.py +++ b/src/apify_client/_resource_clients/request_queue_collection.py @@ -17,7 +17,7 @@ from apify_client._literals import StorageOwnership from apify_client._models import RequestQueueShort - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/run.py b/src/apify_client/_resource_clients/run.py index ec0c0e8d..fa1e8977 100644 --- a/src/apify_client/_resource_clients/run.py +++ b/src/apify_client/_resource_clients/run.py @@ -30,7 +30,7 @@ RequestQueueClient, RequestQueueClientAsync, ) - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/run_collection.py b/src/apify_client/_resource_clients/run_collection.py index 21b7d186..8b9edd87 100644 --- a/src/apify_client/_resource_clients/run_collection.py +++ b/src/apify_client/_resource_clients/run_collection.py @@ -13,7 +13,7 @@ from apify_client._literals import ActorJobStatus from apify_client._models import RunShort - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/schedule.py b/src/apify_client/_resource_clients/schedule.py index 8eee629b..b6d2b3e2 100644 --- a/src/apify_client/_resource_clients/schedule.py +++ b/src/apify_client/_resource_clients/schedule.py @@ -14,7 +14,7 @@ from apify_client._utils import response_to_dict if TYPE_CHECKING: - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/schedule_collection.py b/src/apify_client/_resource_clients/schedule_collection.py index 138246e5..0e3bfa20 100644 --- a/src/apify_client/_resource_clients/schedule_collection.py +++ b/src/apify_client/_resource_clients/schedule_collection.py @@ -17,7 +17,7 @@ from collections.abc import AsyncIterator, Iterator from apify_client._models import ScheduleShort - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/store_collection.py b/src/apify_client/_resource_clients/store_collection.py index f1990ee1..3cff28e8 100644 --- a/src/apify_client/_resource_clients/store_collection.py +++ b/src/apify_client/_resource_clients/store_collection.py @@ -11,7 +11,7 @@ from collections.abc import AsyncIterator, Iterator from apify_client._models import StoreListActor - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/task.py b/src/apify_client/_resource_clients/task.py index 819bc464..0492e981 100644 --- a/src/apify_client/_resource_clients/task.py +++ b/src/apify_client/_resource_clients/task.py @@ -29,7 +29,7 @@ WebhookCollectionClientAsync, ) from apify_client._typeddicts import TaskInputDict - from apify_client._types import Timeout, WebhooksList + from apify_client.types import Timeout, WebhooksList @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/task_collection.py b/src/apify_client/_resource_clients/task_collection.py index 04b6223d..22075129 100644 --- a/src/apify_client/_resource_clients/task_collection.py +++ b/src/apify_client/_resource_clients/task_collection.py @@ -23,7 +23,7 @@ from apify_client._models import TaskShort from apify_client._typeddicts import TaskInputDict - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/user.py b/src/apify_client/_resource_clients/user.py index 6703000f..26a18acd 100644 --- a/src/apify_client/_resource_clients/user.py +++ b/src/apify_client/_resource_clients/user.py @@ -19,7 +19,7 @@ from apify_client._utils import response_to_dict if TYPE_CHECKING: - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/webhook.py b/src/apify_client/_resource_clients/webhook.py index 10b6a14b..439ba34c 100644 --- a/src/apify_client/_resource_clients/webhook.py +++ b/src/apify_client/_resource_clients/webhook.py @@ -19,7 +19,7 @@ if TYPE_CHECKING: from apify_client._literals import WebhookEventType from apify_client._resource_clients import WebhookDispatchCollectionClient, WebhookDispatchCollectionClientAsync - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/webhook_collection.py b/src/apify_client/_resource_clients/webhook_collection.py index 4c7b3cf7..d7fbf517 100644 --- a/src/apify_client/_resource_clients/webhook_collection.py +++ b/src/apify_client/_resource_clients/webhook_collection.py @@ -18,7 +18,7 @@ from apify_client._literals import WebhookEventType from apify_client._models import Webhook, WebhookShort - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/webhook_dispatch.py b/src/apify_client/_resource_clients/webhook_dispatch.py index c94e965e..a3ed7c86 100644 --- a/src/apify_client/_resource_clients/webhook_dispatch.py +++ b/src/apify_client/_resource_clients/webhook_dispatch.py @@ -7,7 +7,7 @@ from apify_client._resource_clients._resource_client import ResourceClient, ResourceClientAsync if TYPE_CHECKING: - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_resource_clients/webhook_dispatch_collection.py b/src/apify_client/_resource_clients/webhook_dispatch_collection.py index 2682ac47..805ea5de 100644 --- a/src/apify_client/_resource_clients/webhook_dispatch_collection.py +++ b/src/apify_client/_resource_clients/webhook_dispatch_collection.py @@ -11,7 +11,7 @@ from collections.abc import AsyncIterator, Iterator from apify_client._models import WebhookDispatch - from apify_client._types import Timeout + from apify_client.types import Timeout @docs_group('Resource clients') diff --git a/src/apify_client/_utils.py b/src/apify_client/_utils.py index 7196e369..e488b5be 100644 --- a/src/apify_client/_utils.py +++ b/src/apify_client/_utils.py @@ -20,9 +20,9 @@ if TYPE_CHECKING: from datetime import timedelta - from apify_client._http_clients import HttpResponse - from apify_client._types import WebhooksList from apify_client.errors import ApifyApiError + from apify_client.http_clients import HttpResponse + from apify_client.types import WebhooksList T = TypeVar('T') diff --git a/src/apify_client/errors.py b/src/apify_client/errors.py index 84c5423d..630fe065 100644 --- a/src/apify_client/errors.py +++ b/src/apify_client/errors.py @@ -8,7 +8,7 @@ if TYPE_CHECKING: from typing import Self - from apify_client._http_clients import HttpResponse + from apify_client.http_clients import HttpResponse @docs_group('Errors') @@ -161,3 +161,17 @@ def __init__(self, response: HttpResponse) -> None: 409: ConflictError, 429: RateLimitError, } + + +__all__ = [ + 'ApifyApiError', + 'ApifyClientError', + 'ConflictError', + 'ForbiddenError', + 'InvalidRequestError', + 'InvalidResponseBodyError', + 'NotFoundError', + 'RateLimitError', + 'ServerError', + 'UnauthorizedError', +] diff --git a/src/apify_client/_http_clients/__init__.py b/src/apify_client/http_clients/__init__.py similarity index 100% rename from src/apify_client/_http_clients/__init__.py rename to src/apify_client/http_clients/__init__.py diff --git a/src/apify_client/_http_clients/_base.py b/src/apify_client/http_clients/_base.py similarity index 99% rename from src/apify_client/_http_clients/_base.py rename to src/apify_client/http_clients/_base.py index 2abe8ab5..6da96dbf 100644 --- a/src/apify_client/_http_clients/_base.py +++ b/src/apify_client/http_clients/_base.py @@ -25,7 +25,7 @@ if TYPE_CHECKING: from collections.abc import AsyncIterator, Iterator, Mapping - from apify_client._types import JsonSerializable, Timeout + from apify_client.types import JsonSerializable, Timeout @docs_group('HTTP clients') diff --git a/src/apify_client/_http_clients/_impit.py b/src/apify_client/http_clients/_impit.py similarity index 99% rename from src/apify_client/_http_clients/_impit.py rename to src/apify_client/http_clients/_impit.py index 0701ad5c..c137dde7 100644 --- a/src/apify_client/_http_clients/_impit.py +++ b/src/apify_client/http_clients/_impit.py @@ -19,17 +19,17 @@ DEFAULT_TIMEOUT_SHORT, ) from apify_client._docs import docs_group -from apify_client._http_clients import HttpClient, HttpClientAsync from apify_client._logging import log_context, logger_name from apify_client._utils import to_seconds from apify_client.errors import ApifyApiError, InvalidResponseBodyError +from apify_client.http_clients._base import HttpClient, HttpClientAsync if TYPE_CHECKING: from collections.abc import Awaitable, Callable - from apify_client._http_clients import HttpResponse from apify_client._statistics import ClientStatistics - from apify_client._types import JsonSerializable, Timeout + from apify_client.http_clients._base import HttpResponse + from apify_client.types import JsonSerializable, Timeout T = TypeVar('T') diff --git a/src/apify_client/_types.py b/src/apify_client/types.py similarity index 89% rename from src/apify_client/_types.py rename to src/apify_client/types.py index 8d285dce..14bc9b51 100644 --- a/src/apify_client/_types.py +++ b/src/apify_client/types.py @@ -17,9 +17,6 @@ `condition`) are ignored at runtime. """ -TerminalActorJobStatus = Literal['SUCCEEDED', 'FAILED', 'TIMED-OUT', 'ABORTED'] -"""Subset of `ActorJobStatus` values that indicate the job has finished and will not change again.""" - Timeout = timedelta | Literal['no_timeout', 'short', 'medium', 'long'] """Type for the `timeout` parameter on resource client methods. @@ -32,3 +29,10 @@ Based on the definition discussed in https://github.com/python/typing/issues/182. """ + + +__all__ = [ + 'JsonSerializable', + 'Timeout', + 'WebhooksList', +] diff --git a/tests/unit/test_client_errors.py b/tests/unit/test_client_errors.py index d86a476b..4dae2168 100644 --- a/tests/unit/test_client_errors.py +++ b/tests/unit/test_client_errors.py @@ -7,7 +7,6 @@ from werkzeug import Response from apify_client import ApifyClient, ApifyClientAsync -from apify_client._http_clients import ImpitHttpClient, ImpitHttpClientAsync from apify_client.errors import ( ApifyApiError, ConflictError, @@ -18,6 +17,7 @@ ServerError, UnauthorizedError, ) +from apify_client.http_clients import ImpitHttpClient, ImpitHttpClientAsync if TYPE_CHECKING: from collections.abc import Awaitable, Callable diff --git a/tests/unit/test_client_headers.py b/tests/unit/test_client_headers.py index 84f9b2b8..fcc086fd 100644 --- a/tests/unit/test_client_headers.py +++ b/tests/unit/test_client_headers.py @@ -8,7 +8,7 @@ from werkzeug import Request, Response -from apify_client._http_clients import ImpitHttpClient, ImpitHttpClientAsync +from apify_client.http_clients import ImpitHttpClient, ImpitHttpClientAsync if TYPE_CHECKING: from pytest_httpserver import HTTPServer diff --git a/tests/unit/test_client_timeouts.py b/tests/unit/test_client_timeouts.py index 7c961f50..2e87279e 100644 --- a/tests/unit/test_client_timeouts.py +++ b/tests/unit/test_client_timeouts.py @@ -7,7 +7,7 @@ import pytest from impit import HTTPError, Response, TimeoutException -from apify_client._http_clients import ImpitHttpClient, ImpitHttpClientAsync +from apify_client.http_clients import ImpitHttpClient, ImpitHttpClientAsync if TYPE_CHECKING: from collections.abc import Iterator diff --git a/tests/unit/test_http_clients.py b/tests/unit/test_http_clients.py index 50d9f54c..b54c9fee 100644 --- a/tests/unit/test_http_clients.py +++ b/tests/unit/test_http_clients.py @@ -8,10 +8,10 @@ import impit import pytest -from apify_client._http_clients import HttpClient, HttpClientAsync, HttpResponse, ImpitHttpClient, ImpitHttpClientAsync -from apify_client._http_clients._impit import _is_retryable_error from apify_client._statistics import ClientStatistics from apify_client.errors import InvalidResponseBodyError +from apify_client.http_clients import HttpClient, HttpClientAsync, HttpResponse, ImpitHttpClient, ImpitHttpClientAsync +from apify_client.http_clients._impit import _is_retryable_error class _ConcreteHttpClient(HttpClient): diff --git a/tests/unit/test_pluggable_http_client.py b/tests/unit/test_pluggable_http_client.py index e601e3c5..e5eab9e8 100644 --- a/tests/unit/test_pluggable_http_client.py +++ b/tests/unit/test_pluggable_http_client.py @@ -6,22 +6,22 @@ import pytest import apify_client as apify_client_module -from apify_client import ( - ApifyClient, - ApifyClientAsync, +from apify_client import ApifyClient, ApifyClientAsync +from apify_client.errors import ApifyApiError +from apify_client.http_clients import ( HttpClient, HttpClientAsync, HttpResponse, + ImpitHttpClient, + ImpitHttpClientAsync, ) -from apify_client._http_clients import ImpitHttpClient, ImpitHttpClientAsync -from apify_client.errors import ApifyApiError if TYPE_CHECKING: from collections.abc import AsyncIterator, Iterator from pytest_httpserver import HTTPServer - from apify_client._types import Timeout + from apify_client.types import Timeout # -- Test response and client implementations -- @@ -287,12 +287,11 @@ async def test_apify_client_async_with_custom_http_client_accepts_url_params() - def test_public_exports() -> None: - """Test that all HTTP client types are available from the public API.""" - assert hasattr(apify_client_module, 'HttpClient') - assert hasattr(apify_client_module, 'HttpClientAsync') - assert hasattr(apify_client_module, 'HttpResponse') - assert hasattr(apify_client_module, 'ImpitHttpClient') - assert hasattr(apify_client_module, 'ImpitHttpClientAsync') + """HTTP client types are exposed from `apify_client.http_clients`, not the root namespace.""" + http_clients_module = apify_client_module.http_clients + for name in ('HttpClient', 'HttpClientAsync', 'HttpResponse', 'ImpitHttpClient', 'ImpitHttpClientAsync'): + assert hasattr(http_clients_module, name) + assert not hasattr(apify_client_module, name) # -- http_client property --