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,248 @@
|
|
|
1
|
+
"""AbstractLabelsResource, LabelsResource, and AsyncLabelsResource resource group."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import List, Optional, Union
|
|
5
|
+
|
|
6
|
+
from ..._models import Label
|
|
7
|
+
from .._shared import AsyncResource, SyncResource
|
|
8
|
+
|
|
9
|
+
# mypy: disable-error-code=override
|
|
10
|
+
# pylint: disable=invalid-overridden-method,protected-access,redefined-builtin
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AbstractLabelsResource(ABC):
|
|
14
|
+
"""Interface for Labels resource endpoints."""
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None) -> List[Label]:
|
|
18
|
+
"""List repository labels.
|
|
19
|
+
|
|
20
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
21
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
22
|
+
:returns: All labels defined on the repository.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def create(self, *, name: str, color: str, owner: Optional[str] = None, repo: Optional[str] = None) -> Label:
|
|
27
|
+
"""Create a repository label.
|
|
28
|
+
|
|
29
|
+
:param name: Label name.
|
|
30
|
+
:param color: Label color (typically a ``#RRGGBB`` hex string per API examples).
|
|
31
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
32
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
33
|
+
:returns: Created label.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
@abstractmethod
|
|
37
|
+
def update(
|
|
38
|
+
self,
|
|
39
|
+
*,
|
|
40
|
+
original_name: str,
|
|
41
|
+
owner: Optional[str] = None,
|
|
42
|
+
repo: Optional[str] = None,
|
|
43
|
+
name: Optional[str] = None,
|
|
44
|
+
color: Optional[str] = None,
|
|
45
|
+
) -> Label:
|
|
46
|
+
"""Update a repository label.
|
|
47
|
+
|
|
48
|
+
:param original_name: Current label name in the URL path.
|
|
49
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
50
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
51
|
+
:param name: New label name, if renaming.
|
|
52
|
+
:param color: New color value.
|
|
53
|
+
:returns: Updated label.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
@abstractmethod
|
|
57
|
+
def delete(self, *, name: str, owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
58
|
+
"""Delete a repository label.
|
|
59
|
+
|
|
60
|
+
:param name: Label name in the path.
|
|
61
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
62
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
def clear_issue_labels(
|
|
67
|
+
self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None
|
|
68
|
+
) -> None:
|
|
69
|
+
"""Remove all labels from an issue.
|
|
70
|
+
|
|
71
|
+
:param number: Repository-local issue number.
|
|
72
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
73
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
@abstractmethod
|
|
77
|
+
def replace_issue_labels(
|
|
78
|
+
self, *, number: Union[int, str], labels: List[str], owner: Optional[str] = None, repo: Optional[str] = None
|
|
79
|
+
) -> List[Label]:
|
|
80
|
+
"""Replace all labels on an issue.
|
|
81
|
+
|
|
82
|
+
:param number: Repository-local issue number.
|
|
83
|
+
:param labels: Complete new label set (JSON array body).
|
|
84
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
85
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
86
|
+
:returns: Labels after replacement.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
@abstractmethod
|
|
90
|
+
def list_enterprise(
|
|
91
|
+
self,
|
|
92
|
+
*,
|
|
93
|
+
enterprise: str,
|
|
94
|
+
search: Optional[str] = None,
|
|
95
|
+
direction: Optional[str] = None,
|
|
96
|
+
page: Optional[int] = None,
|
|
97
|
+
per_page: Optional[int] = None,
|
|
98
|
+
api_version: str = "v5",
|
|
99
|
+
) -> List[Label]:
|
|
100
|
+
"""List labels for an enterprise, optionally using a different API version.
|
|
101
|
+
|
|
102
|
+
:param enterprise: Enterprise path or login.
|
|
103
|
+
:param search: Optional name search string.
|
|
104
|
+
:param direction: Sort direction for results.
|
|
105
|
+
:param page: Page number.
|
|
106
|
+
:param per_page: Page size.
|
|
107
|
+
:param api_version: ``v5`` uses ``/api/v5/...``; other values build ``/api/{version}/...`` on the same host.
|
|
108
|
+
:returns: Enterprise label definitions.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class LabelsResource(SyncResource, AbstractLabelsResource):
|
|
113
|
+
"""Synchronous label endpoints."""
|
|
114
|
+
|
|
115
|
+
def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None) -> List[Label]:
|
|
116
|
+
return self._models("GET", self._client._repo_path("labels", owner=owner, repo=repo), Label)
|
|
117
|
+
|
|
118
|
+
def create(self, *, name: str, color: str, owner: Optional[str] = None, repo: Optional[str] = None) -> Label:
|
|
119
|
+
return self._model(
|
|
120
|
+
"POST",
|
|
121
|
+
self._client._repo_path("labels", owner=owner, repo=repo),
|
|
122
|
+
Label,
|
|
123
|
+
json={"name": name, "color": color},
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def update(
|
|
127
|
+
self,
|
|
128
|
+
*,
|
|
129
|
+
original_name: str,
|
|
130
|
+
owner: Optional[str] = None,
|
|
131
|
+
repo: Optional[str] = None,
|
|
132
|
+
name: Optional[str] = None,
|
|
133
|
+
color: Optional[str] = None,
|
|
134
|
+
) -> Label:
|
|
135
|
+
return self._model(
|
|
136
|
+
"PATCH",
|
|
137
|
+
self._client._repo_path("labels", original_name, owner=owner, repo=repo),
|
|
138
|
+
Label,
|
|
139
|
+
json={"name": name, "color": color},
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
def delete(self, *, name: str, owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
143
|
+
self._request("DELETE", self._client._repo_path("labels", name, owner=owner, repo=repo))
|
|
144
|
+
|
|
145
|
+
def clear_issue_labels(
|
|
146
|
+
self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None
|
|
147
|
+
) -> None:
|
|
148
|
+
self._request("DELETE", self._client._repo_path("issues", number, "labels", owner=owner, repo=repo))
|
|
149
|
+
|
|
150
|
+
def replace_issue_labels(
|
|
151
|
+
self, *, number: Union[int, str], labels: List[str], owner: Optional[str] = None, repo: Optional[str] = None
|
|
152
|
+
) -> List[Label]:
|
|
153
|
+
return self._models(
|
|
154
|
+
"PUT",
|
|
155
|
+
self._client._repo_path("issues", number, "labels", owner=owner, repo=repo),
|
|
156
|
+
Label,
|
|
157
|
+
json=labels,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
def list_enterprise(
|
|
161
|
+
self,
|
|
162
|
+
*,
|
|
163
|
+
enterprise: str,
|
|
164
|
+
search: Optional[str] = None,
|
|
165
|
+
direction: Optional[str] = None,
|
|
166
|
+
page: Optional[int] = None,
|
|
167
|
+
per_page: Optional[int] = None,
|
|
168
|
+
api_version: str = "v5",
|
|
169
|
+
) -> List[Label]:
|
|
170
|
+
if api_version == "v5":
|
|
171
|
+
path = self._client._path("enterprises", enterprise, "labels")
|
|
172
|
+
else:
|
|
173
|
+
host = self._client.base_url.split("/api/", maxsplit=1)[0]
|
|
174
|
+
path = f"{host}/api/{api_version}/enterprises/{self._client._encode_segment(enterprise)}/labels"
|
|
175
|
+
return self._models(
|
|
176
|
+
"GET",
|
|
177
|
+
path,
|
|
178
|
+
Label,
|
|
179
|
+
params={"search": search, "direction": direction, "page": page, "per_page": per_page},
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class AsyncLabelsResource(AsyncResource, AbstractLabelsResource):
|
|
184
|
+
"""Asynchronous label endpoints.
|
|
185
|
+
|
|
186
|
+
Mirrors :class:`LabelsResource`; see that class for parameter documentation.
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
async def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None) -> List[Label]:
|
|
190
|
+
return await self._models("GET", self._client._repo_path("labels", owner=owner, repo=repo), Label)
|
|
191
|
+
|
|
192
|
+
async def create(self, *, name: str, color: str, owner: Optional[str] = None, repo: Optional[str] = None) -> Label:
|
|
193
|
+
return await self._model(
|
|
194
|
+
"POST",
|
|
195
|
+
self._client._repo_path("labels", owner=owner, repo=repo),
|
|
196
|
+
Label,
|
|
197
|
+
json={"name": name, "color": color},
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
async def update(
|
|
201
|
+
self,
|
|
202
|
+
*,
|
|
203
|
+
original_name: str,
|
|
204
|
+
owner: Optional[str] = None,
|
|
205
|
+
repo: Optional[str] = None,
|
|
206
|
+
name: Optional[str] = None,
|
|
207
|
+
color: Optional[str] = None,
|
|
208
|
+
) -> Label:
|
|
209
|
+
return await self._model(
|
|
210
|
+
"PATCH",
|
|
211
|
+
self._client._repo_path("labels", original_name, owner=owner, repo=repo),
|
|
212
|
+
Label,
|
|
213
|
+
json={"name": name, "color": color},
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
async def delete(self, *, name: str, owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
217
|
+
await self._request("DELETE", self._client._repo_path("labels", name, owner=owner, repo=repo))
|
|
218
|
+
|
|
219
|
+
async def clear_issue_labels(
|
|
220
|
+
self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None
|
|
221
|
+
) -> None:
|
|
222
|
+
await self._request("DELETE", self._client._repo_path("issues", number, "labels", owner=owner, repo=repo))
|
|
223
|
+
|
|
224
|
+
async def replace_issue_labels(
|
|
225
|
+
self, *, number: Union[int, str], labels: List[str], owner: Optional[str] = None, repo: Optional[str] = None
|
|
226
|
+
) -> List[Label]:
|
|
227
|
+
return await self._models(
|
|
228
|
+
"PUT", self._client._repo_path("issues", number, "labels", owner=owner, repo=repo), Label, json=labels
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
async def list_enterprise(
|
|
232
|
+
self,
|
|
233
|
+
*,
|
|
234
|
+
enterprise: str,
|
|
235
|
+
search: Optional[str] = None,
|
|
236
|
+
direction: Optional[str] = None,
|
|
237
|
+
page: Optional[int] = None,
|
|
238
|
+
per_page: Optional[int] = None,
|
|
239
|
+
api_version: str = "v5",
|
|
240
|
+
) -> List[Label]:
|
|
241
|
+
if api_version == "v5":
|
|
242
|
+
path = self._client._path("enterprises", enterprise, "labels")
|
|
243
|
+
else:
|
|
244
|
+
host = self._client.base_url.split("/api/", maxsplit=1)[0]
|
|
245
|
+
path = f"{host}/api/{api_version}/enterprises/{self._client._encode_segment(enterprise)}/labels"
|
|
246
|
+
return await self._models(
|
|
247
|
+
"GET", path, Label, params={"search": search, "direction": direction, "page": page, "per_page": per_page}
|
|
248
|
+
)
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""AbstractMembersResource, MembersResource, and AsyncMembersResource resource group."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
|
|
6
|
+
from ..._models import (
|
|
7
|
+
RepoCollaborator,
|
|
8
|
+
RepoMember,
|
|
9
|
+
RepoMemberPermission,
|
|
10
|
+
RepositoryCollaboratorCheck,
|
|
11
|
+
)
|
|
12
|
+
from .._shared import AsyncResource, SyncResource
|
|
13
|
+
|
|
14
|
+
# mypy: disable-error-code=override
|
|
15
|
+
# pylint: disable=invalid-overridden-method,protected-access,redefined-builtin
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AbstractMembersResource(ABC):
|
|
19
|
+
"""Interface for Members resource endpoints."""
|
|
20
|
+
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def add_or_update(
|
|
23
|
+
self,
|
|
24
|
+
*,
|
|
25
|
+
username: str,
|
|
26
|
+
owner: Optional[str] = None,
|
|
27
|
+
repo: Optional[str] = None,
|
|
28
|
+
permission: Optional[str] = None,
|
|
29
|
+
) -> RepoMember:
|
|
30
|
+
"""Add or update repository member permissions.
|
|
31
|
+
|
|
32
|
+
:param username: Collaborator login.
|
|
33
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
34
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
35
|
+
:param permission: Permission string (for example ``pull``, ``push``, ``admin`` per GitCode API).
|
|
36
|
+
:returns: Collaborator record.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def remove(self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
41
|
+
"""Remove a repository member.
|
|
42
|
+
|
|
43
|
+
:param username: Collaborator login to remove.
|
|
44
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
45
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
@abstractmethod
|
|
49
|
+
def list(
|
|
50
|
+
self,
|
|
51
|
+
*,
|
|
52
|
+
owner: Optional[str] = None,
|
|
53
|
+
repo: Optional[str] = None,
|
|
54
|
+
page: Optional[int] = None,
|
|
55
|
+
per_page: Optional[int] = None,
|
|
56
|
+
) -> List[RepoCollaborator]:
|
|
57
|
+
"""List repository members (collaborators).
|
|
58
|
+
|
|
59
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
60
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
61
|
+
:param page: Page number.
|
|
62
|
+
:param per_page: Page size.
|
|
63
|
+
:returns: Collaborators with permission metadata.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
@abstractmethod
|
|
67
|
+
def get(
|
|
68
|
+
self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
69
|
+
) -> RepositoryCollaboratorCheck:
|
|
70
|
+
"""Check whether a user is a repository member."""
|
|
71
|
+
|
|
72
|
+
@abstractmethod
|
|
73
|
+
def get_permission(
|
|
74
|
+
self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
75
|
+
) -> RepoMemberPermission:
|
|
76
|
+
"""Get repository member permissions.
|
|
77
|
+
|
|
78
|
+
:param username: Collaborator login.
|
|
79
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
80
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
81
|
+
:returns: Effective permission for the user on the repository.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class MembersResource(SyncResource, AbstractMembersResource):
|
|
86
|
+
"""Synchronous repository member endpoints."""
|
|
87
|
+
|
|
88
|
+
def add_or_update(
|
|
89
|
+
self,
|
|
90
|
+
*,
|
|
91
|
+
username: str,
|
|
92
|
+
owner: Optional[str] = None,
|
|
93
|
+
repo: Optional[str] = None,
|
|
94
|
+
permission: Optional[str] = None,
|
|
95
|
+
) -> RepoMember:
|
|
96
|
+
return self._model(
|
|
97
|
+
"PUT",
|
|
98
|
+
self._client._repo_path("collaborators", username, owner=owner, repo=repo),
|
|
99
|
+
RepoMember,
|
|
100
|
+
json={"permission": permission},
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
def remove(self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
104
|
+
self._request("DELETE", self._client._repo_path("collaborators", username, owner=owner, repo=repo))
|
|
105
|
+
|
|
106
|
+
def list(
|
|
107
|
+
self,
|
|
108
|
+
*,
|
|
109
|
+
owner: Optional[str] = None,
|
|
110
|
+
repo: Optional[str] = None,
|
|
111
|
+
page: Optional[int] = None,
|
|
112
|
+
per_page: Optional[int] = None,
|
|
113
|
+
) -> List[RepoCollaborator]:
|
|
114
|
+
return self._models(
|
|
115
|
+
"GET",
|
|
116
|
+
self._client._repo_path("collaborators", owner=owner, repo=repo),
|
|
117
|
+
RepoCollaborator,
|
|
118
|
+
params={"page": page, "per_page": per_page},
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
def get(
|
|
122
|
+
self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
123
|
+
) -> RepositoryCollaboratorCheck:
|
|
124
|
+
return self._model(
|
|
125
|
+
"GET",
|
|
126
|
+
self._client._repo_path("collaborators", username, owner=owner, repo=repo),
|
|
127
|
+
RepositoryCollaboratorCheck,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def get_permission(
|
|
131
|
+
self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
132
|
+
) -> RepoMemberPermission:
|
|
133
|
+
return self._model(
|
|
134
|
+
"GET",
|
|
135
|
+
self._client._repo_path("collaborators", username, "permission", owner=owner, repo=repo),
|
|
136
|
+
RepoMemberPermission,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class AsyncMembersResource(AsyncResource, AbstractMembersResource):
|
|
141
|
+
"""Asynchronous repository member endpoints.
|
|
142
|
+
|
|
143
|
+
Mirrors :class:`MembersResource` (collaborators API); see that class for parameters.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
async def add_or_update(
|
|
147
|
+
self,
|
|
148
|
+
*,
|
|
149
|
+
username: str,
|
|
150
|
+
owner: Optional[str] = None,
|
|
151
|
+
repo: Optional[str] = None,
|
|
152
|
+
permission: Optional[str] = None,
|
|
153
|
+
) -> RepoMember:
|
|
154
|
+
return await self._model(
|
|
155
|
+
"PUT",
|
|
156
|
+
self._client._repo_path("collaborators", username, owner=owner, repo=repo),
|
|
157
|
+
RepoMember,
|
|
158
|
+
json={"permission": permission},
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
async def remove(self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
162
|
+
await self._request("DELETE", self._client._repo_path("collaborators", username, owner=owner, repo=repo))
|
|
163
|
+
|
|
164
|
+
async def list(
|
|
165
|
+
self,
|
|
166
|
+
*,
|
|
167
|
+
owner: Optional[str] = None,
|
|
168
|
+
repo: Optional[str] = None,
|
|
169
|
+
page: Optional[int] = None,
|
|
170
|
+
per_page: Optional[int] = None,
|
|
171
|
+
) -> List[RepoCollaborator]:
|
|
172
|
+
return await self._models(
|
|
173
|
+
"GET",
|
|
174
|
+
self._client._repo_path("collaborators", owner=owner, repo=repo),
|
|
175
|
+
RepoCollaborator,
|
|
176
|
+
params={"page": page, "per_page": per_page},
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
async def get(
|
|
180
|
+
self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
181
|
+
) -> RepositoryCollaboratorCheck:
|
|
182
|
+
return await self._model(
|
|
183
|
+
"GET",
|
|
184
|
+
self._client._repo_path("collaborators", username, owner=owner, repo=repo),
|
|
185
|
+
RepositoryCollaboratorCheck,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
async def get_permission(
|
|
189
|
+
self, *, username: str, owner: Optional[str] = None, repo: Optional[str] = None
|
|
190
|
+
) -> RepoMemberPermission:
|
|
191
|
+
return await self._model(
|
|
192
|
+
"GET",
|
|
193
|
+
self._client._repo_path("collaborators", username, "permission", owner=owner, repo=repo),
|
|
194
|
+
RepoMemberPermission,
|
|
195
|
+
)
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""AbstractMilestonesResource, MilestonesResource, and AsyncMilestonesResource resource group."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import List, Optional, Union
|
|
5
|
+
|
|
6
|
+
from ..._models import Milestone
|
|
7
|
+
from .._shared import AsyncResource, SyncResource
|
|
8
|
+
|
|
9
|
+
# mypy: disable-error-code=override
|
|
10
|
+
# pylint: disable=invalid-overridden-method,protected-access,redefined-builtin
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AbstractMilestonesResource(ABC):
|
|
14
|
+
"""Interface for Milestones resource endpoints."""
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None, **params) -> List[Milestone]:
|
|
18
|
+
"""List milestones for a repository.
|
|
19
|
+
|
|
20
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
21
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
22
|
+
:param params: Query parameters accepted by the milestones listing (state, sort, pagination, etc.).
|
|
23
|
+
:returns: Milestones.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def get(self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None) -> Milestone:
|
|
28
|
+
"""Get a single milestone.
|
|
29
|
+
|
|
30
|
+
:param number: Milestone number in the repository.
|
|
31
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
32
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
33
|
+
:returns: Milestone details.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
@abstractmethod
|
|
37
|
+
def create(
|
|
38
|
+
self,
|
|
39
|
+
*,
|
|
40
|
+
title: str,
|
|
41
|
+
due_on: str,
|
|
42
|
+
owner: Optional[str] = None,
|
|
43
|
+
repo: Optional[str] = None,
|
|
44
|
+
description: Optional[str] = None,
|
|
45
|
+
) -> Milestone:
|
|
46
|
+
"""Create a milestone.
|
|
47
|
+
|
|
48
|
+
:param title: Milestone title.
|
|
49
|
+
:param due_on: Due date string in the format expected by the API (often ISO 8601).
|
|
50
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
51
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
52
|
+
:param description: Optional description.
|
|
53
|
+
:returns: Created milestone.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
@abstractmethod
|
|
57
|
+
def update(
|
|
58
|
+
self,
|
|
59
|
+
*,
|
|
60
|
+
number: Union[int, str],
|
|
61
|
+
title: str,
|
|
62
|
+
due_on: str,
|
|
63
|
+
owner: Optional[str] = None,
|
|
64
|
+
repo: Optional[str] = None,
|
|
65
|
+
description: Optional[str] = None,
|
|
66
|
+
state: Optional[str] = None,
|
|
67
|
+
) -> Milestone:
|
|
68
|
+
"""Update a milestone.
|
|
69
|
+
|
|
70
|
+
:param number: Milestone number.
|
|
71
|
+
:param title: Updated title.
|
|
72
|
+
:param due_on: Updated due date.
|
|
73
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
74
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
75
|
+
:param description: Updated description.
|
|
76
|
+
:param state: Milestone state such as ``open`` or ``closed`` per API.
|
|
77
|
+
:returns: Updated milestone.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
@abstractmethod
|
|
81
|
+
def delete(self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
82
|
+
"""Delete a milestone.
|
|
83
|
+
|
|
84
|
+
:param number: Milestone number.
|
|
85
|
+
:param owner: Repository owner path. Uses the client default when omitted.
|
|
86
|
+
:param repo: Repository path. Uses the client default when omitted.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class MilestonesResource(SyncResource, AbstractMilestonesResource):
|
|
91
|
+
"""Synchronous milestone endpoints."""
|
|
92
|
+
|
|
93
|
+
def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None, **params) -> List[Milestone]:
|
|
94
|
+
return self._models(
|
|
95
|
+
"GET", self._client._repo_path("milestones", owner=owner, repo=repo), Milestone, params=params
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def get(self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None) -> Milestone:
|
|
99
|
+
return self._model("GET", self._client._repo_path("milestones", number, owner=owner, repo=repo), Milestone)
|
|
100
|
+
|
|
101
|
+
def create(
|
|
102
|
+
self,
|
|
103
|
+
*,
|
|
104
|
+
title: str,
|
|
105
|
+
due_on: str,
|
|
106
|
+
owner: Optional[str] = None,
|
|
107
|
+
repo: Optional[str] = None,
|
|
108
|
+
description: Optional[str] = None,
|
|
109
|
+
) -> Milestone:
|
|
110
|
+
return self._model(
|
|
111
|
+
"POST",
|
|
112
|
+
self._client._repo_path("milestones", owner=owner, repo=repo),
|
|
113
|
+
Milestone,
|
|
114
|
+
json={"title": title, "due_on": due_on, "description": description},
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
def update(
|
|
118
|
+
self,
|
|
119
|
+
*,
|
|
120
|
+
number: Union[int, str],
|
|
121
|
+
title: str,
|
|
122
|
+
due_on: str,
|
|
123
|
+
owner: Optional[str] = None,
|
|
124
|
+
repo: Optional[str] = None,
|
|
125
|
+
description: Optional[str] = None,
|
|
126
|
+
state: Optional[str] = None,
|
|
127
|
+
) -> Milestone:
|
|
128
|
+
return self._model(
|
|
129
|
+
"PATCH",
|
|
130
|
+
self._client._repo_path("milestones", number, owner=owner, repo=repo),
|
|
131
|
+
Milestone,
|
|
132
|
+
json={"title": title, "due_on": due_on, "description": description, "state": state},
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
def delete(self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
136
|
+
self._request("DELETE", self._client._repo_path("milestones", number, owner=owner, repo=repo))
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class AsyncMilestonesResource(AsyncResource, AbstractMilestonesResource):
|
|
140
|
+
"""Asynchronous milestone endpoints.
|
|
141
|
+
|
|
142
|
+
Mirrors :class:`MilestonesResource`; see that class for parameter documentation.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
async def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None, **params) -> List[Milestone]:
|
|
146
|
+
return await self._models(
|
|
147
|
+
"GET", self._client._repo_path("milestones", owner=owner, repo=repo), Milestone, params=params
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
async def get(
|
|
151
|
+
self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None
|
|
152
|
+
) -> Milestone:
|
|
153
|
+
return await self._model(
|
|
154
|
+
"GET", self._client._repo_path("milestones", number, owner=owner, repo=repo), Milestone
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
async def create(
|
|
158
|
+
self,
|
|
159
|
+
*,
|
|
160
|
+
title: str,
|
|
161
|
+
due_on: str,
|
|
162
|
+
owner: Optional[str] = None,
|
|
163
|
+
repo: Optional[str] = None,
|
|
164
|
+
description: Optional[str] = None,
|
|
165
|
+
) -> Milestone:
|
|
166
|
+
return await self._model(
|
|
167
|
+
"POST",
|
|
168
|
+
self._client._repo_path("milestones", owner=owner, repo=repo),
|
|
169
|
+
Milestone,
|
|
170
|
+
json={"title": title, "due_on": due_on, "description": description},
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
async def update(
|
|
174
|
+
self,
|
|
175
|
+
*,
|
|
176
|
+
number: Union[int, str],
|
|
177
|
+
title: str,
|
|
178
|
+
due_on: str,
|
|
179
|
+
owner: Optional[str] = None,
|
|
180
|
+
repo: Optional[str] = None,
|
|
181
|
+
description: Optional[str] = None,
|
|
182
|
+
state: Optional[str] = None,
|
|
183
|
+
) -> Milestone:
|
|
184
|
+
return await self._model(
|
|
185
|
+
"PATCH",
|
|
186
|
+
self._client._repo_path("milestones", number, owner=owner, repo=repo),
|
|
187
|
+
Milestone,
|
|
188
|
+
json={"title": title, "due_on": due_on, "description": description, "state": state},
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
async def delete(self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None) -> None:
|
|
192
|
+
await self._request("DELETE", self._client._repo_path("milestones", number, owner=owner, repo=repo))
|