1+ from typing import Any ,cast ,Dict ,Optional ,TYPE_CHECKING ,Union
2+
13from gitlab import exceptions as exc
24from gitlab import types
35from gitlab .base import RequiredOptional ,RESTManager ,RESTObject
@@ -42,11 +44,17 @@ class GroupEpicManager(CRUDMixin, RESTManager):
4244 )
4345_types = {"labels" :types .ListAttribute }
4446
47+ def get (self ,id :Union [str ,int ],lazy :bool = False ,** kwargs :Any )-> GroupEpic :
48+ return cast (GroupEpic ,super ().get (id = id ,lazy = lazy ,** kwargs ))
49+
4550
4651class GroupEpicIssue (ObjectDeleteMixin ,SaveMixin ,RESTObject ):
4752_id_attr = "epic_issue_id"
53+ # Define type for 'manager' here So mypy won't complain about
54+ # 'self.manager.update()' call in the 'save' method.
55+ manager :"GroupEpicIssueManager"
4856
49- def save (self ,** kwargs ) :
57+ def save (self ,** kwargs : Any ) -> None :
5058"""Save the changes made to the object to the server.
5159
5260 The object is updated to match what the server returns.
@@ -78,7 +86,9 @@ class GroupEpicIssueManager(
7886_update_attrs = RequiredOptional (optional = ("move_before_id" ,"move_after_id" ))
7987
8088@exc .on_http_error (exc .GitlabCreateError )
81- def create (self ,data ,** kwargs ):
89+ def create (
90+ self ,data :Optional [Dict [str ,Any ]]= None ,** kwargs :Any
91+ )-> GroupEpicIssue :
8292"""Create a new object.
8393
8494 Args:
@@ -94,9 +104,13 @@ def create(self, data, **kwargs):
94104 RESTObject: A new instance of the manage object class build with
95105 the data sent by the server
96106 """
107+ if TYPE_CHECKING :
108+ assert data is not None
97109CreateMixin ._check_missing_create_attrs (self ,data )
98110path = f"{ self .path } /{ data .pop ('issue_id' )} "
99111server_data = self .gitlab .http_post (path ,** kwargs )
112+ if TYPE_CHECKING :
113+ assert isinstance (server_data ,dict )
100114# The epic_issue_id attribute doesn't exist when creating the resource,
101115# but is used everywhere elese. Let's create it to be consistent client
102116# side