python-arango-async 0.0.5__tar.gz → 1.0.1__tar.gz

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.
Files changed (111) hide show
  1. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/CONTRIBUTING.md +1 -1
  2. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/PKG-INFO +3 -2
  3. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/README.md +1 -1
  4. python_arango_async-1.0.1/arangoasync/backup.py +295 -0
  5. python_arango_async-1.0.1/arangoasync/cluster.py +451 -0
  6. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/collection.py +417 -7
  7. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/connection.py +7 -2
  8. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/database.py +1072 -2
  9. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/exceptions.py +330 -2
  10. python_arango_async-1.0.1/arangoasync/foxx.py +829 -0
  11. python_arango_async-1.0.1/arangoasync/replication.py +270 -0
  12. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/request.py +10 -5
  13. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/typings.py +140 -2
  14. python_arango_async-1.0.1/arangoasync/version.py +1 -0
  15. python_arango_async-1.0.1/docs/admin.rst +50 -0
  16. python_arango_async-1.0.1/docs/backup.rst +78 -0
  17. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/certificates.rst +22 -0
  18. python_arango_async-1.0.1/docs/cluster.rst +53 -0
  19. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/database.rst +7 -0
  20. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/document.rst +33 -0
  21. python_arango_async-1.0.1/docs/foxx.rst +147 -0
  22. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/index.rst +6 -2
  23. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/migration.rst +9 -2
  24. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/specs.rst +12 -0
  25. python_arango_async-1.0.1/docs/task.rst +51 -0
  26. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/pyproject.toml +1 -0
  27. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/python_arango_async.egg-info/PKG-INFO +3 -2
  28. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/python_arango_async.egg-info/SOURCES.txt +14 -0
  29. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/python_arango_async.egg-info/requires.txt +1 -0
  30. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/conftest.py +13 -0
  31. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/helpers.py +27 -0
  32. python_arango_async-1.0.1/tests/static/service.zip +0 -0
  33. python_arango_async-1.0.1/tests/test_backup.py +57 -0
  34. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_client.py +14 -0
  35. python_arango_async-1.0.1/tests/test_cluster.py +101 -0
  36. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_collection.py +100 -1
  37. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_connection.py +6 -0
  38. python_arango_async-1.0.1/tests/test_database.py +410 -0
  39. python_arango_async-1.0.1/tests/test_foxx.py +245 -0
  40. python_arango_async-1.0.1/tests/test_task.py +79 -0
  41. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_typings.py +60 -0
  42. python_arango_async-0.0.5/arangoasync/version.py +0 -1
  43. python_arango_async-0.0.5/tests/test_database.py +0 -210
  44. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/.circleci/config.yml +0 -0
  45. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/.github/workflows/codeql.yaml +0 -0
  46. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/.github/workflows/docs.yaml +0 -0
  47. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/.github/workflows/pypi.yaml +0 -0
  48. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/.gitignore +0 -0
  49. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/.pre-commit-config.yaml +0 -0
  50. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/.readthedocs.yaml +0 -0
  51. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/LICENSE +0 -0
  52. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/__init__.py +0 -0
  53. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/aql.py +0 -0
  54. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/auth.py +0 -0
  55. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/client.py +0 -0
  56. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/compression.py +0 -0
  57. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/cursor.py +0 -0
  58. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/errno.py +0 -0
  59. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/executor.py +0 -0
  60. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/graph.py +0 -0
  61. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/http.py +0 -0
  62. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/job.py +0 -0
  63. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/logger.py +0 -0
  64. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/resolver.py +0 -0
  65. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/response.py +0 -0
  66. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/result.py +0 -0
  67. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/arangoasync/serialization.py +0 -0
  68. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/analyzer.rst +0 -0
  69. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/aql.rst +0 -0
  70. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/async.rst +0 -0
  71. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/authentication.rst +0 -0
  72. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/collection.rst +0 -0
  73. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/compression.rst +0 -0
  74. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/conf.py +0 -0
  75. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/cursor.rst +0 -0
  76. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/errno.rst +0 -0
  77. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/errors.rst +0 -0
  78. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/graph.rst +0 -0
  79. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/helpers.rst +0 -0
  80. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/http.rst +0 -0
  81. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/indexes.rst +0 -0
  82. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/logging.rst +0 -0
  83. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/overview.rst +0 -0
  84. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/serialization.rst +0 -0
  85. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/static/logo.png +0 -0
  86. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/transaction.rst +0 -0
  87. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/user.rst +0 -0
  88. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/docs/view.rst +0 -0
  89. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/python_arango_async.egg-info/dependency_links.txt +0 -0
  90. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/python_arango_async.egg-info/top_level.txt +0 -0
  91. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/setup.cfg +0 -0
  92. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/setup.py +0 -0
  93. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/starter.sh +0 -0
  94. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/__init__.py +0 -0
  95. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/static/cluster-3.11.conf +0 -0
  96. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/static/cluster-3.12.conf +0 -0
  97. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/static/keyfile +0 -0
  98. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/static/single-3.11.conf +0 -0
  99. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/static/single-3.12.conf +0 -0
  100. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_analyzer.py +0 -0
  101. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_aql.py +0 -0
  102. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_async.py +0 -0
  103. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_compression.py +0 -0
  104. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_cursor.py +0 -0
  105. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_document.py +0 -0
  106. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_graph.py +0 -0
  107. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_http.py +0 -0
  108. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_resolver.py +0 -0
  109. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_transaction.py +0 -0
  110. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_user.py +0 -0
  111. {python_arango_async-0.0.5 → python_arango_async-1.0.1}/tests/test_view.py +0 -0
@@ -10,7 +10,7 @@ pre-commit install # Install git pre-commit hooks
10
10
  Run unit tests with coverage:
11
11
 
12
12
  ```shell
13
- pytest --cov=arango --cov-report=html # Open htmlcov/index.html in your browser
13
+ pytest --enterprise --cluster --cov=arango --cov-report=html # Open htmlcov/index.html in your browser
14
14
  ```
15
15
 
16
16
  To start and ArangoDB instance locally, run:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-arango-async
3
- Version: 0.0.5
3
+ Version: 1.0.1
4
4
  Summary: Async Python Driver for ArangoDB
5
5
  Author-email: Alexandru Petenchea <alexandru.petenchea@arangodb.com>, Anthony Mahanna <anthony.mahanna@arangodb.com>
6
6
  Maintainer-email: Alexandru Petenchea <alexandru.petenchea@arangodb.com>, Anthony Mahanna <anthony.mahanna@arangodb.com>
@@ -26,6 +26,7 @@ Requires-Dist: aiohttp>=3.9
26
26
  Requires-Dist: multidict>=6.0
27
27
  Requires-Dist: pyjwt>=2.8.0
28
28
  Provides-Extra: dev
29
+ Requires-Dist: aiofiles>=24.1.0; extra == "dev"
29
30
  Requires-Dist: black>=24.2; extra == "dev"
30
31
  Requires-Dist: flake8>=7.0; extra == "dev"
31
32
  Requires-Dist: isort>=5.10; extra == "dev"
@@ -61,7 +62,7 @@ database natively supporting documents, graphs and search.
61
62
  This is the _asyncio_ alternative of the [python-arango](https://github.com/arangodb/python-arango)
62
63
  driver.
63
64
 
64
- **Note: This project is still in active development, features might be added or removed.**
65
+ Check out a demo app at [python-arango-async-demo](https://github.com/apetenchea/python-arango-async-demo).
65
66
 
66
67
  ## Requirements
67
68
 
@@ -20,7 +20,7 @@ database natively supporting documents, graphs and search.
20
20
  This is the _asyncio_ alternative of the [python-arango](https://github.com/arangodb/python-arango)
21
21
  driver.
22
22
 
23
- **Note: This project is still in active development, features might be added or removed.**
23
+ Check out a demo app at [python-arango-async-demo](https://github.com/apetenchea/python-arango-async-demo).
24
24
 
25
25
  ## Requirements
26
26
 
@@ -0,0 +1,295 @@
1
+ __all__ = ["Backup"]
2
+
3
+ from numbers import Number
4
+ from typing import Optional, cast
5
+
6
+ from arangoasync.exceptions import (
7
+ BackupCreateError,
8
+ BackupDeleteError,
9
+ BackupDownloadError,
10
+ BackupGetError,
11
+ BackupRestoreError,
12
+ BackupUploadError,
13
+ )
14
+ from arangoasync.executor import ApiExecutor
15
+ from arangoasync.request import Method, Request
16
+ from arangoasync.response import Response
17
+ from arangoasync.result import Result
18
+ from arangoasync.serialization import Deserializer, Serializer
19
+ from arangoasync.typings import Json, Jsons
20
+
21
+
22
+ class Backup:
23
+ """Backup API wrapper."""
24
+
25
+ def __init__(self, executor: ApiExecutor) -> None:
26
+ self._executor = executor
27
+
28
+ @property
29
+ def serializer(self) -> Serializer[Json]:
30
+ """Return the serializer."""
31
+ return self._executor.serializer
32
+
33
+ @property
34
+ def deserializer(self) -> Deserializer[Json, Jsons]:
35
+ """Return the deserializer."""
36
+ return self._executor.deserializer
37
+
38
+ async def get(self, backup_id: Optional[str] = None) -> Result[Json]:
39
+ """Return backup details.
40
+
41
+ Args:
42
+ backup_id (str | None): If set, the returned list is restricted to the
43
+ backup with the given id.
44
+
45
+ Returns:
46
+ dict: Backup details.
47
+
48
+ Raises:
49
+ BackupGetError: If the operation fails.
50
+
51
+ References:
52
+ - `list-backups <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#list-all-backups>`__
53
+ """ # noqa: E501
54
+ data: Json = {}
55
+ if backup_id is not None:
56
+ data["id"] = backup_id
57
+
58
+ request = Request(
59
+ method=Method.POST,
60
+ endpoint="/_admin/backup/list",
61
+ data=self.serializer.dumps(data) if data else None,
62
+ prefix_needed=False,
63
+ )
64
+
65
+ def response_handler(resp: Response) -> Json:
66
+ if not resp.is_success:
67
+ raise BackupGetError(resp, request)
68
+ result: Json = self.deserializer.loads(resp.raw_body)
69
+ return cast(Json, result["result"])
70
+
71
+ return await self._executor.execute(request, response_handler)
72
+
73
+ async def create(
74
+ self,
75
+ label: Optional[str] = None,
76
+ allow_inconsistent: Optional[bool] = None,
77
+ force: Optional[bool] = None,
78
+ timeout: Optional[Number] = None,
79
+ ) -> Result[Json]:
80
+ """Create a backup when the global write lock can be obtained.
81
+
82
+ Args:
83
+ label (str | None): Label for this backup. If not specified, a UUID is used.
84
+ allow_inconsistent (bool | None): Allow inconsistent backup when the global
85
+ transaction lock cannot be acquired before timeout.
86
+ force (bool | None): Forcefully abort all running transactions to ensure a
87
+ consistent backup when the global transaction lock cannot be
88
+ acquired before timeout. Default (and highly recommended) value
89
+ is `False`.
90
+ timeout (float | None): The time in seconds that the operation tries to
91
+ get a consistent snapshot.
92
+
93
+ Returns:
94
+ dict: Backup information.
95
+
96
+ Raises:
97
+ BackupCreateError: If the backup creation fails.
98
+
99
+ References:
100
+ - `create-backup <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#create-a-backup>`__
101
+ """ # noqa: E501
102
+ data: Json = {}
103
+ if label is not None:
104
+ data["label"] = label
105
+ if allow_inconsistent is not None:
106
+ data["allowInconsistent"] = allow_inconsistent
107
+ if force is not None:
108
+ data["force"] = force
109
+ if timeout is not None:
110
+ data["timeout"] = timeout
111
+
112
+ request = Request(
113
+ method=Method.POST,
114
+ endpoint="/_admin/backup/create",
115
+ data=self.serializer.dumps(data),
116
+ prefix_needed=False,
117
+ )
118
+
119
+ def response_handler(resp: Response) -> Json:
120
+ if not resp.is_success:
121
+ raise BackupCreateError(resp, request)
122
+ result: Json = self.deserializer.loads(resp.raw_body)
123
+ return cast(Json, result["result"])
124
+
125
+ return await self._executor.execute(request, response_handler)
126
+
127
+ async def restore(self, backup_id: str) -> Result[Json]:
128
+ """Restore a local backup.
129
+
130
+ Args:
131
+ backup_id (str): Backup ID.
132
+
133
+ Returns:
134
+ dict: Result of the restore operation.
135
+
136
+ Raises:
137
+ BackupRestoreError: If the restore operation fails.
138
+
139
+ References:
140
+ - `restore-backup <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#restore-a-backup>`__
141
+ """ # noqa: E501
142
+ data: Json = {"id": backup_id}
143
+ request = Request(
144
+ method=Method.POST,
145
+ endpoint="/_admin/backup/restore",
146
+ data=self.serializer.dumps(data),
147
+ prefix_needed=False,
148
+ )
149
+
150
+ def response_handler(resp: Response) -> Json:
151
+ if not resp.is_success:
152
+ raise BackupRestoreError(resp, request)
153
+ result: Json = self.deserializer.loads(resp.raw_body)
154
+ return cast(Json, result["result"])
155
+
156
+ return await self._executor.execute(request, response_handler)
157
+
158
+ async def delete(self, backup_id: str) -> None:
159
+ """Delete a backup.
160
+
161
+ Args:
162
+ backup_id (str): Backup ID.
163
+
164
+ Raises:
165
+ BackupDeleteError: If the delete operation fails.
166
+
167
+ References:
168
+ - `delete-backup <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#delete-a-backup>`__
169
+ """ # noqa: E501
170
+ data: Json = {"id": backup_id}
171
+ request = Request(
172
+ method=Method.POST,
173
+ endpoint="/_admin/backup/delete",
174
+ data=self.serializer.dumps(data),
175
+ prefix_needed=False,
176
+ )
177
+
178
+ def response_handler(resp: Response) -> None:
179
+ if not resp.is_success:
180
+ raise BackupDeleteError(resp, request)
181
+
182
+ await self._executor.execute(request, response_handler)
183
+
184
+ async def upload(
185
+ self,
186
+ backup_id: Optional[str] = None,
187
+ repository: Optional[str] = None,
188
+ abort: Optional[bool] = None,
189
+ config: Optional[Json] = None,
190
+ upload_id: Optional[str] = None,
191
+ ) -> Result[Json]:
192
+ """Manage backup uploads.
193
+
194
+ Args:
195
+ backup_id (str | None): Backup ID used for scheduling an upload. Mutually
196
+ exclusive with parameter **upload_id**.
197
+ repository (str | None): Remote repository URL(e.g. "local://tmp/backups").
198
+ abort (str | None): If set to `True`, running upload is aborted. Used with
199
+ parameter **upload_id**.
200
+ config (dict | None): Remote repository configuration. Required for scheduling
201
+ an upload and mutually exclusive with parameter **upload_id**.
202
+ upload_id (str | None): Upload ID. Mutually exclusive with parameters
203
+ **backup_id**, **repository**, and **config**.
204
+
205
+ Returns:
206
+ dict: Upload details.
207
+
208
+ Raises:
209
+ BackupUploadError: If upload operation fails.
210
+
211
+ References:
212
+ - `upload-a-backup-to-a-remote-repository <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#upload-a-backup-to-a-remote-repository>`__
213
+ """ # noqa: E501
214
+ data: Json = {}
215
+ if upload_id is not None:
216
+ data["uploadId"] = upload_id
217
+ if backup_id is not None:
218
+ data["id"] = backup_id
219
+ if repository is not None:
220
+ data["remoteRepository"] = repository
221
+ if abort is not None:
222
+ data["abort"] = abort
223
+ if config is not None:
224
+ data["config"] = config
225
+
226
+ request = Request(
227
+ method=Method.POST,
228
+ endpoint="/_admin/backup/upload",
229
+ data=self.serializer.dumps(data),
230
+ prefix_needed=False,
231
+ )
232
+
233
+ def response_handler(resp: Response) -> Json:
234
+ if not resp.is_success:
235
+ raise BackupUploadError(resp, request)
236
+ result: Json = self.deserializer.loads(resp.raw_body)
237
+ return cast(Json, result["result"])
238
+
239
+ return await self._executor.execute(request, response_handler)
240
+
241
+ async def download(
242
+ self,
243
+ backup_id: Optional[str] = None,
244
+ repository: Optional[str] = None,
245
+ abort: Optional[bool] = None,
246
+ config: Optional[Json] = None,
247
+ download_id: Optional[str] = None,
248
+ ) -> Result[Json]:
249
+ """Manage backup downloads.
250
+
251
+ Args:
252
+ backup_id (str | None): Backup ID used for scheduling a download. Mutually
253
+ exclusive with parameter **download_id**.
254
+ repository (str | None): Remote repository URL (e.g. "local://tmp/backups").
255
+ abort (bool | None): If set to `True`, running download is aborted.
256
+ config (dict | None): Remote repository configuration. Required for scheduling
257
+ a download and mutually exclusive with parameter **download_id**.
258
+ download_id (str | None): Download ID. Mutually exclusive with parameters
259
+ **backup_id**, **repository**, and **config**.
260
+
261
+ Returns:
262
+ dict: Download details.
263
+
264
+ Raises:
265
+ BackupDownloadError: If the download operation fails.
266
+
267
+ References:
268
+ - `download-a-backup-from-a-remote-repository <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#download-a-backup-from-a-remote-repository>`__
269
+ """ # noqa: E501
270
+ data: Json = {}
271
+ if download_id is not None:
272
+ data["downloadId"] = download_id
273
+ if backup_id is not None:
274
+ data["id"] = backup_id
275
+ if repository is not None:
276
+ data["remoteRepository"] = repository
277
+ if abort is not None:
278
+ data["abort"] = abort
279
+ if config is not None:
280
+ data["config"] = config
281
+
282
+ request = Request(
283
+ method=Method.POST,
284
+ endpoint="/_admin/backup/download",
285
+ data=self.serializer.dumps(data),
286
+ prefix_needed=False,
287
+ )
288
+
289
+ def response_handler(resp: Response) -> Json:
290
+ if not resp.is_success:
291
+ raise BackupDownloadError(resp, request)
292
+ result: Json = self.deserializer.loads(resp.raw_body)
293
+ return cast(Json, result["result"])
294
+
295
+ return await self._executor.execute(request, response_handler)