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,19 @@ class GroupEpicManager(CRUDMixin, RESTManager):
4244 )
4345_types = {"labels" :types .ListAttribute }
4446
47+ def get (
48+ self ,id :Union [str ,int ],lazy :bool = False ,** kwargs :Any
49+ )-> GroupEpic :
50+ return cast (GroupEpic ,super ().get (id = id ,lazy = lazy ,** kwargs ))
51+
4552
4653class GroupEpicIssue (ObjectDeleteMixin ,SaveMixin ,RESTObject ):
4754_id_attr = "epic_issue_id"
55+ # Define type for 'manager' here So mypy won't complain about
56+ # 'self.manager.update()' call in the 'save' method.
57+ manager :"GroupEpicIssueManager"
4858
49- def save (self ,** kwargs ) :
59+ def save (self ,** kwargs : Any ) -> None :
5060"""Save the changes made to the object to the server.
5161
5262 The object is updated to match what the server returns.
@@ -78,7 +88,9 @@ class GroupEpicIssueManager(
7888_update_attrs = RequiredOptional (optional = ("move_before_id" ,"move_after_id" ))
7989
8090@exc .on_http_error (exc .GitlabCreateError )
81- def create (self ,data ,** kwargs ):
91+ def create (
92+ self ,data :Optional [Dict [str ,Any ]]= None ,** kwargs :Any
93+ )-> GroupEpicIssue :
8294"""Create a new object.
8395
8496 Args:
@@ -94,9 +106,13 @@ def create(self, data, **kwargs):
94106 RESTObject: A new instance of the manage object class build with
95107 the data sent by the server
96108 """
109+ if TYPE_CHECKING :
110+ assert data is not None
97111CreateMixin ._check_missing_create_attrs (self ,data )
98112path = f"{ self .path } /{ data .pop ('issue_id' )} "
99113server_data = self .gitlab .http_post (path ,** kwargs )
114+ if TYPE_CHECKING :
115+ assert isinstance (server_data ,dict )
100116# The epic_issue_id attribute doesn't exist when creating the resource,
101117# but is used everywhere elese. Let's create it to be consistent client
102118# side