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,7 @@ 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 (self , ** kwargs : Any ) -> ProjectMergeRequest :
163168 """Cancel merge when the pipeline succeeds.
164169
165170 Args:
@@ -169,17 +174,23 @@ def cancel_merge_when_pipeline_succeeds(self, **kwargs):
169174 GitlabAuthenticationError: If authentication is not correct
170175 GitlabMROnBuildSuccessError: If the server could not handle the
171176 request
177+
178+ Returns:
179+ ProjectMergeRequest
172180 """
173181
174182 path = (
175183 f"{ self .manager .path } /{ self .get_id ()} /cancel_merge_when_pipeline_succeeds"
176184 )
177185 server_data = self .manager .gitlab .http_put (path , ** kwargs )
186+ if TYPE_CHECKING :
187+ assert isinstance (server_data , dict )
178188 self ._update_attrs (server_data )
189+ return ProjectMergeRequest (self .manager , server_data )
179190
180191 @cli .register_custom_action ("ProjectMergeRequest" )
181192 @exc .on_http_error (exc .GitlabListError )
182- def closes_issues (self , ** kwargs ) :
193+ def closes_issues (self , ** kwargs : Any ) -> RESTObjectList :
183194 """List issues that will close on merge."
184195
185196 Args:
@@ -199,12 +210,14 @@ def closes_issues(self, **kwargs):
199210 """
200211 path = f"{ self .manager .path } /{ self .get_id ()} /closes_issues"
201212 data_list = self .manager .gitlab .http_list (path , as_list = False , ** kwargs )
213+ if TYPE_CHECKING :
214+ assert isinstance (data_list , gitlab .GitlabList )
202215 manager = ProjectIssueManager (self .manager .gitlab , parent = self .manager ._parent )
203216 return RESTObjectList (manager , ProjectIssue , data_list )
204217
205218 @cli .register_custom_action ("ProjectMergeRequest" )
206219 @exc .on_http_error (exc .GitlabListError )
207- def commits (self , ** kwargs ) :
220+ def commits (self , ** kwargs : Any ) -> RESTObjectList :
208221 """List the merge request commits.
209222
210223 Args:
@@ -225,12 +238,14 @@ def commits(self, **kwargs):
225238
226239 path = f"{ self .manager .path } /{ self .get_id ()} /commits"
227240 data_list = self .manager .gitlab .http_list (path , as_list = False , ** kwargs )
241+ if TYPE_CHECKING :
242+ assert isinstance (data_list , gitlab .GitlabList )
228243 manager = ProjectCommitManager (self .manager .gitlab , parent = self .manager ._parent )
229244 return RESTObjectList (manager , ProjectCommit , data_list )
230245
231246 @cli .register_custom_action ("ProjectMergeRequest" )
232247 @exc .on_http_error (exc .GitlabListError )
233- def changes (self , ** kwargs ) :
248+ def changes (self , ** kwargs : Any ) -> Union [ Dict [ str , Any ], requests . Response ] :
234249 """List the merge request changes.
235250
236251 Args:
@@ -248,7 +263,7 @@ def changes(self, **kwargs):
248263
249264 @cli .register_custom_action ("ProjectMergeRequest" , tuple (), ("sha" ,))
250265 @exc .on_http_error (exc .GitlabMRApprovalError )
251- def approve (self , sha = None , ** kwargs ) :
266+ def approve (self , sha : Optional [ str ] = None , ** kwargs : Any ) -> Dict [ str , Any ] :
252267 """Approve the merge request.
253268
254269 Args:
@@ -259,6 +274,9 @@ def approve(self, sha=None, **kwargs):
259274 GitlabAuthenticationError: If authentication is not correct
260275 GitlabMRApprovalError: If the approval failed
261276
277+ Returns:
278+ A dict containing the result.
279+
262280 https://docs.gitlab.com/ee/api/merge_request_approvals.html#approve-merge-request
263281 """
264282 path = f"{ self .manager .path } /{ self .get_id ()} /approve"
@@ -267,11 +285,14 @@ def approve(self, sha=None, **kwargs):
267285 data ["sha" ] = sha
268286
269287 server_data = self .manager .gitlab .http_post (path , post_data = data , ** kwargs )
288+ if TYPE_CHECKING :
289+ assert isinstance (server_data , dict )
270290 self ._update_attrs (server_data )
291+ return server_data
271292
272293 @cli .register_custom_action ("ProjectMergeRequest" )
273294 @exc .on_http_error (exc .GitlabMRApprovalError )
274- def unapprove (self , ** kwargs ) :
295+ def unapprove (self , ** kwargs : Any ) -> None :
275296 """Unapprove the merge request.
276297
277298 Args:
@@ -284,14 +305,16 @@ def unapprove(self, **kwargs):
284305 https://docs.gitlab.com/ee/api/merge_request_approvals.html#unapprove-merge-request
285306 """
286307 path = f"{ self .manager .path } /{ self .get_id ()} /unapprove"
287- data = {}
308+ data : Dict [ str , Any ] = {}
288309
289310 server_data = self .manager .gitlab .http_post (path , post_data = data , ** kwargs )
311+ if TYPE_CHECKING :
312+ assert isinstance (server_data , dict )
290313 self ._update_attrs (server_data )
291314
292315 @cli .register_custom_action ("ProjectMergeRequest" )
293316 @exc .on_http_error (exc .GitlabMRRebaseError )
294- def rebase (self , ** kwargs ) :
317+ def rebase (self , ** kwargs : Any ) -> Union [ Dict [ str , Any ], requests . Response ] :
295318 """Attempt to rebase the source branch onto the target branch
296319
297320 Args:
@@ -302,12 +325,12 @@ def rebase(self, **kwargs):
302325 GitlabMRRebaseError: If rebasing failed
303326 """
304327 path = f"{ self .manager .path } /{ self .get_id ()} /rebase"
305- data = {}
328+ data : Dict [ str , Any ] = {}
306329 return self .manager .gitlab .http_put (path , post_data = data , ** kwargs )
307330
308331 @cli .register_custom_action ("ProjectMergeRequest" )
309332 @exc .on_http_error (exc .GitlabGetError )
310- def merge_ref (self , ** kwargs ) :
333+ def merge_ref (self , ** kwargs : Any ) -> Union [ Dict [ str , Any ], requests . Response ] :
311334 """Attempt to merge changes between source and target branches into
312335 `refs/merge-requests/:iid/merge`.
313336
@@ -332,15 +355,15 @@ def merge_ref(self, **kwargs):
332355 @exc .on_http_error (exc .GitlabMRClosedError )
333356 def merge (
334357 self ,
335- merge_commit_message = None ,
336- should_remove_source_branch = False ,
337- merge_when_pipeline_succeeds = False ,
338- ** kwargs ,
339- ):
358+ merge_commit_message : Optional [ str ] = None ,
359+ should_remove_source_branch : bool = False ,
360+ merge_when_pipeline_succeeds : bool = False ,
361+ ** kwargs : Any ,
362+ ) -> Dict [ str , Any ] :
340363 """Accept the merge request.
341364
342365 Args:
343- merge_commit_message (bool ): Commit message
366+ merge_commit_message (str ): Commit message
344367 should_remove_source_branch (bool): If True, removes the source
345368 branch
346369 merge_when_pipeline_succeeds (bool): Wait for the build to succeed,
@@ -352,7 +375,7 @@ def merge(
352375 GitlabMRClosedError: If the merge failed
353376 """
354377 path = f"{ self .manager .path } /{ self .get_id ()} /merge"
355- data = {}
378+ data : Dict [ str , Any ] = {}
356379 if merge_commit_message :
357380 data ["merge_commit_message" ] = merge_commit_message
358381 if should_remove_source_branch is not None :
@@ -361,7 +384,10 @@ def merge(
361384 data ["merge_when_pipeline_succeeds" ] = True
362385
363386 server_data = self .manager .gitlab .http_put (path , post_data = data , ** kwargs )
387+ if TYPE_CHECKING :
388+ assert isinstance (server_data , dict )
364389 self ._update_attrs (server_data )
390+ return server_data
365391
366392
367393class ProjectMergeRequestManager (CRUDMixin , RESTManager ):
@@ -428,6 +454,11 @@ class ProjectMergeRequestManager(CRUDMixin, RESTManager):
428454 "labels" : types .ListAttribute ,
429455 }
430456
457+ def get (
458+ self , id : Union [str , int ], lazy : bool = False , ** kwargs : Any
459+ ) -> ProjectMergeRequest :
460+ return cast (ProjectMergeRequest , super ().get (id = id , lazy = lazy , ** kwargs ))
461+
431462
432463class ProjectDeploymentMergeRequest (MergeRequest ):
433464 pass
0 commit comments