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,422 @@
|
|
|
1
|
+
"""AbstractOrgsResource, OrgsResource, and AsyncOrgsResource resource group."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
|
|
6
|
+
from ..._models import (
|
|
7
|
+
APIObject,
|
|
8
|
+
EmptyResponse,
|
|
9
|
+
EnterpriseMember,
|
|
10
|
+
Organization,
|
|
11
|
+
OrganizationMembership,
|
|
12
|
+
OrganizationSummary,
|
|
13
|
+
Repository,
|
|
14
|
+
User,
|
|
15
|
+
)
|
|
16
|
+
from .._shared import AsyncResource, SyncResource
|
|
17
|
+
|
|
18
|
+
# mypy: disable-error-code=override
|
|
19
|
+
# pylint: disable=invalid-overridden-method,protected-access,redefined-builtin
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class AbstractOrgsResource(ABC):
|
|
23
|
+
"""Interface for Orgs resource endpoints."""
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def list_for_user(
|
|
27
|
+
self, *, username: str, page: Optional[int] = None, per_page: Optional[int] = None
|
|
28
|
+
) -> List[OrganizationSummary]:
|
|
29
|
+
"""List organizations for a user.
|
|
30
|
+
|
|
31
|
+
:param username: GitCode username or login.
|
|
32
|
+
:param page: Page number.
|
|
33
|
+
:param per_page: Page size.
|
|
34
|
+
:returns: Organizations the user belongs to.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def list_authenticated(
|
|
39
|
+
self, *, page: Optional[int] = None, per_page: Optional[int] = None, admin: Optional[bool] = None
|
|
40
|
+
) -> List[OrganizationSummary]:
|
|
41
|
+
"""List organizations for the authenticated user.
|
|
42
|
+
|
|
43
|
+
:param page: Page number.
|
|
44
|
+
:param per_page: Page size.
|
|
45
|
+
:param admin: Optional admin-only filter.
|
|
46
|
+
:returns: Organizations visible to the authorized user.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def get_member(self, *, org: str, username: str) -> OrganizationMembership:
|
|
51
|
+
"""Get an organization member profile.
|
|
52
|
+
|
|
53
|
+
:param org: Organization path or login.
|
|
54
|
+
:param username: Member username or login.
|
|
55
|
+
:returns: Organization membership details.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
@abstractmethod
|
|
59
|
+
def get(self, *, org: str) -> Organization:
|
|
60
|
+
"""Get an organization.
|
|
61
|
+
|
|
62
|
+
:param org: Organization path or login.
|
|
63
|
+
:returns: Organization details.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
@abstractmethod
|
|
67
|
+
def list_repos(
|
|
68
|
+
self, *, org: str, type: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None
|
|
69
|
+
) -> List[Repository]:
|
|
70
|
+
"""List repositories for an organization.
|
|
71
|
+
|
|
72
|
+
:param org: Organization path or login.
|
|
73
|
+
:param type: Repository type filter such as ``all``, ``public``, or ``private``.
|
|
74
|
+
:param page: Page number.
|
|
75
|
+
:param per_page: Page size.
|
|
76
|
+
:returns: Matching repositories.
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
@abstractmethod
|
|
80
|
+
def create_repo(self, *, org: str, name: str, **payload) -> Repository:
|
|
81
|
+
"""Create an organization repository.
|
|
82
|
+
|
|
83
|
+
Additional payload fields match the organization repository creation
|
|
84
|
+
endpoint, such as ``description``, ``homepage``, ``private``,
|
|
85
|
+
``public``, ``auto_init``, and ``default_branch``.
|
|
86
|
+
|
|
87
|
+
:param org: Organization path or login.
|
|
88
|
+
:param name: Repository name.
|
|
89
|
+
:param payload: Additional repository creation fields.
|
|
90
|
+
:returns: Created repository metadata.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
@abstractmethod
|
|
94
|
+
def get_enterprise_member(self, *, enterprise: str, username: str) -> EnterpriseMember:
|
|
95
|
+
"""Get a member profile for an enterprise.
|
|
96
|
+
|
|
97
|
+
:param enterprise: Enterprise path or login.
|
|
98
|
+
:param username: Member username or login.
|
|
99
|
+
:returns: Enterprise membership details.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
@abstractmethod
|
|
103
|
+
def get_membership(self, *, org: str) -> OrganizationMembership:
|
|
104
|
+
"""Get the authenticated user's membership in an organization.
|
|
105
|
+
|
|
106
|
+
:param org: Organization path or login.
|
|
107
|
+
:returns: Membership details for the current user.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
@abstractmethod
|
|
111
|
+
def list_members(
|
|
112
|
+
self, *, org: str, page: Optional[int] = None, per_page: Optional[int] = None, role: Optional[str] = None
|
|
113
|
+
) -> List[User]:
|
|
114
|
+
"""List members of an organization.
|
|
115
|
+
|
|
116
|
+
:param org: Organization path or login.
|
|
117
|
+
:param page: Page number.
|
|
118
|
+
:param per_page: Page size.
|
|
119
|
+
:param role: Optional role filter such as ``all``, ``admin``, or ``member``.
|
|
120
|
+
:returns: Organization members.
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
@abstractmethod
|
|
124
|
+
def list_enterprise_members(
|
|
125
|
+
self, *, enterprise: str, page: Optional[int] = None, per_page: Optional[int] = None, role: Optional[str] = None
|
|
126
|
+
) -> List[EnterpriseMember]:
|
|
127
|
+
"""List members of an enterprise.
|
|
128
|
+
|
|
129
|
+
:param enterprise: Enterprise path or login.
|
|
130
|
+
:param page: Page number.
|
|
131
|
+
:param per_page: Page size.
|
|
132
|
+
:param role: Optional role filter.
|
|
133
|
+
:returns: Enterprise members.
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
@abstractmethod
|
|
137
|
+
def remove_member(self, *, org: str, username: str) -> EmptyResponse:
|
|
138
|
+
"""Remove a member from an organization.
|
|
139
|
+
|
|
140
|
+
:param org: Organization path or login.
|
|
141
|
+
:param username: Member username or login.
|
|
142
|
+
:returns: API response payload, if any.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
@abstractmethod
|
|
146
|
+
def list_followers(self, *, owner: str, page: Optional[int] = None, per_page: Optional[int] = None) -> List[User]:
|
|
147
|
+
"""List followers of an organization.
|
|
148
|
+
|
|
149
|
+
:param owner: Organization path.
|
|
150
|
+
:param page: Page number.
|
|
151
|
+
:param per_page: Page size.
|
|
152
|
+
:returns: Followers of the organization.
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
@abstractmethod
|
|
156
|
+
def get_issue_extend_settings(self, *, org: str) -> List[APIObject]:
|
|
157
|
+
"""Get extended issue type and status settings for an organization.
|
|
158
|
+
|
|
159
|
+
:param org: Organization path or login.
|
|
160
|
+
:returns: Extended issue configuration entries.
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
@abstractmethod
|
|
164
|
+
def invite_member(
|
|
165
|
+
self, *, org: str, username: str, permission: Optional[str] = None, role_id: Optional[str] = None
|
|
166
|
+
) -> User:
|
|
167
|
+
"""Invite a user to an organization.
|
|
168
|
+
|
|
169
|
+
:param org: Organization path or login.
|
|
170
|
+
:param username: Member username or login.
|
|
171
|
+
:param permission: Permission level such as ``pull``, ``push``, or ``admin``.
|
|
172
|
+
:param role_id: Custom role identifier when using a customized permission.
|
|
173
|
+
:returns: Invited user information with permissions.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
@abstractmethod
|
|
177
|
+
def update_enterprise_member(self, *, enterprise: str, username: str, role: str) -> EnterpriseMember:
|
|
178
|
+
"""Update the role of an enterprise member.
|
|
179
|
+
|
|
180
|
+
:param enterprise: Enterprise path or login.
|
|
181
|
+
:param username: Member username or login.
|
|
182
|
+
:param role: Enterprise role such as ``viewer``, ``developer``, or ``admin``.
|
|
183
|
+
:returns: Updated enterprise membership.
|
|
184
|
+
"""
|
|
185
|
+
|
|
186
|
+
@abstractmethod
|
|
187
|
+
def update(self, *, org: str, **payload) -> Organization:
|
|
188
|
+
"""Update organization metadata.
|
|
189
|
+
|
|
190
|
+
:param org: Organization path or login.
|
|
191
|
+
:param payload: Updatable fields such as ``name``, ``email``, or ``description``.
|
|
192
|
+
:returns: Updated organization details.
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
@abstractmethod
|
|
196
|
+
def leave(self, *, org: str) -> None:
|
|
197
|
+
"""Leave an organization as the authenticated user.
|
|
198
|
+
|
|
199
|
+
:param org: Organization path or login.
|
|
200
|
+
"""
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
class OrgsResource(SyncResource, AbstractOrgsResource):
|
|
204
|
+
"""Synchronous organization and enterprise endpoints."""
|
|
205
|
+
|
|
206
|
+
def list_for_user(
|
|
207
|
+
self, *, username: str, page: Optional[int] = None, per_page: Optional[int] = None
|
|
208
|
+
) -> List[OrganizationSummary]:
|
|
209
|
+
return self._models(
|
|
210
|
+
"GET",
|
|
211
|
+
self._client._path("users", username, "orgs"),
|
|
212
|
+
OrganizationSummary,
|
|
213
|
+
params={"page": page, "per_page": per_page},
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
def list_authenticated(
|
|
217
|
+
self, *, page: Optional[int] = None, per_page: Optional[int] = None, admin: Optional[bool] = None
|
|
218
|
+
) -> List[OrganizationSummary]:
|
|
219
|
+
return self._models(
|
|
220
|
+
"GET",
|
|
221
|
+
self._client._path("users", "orgs"),
|
|
222
|
+
OrganizationSummary,
|
|
223
|
+
params={"page": page, "per_page": per_page, "admin": admin},
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
def get_member(self, *, org: str, username: str) -> OrganizationMembership:
|
|
227
|
+
return self._model("GET", self._client._path("orgs", org, "members", username), OrganizationMembership)
|
|
228
|
+
|
|
229
|
+
def get(self, *, org: str) -> Organization:
|
|
230
|
+
return self._model("GET", self._client._path("orgs", org), Organization)
|
|
231
|
+
|
|
232
|
+
def list_repos(
|
|
233
|
+
self, *, org: str, type: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None
|
|
234
|
+
) -> List[Repository]:
|
|
235
|
+
return self._models(
|
|
236
|
+
"GET",
|
|
237
|
+
self._client._path("orgs", org, "repos"),
|
|
238
|
+
Repository,
|
|
239
|
+
params={"type": type, "page": page, "per_page": per_page},
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
def create_repo(self, *, org: str, name: str, **payload) -> Repository:
|
|
243
|
+
payload["name"] = name
|
|
244
|
+
return self._model("POST", self._client._path("orgs", org, "repos"), Repository, json=payload)
|
|
245
|
+
|
|
246
|
+
def get_enterprise_member(self, *, enterprise: str, username: str) -> EnterpriseMember:
|
|
247
|
+
return self._model("GET", self._client._path("enterprises", enterprise, "members", username), EnterpriseMember)
|
|
248
|
+
|
|
249
|
+
def get_membership(self, *, org: str) -> OrganizationMembership:
|
|
250
|
+
return self._model("GET", self._client._path("user", "memberships", "orgs", org), OrganizationMembership)
|
|
251
|
+
|
|
252
|
+
def list_members(
|
|
253
|
+
self, *, org: str, page: Optional[int] = None, per_page: Optional[int] = None, role: Optional[str] = None
|
|
254
|
+
) -> List[User]:
|
|
255
|
+
return self._models(
|
|
256
|
+
"GET",
|
|
257
|
+
self._client._path("orgs", org, "members"),
|
|
258
|
+
User,
|
|
259
|
+
params={"page": page, "per_page": per_page, "role": role},
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
def list_enterprise_members(
|
|
263
|
+
self, *, enterprise: str, page: Optional[int] = None, per_page: Optional[int] = None, role: Optional[str] = None
|
|
264
|
+
) -> List[EnterpriseMember]:
|
|
265
|
+
return self._models(
|
|
266
|
+
"GET",
|
|
267
|
+
self._client._path("enterprises", enterprise, "members"),
|
|
268
|
+
EnterpriseMember,
|
|
269
|
+
params={"page": page, "per_page": per_page, "role": role},
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
def remove_member(self, *, org: str, username: str) -> EmptyResponse:
|
|
273
|
+
return self._model("DELETE", self._client._path("orgs", org, "memberships", username), EmptyResponse)
|
|
274
|
+
|
|
275
|
+
def list_followers(self, *, owner: str, page: Optional[int] = None, per_page: Optional[int] = None) -> List[User]:
|
|
276
|
+
return self._models(
|
|
277
|
+
"GET",
|
|
278
|
+
self._client._path("orgs", owner, "followers"),
|
|
279
|
+
User,
|
|
280
|
+
params={"page": page, "per_page": per_page},
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
def get_issue_extend_settings(self, *, org: str) -> List[APIObject]:
|
|
284
|
+
data = self._request("GET", self._client._path("orgs", org, "issue", "extend", "settings"))
|
|
285
|
+
return [APIObject(dict(item)) for item in data]
|
|
286
|
+
|
|
287
|
+
def invite_member(
|
|
288
|
+
self, *, org: str, username: str, permission: Optional[str] = None, role_id: Optional[str] = None
|
|
289
|
+
) -> User:
|
|
290
|
+
return self._model(
|
|
291
|
+
"POST",
|
|
292
|
+
self._client._path("orgs", org, "memberships", username),
|
|
293
|
+
User,
|
|
294
|
+
json={"permission": permission, "role_id": role_id},
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
def update_enterprise_member(self, *, enterprise: str, username: str, role: str) -> EnterpriseMember:
|
|
298
|
+
return self._model(
|
|
299
|
+
"PUT",
|
|
300
|
+
self._client._path("enterprises", enterprise, "members", username),
|
|
301
|
+
EnterpriseMember,
|
|
302
|
+
json={"role": role},
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
def update(self, *, org: str, **payload) -> Organization:
|
|
306
|
+
return self._model("PATCH", self._client._path("orgs", org), Organization, json=payload)
|
|
307
|
+
|
|
308
|
+
def leave(self, *, org: str) -> None:
|
|
309
|
+
self._request("DELETE", self._client._path("user", "memberships", "orgs", org))
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class AsyncOrgsResource(AsyncResource, AbstractOrgsResource):
|
|
313
|
+
"""Asynchronous organization and enterprise endpoints.
|
|
314
|
+
|
|
315
|
+
Mirrors :class:`OrgsResource`; see that class for parameters (``docs/rest_api/orgs``).
|
|
316
|
+
"""
|
|
317
|
+
|
|
318
|
+
async def list_for_user(
|
|
319
|
+
self, *, username: str, page: Optional[int] = None, per_page: Optional[int] = None
|
|
320
|
+
) -> List[OrganizationSummary]:
|
|
321
|
+
return await self._models(
|
|
322
|
+
"GET",
|
|
323
|
+
self._client._path("users", username, "orgs"),
|
|
324
|
+
OrganizationSummary,
|
|
325
|
+
params={"page": page, "per_page": per_page},
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
async def list_authenticated(
|
|
329
|
+
self, *, page: Optional[int] = None, per_page: Optional[int] = None, admin: Optional[bool] = None
|
|
330
|
+
) -> List[OrganizationSummary]:
|
|
331
|
+
return await self._models(
|
|
332
|
+
"GET",
|
|
333
|
+
self._client._path("users", "orgs"),
|
|
334
|
+
OrganizationSummary,
|
|
335
|
+
params={"page": page, "per_page": per_page, "admin": admin},
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
async def get_member(self, *, org: str, username: str) -> OrganizationMembership:
|
|
339
|
+
return await self._model("GET", self._client._path("orgs", org, "members", username), OrganizationMembership)
|
|
340
|
+
|
|
341
|
+
async def get(self, *, org: str) -> Organization:
|
|
342
|
+
return await self._model("GET", self._client._path("orgs", org), Organization)
|
|
343
|
+
|
|
344
|
+
async def list_repos(
|
|
345
|
+
self, *, org: str, type: Optional[str] = None, page: Optional[int] = None, per_page: Optional[int] = None
|
|
346
|
+
) -> List[Repository]:
|
|
347
|
+
return await self._models(
|
|
348
|
+
"GET",
|
|
349
|
+
self._client._path("orgs", org, "repos"),
|
|
350
|
+
Repository,
|
|
351
|
+
params={"type": type, "page": page, "per_page": per_page},
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
async def create_repo(self, *, org: str, name: str, **payload) -> Repository:
|
|
355
|
+
payload["name"] = name
|
|
356
|
+
return await self._model("POST", self._client._path("orgs", org, "repos"), Repository, json=payload)
|
|
357
|
+
|
|
358
|
+
async def get_enterprise_member(self, *, enterprise: str, username: str) -> EnterpriseMember:
|
|
359
|
+
return await self._model(
|
|
360
|
+
"GET", self._client._path("enterprises", enterprise, "members", username), EnterpriseMember
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
async def get_membership(self, *, org: str) -> OrganizationMembership:
|
|
364
|
+
return await self._model("GET", self._client._path("user", "memberships", "orgs", org), OrganizationMembership)
|
|
365
|
+
|
|
366
|
+
async def list_members(
|
|
367
|
+
self, *, org: str, page: Optional[int] = None, per_page: Optional[int] = None, role: Optional[str] = None
|
|
368
|
+
) -> List[User]:
|
|
369
|
+
return await self._models(
|
|
370
|
+
"GET",
|
|
371
|
+
self._client._path("orgs", org, "members"),
|
|
372
|
+
User,
|
|
373
|
+
params={"page": page, "per_page": per_page, "role": role},
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
async def list_enterprise_members(
|
|
377
|
+
self, *, enterprise: str, page: Optional[int] = None, per_page: Optional[int] = None, role: Optional[str] = None
|
|
378
|
+
) -> List[EnterpriseMember]:
|
|
379
|
+
return await self._models(
|
|
380
|
+
"GET",
|
|
381
|
+
self._client._path("enterprises", enterprise, "members"),
|
|
382
|
+
EnterpriseMember,
|
|
383
|
+
params={"page": page, "per_page": per_page, "role": role},
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
async def remove_member(self, *, org: str, username: str) -> EmptyResponse:
|
|
387
|
+
return await self._model("DELETE", self._client._path("orgs", org, "memberships", username), EmptyResponse)
|
|
388
|
+
|
|
389
|
+
async def list_followers(
|
|
390
|
+
self, *, owner: str, page: Optional[int] = None, per_page: Optional[int] = None
|
|
391
|
+
) -> List[User]:
|
|
392
|
+
return await self._models(
|
|
393
|
+
"GET", self._client._path("orgs", owner, "followers"), User, params={"page": page, "per_page": per_page}
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
async def get_issue_extend_settings(self, *, org: str) -> List[APIObject]:
|
|
397
|
+
data = await self._request("GET", self._client._path("orgs", org, "issue", "extend", "settings"))
|
|
398
|
+
return [APIObject(dict(item)) for item in data]
|
|
399
|
+
|
|
400
|
+
async def invite_member(
|
|
401
|
+
self, *, org: str, username: str, permission: Optional[str] = None, role_id: Optional[str] = None
|
|
402
|
+
) -> User:
|
|
403
|
+
return await self._model(
|
|
404
|
+
"POST",
|
|
405
|
+
self._client._path("orgs", org, "memberships", username),
|
|
406
|
+
User,
|
|
407
|
+
json={"permission": permission, "role_id": role_id},
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
async def update_enterprise_member(self, *, enterprise: str, username: str, role: str) -> EnterpriseMember:
|
|
411
|
+
return await self._model(
|
|
412
|
+
"PUT",
|
|
413
|
+
self._client._path("enterprises", enterprise, "members", username),
|
|
414
|
+
EnterpriseMember,
|
|
415
|
+
json={"role": role},
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
async def update(self, *, org: str, **payload) -> Organization:
|
|
419
|
+
return await self._model("PATCH", self._client._path("orgs", org), Organization, json=payload)
|
|
420
|
+
|
|
421
|
+
async def leave(self, *, org: str) -> None:
|
|
422
|
+
await self._request("DELETE", self._client._path("user", "memberships", "orgs", org))
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""AbstractSearchResource, SearchResource, and AsyncSearchResource resource group."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
|
|
6
|
+
from ..._models import SearchIssue, SearchRepository, SearchUser
|
|
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 AbstractSearchResource(ABC):
|
|
14
|
+
"""Interface for Search resource endpoints."""
|
|
15
|
+
|
|
16
|
+
@abstractmethod
|
|
17
|
+
def users(
|
|
18
|
+
self,
|
|
19
|
+
*,
|
|
20
|
+
q: str,
|
|
21
|
+
page: Optional[int] = None,
|
|
22
|
+
per_page: Optional[int] = None,
|
|
23
|
+
sort: Optional[str] = None,
|
|
24
|
+
order: Optional[str] = None,
|
|
25
|
+
) -> List[SearchUser]:
|
|
26
|
+
"""Search users.
|
|
27
|
+
|
|
28
|
+
:param q: Search keywords.
|
|
29
|
+
:param page: Page number.
|
|
30
|
+
:param per_page: Page size.
|
|
31
|
+
:param sort: Optional sort field such as ``joined_at``.
|
|
32
|
+
:param order: Sort order, usually ``asc`` or ``desc``.
|
|
33
|
+
:returns: Matching user search results.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
@abstractmethod
|
|
37
|
+
def issues(
|
|
38
|
+
self,
|
|
39
|
+
*,
|
|
40
|
+
q: str,
|
|
41
|
+
page: Optional[int] = None,
|
|
42
|
+
per_page: Optional[int] = None,
|
|
43
|
+
sort: Optional[str] = None,
|
|
44
|
+
order: Optional[str] = None,
|
|
45
|
+
repo: Optional[str] = None,
|
|
46
|
+
state: Optional[str] = None,
|
|
47
|
+
) -> List[SearchIssue]:
|
|
48
|
+
"""Search issues.
|
|
49
|
+
|
|
50
|
+
:param q: Search keywords.
|
|
51
|
+
:param page: Page number.
|
|
52
|
+
:param per_page: Page size.
|
|
53
|
+
:param sort: Optional sort field.
|
|
54
|
+
:param order: Sort order, usually ``asc`` or ``desc``.
|
|
55
|
+
:param repo: Optional repository path filter.
|
|
56
|
+
:param state: Optional issue state filter.
|
|
57
|
+
:returns: Matching issue search results.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
@abstractmethod
|
|
61
|
+
def repositories(
|
|
62
|
+
self,
|
|
63
|
+
*,
|
|
64
|
+
q: str,
|
|
65
|
+
page: Optional[int] = None,
|
|
66
|
+
per_page: Optional[int] = None,
|
|
67
|
+
sort: Optional[str] = None,
|
|
68
|
+
order: Optional[str] = None,
|
|
69
|
+
owner: Optional[str] = None,
|
|
70
|
+
fork: Optional[str] = None,
|
|
71
|
+
language: Optional[str] = None,
|
|
72
|
+
) -> List[SearchRepository]:
|
|
73
|
+
"""Search repositories.
|
|
74
|
+
|
|
75
|
+
:param q: Search keywords.
|
|
76
|
+
:param page: Page number.
|
|
77
|
+
:param per_page: Page size.
|
|
78
|
+
:param sort: Optional sort field such as ``stars_count``.
|
|
79
|
+
:param order: Sort order, usually ``asc`` or ``desc``.
|
|
80
|
+
:param owner: Optional owner path filter.
|
|
81
|
+
:param fork: Optional fork visibility filter.
|
|
82
|
+
:param language: Optional programming language filter.
|
|
83
|
+
:returns: Matching repository search results.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class SearchResource(SyncResource, AbstractSearchResource):
|
|
88
|
+
"""Synchronous search endpoints."""
|
|
89
|
+
|
|
90
|
+
def users(
|
|
91
|
+
self,
|
|
92
|
+
*,
|
|
93
|
+
q: str,
|
|
94
|
+
page: Optional[int] = None,
|
|
95
|
+
per_page: Optional[int] = None,
|
|
96
|
+
sort: Optional[str] = None,
|
|
97
|
+
order: Optional[str] = None,
|
|
98
|
+
) -> List[SearchUser]:
|
|
99
|
+
return self._models(
|
|
100
|
+
"GET",
|
|
101
|
+
self._client._path("search", "users"),
|
|
102
|
+
SearchUser,
|
|
103
|
+
params={"q": q, "page": page, "per_page": per_page, "sort": sort, "order": order},
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def issues(
|
|
107
|
+
self,
|
|
108
|
+
*,
|
|
109
|
+
q: str,
|
|
110
|
+
page: Optional[int] = None,
|
|
111
|
+
per_page: Optional[int] = None,
|
|
112
|
+
sort: Optional[str] = None,
|
|
113
|
+
order: Optional[str] = None,
|
|
114
|
+
repo: Optional[str] = None,
|
|
115
|
+
state: Optional[str] = None,
|
|
116
|
+
) -> List[SearchIssue]:
|
|
117
|
+
return self._models(
|
|
118
|
+
"GET",
|
|
119
|
+
self._client._path("search", "issues"),
|
|
120
|
+
SearchIssue,
|
|
121
|
+
params={
|
|
122
|
+
"q": q,
|
|
123
|
+
"page": page,
|
|
124
|
+
"per_page": per_page,
|
|
125
|
+
"sort": sort,
|
|
126
|
+
"order": order,
|
|
127
|
+
"repo": repo,
|
|
128
|
+
"state": state,
|
|
129
|
+
},
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
def repositories(
|
|
133
|
+
self,
|
|
134
|
+
*,
|
|
135
|
+
q: str,
|
|
136
|
+
page: Optional[int] = None,
|
|
137
|
+
per_page: Optional[int] = None,
|
|
138
|
+
sort: Optional[str] = None,
|
|
139
|
+
order: Optional[str] = None,
|
|
140
|
+
owner: Optional[str] = None,
|
|
141
|
+
fork: Optional[str] = None,
|
|
142
|
+
language: Optional[str] = None,
|
|
143
|
+
) -> List[SearchRepository]:
|
|
144
|
+
return self._models(
|
|
145
|
+
"GET",
|
|
146
|
+
self._client._path("search", "repositories"),
|
|
147
|
+
SearchRepository,
|
|
148
|
+
params={
|
|
149
|
+
"q": q,
|
|
150
|
+
"page": page,
|
|
151
|
+
"per_page": per_page,
|
|
152
|
+
"sort": sort,
|
|
153
|
+
"order": order,
|
|
154
|
+
"owner": owner,
|
|
155
|
+
"fork": fork,
|
|
156
|
+
"language": language,
|
|
157
|
+
},
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class AsyncSearchResource(AsyncResource, AbstractSearchResource):
|
|
162
|
+
"""Asynchronous search endpoints.
|
|
163
|
+
|
|
164
|
+
Query parameters match :class:`SearchResource` (``page``, ``per_page``, ``sort``, ``order``, etc.);
|
|
165
|
+
see ``docs/rest_api/search`` and the synchronous methods for field meanings.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
async def users(
|
|
169
|
+
self,
|
|
170
|
+
*,
|
|
171
|
+
q: str,
|
|
172
|
+
page: Optional[int] = None,
|
|
173
|
+
per_page: Optional[int] = None,
|
|
174
|
+
sort: Optional[str] = None,
|
|
175
|
+
order: Optional[str] = None,
|
|
176
|
+
) -> List[SearchUser]:
|
|
177
|
+
return await self._models(
|
|
178
|
+
"GET",
|
|
179
|
+
self._client._path("search", "users"),
|
|
180
|
+
SearchUser,
|
|
181
|
+
params={"q": q, "page": page, "per_page": per_page, "sort": sort, "order": order},
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
async def issues(
|
|
185
|
+
self,
|
|
186
|
+
*,
|
|
187
|
+
q: str,
|
|
188
|
+
page: Optional[int] = None,
|
|
189
|
+
per_page: Optional[int] = None,
|
|
190
|
+
sort: Optional[str] = None,
|
|
191
|
+
order: Optional[str] = None,
|
|
192
|
+
repo: Optional[str] = None,
|
|
193
|
+
state: Optional[str] = None,
|
|
194
|
+
) -> List[SearchIssue]:
|
|
195
|
+
return await self._models(
|
|
196
|
+
"GET",
|
|
197
|
+
self._client._path("search", "issues"),
|
|
198
|
+
SearchIssue,
|
|
199
|
+
params={
|
|
200
|
+
"q": q,
|
|
201
|
+
"page": page,
|
|
202
|
+
"per_page": per_page,
|
|
203
|
+
"sort": sort,
|
|
204
|
+
"order": order,
|
|
205
|
+
"repo": repo,
|
|
206
|
+
"state": state,
|
|
207
|
+
},
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
async def repositories(
|
|
211
|
+
self,
|
|
212
|
+
*,
|
|
213
|
+
q: str,
|
|
214
|
+
page: Optional[int] = None,
|
|
215
|
+
per_page: Optional[int] = None,
|
|
216
|
+
sort: Optional[str] = None,
|
|
217
|
+
order: Optional[str] = None,
|
|
218
|
+
owner: Optional[str] = None,
|
|
219
|
+
fork: Optional[str] = None,
|
|
220
|
+
language: Optional[str] = None,
|
|
221
|
+
) -> List[SearchRepository]:
|
|
222
|
+
return await self._models(
|
|
223
|
+
"GET",
|
|
224
|
+
self._client._path("search", "repositories"),
|
|
225
|
+
SearchRepository,
|
|
226
|
+
params={
|
|
227
|
+
"q": q,
|
|
228
|
+
"page": page,
|
|
229
|
+
"per_page": per_page,
|
|
230
|
+
"sort": sort,
|
|
231
|
+
"order": order,
|
|
232
|
+
"owner": owner,
|
|
233
|
+
"fork": fork,
|
|
234
|
+
"language": language,
|
|
235
|
+
},
|
|
236
|
+
)
|