gitcode-api 1.2.20__py3-none-any.whl → 1.3.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.
- gitcode_api/__init__.py +8 -2
- gitcode_api/_base_client.py +7 -2
- gitcode_api/_exceptions.py +8 -0
- gitcode_api/exceptions.py +19 -0
- gitcode_api/llm/mcp.py +5 -5
- gitcode_api/models.py +205 -0
- gitcode_api/resources/__init__.py +1 -1
- gitcode_api/resources/_shared/__init__.py +18 -0
- gitcode_api/resources/_shared/base.py +129 -0
- gitcode_api/resources/{_shared.py → _shared/fetch_template.py} +133 -259
- gitcode_api/resources/account/__init__.py +17 -0
- gitcode_api/resources/account/oauth_resource_group.py +159 -0
- gitcode_api/resources/account/orgs_resource_group.py +422 -0
- gitcode_api/resources/account/search_resource_group.py +236 -0
- gitcode_api/resources/account/users_resource_group.py +249 -0
- gitcode_api/resources/collaboration/__init__.py +20 -0
- gitcode_api/resources/collaboration/_helpers.py +10 -0
- gitcode_api/resources/collaboration/issues_resource_group.py +855 -0
- gitcode_api/resources/collaboration/labels_resource_group.py +248 -0
- gitcode_api/resources/collaboration/members_resource_group.py +195 -0
- gitcode_api/resources/collaboration/milestones_resource_group.py +192 -0
- gitcode_api/resources/collaboration/pulls_resource_group.py +1300 -0
- gitcode_api/resources/misc/__init__.py +14 -0
- gitcode_api/resources/misc/releases_resource_group.py +445 -0
- gitcode_api/resources/misc/tags_resource_group.py +286 -0
- gitcode_api/resources/misc/webhooks_resource_group.py +192 -0
- gitcode_api/resources/repositories/__init__.py +17 -0
- gitcode_api/resources/repositories/branches_resource_group.py +151 -0
- gitcode_api/resources/repositories/commits_resource_group.py +333 -0
- gitcode_api/resources/repositories/repo_contents_resource_group.py +459 -0
- gitcode_api/resources/repositories/repos_resource_group.py +1279 -0
- gitcode_api/version.txt +1 -1
- {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/METADATA +3 -3
- gitcode_api-1.3.0.dist-info/RECORD +52 -0
- gitcode_api/resources/account.py +0 -1086
- gitcode_api/resources/collaboration.py +0 -2818
- gitcode_api/resources/misc.py +0 -901
- gitcode_api/resources/repositories.py +0 -2197
- gitcode_api-1.2.20.dist-info/RECORD +0 -31
- {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/WHEEL +0 -0
- {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/entry_points.txt +0 -0
- {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/licenses/LICENSE +0 -0
- {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Classes for resource groups: releases, tags, and webhooks."""
|
|
2
|
+
|
|
3
|
+
from .releases_resource_group import AsyncReleasesResource, ReleasesResource
|
|
4
|
+
from .tags_resource_group import AsyncTagsResource, TagsResource
|
|
5
|
+
from .webhooks_resource_group import AsyncWebhooksResource, WebhooksResource
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"AsyncReleasesResource",
|
|
9
|
+
"AsyncTagsResource",
|
|
10
|
+
"AsyncWebhooksResource",
|
|
11
|
+
"ReleasesResource",
|
|
12
|
+
"TagsResource",
|
|
13
|
+
"WebhooksResource",
|
|
14
|
+
]
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
"""AbstractReleasesResource, ReleasesResource, and AsyncReleasesResource resource group."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import List, Optional, Union
|
|
6
|
+
|
|
7
|
+
from ..._models import Release, ReleaseUploadURL
|
|
8
|
+
from .._shared import AsyncResource, SyncResource
|
|
9
|
+
|
|
10
|
+
# mypy: disable-error-code=override
|
|
11
|
+
# pylint: disable=invalid-overridden-method,protected-access,redefined-builtin
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class AbstractReleasesResource(ABC):
|
|
15
|
+
"""Interface for Releases resource endpoints."""
|
|
16
|
+
|
|
17
|
+
@abstractmethod
|
|
18
|
+
def create(
|
|
19
|
+
self,
|
|
20
|
+
*,
|
|
21
|
+
tag: str,
|
|
22
|
+
name: str,
|
|
23
|
+
body: str,
|
|
24
|
+
owner: Optional[str] = None,
|
|
25
|
+
repo: Optional[str] = None,
|
|
26
|
+
target_commitish: Optional[str] = None,
|
|
27
|
+
release_status: Optional[str] = None,
|
|
28
|
+
) -> Release:
|
|
29
|
+
"""Create a repository release.
|
|
30
|
+
|
|
31
|
+
:param tag: Tag name for the release.
|
|
32
|
+
:param name: Release title.
|
|
33
|
+
:param body: Release description.
|
|
34
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
35
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
36
|
+
:param target_commitish: Branch name or commit SHA for creating a missing tag.
|
|
37
|
+
:param release_status: Release status, such as ``pre`` or ``latest``.
|
|
38
|
+
:returns: Created release payload.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def update(
|
|
43
|
+
self,
|
|
44
|
+
*,
|
|
45
|
+
tag: str,
|
|
46
|
+
name: str,
|
|
47
|
+
body: str,
|
|
48
|
+
owner: Optional[str] = None,
|
|
49
|
+
repo: Optional[str] = None,
|
|
50
|
+
release_status: Optional[str] = None,
|
|
51
|
+
) -> Release:
|
|
52
|
+
"""Update a repository release.
|
|
53
|
+
|
|
54
|
+
:param tag: Tag name in the release URL path.
|
|
55
|
+
:param name: Release name.
|
|
56
|
+
:param body: Release description.
|
|
57
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
58
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
59
|
+
:param release_status: Release status, such as ``pre`` or ``latest``.
|
|
60
|
+
:returns: Updated release payload.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
@abstractmethod
|
|
64
|
+
def get_upload_url(
|
|
65
|
+
self, *, tag: str, file_name: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
66
|
+
) -> ReleaseUploadURL:
|
|
67
|
+
"""Get a pre-signed URL for uploading a release attachment.
|
|
68
|
+
|
|
69
|
+
:param tag: Tag name in the release URL path.
|
|
70
|
+
:param file_name: Attachment file name to upload.
|
|
71
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
72
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
73
|
+
:returns: Upload URL and required headers.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
@abstractmethod
|
|
77
|
+
def upload(
|
|
78
|
+
self,
|
|
79
|
+
*,
|
|
80
|
+
tag: str,
|
|
81
|
+
file_name: str,
|
|
82
|
+
content: Union[bytes, str],
|
|
83
|
+
owner: Optional[str] = None,
|
|
84
|
+
repo: Optional[str] = None,
|
|
85
|
+
upload_timeout: Optional[float] = 300.0,
|
|
86
|
+
) -> None:
|
|
87
|
+
"""Upload a release attachment through the pre-signed upload URL.
|
|
88
|
+
|
|
89
|
+
:param tag: Tag name in the release URL path.
|
|
90
|
+
:param file_name: Attachment file name to upload.
|
|
91
|
+
:param content: Attachment bytes, or a local file path to read as bytes.
|
|
92
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
93
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
94
|
+
:param upload_timeout: Timeout for upload operation. Default to 300 (5 minutes).
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
@abstractmethod
|
|
98
|
+
def get_by_tag(self, *, tag: str, owner: Optional[str] = None, repo: Optional[str] = None) -> Release:
|
|
99
|
+
"""Get a repository release by tag name.
|
|
100
|
+
|
|
101
|
+
:param tag: Git tag the release is attached to.
|
|
102
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
103
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
104
|
+
:returns: Release metadata for that tag.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
@abstractmethod
|
|
108
|
+
def list(
|
|
109
|
+
self,
|
|
110
|
+
*,
|
|
111
|
+
owner: Optional[str] = None,
|
|
112
|
+
repo: Optional[str] = None,
|
|
113
|
+
direction: Optional[str] = None,
|
|
114
|
+
page: Optional[int] = None,
|
|
115
|
+
per_page: Optional[int] = None,
|
|
116
|
+
) -> List[Release]:
|
|
117
|
+
"""List releases for a repository.
|
|
118
|
+
|
|
119
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
120
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
121
|
+
:param direction: Sort direction, for example ``asc`` or ``desc``.
|
|
122
|
+
:param page: Page number.
|
|
123
|
+
:param per_page: Page size, up to 100.
|
|
124
|
+
:returns: Releases ordered as returned by the API.
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
@abstractmethod
|
|
128
|
+
def get_latest(
|
|
129
|
+
self, *, owner: Optional[str] = None, repo: Optional[str] = None, type: Optional[str] = None
|
|
130
|
+
) -> Release:
|
|
131
|
+
"""Get the latest repository release.
|
|
132
|
+
|
|
133
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
134
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
135
|
+
:param type: Selection type, either ``updated`` or ``latest``.
|
|
136
|
+
:returns: Latest release metadata.
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
@abstractmethod
|
|
140
|
+
def get(
|
|
141
|
+
self,
|
|
142
|
+
*,
|
|
143
|
+
tag: str,
|
|
144
|
+
owner: Optional[str] = None,
|
|
145
|
+
repo: Optional[str] = None,
|
|
146
|
+
temp_download_url: Optional[Union[bool, str]] = None,
|
|
147
|
+
) -> Release:
|
|
148
|
+
"""Get a repository release by tag path.
|
|
149
|
+
|
|
150
|
+
:param tag: Tag name in the release URL path.
|
|
151
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
152
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
153
|
+
:param temp_download_url: Whether to return temporary source package and attachment URLs.
|
|
154
|
+
:returns: Release metadata.
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
@abstractmethod
|
|
158
|
+
def download_attachment(
|
|
159
|
+
self, *, tag: str, file_name: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
160
|
+
) -> bytes:
|
|
161
|
+
"""Download a release attachment as bytes.
|
|
162
|
+
|
|
163
|
+
:param tag: Tag name in the release URL path.
|
|
164
|
+
:param file_name: Attachment file name.
|
|
165
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
166
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
167
|
+
:returns: Attachment bytes.
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
class ReleasesResource(SyncResource, AbstractReleasesResource):
|
|
172
|
+
"""Synchronous release endpoints."""
|
|
173
|
+
|
|
174
|
+
def create(
|
|
175
|
+
self,
|
|
176
|
+
*,
|
|
177
|
+
tag: str,
|
|
178
|
+
name: str,
|
|
179
|
+
body: str,
|
|
180
|
+
owner: Optional[str] = None,
|
|
181
|
+
repo: Optional[str] = None,
|
|
182
|
+
target_commitish: Optional[str] = None,
|
|
183
|
+
release_status: Optional[str] = None,
|
|
184
|
+
) -> Release:
|
|
185
|
+
return self._model(
|
|
186
|
+
"POST",
|
|
187
|
+
self._client._repo_path("releases", owner=owner, repo=repo),
|
|
188
|
+
Release,
|
|
189
|
+
json={
|
|
190
|
+
"tag_name": tag,
|
|
191
|
+
"name": name,
|
|
192
|
+
"body": body,
|
|
193
|
+
"target_commitish": target_commitish,
|
|
194
|
+
"release_status": release_status,
|
|
195
|
+
},
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
def update(
|
|
199
|
+
self,
|
|
200
|
+
*,
|
|
201
|
+
tag: str,
|
|
202
|
+
name: str,
|
|
203
|
+
body: str,
|
|
204
|
+
owner: Optional[str] = None,
|
|
205
|
+
repo: Optional[str] = None,
|
|
206
|
+
release_status: Optional[str] = None,
|
|
207
|
+
) -> Release:
|
|
208
|
+
return self._model(
|
|
209
|
+
"PATCH",
|
|
210
|
+
self._client._repo_path("releases", tag, owner=owner, repo=repo),
|
|
211
|
+
Release,
|
|
212
|
+
json={"name": name, "body": body, "release_status": release_status},
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
def get_upload_url(
|
|
216
|
+
self, *, tag: str, file_name: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
217
|
+
) -> ReleaseUploadURL:
|
|
218
|
+
return self._model(
|
|
219
|
+
"GET",
|
|
220
|
+
self._client._repo_path("releases", tag, "upload_url", owner=owner, repo=repo),
|
|
221
|
+
ReleaseUploadURL,
|
|
222
|
+
params={"file_name": file_name},
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
def upload(
|
|
226
|
+
self,
|
|
227
|
+
*,
|
|
228
|
+
tag: str,
|
|
229
|
+
file_name: str,
|
|
230
|
+
content: Union[bytes, str],
|
|
231
|
+
owner: Optional[str] = None,
|
|
232
|
+
repo: Optional[str] = None,
|
|
233
|
+
upload_timeout: Optional[float] = 300.0,
|
|
234
|
+
) -> None:
|
|
235
|
+
upload_content = Path(content).read_bytes() if isinstance(content, str) else content
|
|
236
|
+
if not isinstance(upload_content, bytes):
|
|
237
|
+
raise TypeError("content must be bytes or a file path string.")
|
|
238
|
+
|
|
239
|
+
upload_url = self.get_upload_url(tag=tag, file_name=file_name, owner=owner, repo=repo)
|
|
240
|
+
if not upload_url.url:
|
|
241
|
+
raise ValueError("Release upload URL response did not include a URL.")
|
|
242
|
+
|
|
243
|
+
self._client._client.request(
|
|
244
|
+
"PUT",
|
|
245
|
+
upload_url.url,
|
|
246
|
+
content=upload_content,
|
|
247
|
+
headers=upload_url.headers or {},
|
|
248
|
+
timeout=upload_timeout,
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
def get_by_tag(self, *, tag: str, owner: Optional[str] = None, repo: Optional[str] = None) -> Release:
|
|
252
|
+
return self._model(
|
|
253
|
+
"GET",
|
|
254
|
+
self._client._repo_path("releases", "tags", tag, owner=owner, repo=repo),
|
|
255
|
+
Release,
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
def list(
|
|
259
|
+
self,
|
|
260
|
+
*,
|
|
261
|
+
owner: Optional[str] = None,
|
|
262
|
+
repo: Optional[str] = None,
|
|
263
|
+
direction: Optional[str] = None,
|
|
264
|
+
page: Optional[int] = None,
|
|
265
|
+
per_page: Optional[int] = None,
|
|
266
|
+
) -> List[Release]:
|
|
267
|
+
return self._models(
|
|
268
|
+
"GET",
|
|
269
|
+
self._client._repo_path("releases", owner=owner, repo=repo),
|
|
270
|
+
Release,
|
|
271
|
+
params={"direction": direction, "page": page, "per_page": per_page},
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
def get_latest(
|
|
275
|
+
self, *, owner: Optional[str] = None, repo: Optional[str] = None, type: Optional[str] = None
|
|
276
|
+
) -> Release:
|
|
277
|
+
return self._model(
|
|
278
|
+
"GET",
|
|
279
|
+
self._client._repo_path("releases", "latest", owner=owner, repo=repo),
|
|
280
|
+
Release,
|
|
281
|
+
params={"type": type},
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
def get(
|
|
285
|
+
self,
|
|
286
|
+
*,
|
|
287
|
+
tag: str,
|
|
288
|
+
owner: Optional[str] = None,
|
|
289
|
+
repo: Optional[str] = None,
|
|
290
|
+
temp_download_url: Optional[Union[bool, str]] = None,
|
|
291
|
+
) -> Release:
|
|
292
|
+
return self._model(
|
|
293
|
+
"GET",
|
|
294
|
+
self._client._repo_path("releases", tag, owner=owner, repo=repo),
|
|
295
|
+
Release,
|
|
296
|
+
params={"temp_download_url": temp_download_url},
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
def download_attachment(
|
|
300
|
+
self, *, tag: str, file_name: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
301
|
+
) -> bytes:
|
|
302
|
+
return self._request(
|
|
303
|
+
"GET",
|
|
304
|
+
self._client._repo_path("releases", tag, "attach_files", file_name, "download", owner=owner, repo=repo),
|
|
305
|
+
raw=True,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
class AsyncReleasesResource(AsyncResource, AbstractReleasesResource):
|
|
310
|
+
"""Asynchronous release endpoints.
|
|
311
|
+
|
|
312
|
+
Mirrors :class:`ReleasesResource`; see that class for parameters (Release API in ``docs/rest_api``).
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
async def create(
|
|
316
|
+
self,
|
|
317
|
+
*,
|
|
318
|
+
tag: str,
|
|
319
|
+
name: str,
|
|
320
|
+
body: str,
|
|
321
|
+
owner: Optional[str] = None,
|
|
322
|
+
repo: Optional[str] = None,
|
|
323
|
+
target_commitish: Optional[str] = None,
|
|
324
|
+
release_status: Optional[str] = None,
|
|
325
|
+
) -> Release:
|
|
326
|
+
return await self._model(
|
|
327
|
+
"POST",
|
|
328
|
+
self._client._repo_path("releases", owner=owner, repo=repo),
|
|
329
|
+
Release,
|
|
330
|
+
json={
|
|
331
|
+
"tag_name": tag,
|
|
332
|
+
"name": name,
|
|
333
|
+
"body": body,
|
|
334
|
+
"target_commitish": target_commitish,
|
|
335
|
+
"release_status": release_status,
|
|
336
|
+
},
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
async def update(
|
|
340
|
+
self,
|
|
341
|
+
*,
|
|
342
|
+
tag: str,
|
|
343
|
+
name: str,
|
|
344
|
+
body: str,
|
|
345
|
+
owner: Optional[str] = None,
|
|
346
|
+
repo: Optional[str] = None,
|
|
347
|
+
release_status: Optional[str] = None,
|
|
348
|
+
) -> Release:
|
|
349
|
+
return await self._model(
|
|
350
|
+
"PATCH",
|
|
351
|
+
self._client._repo_path("releases", tag, owner=owner, repo=repo),
|
|
352
|
+
Release,
|
|
353
|
+
json={"name": name, "body": body, "release_status": release_status},
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
async def get_upload_url(
|
|
357
|
+
self, *, tag: str, file_name: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
358
|
+
) -> ReleaseUploadURL:
|
|
359
|
+
return await self._model(
|
|
360
|
+
"GET",
|
|
361
|
+
self._client._repo_path("releases", tag, "upload_url", owner=owner, repo=repo),
|
|
362
|
+
ReleaseUploadURL,
|
|
363
|
+
params={"file_name": file_name},
|
|
364
|
+
)
|
|
365
|
+
|
|
366
|
+
async def upload(
|
|
367
|
+
self,
|
|
368
|
+
*,
|
|
369
|
+
tag: str,
|
|
370
|
+
file_name: str,
|
|
371
|
+
content: Union[bytes, str],
|
|
372
|
+
owner: Optional[str] = None,
|
|
373
|
+
repo: Optional[str] = None,
|
|
374
|
+
upload_timeout: Optional[float] = 300.0,
|
|
375
|
+
) -> None:
|
|
376
|
+
upload_content = Path(content).read_bytes() if isinstance(content, str) else content
|
|
377
|
+
if not isinstance(upload_content, bytes):
|
|
378
|
+
raise TypeError("content must be bytes or a file path string.")
|
|
379
|
+
|
|
380
|
+
upload_url = await self.get_upload_url(tag=tag, file_name=file_name, owner=owner, repo=repo)
|
|
381
|
+
if not upload_url.url:
|
|
382
|
+
raise ValueError("Release upload URL response did not include a URL.")
|
|
383
|
+
|
|
384
|
+
await self._client._client.request(
|
|
385
|
+
"PUT",
|
|
386
|
+
upload_url.url,
|
|
387
|
+
content=upload_content,
|
|
388
|
+
headers=upload_url.headers or {},
|
|
389
|
+
timeout=upload_timeout,
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
async def get_by_tag(self, *, tag: str, owner: Optional[str] = None, repo: Optional[str] = None) -> Release:
|
|
393
|
+
return await self._model(
|
|
394
|
+
"GET", self._client._repo_path("releases", "tags", tag, owner=owner, repo=repo), Release
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
async def list(
|
|
398
|
+
self,
|
|
399
|
+
*,
|
|
400
|
+
owner: Optional[str] = None,
|
|
401
|
+
repo: Optional[str] = None,
|
|
402
|
+
direction: Optional[str] = None,
|
|
403
|
+
page: Optional[int] = None,
|
|
404
|
+
per_page: Optional[int] = None,
|
|
405
|
+
) -> List[Release]:
|
|
406
|
+
return await self._models(
|
|
407
|
+
"GET",
|
|
408
|
+
self._client._repo_path("releases", owner=owner, repo=repo),
|
|
409
|
+
Release,
|
|
410
|
+
params={"direction": direction, "page": page, "per_page": per_page},
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
async def get_latest(
|
|
414
|
+
self, *, owner: Optional[str] = None, repo: Optional[str] = None, type: Optional[str] = None
|
|
415
|
+
) -> Release:
|
|
416
|
+
return await self._model(
|
|
417
|
+
"GET",
|
|
418
|
+
self._client._repo_path("releases", "latest", owner=owner, repo=repo),
|
|
419
|
+
Release,
|
|
420
|
+
params={"type": type},
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
async def get(
|
|
424
|
+
self,
|
|
425
|
+
*,
|
|
426
|
+
tag: str,
|
|
427
|
+
owner: Optional[str] = None,
|
|
428
|
+
repo: Optional[str] = None,
|
|
429
|
+
temp_download_url: Optional[Union[bool, str]] = None,
|
|
430
|
+
) -> Release:
|
|
431
|
+
return await self._model(
|
|
432
|
+
"GET",
|
|
433
|
+
self._client._repo_path("releases", tag, owner=owner, repo=repo),
|
|
434
|
+
Release,
|
|
435
|
+
params={"temp_download_url": temp_download_url},
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
async def download_attachment(
|
|
439
|
+
self, *, tag: str, file_name: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
440
|
+
) -> bytes:
|
|
441
|
+
return await self._request(
|
|
442
|
+
"GET",
|
|
443
|
+
self._client._repo_path("releases", tag, "attach_files", file_name, "download", owner=owner, repo=repo),
|
|
444
|
+
raw=True,
|
|
445
|
+
)
|