Skip to content

Commit f9c0ad9

Browse files
chore: add type-hints to gitlab/v4/objects/merge_requests.py
* Add type-hints to gitlab/v4/objects/merge_requests.py * Add return value to cancel_merge_when_pipeline_succeeds() function as GitLab docs show it returns a value. * Add return value to approve() function as GitLab docs show it returns a value. * Add 'get()' method so that type-checkers will understand that getting a project merge request is of type ProjectMergeRequest.
1 parent 4ab9e92 commit f9c0ad9

File tree

2 files changed

+51
-17
lines changed

2 files changed

+51
-17
lines changed

gitlab/v4/objects/merge_requests.py

+50-17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
https://docs.gitlab.com/ee/api/merge_requests.html
44
https://docs.gitlab.com/ee/api/merge_request_approvals.html
55
"""
6+
from typing import Any, cast, Dict, Optional, TYPE_CHECKING, Union
7+
8+
import requests
9+
10+
import gitlab
611
from gitlab import cli
712
from gitlab import exceptions as exc
813
from gitlab import types
@@ -159,7 +164,9 @@ class ProjectMergeRequest(
159164

160165
@cli.register_custom_action("ProjectMergeRequest")
161166
@exc.on_http_error(exc.GitlabMROnBuildSuccessError)
162-
def cancel_merge_when_pipeline_succeeds(self, **kwargs):
167+
def cancel_merge_when_pipeline_succeeds(
168+
self, **kwargs: Any
169+
) -> "ProjectMergeRequest":
163170
"""Cancel merge when the pipeline succeeds.
164171
165172
Args:
@@ -169,17 +176,23 @@ def cancel_merge_when_pipeline_succeeds(self, **kwargs):
169176
GitlabAuthenticationError: If authentication is not correct
170177
GitlabMROnBuildSuccessError: If the server could not handle the
171178
request
179+
180+
Returns:
181+
ProjectMergeRequest
172182
"""
173183

174184
path = (
175185
f"{self.manager.path}/{self.get_id()}/cancel_merge_when_pipeline_succeeds"
176186
)
177187
server_data = self.manager.gitlab.http_put(path, **kwargs)
188+
if TYPE_CHECKING:
189+
assert isinstance(server_data, dict)
178190
self._update_attrs(server_data)
191+
return ProjectMergeRequest(self.manager, server_data)
179192

180193
@cli.register_custom_action("ProjectMergeRequest")
181194
@exc.on_http_error(exc.GitlabListError)
182-
def closes_issues(self, **kwargs):
195+
def closes_issues(self, **kwargs: Any) -> RESTObjectList:
183196
"""List issues that will close on merge."
184197
185198
Args:
@@ -199,12 +212,14 @@ def closes_issues(self, **kwargs):
199212
"""
200213
path = f"{self.manager.path}/{self.get_id()}/closes_issues"
201214
data_list = self.manager.gitlab.http_list(path, as_list=False, **kwargs)
215+
if TYPE_CHECKING:
216+
assert isinstance(data_list, gitlab.GitlabList)
202217
manager = ProjectIssueManager(self.manager.gitlab, parent=self.manager._parent)
203218
return RESTObjectList(manager, ProjectIssue, data_list)
204219

205220
@cli.register_custom_action("ProjectMergeRequest")
206221
@exc.on_http_error(exc.GitlabListError)
207-
def commits(self, **kwargs):
222+
def commits(self, **kwargs: Any) -> RESTObjectList:
208223
"""List the merge request commits.
209224
210225
Args:
@@ -225,12 +240,14 @@ def commits(self, **kwargs):
225240

226241
path = f"{self.manager.path}/{self.get_id()}/commits"
227242
data_list = self.manager.gitlab.http_list(path, as_list=False, **kwargs)
243+
if TYPE_CHECKING:
244+
assert isinstance(data_list, gitlab.GitlabList)
228245
manager = ProjectCommitManager(self.manager.gitlab, parent=self.manager._parent)
229246
return RESTObjectList(manager, ProjectCommit, data_list)
230247

231248
@cli.register_custom_action("ProjectMergeRequest")
232249
@exc.on_http_error(exc.GitlabListError)
233-
def changes(self, **kwargs):
250+
def changes(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]:
234251
"""List the merge request changes.
235252
236253
Args:
@@ -248,7 +265,7 @@ def changes(self, **kwargs):
248265

249266
@cli.register_custom_action("ProjectMergeRequest", tuple(), ("sha",))
250267
@exc.on_http_error(exc.GitlabMRApprovalError)
251-
def approve(self, sha=None, **kwargs):
268+
def approve(self, sha: Optional[str] = None, **kwargs: Any) -> Dict[str, Any]:
252269
"""Approve the merge request.
253270
254271
Args:
@@ -259,6 +276,9 @@ def approve(self, sha=None, **kwargs):
259276
GitlabAuthenticationError: If authentication is not correct
260277
GitlabMRApprovalError: If the approval failed
261278
279+
Returns:
280+
A dict containing the result.
281+
262282
https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request
263283
"""
264284
path = f"{self.manager.path}/{self.get_id()}/approve"
@@ -267,11 +287,14 @@ def approve(self, sha=None, **kwargs):
267287
data["sha"] = sha
268288

269289
server_data = self.manager.gitlab.http_post(path, post_data=data, **kwargs)
290+
if TYPE_CHECKING:
291+
assert isinstance(server_data, dict)
270292
self._update_attrs(server_data)
293+
return server_data
271294

272295
@cli.register_custom_action("ProjectMergeRequest")
273296
@exc.on_http_error(exc.GitlabMRApprovalError)
274-
def unapprove(self, **kwargs):
297+
def unapprove(self, **kwargs: Any) -> None:
275298
"""Unapprove the merge request.
276299
277300
Args:
@@ -284,14 +307,16 @@ def unapprove(self, **kwargs):
284307
https://docs.gitlab.com/ee/api/merge_request_approvals.html#unapprove-merge-request
285308
"""
286309
path = f"{self.manager.path}/{self.get_id()}/unapprove"
287-
data = {}
310+
data: Dict[str, Any] = {}
288311

289312
server_data = self.manager.gitlab.http_post(path, post_data=data, **kwargs)
313+
if TYPE_CHECKING:
314+
assert isinstance(server_data, dict)
290315
self._update_attrs(server_data)
291316

292317
@cli.register_custom_action("ProjectMergeRequest")
293318
@exc.on_http_error(exc.GitlabMRRebaseError)
294-
def rebase(self, **kwargs):
319+
def rebase(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]:
295320
"""Attempt to rebase the source branch onto the target branch
296321
297322
Args:
@@ -302,12 +327,12 @@ def rebase(self, **kwargs):
302327
GitlabMRRebaseError: If rebasing failed
303328
"""
304329
path = f"{self.manager.path}/{self.get_id()}/rebase"
305-
data = {}
330+
data: Dict[str, Any] = {}
306331
return self.manager.gitlab.http_put(path, post_data=data, **kwargs)
307332

308333
@cli.register_custom_action("ProjectMergeRequest")
309334
@exc.on_http_error(exc.GitlabGetError)
310-
def merge_ref(self, **kwargs):
335+
def merge_ref(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]:
311336
"""Attempt to merge changes between source and target branches into
312337
`refs/merge-requests/:iid/merge`.
313338
@@ -332,15 +357,15 @@ def merge_ref(self, **kwargs):
332357
@exc.on_http_error(exc.GitlabMRClosedError)
333358
def merge(
334359
self,
335-
merge_commit_message=None,
336-
should_remove_source_branch=False,
337-
merge_when_pipeline_succeeds=False,
338-
**kwargs,
339-
):
360+
merge_commit_message: Optional[str] = None,
361+
should_remove_source_branch: bool = False,
362+
merge_when_pipeline_succeeds: bool = False,
363+
**kwargs: Any,
364+
) -> Dict[str, Any]:
340365
"""Accept the merge request.
341366
342367
Args:
343-
merge_commit_message (bool): Commit message
368+
merge_commit_message (str): Commit message
344369
should_remove_source_branch (bool): If True, removes the source
345370
branch
346371
merge_when_pipeline_succeeds (bool): Wait for the build to succeed,
@@ -352,7 +377,7 @@ def merge(
352377
GitlabMRClosedError: If the merge failed
353378
"""
354379
path = f"{self.manager.path}/{self.get_id()}/merge"
355-
data = {}
380+
data: Dict[str, Any] = {}
356381
if merge_commit_message:
357382
data["merge_commit_message"] = merge_commit_message
358383
if should_remove_source_branch is not None:
@@ -361,7 +386,10 @@ def merge(
361386
data["merge_when_pipeline_succeeds"] = True
362387

363388
server_data = self.manager.gitlab.http_put(path, post_data=data, **kwargs)
389+
if TYPE_CHECKING:
390+
assert isinstance(server_data, dict)
364391
self._update_attrs(server_data)
392+
return server_data
365393

366394

367395
class ProjectMergeRequestManager(CRUDMixin, RESTManager):
@@ -428,6 +456,11 @@ class ProjectMergeRequestManager(CRUDMixin, RESTManager):
428456
"labels": types.ListAttribute,
429457
}
430458

459+
def get(
460+
self, id: Union[str, int], lazy: bool = False, **kwargs: Any
461+
) -> ProjectMergeRequest:
462+
return cast(ProjectMergeRequest, super().get(id=id, lazy=lazy, **kwargs))
463+
431464

432465
class ProjectDeploymentMergeRequest(MergeRequest):
433466
pass

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ ignore_errors = true
2323

2424
[[tool.mypy.overrides]] # Overrides to negate above patterns
2525
module = [
26+
"gitlab.v4.objects.merge_requests",
2627
"gitlab.v4.objects.projects",
2728
"gitlab.v4.objects.users"
2829
]

0 commit comments

Comments
 (0)