Skip to content

Commit 00327c2

Browse files
committed
Fix
1 parent cc295c9 commit 00327c2

File tree

6 files changed

+60
-35
lines changed

6 files changed

+60
-35
lines changed

src/apify/storage_clients/_apify/_dataset_client.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import asyncio
44
import warnings
5+
from datetime import datetime
56
from logging import getLogger
67
from typing import TYPE_CHECKING, Any
78

@@ -65,7 +66,18 @@ def __init__(
6566
@override
6667
async def get_metadata(self) -> DatasetMetadata:
6768
metadata = await self._api_client.get()
68-
return DatasetMetadata.model_validate(metadata)
69+
70+
if metadata is None:
71+
raise ValueError('Failed to retrieve dataset metadata.')
72+
73+
return DatasetMetadata(
74+
id=metadata.id,
75+
name=metadata.name,
76+
created_at=datetime.fromisoformat(metadata.created_at.replace('Z', '+00:00')),
77+
modified_at=datetime.fromisoformat(metadata.modified_at.replace('Z', '+00:00')),
78+
accessed_at=datetime.fromisoformat(metadata.accessed_at.replace('Z', '+00:00')),
79+
item_count=int(metadata.item_count),
80+
)
6981

7082
@classmethod
7183
async def open(

src/apify/storage_clients/_apify/_key_value_store_client.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import asyncio
44
import warnings
5+
from datetime import datetime
56
from logging import getLogger
67
from typing import TYPE_CHECKING, Any
78

@@ -54,7 +55,18 @@ def __init__(
5455
@override
5556
async def get_metadata(self) -> ApifyKeyValueStoreMetadata:
5657
metadata = await self._api_client.get()
57-
return ApifyKeyValueStoreMetadata.model_validate(metadata)
58+
59+
if metadata is None:
60+
raise ValueError('Failed to retrieve dataset metadata.')
61+
62+
return ApifyKeyValueStoreMetadata(
63+
id=metadata.id,
64+
name=metadata.name,
65+
created_at=datetime.fromisoformat(metadata.created_at.replace('Z', '+00:00')),
66+
modified_at=datetime.fromisoformat(metadata.modified_at.replace('Z', '+00:00')),
67+
accessed_at=datetime.fromisoformat(metadata.accessed_at.replace('Z', '+00:00')),
68+
url_signing_secret_key=metadata.url_signing_secret_key,
69+
)
5870

5971
@classmethod
6072
async def open(

src/apify/storage_clients/_apify/_request_queue_client.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,32 +78,32 @@ async def get_metadata(self) -> ApifyRequestQueueMetadata:
7878
Returns:
7979
Request queue metadata with accurate counts and timestamps, combining API data with local estimates.
8080
"""
81-
response = await self._api_client.get()
81+
metadata = await self._api_client.get()
8282

83-
if response is None:
83+
if metadata is None:
8484
raise ValueError('Failed to fetch request queue metadata from the API.')
8585

86-
total_request_count = int(response.total_request_count)
87-
handled_request_count = int(response.handled_request_count)
88-
pending_request_count = int(response.pending_request_count)
89-
created_at = datetime.fromisoformat(response.created_at.replace('Z', '+00:00'))
90-
modified_at = datetime.fromisoformat(response.modified_at.replace('Z', '+00:00'))
91-
accessed_at = datetime.fromisoformat(response.accessed_at.replace('Z', '+00:00'))
86+
total_request_count = int(metadata.total_request_count)
87+
handled_request_count = int(metadata.handled_request_count)
88+
pending_request_count = int(metadata.pending_request_count)
89+
created_at = datetime.fromisoformat(metadata.created_at.replace('Z', '+00:00'))
90+
modified_at = datetime.fromisoformat(metadata.modified_at.replace('Z', '+00:00'))
91+
accessed_at = datetime.fromisoformat(metadata.accessed_at.replace('Z', '+00:00'))
9292

9393
# Enhance API response with local estimations to account for propagation delays (API data can be delayed
9494
# by a few seconds, while local estimates are immediately accurate).
9595
return ApifyRequestQueueMetadata(
96-
id=response.id,
97-
name=response.name,
96+
id=metadata.id,
97+
name=metadata.name,
9898
total_request_count=max(total_request_count, self._implementation.metadata.total_request_count),
9999
handled_request_count=max(handled_request_count, self._implementation.metadata.handled_request_count),
100100
pending_request_count=pending_request_count,
101101
created_at=min(created_at, self._implementation.metadata.created_at),
102102
modified_at=max(modified_at, self._implementation.metadata.modified_at),
103103
accessed_at=max(accessed_at, self._implementation.metadata.accessed_at),
104-
had_multiple_clients=response.had_multiple_clients or self._implementation.metadata.had_multiple_clients,
104+
had_multiple_clients=metadata.had_multiple_clients or self._implementation.metadata.had_multiple_clients,
105105
stats=RequestQueueStats.model_validate(
106-
response.stats.model_dump(by_alias=True) if response.stats else {},
106+
metadata.stats.model_dump(by_alias=True) if metadata.stats else {},
107107
by_alias=True,
108108
),
109109
)

src/apify/storage_clients/_apify/_request_queue_shared_client.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,17 @@ async def add_batch_of_requests(
121121

122122
if new_requests:
123123
# Prepare requests for API by converting to dictionaries.
124-
requests_dict = [
125-
request.model_dump(
126-
by_alias=True,
127-
)
128-
for request in new_requests
129-
]
124+
requests_dict = [request.model_dump(by_alias=True) for request in new_requests]
130125

131126
# Send requests to API.
132-
api_response = AddRequestsResponse.model_validate(
133-
await self._api_client.batch_add_requests(requests=requests_dict, forefront=forefront)
127+
batch_response = await self._api_client.batch_add_requests(
128+
requests=requests_dict,
129+
forefront=forefront,
134130
)
135131

132+
batch_response_dict = batch_response.model_dump(by_alias=True)
133+
api_response = AddRequestsResponse.model_validate(batch_response_dict)
134+
136135
# Add the locally known already present processed requests based on the local cache.
137136
api_response.processed_requests.extend(already_present_requests)
138137

@@ -312,7 +311,8 @@ async def _get_request_by_id(self, request_id: str) -> Request | None:
312311
if response is None:
313312
return None
314313

315-
return Request.model_validate(response)
314+
response_dict = response.model_dump(by_alias=True)
315+
return Request.model_validate(response_dict)
316316

317317
async def _ensure_head_is_non_empty(self) -> None:
318318
"""Ensure that the queue head has requests if they are available in the queue."""
@@ -473,7 +473,8 @@ async def _list_head(
473473
# After adding new requests to the forefront, any existing leftover locked request is kept in the end.
474474
self._queue_head.append(leftover_id)
475475

476-
return RequestQueueHead.model_validate(list_and_lost_data)
476+
list_and_lost_dict = list_and_lost_data.model_dump(by_alias=True)
477+
return RequestQueueHead.model_validate(list_and_lost_dict)
477478

478479
def _cache_request(
479480
self,

src/apify/storage_clients/_apify/_request_queue_single_client.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -147,22 +147,20 @@ async def add_batch_of_requests(
147147

148148
if new_requests:
149149
# Prepare requests for API by converting to dictionaries.
150-
requests_dict = [
151-
request.model_dump(
152-
by_alias=True,
153-
)
154-
for request in new_requests
155-
]
150+
requests_dict = [request.model_dump(by_alias=True) for request in new_requests]
156151

157152
# Send requests to API.
158-
api_response = AddRequestsResponse.model_validate(
159-
await self._api_client.batch_add_requests(requests=requests_dict, forefront=forefront)
160-
)
153+
batch_response = await self._api_client.batch_add_requests(requests=requests_dict, forefront=forefront)
154+
batch_response_dict = batch_response.model_dump(by_alias=True)
155+
api_response = AddRequestsResponse.model_validate(batch_response_dict)
156+
161157
# Add the locally known already present processed requests based on the local cache.
162158
api_response.processed_requests.extend(already_present_requests)
159+
163160
# Remove unprocessed requests from the cache
164161
for unprocessed_request in api_response.unprocessed_requests:
165-
self._requests_cache.pop(unique_key_to_request_id(unprocessed_request.unique_key), None)
162+
request_id = unique_key_to_request_id(unprocessed_request.unique_key)
163+
self._requests_cache.pop(request_id, None)
166164

167165
else:
168166
api_response = AddRequestsResponse(
@@ -329,7 +327,8 @@ async def _get_request_by_id(self, id: str) -> Request | None:
329327
if response is None:
330328
return None
331329

332-
request = Request.model_validate(response)
330+
response_dict = response.model_dump(by_alias=True)
331+
request = Request.model_validate(response_dict)
333332

334333
# Updated local caches
335334
if id in self._requests_in_progress:

tests/unit/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def prepare_test_env(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> Callabl
6262
def _prepare_test_env() -> None:
6363
if hasattr(apify._actor.Actor, '__wrapped__'):
6464
delattr(apify._actor.Actor, '__wrapped__')
65+
6566
apify._actor.Actor._is_initialized = False
6667

6768
# Set the environment variable for the local storage directory to the temporary path.

0 commit comments

Comments
 (0)