1+ from typing import Any ,Dict ,List ,Optional ,TYPE_CHECKING
2+
13from gitlab import exceptions as exc
24from gitlab .base import RequiredOptional ,RESTManager ,RESTObject
35from gitlab .mixins import (
@@ -44,7 +46,12 @@ class ProjectApprovalManager(GetWithoutIdMixin, UpdateMixin, RESTManager):
4446_update_uses_post = True
4547
4648@exc .on_http_error (exc .GitlabUpdateError )
47- def set_approvers (self ,approver_ids = None ,approver_group_ids = None ,** kwargs ):
49+ def set_approvers (
50+ self ,
51+ approver_ids :Optional [List [int ]]= None ,
52+ approver_group_ids :Optional [List [int ]]= None ,
53+ ** kwargs :Any ,
54+ )-> Dict [str ,Any ]:
4855"""Change project-level allowed approvers and approver groups.
4956
5057 Args:
@@ -54,13 +61,21 @@ def set_approvers(self, approver_ids=None, approver_group_ids=None, **kwargs):
5461 Raises:
5562 GitlabAuthenticationError: If authentication is not correct
5663 GitlabUpdateError: If the server failed to perform the request
64+
65+ Returns:
66+ A dict value of the result
5767 """
5868approver_ids = approver_ids or []
5969approver_group_ids = approver_group_ids or []
6070
71+ if TYPE_CHECKING :
72+ assert self ._parent is not None
6173path = f"/projects/{ self ._parent .get_id ()} /approvers"
6274data = {"approver_ids" :approver_ids ,"approver_group_ids" :approver_group_ids }
63- self .gitlab .http_put (path ,post_data = data ,** kwargs )
75+ result = self .gitlab .http_put (path ,post_data = data ,** kwargs )
76+ if TYPE_CHECKING :
77+ assert isinstance (result ,dict )
78+ return result
6479
6580
6681class ProjectApprovalRule (SaveMixin ,ObjectDeleteMixin ,RESTObject ):
@@ -93,12 +108,12 @@ class ProjectMergeRequestApprovalManager(GetWithoutIdMixin, UpdateMixin, RESTMan
93108@exc .on_http_error (exc .GitlabUpdateError )
94109def set_approvers (
95110self ,
96- approvals_required ,
97- approver_ids = None ,
98- approver_group_ids = None ,
99- approval_rule_name = "name" ,
100- ** kwargs ,
101- ):
111+ approvals_required : int ,
112+ approver_ids : Optional [ List [ int ]] = None ,
113+ approver_group_ids : Optional [ List [ int ]] = None ,
114+ approval_rule_name : str = "name" ,
115+ ** kwargs : Any ,
116+ )-> RESTObject :
102117"""Change MR-level allowed approvers and approver groups.
103118
104119 Args:
@@ -120,7 +135,11 @@ def set_approvers(
120135"user_ids" :approver_ids ,
121136"group_ids" :approver_group_ids ,
122137 }
123- approval_rules = self ._parent .approval_rules
138+ if TYPE_CHECKING :
139+ assert self ._parent is not None
140+ approval_rules :ProjectMergeRequestApprovalRuleManager = (
141+ self ._parent .approval_rules
142+ )
124143""" update any existing approval rule matching the name"""
125144existing_approval_rules = approval_rules .list ()
126145for ar in existing_approval_rules :
@@ -137,9 +156,10 @@ def set_approvers(
137156class ProjectMergeRequestApprovalRule (SaveMixin ,RESTObject ):
138157_id_attr = "approval_rule_id"
139158_short_print_attr = "approval_rule"
159+ id :int
140160
141161@exc .on_http_error (exc .GitlabUpdateError )
142- def save (self ,** kwargs ) :
162+ def save (self ,** kwargs : Any ) -> None :
143163"""Save the changes made to the object to the server.
144164
145165 The object is updated to match what the server returns.
@@ -185,7 +205,9 @@ class ProjectMergeRequestApprovalRuleManager(
185205optional = ("approval_project_rule_id" ,"user_ids" ,"group_ids" ),
186206 )
187207
188- def create (self ,data ,** kwargs ):
208+ def create (
209+ self ,data :Optional [Dict [str ,Any ]]= None ,** kwargs :Any
210+ )-> RESTObject :
189211"""Create a new object.
190212
191213 Args:
@@ -202,6 +224,8 @@ def create(self, data, **kwargs):
202224 RESTObject: A new instance of the manage object class build with
203225 the data sent by the server
204226 """
227+ if TYPE_CHECKING :
228+ assert data is not None
205229new_data = data .copy ()
206230new_data ["id" ]= self ._from_parent_attrs ["project_id" ]
207231new_data ["merge_request_iid" ]= self ._from_parent_attrs ["mr_iid" ]