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