gitcode-api 1.3.0__py3-none-any.whl → 1.3.2__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/llm/mcp.py CHANGED
@@ -136,7 +136,7 @@ def create_mcp_server(name: str = "GitCode API", tool: Optional[GitCodeLLMTool]
136
136
  :param name: MCP server display name.
137
137
  :param tool: Optional preconfigured :class:`~gitcode_api.llm._tool.GitCodeLLMTool`.
138
138
  :param kwargs: Forwarded to :class:`GitCodeMCP` and then to ``fastmcp.FastMCP`` (for example
139
- ``instructions=`` to override the default server instructions).
139
+ ``instructions`` to override the default server instructions).
140
140
  :returns: Configured ``FastMCP`` instance with ``gitcode_api_tool`` registered.
141
141
  """
142
142
  return GitCodeMCP(name=name, tool=tool, **kwargs).mcp
@@ -56,14 +56,26 @@ class AbstractUsersResource(ABC):
56
56
  """
57
57
 
58
58
  @abstractmethod
59
- def list_repos(self, *, username: str, **params) -> List[Repository]:
59
+ def list_repos(
60
+ self,
61
+ *,
62
+ username: str,
63
+ type: Optional[str] = None,
64
+ sort: Optional[str] = None,
65
+ direction: Optional[str] = None,
66
+ page: Optional[int] = None,
67
+ per_page: Optional[int] = None,
68
+ **kwargs,
69
+ ) -> List[Repository]:
60
70
  """List public repositories owned by a user.
61
71
 
62
- Supported filters follow the user repository API documentation, such as
63
- ``type``, ``sort``, ``direction``, ``page``, and ``per_page``.
64
-
65
72
  :param username: GitCode username or login.
66
- :param params: Query parameters accepted by the REST endpoint.
73
+ :param type: Ownership filter: ``owner``, ``personal``, ``member``, or ``all``. Default: ``all``.
74
+ :param sort: Sort field: ``created``, ``updated``, ``pushed``, or ``full_name``. Default: ``full_name``.
75
+ :param direction: ``asc`` or ``desc``.
76
+ :param page: Page number.
77
+ :param per_page: Page size.
78
+ :param kwargs: Additional arguments forwarded directly in request.
67
79
  :returns: Matching repositories.
68
80
  """
69
81
 
@@ -149,8 +161,30 @@ class UsersResource(SyncResource, AbstractUsersResource):
149
161
  params={"year": year, "next": next},
150
162
  )
151
163
 
152
- def list_repos(self, *, username: str, **params) -> List[Repository]:
153
- return self._models("GET", self._client._path("users", username, "repos"), Repository, params=params)
164
+ def list_repos(
165
+ self,
166
+ *,
167
+ username: str,
168
+ type: Optional[str] = None,
169
+ sort: Optional[str] = None,
170
+ direction: Optional[str] = None,
171
+ page: Optional[int] = None,
172
+ per_page: Optional[int] = None,
173
+ **kwargs,
174
+ ) -> List[Repository]:
175
+ return self._models(
176
+ "GET",
177
+ self._client._path("users", username, "repos"),
178
+ Repository,
179
+ params={
180
+ "type": type,
181
+ "sort": sort,
182
+ "direction": direction,
183
+ "page": page,
184
+ "per_page": per_page,
185
+ **kwargs,
186
+ },
187
+ )
154
188
 
155
189
  def create_key(self, *, key: str, title: str) -> PublicKey:
156
190
  return self._model("POST", self._client._path("user", "keys"), PublicKey, json={"key": key, "title": title})
@@ -210,8 +244,30 @@ class AsyncUsersResource(AsyncResource, AbstractUsersResource):
210
244
  params={"year": year, "next": next},
211
245
  )
212
246
 
213
- async def list_repos(self, *, username: str, **params) -> List[Repository]:
214
- return await self._models("GET", self._client._path("users", username, "repos"), Repository, params=params)
247
+ async def list_repos(
248
+ self,
249
+ *,
250
+ username: str,
251
+ type: Optional[str] = None,
252
+ sort: Optional[str] = None,
253
+ direction: Optional[str] = None,
254
+ page: Optional[int] = None,
255
+ per_page: Optional[int] = None,
256
+ **kwargs,
257
+ ) -> List[Repository]:
258
+ return await self._models(
259
+ "GET",
260
+ self._client._path("users", username, "repos"),
261
+ Repository,
262
+ params={
263
+ "type": type,
264
+ "sort": sort,
265
+ "direction": direction,
266
+ "page": page,
267
+ "per_page": per_page,
268
+ **kwargs,
269
+ },
270
+ )
215
271
 
216
272
  async def create_key(self, *, key: str, title: str) -> PublicKey:
217
273
  return await self._model(
@@ -76,6 +76,8 @@ class AbstractIssuesResource(ABC):
76
76
  labels: Optional[List[str]] = None,
77
77
  milestone: Union[int, str, None] = None,
78
78
  security_hole: Optional[str] = None,
79
+ template_path: Optional[str] = None,
80
+ **kwargs,
79
81
  ) -> Issue:
80
82
  """Create an issue for a repository.
81
83
 
@@ -87,6 +89,9 @@ class AbstractIssuesResource(ABC):
87
89
  :param labels: Optional label names.
88
90
  :param milestone: Optional milestone identifier.
89
91
  :param security_hole: Whether the issue is private; form field described in the Issues API (default public).
92
+ :param template_path: issue template path, project templates support files under the .gitcode, .github, .gitee
93
+ directories, and organization templates only support files under the .gitcode directory of .gitcode repo.
94
+ :param kwargs: Additional arguments forwarded directly in request.
90
95
  :returns: Created issue details.
91
96
  """
92
97
 
@@ -241,28 +246,108 @@ class AbstractIssuesResource(ABC):
241
246
  """
242
247
 
243
248
  @abstractmethod
244
- def list_enterprise(self, *, enterprise: str, **params) -> List[Issue]:
249
+ def list_enterprise(
250
+ self,
251
+ *,
252
+ enterprise: str,
253
+ state: Optional[str] = None,
254
+ labels: Optional[str] = None,
255
+ sort: Optional[str] = None,
256
+ direction: Optional[str] = None,
257
+ since: Optional[str] = None,
258
+ page: Optional[int] = None,
259
+ per_page: Optional[int] = None,
260
+ milestone: Optional[str] = None,
261
+ assignee: Optional[str] = None,
262
+ creator: Optional[str] = None,
263
+ program: Optional[str] = None,
264
+ created_at: Optional[str] = None,
265
+ created_before: Optional[str] = None,
266
+ **kwargs,
267
+ ) -> List[Issue]:
245
268
  """List enterprise issues visible to the caller.
246
269
 
247
270
  :param enterprise: Enterprise path or login.
248
- :param params: Additional query parameters accepted by ``GET .../enterprises/{enterprise}/issues``.
271
+ :param state: Issue state: ``open``, ``closed``, or ``all``. Default: ``open``.
272
+ :param labels: Comma-separated list of label names.
273
+ :param sort: Sort field: ``created`` or ``updated_at``. Default: ``created_at``.
274
+ :param direction: ``asc`` or ``desc``. Default: ``desc``.
275
+ :param since: Return issues updated since this timestamp.
276
+ :param page: Page number.
277
+ :param per_page: Page size.
278
+ :param milestone: Milestone name (``none`` for no milestone, ``*`` for any).
279
+ :param assignee: Assignee username (``none`` for unassigned, ``*`` for any).
280
+ :param creator: Creator username filter.
281
+ :param program: Project name (``none`` for unassociated, ``*`` for any).
282
+ :param created_at: Created-at timestamp filter.
283
+ :param created_before: Return issues created before this timestamp.
284
+ :param kwargs: Additional arguments forwarded directly in request.
249
285
  :returns: Enterprise-scoped issues.
250
286
  """
251
287
 
252
288
  @abstractmethod
253
- def list_user(self, **params) -> List[Issue]:
289
+ def list_user(
290
+ self,
291
+ *,
292
+ filter: Optional[str] = None,
293
+ state: Optional[str] = None,
294
+ labels: Optional[str] = None,
295
+ sort: Optional[str] = None,
296
+ direction: Optional[str] = None,
297
+ since: Optional[str] = None,
298
+ page: Optional[int] = None,
299
+ per_page: Optional[int] = None,
300
+ schedule: Optional[str] = None,
301
+ deadline: Optional[str] = None,
302
+ created_at: Optional[str] = None,
303
+ finished_at: Optional[str] = None,
304
+ **kwargs,
305
+ ) -> List[Issue]:
254
306
  """List issues for the authenticated user.
255
307
 
256
- :param params: Query parameters for ``GET /user/issues`` (filters, pagination, etc.).
308
+ :param filter: Filter mode: ``assigned``, ``created``, or ``all``. Default: ``assigned``.
309
+ :param state: Issue state: ``open`` or ``closed``. Default: ``open``.
310
+ :param labels: Comma-separated list of label names.
311
+ :param sort: Sort field: ``created`` or ``updated_at``. Default: ``created_at``.
312
+ :param direction: ``asc`` or ``desc``. Default: ``desc``.
313
+ :param since: Return issues updated since this timestamp.
314
+ :param page: Page number.
315
+ :param per_page: Page size.
316
+ :param schedule: Schedule filter.
317
+ :param deadline: Deadline filter.
318
+ :param created_at: Created-at timestamp filter.
319
+ :param finished_at: Finished-at timestamp filter.
320
+ :param kwargs: Additional arguments forwarded directly in request.
257
321
  :returns: Issues assigned to or authored by the user, per API rules.
258
322
  """
259
323
 
260
324
  @abstractmethod
261
- def list_org(self, *, org: str, **params) -> List[Issue]:
325
+ def list_org(
326
+ self,
327
+ *,
328
+ org: str,
329
+ filter: Optional[str] = None,
330
+ state: Optional[str] = None,
331
+ labels: Optional[str] = None,
332
+ sort: Optional[str] = None,
333
+ direction: Optional[str] = None,
334
+ page: Optional[int] = None,
335
+ per_page: Optional[int] = None,
336
+ created_at: Optional[str] = None,
337
+ **kwargs,
338
+ ) -> List[Issue]:
262
339
  """List organization issues visible to the current user.
263
340
 
264
341
  :param org: Organization path or login.
265
- :param params: Query parameters for ``GET .../orgs/{org}/issues``.
342
+ :param filter: Filter mode: ``assigned``, ``created``, or ``all``. Default: ``assigned``.
343
+ :param state: Issue state: ``open`` or ``closed``. Default: ``open``.
344
+ :param labels: Comma-separated list of label names.
345
+ :param sort: Sort field: ``created`` or ``updated_at``. Default: ``created_at``.
346
+ :param direction: ``asc`` or ``desc``. Default: ``desc``.
347
+ :param page: Page number.
348
+ :param per_page: Page size.
349
+ :param created_at: Created-at timestamp filter.
350
+ :param kwargs: Additional arguments forwarded directly in request.
266
351
  :returns: Organization-scoped issues.
267
352
  """
268
353
 
@@ -276,12 +361,22 @@ class AbstractIssuesResource(ABC):
276
361
  """
277
362
 
278
363
  @abstractmethod
279
- def list_enterprise_comments(self, *, enterprise: str, number: Union[int, str], **params) -> List[IssueComment]:
364
+ def list_enterprise_comments(
365
+ self,
366
+ *,
367
+ enterprise: str,
368
+ number: Union[int, str],
369
+ page: Optional[int] = None,
370
+ per_page: Optional[int] = None,
371
+ **kwargs,
372
+ ) -> List[IssueComment]:
280
373
  """List comments for an enterprise issue.
281
374
 
282
375
  :param enterprise: Enterprise path or login.
283
376
  :param number: Enterprise issue identifier in the path.
284
- :param params: Optional pagination or filter query parameters.
377
+ :param page: Page number.
378
+ :param per_page: Page size.
379
+ :param kwargs: Additional arguments forwarded directly in request.
285
380
  :returns: Comments on the enterprise issue.
286
381
  """
287
382
 
@@ -400,6 +495,8 @@ class IssuesResource(SyncResource, AbstractIssuesResource):
400
495
  labels: Optional[List[str]] = None,
401
496
  milestone: Union[int, str, None] = None,
402
497
  security_hole: Optional[str] = None,
498
+ template_path: Optional[str] = None,
499
+ **kwargs,
403
500
  ) -> Issue:
404
501
  resolved_repo = repo or self._client.repo
405
502
  return self._model(
@@ -414,7 +511,9 @@ class IssuesResource(SyncResource, AbstractIssuesResource):
414
511
  "labels": _comma_join(labels),
415
512
  "milestone": milestone,
416
513
  "security_hole": security_hole,
417
- },
514
+ "template_path": template_path,
515
+ }
516
+ | kwargs,
418
517
  )
419
518
 
420
519
  def update(
@@ -536,24 +635,133 @@ class IssuesResource(SyncResource, AbstractIssuesResource):
536
635
  ) -> None:
537
636
  self._request("DELETE", self._client._repo_path("issues", number, "labels", name, owner=owner, repo=repo))
538
637
 
539
- def list_enterprise(self, *, enterprise: str, **params) -> List[Issue]:
540
- return self._models("GET", self._client._path("enterprises", enterprise, "issues"), Issue, params=params)
638
+ def list_enterprise(
639
+ self,
640
+ *,
641
+ enterprise: str,
642
+ state: Optional[str] = None,
643
+ labels: Optional[str] = None,
644
+ sort: Optional[str] = None,
645
+ direction: Optional[str] = None,
646
+ since: Optional[str] = None,
647
+ page: Optional[int] = None,
648
+ per_page: Optional[int] = None,
649
+ milestone: Optional[str] = None,
650
+ assignee: Optional[str] = None,
651
+ creator: Optional[str] = None,
652
+ program: Optional[str] = None,
653
+ created_at: Optional[str] = None,
654
+ created_before: Optional[str] = None,
655
+ **kwargs,
656
+ ) -> List[Issue]:
657
+ return self._models(
658
+ "GET",
659
+ self._client._path("enterprises", enterprise, "issues"),
660
+ Issue,
661
+ params={
662
+ "state": state,
663
+ "labels": labels,
664
+ "sort": sort,
665
+ "direction": direction,
666
+ "since": since,
667
+ "page": page,
668
+ "per_page": per_page,
669
+ "milestone": milestone,
670
+ "assignee": assignee,
671
+ "creator": creator,
672
+ "program": program,
673
+ "created_at": created_at,
674
+ "created_before": created_before,
675
+ **kwargs,
676
+ },
677
+ )
541
678
 
542
- def list_user(self, **params) -> List[Issue]:
543
- return self._models("GET", self._client._path("user", "issues"), Issue, params=params)
679
+ def list_user(
680
+ self,
681
+ *,
682
+ filter: Optional[str] = None,
683
+ state: Optional[str] = None,
684
+ labels: Optional[str] = None,
685
+ sort: Optional[str] = None,
686
+ direction: Optional[str] = None,
687
+ since: Optional[str] = None,
688
+ page: Optional[int] = None,
689
+ per_page: Optional[int] = None,
690
+ schedule: Optional[str] = None,
691
+ deadline: Optional[str] = None,
692
+ created_at: Optional[str] = None,
693
+ finished_at: Optional[str] = None,
694
+ **kwargs,
695
+ ) -> List[Issue]:
696
+ return self._models(
697
+ "GET",
698
+ self._client._path("user", "issues"),
699
+ Issue,
700
+ params={
701
+ "filter": filter,
702
+ "state": state,
703
+ "labels": labels,
704
+ "sort": sort,
705
+ "direction": direction,
706
+ "since": since,
707
+ "page": page,
708
+ "per_page": per_page,
709
+ "schedule": schedule,
710
+ "deadline": deadline,
711
+ "created_at": created_at,
712
+ "finished_at": finished_at,
713
+ **kwargs,
714
+ },
715
+ )
544
716
 
545
- def list_org(self, *, org: str, **params) -> List[Issue]:
546
- return self._models("GET", self._client._path("orgs", org, "issues"), Issue, params=params)
717
+ def list_org(
718
+ self,
719
+ *,
720
+ org: str,
721
+ filter: Optional[str] = None,
722
+ state: Optional[str] = None,
723
+ labels: Optional[str] = None,
724
+ sort: Optional[str] = None,
725
+ direction: Optional[str] = None,
726
+ page: Optional[int] = None,
727
+ per_page: Optional[int] = None,
728
+ created_at: Optional[str] = None,
729
+ **kwargs,
730
+ ) -> List[Issue]:
731
+ return self._models(
732
+ "GET",
733
+ self._client._path("orgs", org, "issues"),
734
+ Issue,
735
+ params={
736
+ "filter": filter,
737
+ "state": state,
738
+ "labels": labels,
739
+ "sort": sort,
740
+ "direction": direction,
741
+ "page": page,
742
+ "per_page": per_page,
743
+ "created_at": created_at,
744
+ **kwargs,
745
+ },
746
+ )
547
747
 
548
748
  def get_enterprise_issue(self, *, enterprise: str, number: Union[int, str]) -> Issue:
549
749
  return self._model("GET", self._client._path("enterprises", enterprise, "issues", number), Issue)
550
750
 
551
- def list_enterprise_comments(self, *, enterprise: str, number: Union[int, str], **params) -> List[IssueComment]:
751
+ def list_enterprise_comments(
752
+ self,
753
+ *,
754
+ enterprise: str,
755
+ number: Union[int, str],
756
+ page: Optional[int] = None,
757
+ per_page: Optional[int] = None,
758
+ **kwargs,
759
+ ) -> List[IssueComment]:
552
760
  return self._models(
553
761
  "GET",
554
762
  self._client._path("enterprises", enterprise, "issues", number, "comments"),
555
763
  IssueComment,
556
- params=params,
764
+ params={"page": page, "per_page": per_page, **kwargs},
557
765
  )
558
766
 
559
767
  def list_enterprise_labels(self, *, enterprise: str, issue_id: Union[int, str]) -> List[Label]:
@@ -659,6 +867,8 @@ class AsyncIssuesResource(AsyncResource, AbstractIssuesResource):
659
867
  labels: Optional[List[str]] = None,
660
868
  milestone: Union[int, str, None] = None,
661
869
  security_hole: Optional[str] = None,
870
+ template_path: Optional[str] = None,
871
+ **kwargs,
662
872
  ) -> Issue:
663
873
  resolved_repo = repo or self._client.repo
664
874
  return await self._model(
@@ -673,6 +883,7 @@ class AsyncIssuesResource(AsyncResource, AbstractIssuesResource):
673
883
  "labels": _comma_join(labels),
674
884
  "milestone": milestone,
675
885
  "security_hole": security_hole,
886
+ "template_path": template_path,
676
887
  },
677
888
  )
678
889
 
@@ -774,26 +985,133 @@ class AsyncIssuesResource(AsyncResource, AbstractIssuesResource):
774
985
  ) -> None:
775
986
  await self._request("DELETE", self._client._repo_path("issues", number, "labels", name, owner=owner, repo=repo))
776
987
 
777
- async def list_enterprise(self, *, enterprise: str, **params) -> List[Issue]:
778
- return await self._models("GET", self._client._path("enterprises", enterprise, "issues"), Issue, params=params)
988
+ async def list_enterprise(
989
+ self,
990
+ *,
991
+ enterprise: str,
992
+ state: Optional[str] = None,
993
+ labels: Optional[str] = None,
994
+ sort: Optional[str] = None,
995
+ direction: Optional[str] = None,
996
+ since: Optional[str] = None,
997
+ page: Optional[int] = None,
998
+ per_page: Optional[int] = None,
999
+ milestone: Optional[str] = None,
1000
+ assignee: Optional[str] = None,
1001
+ creator: Optional[str] = None,
1002
+ program: Optional[str] = None,
1003
+ created_at: Optional[str] = None,
1004
+ created_before: Optional[str] = None,
1005
+ **kwargs,
1006
+ ) -> List[Issue]:
1007
+ return await self._models(
1008
+ "GET",
1009
+ self._client._path("enterprises", enterprise, "issues"),
1010
+ Issue,
1011
+ params={
1012
+ "state": state,
1013
+ "labels": labels,
1014
+ "sort": sort,
1015
+ "direction": direction,
1016
+ "since": since,
1017
+ "page": page,
1018
+ "per_page": per_page,
1019
+ "milestone": milestone,
1020
+ "assignee": assignee,
1021
+ "creator": creator,
1022
+ "program": program,
1023
+ "created_at": created_at,
1024
+ "created_before": created_before,
1025
+ **kwargs,
1026
+ },
1027
+ )
779
1028
 
780
- async def list_user(self, **params) -> List[Issue]:
781
- return await self._models("GET", self._client._path("user", "issues"), Issue, params=params)
1029
+ async def list_user(
1030
+ self,
1031
+ *,
1032
+ filter: Optional[str] = None,
1033
+ state: Optional[str] = None,
1034
+ labels: Optional[str] = None,
1035
+ sort: Optional[str] = None,
1036
+ direction: Optional[str] = None,
1037
+ since: Optional[str] = None,
1038
+ page: Optional[int] = None,
1039
+ per_page: Optional[int] = None,
1040
+ schedule: Optional[str] = None,
1041
+ deadline: Optional[str] = None,
1042
+ created_at: Optional[str] = None,
1043
+ finished_at: Optional[str] = None,
1044
+ **kwargs,
1045
+ ) -> List[Issue]:
1046
+ return await self._models(
1047
+ "GET",
1048
+ self._client._path("user", "issues"),
1049
+ Issue,
1050
+ params={
1051
+ "filter": filter,
1052
+ "state": state,
1053
+ "labels": labels,
1054
+ "sort": sort,
1055
+ "direction": direction,
1056
+ "since": since,
1057
+ "page": page,
1058
+ "per_page": per_page,
1059
+ "schedule": schedule,
1060
+ "deadline": deadline,
1061
+ "created_at": created_at,
1062
+ "finished_at": finished_at,
1063
+ **kwargs,
1064
+ },
1065
+ )
782
1066
 
783
- async def list_org(self, *, org: str, **params) -> List[Issue]:
784
- return await self._models("GET", self._client._path("orgs", org, "issues"), Issue, params=params)
1067
+ async def list_org(
1068
+ self,
1069
+ *,
1070
+ org: str,
1071
+ filter: Optional[str] = None,
1072
+ state: Optional[str] = None,
1073
+ labels: Optional[str] = None,
1074
+ sort: Optional[str] = None,
1075
+ direction: Optional[str] = None,
1076
+ page: Optional[int] = None,
1077
+ per_page: Optional[int] = None,
1078
+ created_at: Optional[str] = None,
1079
+ **kwargs,
1080
+ ) -> List[Issue]:
1081
+ return await self._models(
1082
+ "GET",
1083
+ self._client._path("orgs", org, "issues"),
1084
+ Issue,
1085
+ params={
1086
+ "filter": filter,
1087
+ "state": state,
1088
+ "labels": labels,
1089
+ "sort": sort,
1090
+ "direction": direction,
1091
+ "page": page,
1092
+ "per_page": per_page,
1093
+ "created_at": created_at,
1094
+ **kwargs,
1095
+ },
1096
+ )
785
1097
 
786
1098
  async def get_enterprise_issue(self, *, enterprise: str, number: Union[int, str]) -> Issue:
787
1099
  return await self._model("GET", self._client._path("enterprises", enterprise, "issues", number), Issue)
788
1100
 
789
1101
  async def list_enterprise_comments(
790
- self, *, enterprise: str, number: Union[int, str], **params
1102
+ self,
1103
+ *,
1104
+ enterprise: str,
1105
+ number: Union[int, str],
1106
+ page: Optional[int] = None,
1107
+ per_page: Optional[int] = None,
1108
+ **kwargs,
791
1109
  ) -> List[IssueComment]:
792
1110
  return await self._models(
793
1111
  "GET",
794
1112
  self._client._path("enterprises", enterprise, "issues", number, "comments"),
795
1113
  IssueComment,
796
- params=params,
1114
+ params={"page": page, "per_page": per_page, **kwargs},
797
1115
  )
798
1116
 
799
1117
  async def list_enterprise_labels(self, *, enterprise: str, issue_id: Union[int, str]) -> List[Label]:
@@ -14,12 +14,28 @@ class AbstractMilestonesResource(ABC):
14
14
  """Interface for Milestones resource endpoints."""
15
15
 
16
16
  @abstractmethod
17
- def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None, **params) -> List[Milestone]:
17
+ def list(
18
+ self,
19
+ *,
20
+ owner: Optional[str] = None,
21
+ repo: Optional[str] = None,
22
+ state: Optional[str] = None,
23
+ sort: Optional[str] = None,
24
+ direction: Optional[str] = None,
25
+ page: Optional[int] = None,
26
+ per_page: Optional[int] = None,
27
+ **kwargs,
28
+ ) -> List[Milestone]:
18
29
  """List milestones for a repository.
19
30
 
20
31
  :param owner: Repository owner path. Uses the client default when omitted.
21
32
  :param repo: Repository path. Uses the client default when omitted.
22
- :param params: Query parameters accepted by the milestones listing (state, sort, pagination, etc.).
33
+ :param state: Milestone state: ``open``, ``closed``, or ``all``. Default: ``open``.
34
+ :param sort: Sort field such as ``due_on``.
35
+ :param direction: ``asc`` or ``desc``. Default: ``asc``.
36
+ :param page: Page number.
37
+ :param per_page: Page size.
38
+ :param kwargs: Additional arguments forwarded directly in request.
23
39
  :returns: Milestones.
24
40
  """
25
41
 
@@ -90,9 +106,30 @@ class AbstractMilestonesResource(ABC):
90
106
  class MilestonesResource(SyncResource, AbstractMilestonesResource):
91
107
  """Synchronous milestone endpoints."""
92
108
 
93
- def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None, **params) -> List[Milestone]:
109
+ def list(
110
+ self,
111
+ *,
112
+ owner: Optional[str] = None,
113
+ repo: Optional[str] = None,
114
+ state: Optional[str] = None,
115
+ sort: Optional[str] = None,
116
+ direction: Optional[str] = None,
117
+ page: Optional[int] = None,
118
+ per_page: Optional[int] = None,
119
+ **kwargs,
120
+ ) -> List[Milestone]:
94
121
  return self._models(
95
- "GET", self._client._repo_path("milestones", owner=owner, repo=repo), Milestone, params=params
122
+ "GET",
123
+ self._client._repo_path("milestones", owner=owner, repo=repo),
124
+ Milestone,
125
+ params={
126
+ "state": state,
127
+ "sort": sort,
128
+ "direction": direction,
129
+ "page": page,
130
+ "per_page": per_page,
131
+ **kwargs,
132
+ },
96
133
  )
97
134
 
98
135
  def get(self, *, number: Union[int, str], owner: Optional[str] = None, repo: Optional[str] = None) -> Milestone:
@@ -142,9 +179,30 @@ class AsyncMilestonesResource(AsyncResource, AbstractMilestonesResource):
142
179
  Mirrors :class:`MilestonesResource`; see that class for parameter documentation.
143
180
  """
144
181
 
145
- async def list(self, *, owner: Optional[str] = None, repo: Optional[str] = None, **params) -> List[Milestone]:
182
+ async def list(
183
+ self,
184
+ *,
185
+ owner: Optional[str] = None,
186
+ repo: Optional[str] = None,
187
+ state: Optional[str] = None,
188
+ sort: Optional[str] = None,
189
+ direction: Optional[str] = None,
190
+ page: Optional[int] = None,
191
+ per_page: Optional[int] = None,
192
+ **kwargs,
193
+ ) -> List[Milestone]:
146
194
  return await self._models(
147
- "GET", self._client._repo_path("milestones", owner=owner, repo=repo), Milestone, params=params
195
+ "GET",
196
+ self._client._repo_path("milestones", owner=owner, repo=repo),
197
+ Milestone,
198
+ params={
199
+ "state": state,
200
+ "sort": sort,
201
+ "direction": direction,
202
+ "page": page,
203
+ "per_page": per_page,
204
+ **kwargs,
205
+ },
148
206
  )
149
207
 
150
208
  async def get(