33https://docs.gitlab.com/ee/api/merge_requests.html
44https://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
611from gitlab import cli
712from gitlab import exceptions as exc
813from 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
367395class 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
432465class ProjectDeploymentMergeRequest (MergeRequest ):
433466 pass
0 commit comments