diff --git a/src/apify/_actor.py b/src/apify/_actor.py index b76a11df..d0ca4979 100644 --- a/src/apify/_actor.py +++ b/src/apify/_actor.py @@ -41,7 +41,7 @@ if TYPE_CHECKING: import logging - from collections.abc import Callable + from collections.abc import Callable, MutableMapping from decimal import Decimal from types import TracebackType @@ -1401,7 +1401,7 @@ async def use_state( default_value: dict[str, JsonSerializable] | None = None, key: str | None = None, kvs_name: str | None = None, - ) -> dict[str, JsonSerializable]: + ) -> MutableMapping[str, JsonSerializable]: """Easily create and manage state values. All state values are automatically persisted. Values can be modified by simply using the assignment operator. diff --git a/src/apify/_charging.py b/src/apify/_charging.py index 07fdd04b..0bf43626 100644 --- a/src/apify/_charging.py +++ b/src/apify/_charging.py @@ -318,7 +318,7 @@ async def charge(self, event_name: str, count: int = 1) -> ChargeResult: { 'event_name': event_name, 'event_title': pricing_info.title, - 'event_price_usd': round(pricing_info.price, 3), + 'event_price_usd': float(round(pricing_info.price, 3)), 'charged_count': charged_count, 'timestamp': datetime.now(timezone.utc).isoformat(), } diff --git a/src/apify/storage_clients/_apify/_dataset_client.py b/src/apify/storage_clients/_apify/_dataset_client.py index 2287ec66..fc809646 100644 --- a/src/apify/storage_clients/_apify/_dataset_client.py +++ b/src/apify/storage_clients/_apify/_dataset_client.py @@ -3,7 +3,7 @@ import asyncio import warnings from logging import getLogger -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING from typing_extensions import override @@ -16,7 +16,7 @@ from apify.storage_clients._ppe_dataset_mixin import DatasetClientPpeMixin if TYPE_CHECKING: - from collections.abc import AsyncIterator + from collections.abc import AsyncIterator, Mapping, Sequence from apify_client.clients import DatasetClientAsync from crawlee._types import JsonSerializable @@ -137,13 +137,13 @@ async def drop(self) -> None: await self._api_client.delete() @override - async def push_data(self, data: list[Any] | dict[str, Any]) -> None: - async def payloads_generator(items: list[Any]) -> AsyncIterator[str]: + async def push_data(self, data: Sequence[Mapping[str, JsonSerializable]] | Mapping[str, JsonSerializable]) -> None: + async def payloads_generator(items: Sequence[Mapping[str, JsonSerializable]]) -> AsyncIterator[str]: for index, item in enumerate(items): yield await self._check_and_serialize(item, index) async with self._charge_lock(), self._lock: - items = data if isinstance(data, list) else [data] + items = data if self._is_sequence_of_items(data) else [data] limit = self._compute_limit_for_push(len(items)) items = items[:limit] @@ -211,7 +211,7 @@ async def iterate_items( yield item @classmethod - async def _check_and_serialize(cls, item: JsonSerializable, index: int | None = None) -> str: + async def _check_and_serialize(cls, item: Mapping[str, JsonSerializable], index: int | None = None) -> str: """Serialize a given item to JSON, checks its serializability and size against a limit. Args: diff --git a/src/apify/storage_clients/_file_system/_dataset_client.py b/src/apify/storage_clients/_file_system/_dataset_client.py index 04af9ae2..057bcc9f 100644 --- a/src/apify/storage_clients/_file_system/_dataset_client.py +++ b/src/apify/storage_clients/_file_system/_dataset_client.py @@ -9,6 +9,9 @@ from apify.storage_clients._ppe_dataset_mixin import DatasetClientPpeMixin if TYPE_CHECKING: + from collections.abc import Mapping, Sequence + + from crawlee._types import JsonSerializable from crawlee.configuration import Configuration @@ -47,9 +50,9 @@ async def open( return dataset_client @override - async def push_data(self, data: list[dict[str, Any]] | dict[str, Any]) -> None: + async def push_data(self, data: Sequence[Mapping[str, JsonSerializable]] | Mapping[str, JsonSerializable]) -> None: async with self._charge_lock(): - items = data if isinstance(data, list) else [data] + items = data if self._is_sequence_of_items(data) else [data] limit = self._compute_limit_for_push(len(items)) await super().push_data(items[:limit]) diff --git a/uv.lock b/uv.lock index ad137c90..8b28fc8b 100644 --- a/uv.lock +++ b/uv.lock @@ -609,7 +609,7 @@ toml = [ [[package]] name = "crawlee" -version = "1.7.0" +version = "1.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-timeout" }, @@ -626,9 +626,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/13/10d822c282f7967f97111b4751b454a02a963373247dae925bd01872a0ee/crawlee-1.7.0.tar.gz", hash = "sha256:38035e31f196ae632e65275188ec382ded908a132a99613cb77e82888770bb24", size = 286528, upload-time = "2026-05-12T08:37:13.841Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/99/909066bd4c4c56130d04c4196b5d893a52934790731d18c71499838f4ad1/crawlee-1.7.1.tar.gz", hash = "sha256:aec67a6fefa297834b60b0283ba943287c5580ba07f21f377135a72b455f768c", size = 287576, upload-time = "2026-05-26T07:11:45.523Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/bd/9d69cb8156065f62bcb14ca68b118cbcbbfd3bb293c18fc2ee842b46e784/crawlee-1.7.0-py3-none-any.whl", hash = "sha256:fc969425f1ec977d02ddf68747aec9dad88daac506f677a942389b2b278ab1e9", size = 369875, upload-time = "2026-05-12T08:37:07.629Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5f/38b07ebd7c1dd0496a61e79309743dc1d04f61d5ee7edf12adfdffe08b89/crawlee-1.7.1-py3-none-any.whl", hash = "sha256:4d3ea5c95b0970324cbddd9d2ca48530d29d67b1f3dcd5fba70fb8a576d6bab0", size = 370720, upload-time = "2026-05-26T07:11:42.979Z" }, ] [package.optional-dependencies]