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.
Files changed (43) hide show
  1. gitcode_api/__init__.py +8 -2
  2. gitcode_api/_base_client.py +7 -2
  3. gitcode_api/_exceptions.py +8 -0
  4. gitcode_api/exceptions.py +19 -0
  5. gitcode_api/llm/mcp.py +5 -5
  6. gitcode_api/models.py +205 -0
  7. gitcode_api/resources/__init__.py +1 -1
  8. gitcode_api/resources/_shared/__init__.py +18 -0
  9. gitcode_api/resources/_shared/base.py +129 -0
  10. gitcode_api/resources/{_shared.py → _shared/fetch_template.py} +133 -259
  11. gitcode_api/resources/account/__init__.py +17 -0
  12. gitcode_api/resources/account/oauth_resource_group.py +159 -0
  13. gitcode_api/resources/account/orgs_resource_group.py +422 -0
  14. gitcode_api/resources/account/search_resource_group.py +236 -0
  15. gitcode_api/resources/account/users_resource_group.py +249 -0
  16. gitcode_api/resources/collaboration/__init__.py +20 -0
  17. gitcode_api/resources/collaboration/_helpers.py +10 -0
  18. gitcode_api/resources/collaboration/issues_resource_group.py +855 -0
  19. gitcode_api/resources/collaboration/labels_resource_group.py +248 -0
  20. gitcode_api/resources/collaboration/members_resource_group.py +195 -0
  21. gitcode_api/resources/collaboration/milestones_resource_group.py +192 -0
  22. gitcode_api/resources/collaboration/pulls_resource_group.py +1300 -0
  23. gitcode_api/resources/misc/__init__.py +14 -0
  24. gitcode_api/resources/misc/releases_resource_group.py +445 -0
  25. gitcode_api/resources/misc/tags_resource_group.py +286 -0
  26. gitcode_api/resources/misc/webhooks_resource_group.py +192 -0
  27. gitcode_api/resources/repositories/__init__.py +17 -0
  28. gitcode_api/resources/repositories/branches_resource_group.py +151 -0
  29. gitcode_api/resources/repositories/commits_resource_group.py +333 -0
  30. gitcode_api/resources/repositories/repo_contents_resource_group.py +459 -0
  31. gitcode_api/resources/repositories/repos_resource_group.py +1279 -0
  32. gitcode_api/version.txt +1 -1
  33. {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/METADATA +3 -3
  34. gitcode_api-1.3.0.dist-info/RECORD +52 -0
  35. gitcode_api/resources/account.py +0 -1086
  36. gitcode_api/resources/collaboration.py +0 -2818
  37. gitcode_api/resources/misc.py +0 -901
  38. gitcode_api/resources/repositories.py +0 -2197
  39. gitcode_api-1.2.20.dist-info/RECORD +0 -31
  40. {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/WHEEL +0 -0
  41. {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/entry_points.txt +0 -0
  42. {gitcode_api-1.2.20.dist-info → gitcode_api-1.3.0.dist-info}/licenses/LICENSE +0 -0
  43. {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
+ )