apify 1.7.3b4__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of apify might be problematic. Click here for more details.

Files changed (61) hide show
  1. apify/__init__.py +19 -4
  2. apify/_actor.py +979 -0
  3. apify/_configuration.py +310 -0
  4. apify/_consts.py +10 -0
  5. apify/_crypto.py +29 -27
  6. apify/_models.py +110 -0
  7. apify/_platform_event_manager.py +222 -0
  8. apify/_proxy_configuration.py +316 -0
  9. apify/_utils.py +0 -497
  10. apify/apify_storage_client/__init__.py +3 -0
  11. apify/apify_storage_client/_apify_storage_client.py +56 -0
  12. apify/apify_storage_client/_dataset_client.py +188 -0
  13. apify/apify_storage_client/_dataset_collection_client.py +50 -0
  14. apify/apify_storage_client/_key_value_store_client.py +98 -0
  15. apify/apify_storage_client/_key_value_store_collection_client.py +50 -0
  16. apify/apify_storage_client/_request_queue_client.py +208 -0
  17. apify/apify_storage_client/_request_queue_collection_client.py +50 -0
  18. apify/apify_storage_client/py.typed +0 -0
  19. apify/log.py +24 -105
  20. apify/scrapy/__init__.py +11 -3
  21. apify/scrapy/middlewares/__init__.py +3 -1
  22. apify/scrapy/middlewares/apify_proxy.py +21 -21
  23. apify/scrapy/middlewares/py.typed +0 -0
  24. apify/scrapy/pipelines/__init__.py +3 -1
  25. apify/scrapy/pipelines/actor_dataset_push.py +1 -1
  26. apify/scrapy/pipelines/py.typed +0 -0
  27. apify/scrapy/py.typed +0 -0
  28. apify/scrapy/requests.py +55 -54
  29. apify/scrapy/scheduler.py +19 -13
  30. apify/scrapy/utils.py +2 -31
  31. apify/storages/__init__.py +2 -10
  32. apify/storages/py.typed +0 -0
  33. apify-2.0.0.dist-info/METADATA +209 -0
  34. apify-2.0.0.dist-info/RECORD +37 -0
  35. {apify-1.7.3b4.dist-info → apify-2.0.0.dist-info}/WHEEL +1 -2
  36. apify/_memory_storage/__init__.py +0 -3
  37. apify/_memory_storage/file_storage_utils.py +0 -71
  38. apify/_memory_storage/memory_storage_client.py +0 -219
  39. apify/_memory_storage/resource_clients/__init__.py +0 -19
  40. apify/_memory_storage/resource_clients/base_resource_client.py +0 -141
  41. apify/_memory_storage/resource_clients/base_resource_collection_client.py +0 -114
  42. apify/_memory_storage/resource_clients/dataset.py +0 -452
  43. apify/_memory_storage/resource_clients/dataset_collection.py +0 -48
  44. apify/_memory_storage/resource_clients/key_value_store.py +0 -533
  45. apify/_memory_storage/resource_clients/key_value_store_collection.py +0 -48
  46. apify/_memory_storage/resource_clients/request_queue.py +0 -466
  47. apify/_memory_storage/resource_clients/request_queue_collection.py +0 -48
  48. apify/actor.py +0 -1357
  49. apify/config.py +0 -130
  50. apify/consts.py +0 -67
  51. apify/event_manager.py +0 -236
  52. apify/proxy_configuration.py +0 -365
  53. apify/storages/base_storage.py +0 -181
  54. apify/storages/dataset.py +0 -494
  55. apify/storages/key_value_store.py +0 -257
  56. apify/storages/request_queue.py +0 -602
  57. apify/storages/storage_client_manager.py +0 -72
  58. apify-1.7.3b4.dist-info/METADATA +0 -150
  59. apify-1.7.3b4.dist-info/RECORD +0 -41
  60. apify-1.7.3b4.dist-info/top_level.txt +0 -1
  61. {apify-1.7.3b4.dist-info → apify-2.0.0.dist-info}/LICENSE +0 -0
@@ -0,0 +1,188 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from typing_extensions import override
6
+
7
+ from crawlee.base_storage_client import BaseDatasetClient, DatasetItemsListPage, DatasetMetadata
8
+
9
+ if TYPE_CHECKING:
10
+ from collections.abc import AsyncIterator
11
+ from contextlib import AbstractAsyncContextManager
12
+
13
+ from httpx import Response
14
+
15
+ from apify_client.clients import DatasetClientAsync
16
+ from crawlee._types import JsonSerializable
17
+
18
+
19
+ class DatasetClient(BaseDatasetClient):
20
+ """Dataset resource client implementation based on the Apify platform storage."""
21
+
22
+ def __init__(self, apify_dataset_client: DatasetClientAsync) -> None:
23
+ self._client = apify_dataset_client
24
+
25
+ @override
26
+ async def get(self) -> DatasetMetadata | None:
27
+ result = await self._client.get()
28
+ return DatasetMetadata.model_validate(result) if result else None
29
+
30
+ @override
31
+ async def update(
32
+ self,
33
+ *,
34
+ name: str | None = None,
35
+ ) -> DatasetMetadata:
36
+ return DatasetMetadata.model_validate(
37
+ await self._client.update(
38
+ name=name,
39
+ )
40
+ )
41
+
42
+ @override
43
+ async def delete(self) -> None:
44
+ await self._client.delete()
45
+
46
+ @override
47
+ async def list_items(
48
+ self,
49
+ *,
50
+ offset: int | None = 0,
51
+ limit: int | None = BaseDatasetClient._LIST_ITEMS_LIMIT, # noqa: SLF001
52
+ clean: bool = False,
53
+ desc: bool = False,
54
+ fields: list[str] | None = None,
55
+ omit: list[str] | None = None,
56
+ unwind: str | None = None,
57
+ skip_empty: bool = False,
58
+ skip_hidden: bool = False,
59
+ flatten: list[str] | None = None,
60
+ view: str | None = None,
61
+ ) -> DatasetItemsListPage:
62
+ return DatasetItemsListPage.model_validate(
63
+ vars(
64
+ await self._client.list_items(
65
+ offset=offset,
66
+ limit=limit,
67
+ clean=clean,
68
+ desc=desc,
69
+ fields=fields,
70
+ omit=omit,
71
+ unwind=unwind,
72
+ skip_empty=skip_empty,
73
+ skip_hidden=skip_hidden,
74
+ flatten=flatten,
75
+ view=view,
76
+ )
77
+ )
78
+ )
79
+
80
+ @override
81
+ async def iterate_items(
82
+ self,
83
+ *,
84
+ offset: int = 0,
85
+ limit: int | None = None,
86
+ clean: bool = False,
87
+ desc: bool = False,
88
+ fields: list[str] | None = None,
89
+ omit: list[str] | None = None,
90
+ unwind: str | None = None,
91
+ skip_empty: bool = False,
92
+ skip_hidden: bool = False,
93
+ ) -> AsyncIterator[dict]:
94
+ return self._client.iterate_items(
95
+ offset=offset,
96
+ limit=limit,
97
+ clean=clean,
98
+ desc=desc,
99
+ fields=fields,
100
+ omit=omit,
101
+ unwind=unwind,
102
+ skip_empty=skip_empty,
103
+ skip_hidden=skip_hidden,
104
+ )
105
+
106
+ @override
107
+ async def get_items_as_bytes(
108
+ self,
109
+ *,
110
+ item_format: str = 'json',
111
+ offset: int | None = None,
112
+ limit: int | None = None,
113
+ desc: bool = False,
114
+ clean: bool = False,
115
+ bom: bool = False,
116
+ delimiter: str | None = None,
117
+ fields: list[str] | None = None,
118
+ omit: list[str] | None = None,
119
+ unwind: str | None = None,
120
+ skip_empty: bool = False,
121
+ skip_header_row: bool = False,
122
+ skip_hidden: bool = False,
123
+ xml_root: str | None = None,
124
+ xml_row: str | None = None,
125
+ flatten: list[str] | None = None,
126
+ ) -> bytes:
127
+ return await self._client.get_items_as_bytes(
128
+ item_format=item_format,
129
+ offset=offset,
130
+ limit=limit,
131
+ desc=desc,
132
+ clean=clean,
133
+ bom=bom,
134
+ delimiter=delimiter,
135
+ fields=fields,
136
+ omit=omit,
137
+ unwind=unwind,
138
+ skip_empty=skip_empty,
139
+ skip_header_row=skip_header_row,
140
+ skip_hidden=skip_hidden,
141
+ xml_root=xml_root,
142
+ xml_row=xml_row,
143
+ flatten=flatten,
144
+ )
145
+
146
+ @override
147
+ async def stream_items(
148
+ self,
149
+ *,
150
+ item_format: str = 'json',
151
+ offset: int | None = None,
152
+ limit: int | None = None,
153
+ desc: bool = False,
154
+ clean: bool = False,
155
+ bom: bool = False,
156
+ delimiter: str | None = None,
157
+ fields: list[str] | None = None,
158
+ omit: list[str] | None = None,
159
+ unwind: str | None = None,
160
+ skip_empty: bool = False,
161
+ skip_header_row: bool = False,
162
+ skip_hidden: bool = False,
163
+ xml_root: str | None = None,
164
+ xml_row: str | None = None,
165
+ ) -> AbstractAsyncContextManager[Response | None]:
166
+ return self._client.stream_items(
167
+ item_format=item_format,
168
+ offset=offset,
169
+ limit=limit,
170
+ desc=desc,
171
+ clean=clean,
172
+ bom=bom,
173
+ delimiter=delimiter,
174
+ fields=fields,
175
+ omit=omit,
176
+ unwind=unwind,
177
+ skip_empty=skip_empty,
178
+ skip_header_row=skip_header_row,
179
+ skip_hidden=skip_hidden,
180
+ xml_root=xml_root,
181
+ xml_row=xml_row,
182
+ )
183
+
184
+ @override
185
+ async def push_items(self, items: JsonSerializable) -> None:
186
+ await self._client.push_items(
187
+ items=items,
188
+ )
@@ -0,0 +1,50 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from typing_extensions import override
6
+
7
+ from crawlee.base_storage_client import BaseDatasetCollectionClient, DatasetListPage, DatasetMetadata
8
+
9
+ if TYPE_CHECKING:
10
+ from apify_client.clients import DatasetCollectionClientAsync
11
+
12
+
13
+ class DatasetCollectionClient(BaseDatasetCollectionClient):
14
+ """Dataset collection resource client implementation based on the Apify platform storage."""
15
+
16
+ def __init__(self, apify_dataset_collection_client: DatasetCollectionClientAsync) -> None:
17
+ self._client = apify_dataset_collection_client
18
+
19
+ @override
20
+ async def get_or_create(
21
+ self,
22
+ *,
23
+ id: str | None = None,
24
+ name: str | None = None,
25
+ schema: dict | None = None,
26
+ ) -> DatasetMetadata:
27
+ return DatasetMetadata.model_validate(
28
+ await self._client.get_or_create(
29
+ name=id if id is not None else name,
30
+ schema=schema,
31
+ )
32
+ )
33
+
34
+ @override
35
+ async def list(
36
+ self,
37
+ *,
38
+ unnamed: bool = False,
39
+ limit: int | None = None,
40
+ offset: int | None = None,
41
+ desc: bool = False,
42
+ ) -> DatasetListPage:
43
+ return DatasetListPage.model_validate(
44
+ await self._client.list(
45
+ unnamed=unnamed,
46
+ limit=limit,
47
+ offset=offset,
48
+ desc=desc,
49
+ )
50
+ )
@@ -0,0 +1,98 @@
1
+ from __future__ import annotations
2
+
3
+ from contextlib import asynccontextmanager
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from typing_extensions import override
7
+
8
+ from crawlee.base_storage_client import (
9
+ BaseKeyValueStoreClient,
10
+ KeyValueStoreListKeysPage,
11
+ KeyValueStoreMetadata,
12
+ KeyValueStoreRecord,
13
+ )
14
+
15
+ if TYPE_CHECKING:
16
+ from collections.abc import AsyncIterator
17
+ from contextlib import AbstractAsyncContextManager
18
+
19
+ from httpx import Response
20
+
21
+ from apify_client.clients import KeyValueStoreClientAsync
22
+
23
+
24
+ class KeyValueStoreClient(BaseKeyValueStoreClient):
25
+ """Key-value store resource client implementation based on the Apify platform storage."""
26
+
27
+ def __init__(self, apify_key_value_store_client: KeyValueStoreClientAsync, api_public_base_url: str) -> None:
28
+ self._client = apify_key_value_store_client
29
+ self._api_public_base_url = api_public_base_url
30
+
31
+ @override
32
+ async def get(self) -> KeyValueStoreMetadata | None:
33
+ result = await self._client.get()
34
+ return KeyValueStoreMetadata.model_validate(result) if result else None
35
+
36
+ @override
37
+ async def update(
38
+ self,
39
+ *,
40
+ name: str | None = None,
41
+ ) -> KeyValueStoreMetadata:
42
+ return KeyValueStoreMetadata.model_validate(await self._client.update())
43
+
44
+ @override
45
+ async def delete(self) -> None:
46
+ await self._client.delete()
47
+
48
+ @override
49
+ async def list_keys(
50
+ self,
51
+ *,
52
+ limit: int = 1000,
53
+ exclusive_start_key: str | None = None,
54
+ ) -> KeyValueStoreListKeysPage:
55
+ return KeyValueStoreListKeysPage.model_validate(await self._client.list_keys())
56
+
57
+ @override
58
+ async def get_record(self, key: str) -> KeyValueStoreRecord | None:
59
+ result = await self._client.get_record(key)
60
+ return KeyValueStoreRecord.model_validate(result) if result else None
61
+
62
+ @override
63
+ async def get_record_as_bytes(self, key: str) -> KeyValueStoreRecord | None:
64
+ result = await self._client.get_record_as_bytes(key)
65
+ return KeyValueStoreRecord.model_validate(result) if result else None
66
+
67
+ @override
68
+ async def stream_record(self, key: str) -> AbstractAsyncContextManager[KeyValueStoreRecord[Response] | None]:
69
+ return self._stream_record_internal(key)
70
+
71
+ @asynccontextmanager
72
+ async def _stream_record_internal(self, key: str) -> AsyncIterator[KeyValueStoreRecord[Response] | None]:
73
+ async with self._client.stream_record(key) as response:
74
+ yield KeyValueStoreRecord.model_validate(response)
75
+
76
+ @override
77
+ async def set_record(self, key: str, value: Any, content_type: str | None = None) -> None:
78
+ await self._client.set_record(
79
+ key=key,
80
+ value=value,
81
+ content_type=content_type,
82
+ )
83
+
84
+ @override
85
+ async def delete_record(self, key: str) -> None:
86
+ await self._client.delete_record(
87
+ key=key,
88
+ )
89
+
90
+ async def get_public_url(self, key: str) -> str:
91
+ """Get a URL for the given key that may be used to publicly access the value in the remote key-value store.
92
+
93
+ Args:
94
+ key: The key for which the URL should be generated.
95
+ """
96
+ public_api_url = self._api_public_base_url
97
+
98
+ return f'{public_api_url}/v2/key-value-stores/{self._client.resource_id}/records/{key}'
@@ -0,0 +1,50 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from typing_extensions import override
6
+
7
+ from crawlee.base_storage_client import BaseKeyValueStoreCollectionClient, KeyValueStoreListPage, KeyValueStoreMetadata
8
+
9
+ if TYPE_CHECKING:
10
+ from apify_client.clients import KeyValueStoreCollectionClientAsync
11
+
12
+
13
+ class KeyValueStoreCollectionClient(BaseKeyValueStoreCollectionClient):
14
+ """Key-value store collection resource client implementation based on the Apify platform storage."""
15
+
16
+ def __init__(self, apify_dataset_collection_client: KeyValueStoreCollectionClientAsync) -> None:
17
+ self._client = apify_dataset_collection_client
18
+
19
+ @override
20
+ async def get_or_create(
21
+ self,
22
+ *,
23
+ id: str | None = None,
24
+ name: str | None = None,
25
+ schema: dict | None = None,
26
+ ) -> KeyValueStoreMetadata:
27
+ return KeyValueStoreMetadata.model_validate(
28
+ await self._client.get_or_create(
29
+ name=id if id is not None else name,
30
+ schema=schema,
31
+ )
32
+ )
33
+
34
+ @override
35
+ async def list(
36
+ self,
37
+ *,
38
+ unnamed: bool = False,
39
+ limit: int | None = None,
40
+ offset: int | None = None,
41
+ desc: bool = False,
42
+ ) -> KeyValueStoreListPage:
43
+ return KeyValueStoreListPage.model_validate(
44
+ await self._client.list(
45
+ unnamed=unnamed,
46
+ limit=limit,
47
+ offset=offset,
48
+ desc=desc,
49
+ )
50
+ )
@@ -0,0 +1,208 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from more_itertools import chunked
6
+ from typing_extensions import override
7
+
8
+ from crawlee import Request
9
+ from crawlee.base_storage_client import (
10
+ BaseRequestQueueClient,
11
+ BatchRequestsOperationResponse,
12
+ ProcessedRequest,
13
+ ProlongRequestLockResponse,
14
+ RequestQueueHead,
15
+ RequestQueueHeadWithLocks,
16
+ RequestQueueMetadata,
17
+ )
18
+
19
+ if TYPE_CHECKING:
20
+ from collections.abc import Sequence
21
+
22
+ from apify_client.clients import RequestQueueClientAsync
23
+
24
+
25
+ class RequestQueueClient(BaseRequestQueueClient):
26
+ """Request queue resource client implementation based on the Apify platform storage."""
27
+
28
+ def __init__(self, apify_request_queue_client: RequestQueueClientAsync) -> None:
29
+ self._client = apify_request_queue_client
30
+
31
+ @override
32
+ async def get(self) -> RequestQueueMetadata | None:
33
+ result = await self._client.get()
34
+ return RequestQueueMetadata.model_validate({'resourceDirectory': ''} | result) if result else None
35
+
36
+ @override
37
+ async def update(
38
+ self,
39
+ *,
40
+ name: str | None = None,
41
+ ) -> RequestQueueMetadata:
42
+ return RequestQueueMetadata.model_validate(
43
+ {'resourceDirectory': ''}
44
+ | await self._client.update(
45
+ name=name,
46
+ )
47
+ )
48
+
49
+ @override
50
+ async def delete(self) -> None:
51
+ await self._client.delete()
52
+
53
+ @override
54
+ async def list_head(self, *, limit: int | None = None) -> RequestQueueHead:
55
+ return RequestQueueHead.model_validate(
56
+ await self._client.list_head(
57
+ limit=limit,
58
+ ),
59
+ )
60
+
61
+ @override
62
+ async def list_and_lock_head(self, *, lock_secs: int, limit: int | None = None) -> RequestQueueHeadWithLocks:
63
+ return RequestQueueHeadWithLocks.model_validate(
64
+ await self._client.list_and_lock_head(
65
+ lock_secs=lock_secs,
66
+ limit=limit,
67
+ )
68
+ )
69
+
70
+ @override
71
+ async def add_request(
72
+ self,
73
+ request: Request,
74
+ *,
75
+ forefront: bool = False,
76
+ ) -> ProcessedRequest:
77
+ return ProcessedRequest.model_validate(
78
+ {'id': request.id, 'uniqueKey': request.unique_key}
79
+ | await self._client.add_request(
80
+ request=request.model_dump(
81
+ by_alias=True,
82
+ exclude={
83
+ 'id',
84
+ 'json_',
85
+ 'order_no',
86
+ 'query_params',
87
+ 'data',
88
+ },
89
+ ),
90
+ forefront=forefront,
91
+ )
92
+ )
93
+
94
+ @override
95
+ async def get_request(self, request_id: str) -> Request | None:
96
+ result = await self._client.get_request(request_id)
97
+ return Request.model_validate(result) if result else None
98
+
99
+ @override
100
+ async def update_request(
101
+ self,
102
+ request: Request,
103
+ *,
104
+ forefront: bool = False,
105
+ ) -> ProcessedRequest:
106
+ return ProcessedRequest.model_validate(
107
+ {'id': request.id, 'uniqueKey': request.unique_key}
108
+ | await self._client.update_request(
109
+ request=request.model_dump(
110
+ by_alias=True,
111
+ exclude={
112
+ 'json_',
113
+ 'order_no',
114
+ 'query_params',
115
+ 'data',
116
+ },
117
+ ),
118
+ forefront=forefront,
119
+ )
120
+ )
121
+
122
+ @override
123
+ async def delete_request(self, request_id: str) -> None:
124
+ await self._client.delete_request(request_id)
125
+
126
+ @override
127
+ async def prolong_request_lock(
128
+ self,
129
+ request_id: str,
130
+ *,
131
+ forefront: bool = False,
132
+ lock_secs: int,
133
+ ) -> ProlongRequestLockResponse:
134
+ return ProlongRequestLockResponse.model_validate(
135
+ await self._client.prolong_request_lock(
136
+ request_id=request_id,
137
+ forefront=forefront,
138
+ lock_secs=lock_secs,
139
+ )
140
+ )
141
+
142
+ @override
143
+ async def delete_request_lock(
144
+ self,
145
+ request_id: str,
146
+ *,
147
+ forefront: bool = False,
148
+ ) -> None:
149
+ await self._client.delete_request_lock(
150
+ request_id=request_id,
151
+ forefront=forefront,
152
+ )
153
+
154
+ @override
155
+ async def batch_add_requests(
156
+ self,
157
+ requests: Sequence[Request],
158
+ *,
159
+ forefront: bool = False,
160
+ ) -> BatchRequestsOperationResponse:
161
+ processed = []
162
+ unprocessed = []
163
+
164
+ for chunk in chunked(requests, 25): # The API endpoint won't accept more than 25 requests at once
165
+ response = await self._client.batch_add_requests(
166
+ requests=[
167
+ r.model_dump(
168
+ by_alias=True,
169
+ exclude={
170
+ 'id',
171
+ 'json_',
172
+ 'order_no',
173
+ 'query_params',
174
+ 'data',
175
+ },
176
+ )
177
+ for r in chunk
178
+ ],
179
+ forefront=forefront,
180
+ )
181
+ processed.extend(response['processedRequests'])
182
+ unprocessed.extend(response['unprocessedRequests'])
183
+
184
+ return BatchRequestsOperationResponse.model_validate(
185
+ {
186
+ 'processedRequests': processed,
187
+ 'unprocessedRequests': unprocessed,
188
+ }
189
+ )
190
+
191
+ @override
192
+ async def batch_delete_requests(self, requests: list[Request]) -> BatchRequestsOperationResponse:
193
+ return BatchRequestsOperationResponse.model_validate(
194
+ await self._client.batch_delete_requests(
195
+ requests=[
196
+ r.model_dump(
197
+ by_alias=True,
198
+ exclude={
199
+ 'json_',
200
+ 'order_no',
201
+ 'query_params',
202
+ 'data',
203
+ },
204
+ )
205
+ for r in requests
206
+ ],
207
+ )
208
+ )
@@ -0,0 +1,50 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from typing_extensions import override
6
+
7
+ from crawlee.base_storage_client import BaseRequestQueueCollectionClient, RequestQueueListPage, RequestQueueMetadata
8
+
9
+ if TYPE_CHECKING:
10
+ from apify_client.clients import RequestQueueCollectionClientAsync
11
+
12
+
13
+ class RequestQueueCollectionClient(BaseRequestQueueCollectionClient):
14
+ """Request queue collection resource client implementation based on the Apify platform storage."""
15
+
16
+ def __init__(self, apify_request_queue_collection_client: RequestQueueCollectionClientAsync) -> None:
17
+ self._client = apify_request_queue_collection_client
18
+
19
+ @override
20
+ async def get_or_create(
21
+ self,
22
+ *,
23
+ id: str | None = None,
24
+ name: str | None = None,
25
+ schema: dict | None = None,
26
+ ) -> RequestQueueMetadata:
27
+ return RequestQueueMetadata.model_validate(
28
+ {'resourceDirectory': ''}
29
+ | await self._client.get_or_create(
30
+ name=id if id is not None else name,
31
+ )
32
+ )
33
+
34
+ @override
35
+ async def list(
36
+ self,
37
+ *,
38
+ unnamed: bool = False,
39
+ limit: int | None = None,
40
+ offset: int | None = None,
41
+ desc: bool = False,
42
+ ) -> RequestQueueListPage:
43
+ return RequestQueueListPage.model_validate(
44
+ await self._client.list(
45
+ unnamed=unnamed,
46
+ limit=limit,
47
+ offset=offset,
48
+ desc=desc,
49
+ )
50
+ )
File without changes