Skip to content

Commit bdb814a

Browse files
committed
Introduce default client timeout
1 parent 2aa165f commit bdb814a

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

src/apify_client/client.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
)
5555

5656
DEFAULT_API_URL = 'https://api.apify.com'
57+
DEFAULT_TIMEOUT = 360
5758
API_VERSION = 'v2'
5859

5960

@@ -68,7 +69,7 @@ def __init__(
6869
api_url: str | None = None,
6970
max_retries: int | None = 8,
7071
min_delay_between_retries_millis: int | None = 500,
71-
timeout_secs: int | None = 360,
72+
timeout_secs: int | None = DEFAULT_TIMEOUT,
7273
) -> None:
7374
"""Initialize a new instance.
7475
@@ -85,7 +86,7 @@ def __init__(
8586
self.base_url = f'{api_url}/{API_VERSION}'
8687
self.max_retries = max_retries or 8
8788
self.min_delay_between_retries_millis = min_delay_between_retries_millis or 500
88-
self.timeout_secs = timeout_secs or 360
89+
self.timeout_secs = timeout_secs or DEFAULT_TIMEOUT
8990

9091
def _options(self) -> dict:
9192
return {
@@ -107,7 +108,7 @@ def __init__(
107108
api_url: str | None = None,
108109
max_retries: int | None = 8,
109110
min_delay_between_retries_millis: int | None = 500,
110-
timeout_secs: int | None = 360,
111+
timeout_secs: int | None = DEFAULT_TIMEOUT,
111112
) -> None:
112113
"""Initialize a new instance.
113114
@@ -290,7 +291,7 @@ def __init__(
290291
api_url: str | None = None,
291292
max_retries: int | None = 8,
292293
min_delay_between_retries_millis: int | None = 500,
293-
timeout_secs: int | None = 360,
294+
timeout_secs: int | None = DEFAULT_TIMEOUT,
294295
) -> None:
295296
"""Initialize a new instance.
296297

tests/unit/test_client_timeouts.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from apify_client import ApifyClient
1010
from apify_client._http_client import HTTPClient, HTTPClientAsync
11+
from apify_client.client import DEFAULT_TIMEOUT
1112
from apify_client.clients import DatasetClient, KeyValueStoreClient, RequestQueueClient
1213
from apify_client.clients.resource_clients import dataset, request_queue
1314
from apify_client.clients.resource_clients import key_value_store as kvs
@@ -17,16 +18,6 @@ class EndOfTestError(Exception):
1718
"""Custom exception that is raised after the relevant part of the code is executed to stop the test."""
1819

1920

20-
def assert_timeout(expected_timeout: int, request: Request) -> Response:
21-
assert request.extensions['timeout'] == {
22-
'connect': expected_timeout,
23-
'pool': expected_timeout,
24-
'read': expected_timeout,
25-
'write': expected_timeout,
26-
}
27-
raise EndOfTestError
28-
29-
3021
@respx.mock
3122
async def test_dynamic_timeout_async_client() -> None:
3223
"""Tests timeout values for request with retriable errors.
@@ -83,22 +74,36 @@ def check_timeout(request: Request) -> Response:
8374
HTTPClient(timeout_secs=client_timeout).call(method='GET', url='https://example.com', timeout_secs=call_timeout)
8475

8576

77+
def assert_timeout(expected_timeout: int, request: Request) -> Response:
78+
"""Assert that correct timeouts are set on the request and raise `EndOfTestError`.
79+
80+
This is intended for tests that are only testing timeout value and further execution of the code is not desired.
81+
"""
82+
assert request.extensions['timeout'] == {
83+
'connect': expected_timeout,
84+
'pool': expected_timeout,
85+
'read': expected_timeout,
86+
'write': expected_timeout,
87+
}
88+
raise EndOfTestError
89+
90+
8691
_timeout_params = [
8792
(DatasetClient, 'get', dataset._SMALL_TIMEOUT, {}),
8893
(DatasetClient, 'update', dataset._SMALL_TIMEOUT, {}),
8994
(DatasetClient, 'delete', dataset._SMALL_TIMEOUT, {}),
90-
(DatasetClient, 'list_items', 360, {}),
91-
(DatasetClient, 'download_items', 360, {}),
92-
(DatasetClient, 'get_items_as_bytes', 360, {}),
95+
(DatasetClient, 'list_items', DEFAULT_TIMEOUT, {}),
96+
(DatasetClient, 'download_items', DEFAULT_TIMEOUT, {}),
97+
(DatasetClient, 'get_items_as_bytes', DEFAULT_TIMEOUT, {}),
9398
(DatasetClient, 'push_items', dataset._MEDIUM_TIMEOUT, {'items': {}}),
9499
(DatasetClient, 'get_statistics', dataset._SMALL_TIMEOUT, {}),
95100
(KeyValueStoreClient, 'get', kvs._SMALL_TIMEOUT, {}),
96-
(KeyValueStoreClient, 'update', 360, {}),
101+
(KeyValueStoreClient, 'update', DEFAULT_TIMEOUT, {}),
97102
(KeyValueStoreClient, 'delete', kvs._SMALL_TIMEOUT, {}),
98103
(KeyValueStoreClient, 'list_keys', kvs._MEDIUM_TIMEOUT, {}),
99-
(KeyValueStoreClient, 'get_record', 360, {'key': 'some_key'}),
100-
(KeyValueStoreClient, 'get_record_as_bytes', 360, {'key': 'some_key'}),
101-
(KeyValueStoreClient, 'set_record', 360, {'key': 'some_key', 'value': 'some_value'}),
104+
(KeyValueStoreClient, 'get_record', DEFAULT_TIMEOUT, {'key': 'some_key'}),
105+
(KeyValueStoreClient, 'get_record_as_bytes', DEFAULT_TIMEOUT, {'key': 'some_key'}),
106+
(KeyValueStoreClient, 'set_record', DEFAULT_TIMEOUT, {'key': 'some_key', 'value': 'some_value'}),
102107
(KeyValueStoreClient, 'delete_record', kvs._SMALL_TIMEOUT, {'key': 'some_key'}),
103108
(RequestQueueClient, 'get', request_queue._SMALL_TIMEOUT, {}),
104109
(RequestQueueClient, 'update', kvs._SMALL_TIMEOUT, {}),

0 commit comments

Comments
 (0)