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,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
+ )