1+ from typing import Any ,BinaryIO ,cast ,Dict ,List ,Optional ,Type ,Union
2+
3+ import requests
4+
5+ import gitlab
16from gitlab import cli
27from gitlab import exceptions as exc
38from gitlab import types
@@ -74,7 +79,7 @@ class Group(SaveMixin, ObjectDeleteMixin, RESTObject):
7479
7580@cli .register_custom_action ("Group" , ("project_id" ,))
7681@exc .on_http_error (exc .GitlabTransferProjectError )
77- def transfer_project (self ,project_id ,** kwargs ) :
82+ def transfer_project (self ,project_id : int ,** kwargs : Any ) -> None :
7883"""Transfer a project to this group.
7984
8085 Args:
@@ -90,7 +95,9 @@ def transfer_project(self, project_id, **kwargs):
9095
9196@cli .register_custom_action ("Group" , ("scope" ,"search" ))
9297@exc .on_http_error (exc .GitlabSearchError )
93- def search (self ,scope ,search ,** kwargs ):
98+ def search (
99+ self ,scope :str ,search :str ,** kwargs :Any
100+ )-> Union [gitlab .GitlabList ,List [Dict [str ,Any ]]]:
94101"""Search the group resources matching the provided string.'
95102
96103 Args:
@@ -111,7 +118,9 @@ def search(self, scope, search, **kwargs):
111118
112119@cli .register_custom_action ("Group" , ("cn" ,"group_access" ,"provider" ))
113120@exc .on_http_error (exc .GitlabCreateError )
114- def add_ldap_group_link (self ,cn ,group_access ,provider ,** kwargs ):
121+ def add_ldap_group_link (
122+ self ,cn :str ,group_access :int ,provider :str ,** kwargs :Any
123+ )-> None :
115124"""Add an LDAP group link.
116125
117126 Args:
@@ -131,7 +140,9 @@ def add_ldap_group_link(self, cn, group_access, provider, **kwargs):
131140
132141@cli .register_custom_action ("Group" , ("cn" ,), ("provider" ,))
133142@exc .on_http_error (exc .GitlabDeleteError )
134- def delete_ldap_group_link (self ,cn ,provider = None ,** kwargs ):
143+ def delete_ldap_group_link (
144+ self ,cn :str ,provider :Optional [str ]= None ,** kwargs :Any
145+ )-> None :
135146"""Delete an LDAP group link.
136147
137148 Args:
@@ -151,7 +162,7 @@ def delete_ldap_group_link(self, cn, provider=None, **kwargs):
151162
152163@cli .register_custom_action ("Group" )
153164@exc .on_http_error (exc .GitlabCreateError )
154- def ldap_sync (self ,** kwargs ) :
165+ def ldap_sync (self ,** kwargs : Any ) -> None :
155166"""Sync LDAP groups.
156167
157168 Args:
@@ -166,7 +177,13 @@ def ldap_sync(self, **kwargs):
166177
167178@cli .register_custom_action ("Group" , ("group_id" ,"group_access" ), ("expires_at" ,))
168179@exc .on_http_error (exc .GitlabCreateError )
169- def share (self ,group_id ,group_access ,expires_at = None ,** kwargs ):
180+ def share (
181+ self ,
182+ group_id :int ,
183+ group_access :int ,
184+ expires_at :Optional [str ]= None ,
185+ ** kwargs :Any ,
186+ )-> Union [Dict [str ,Any ],requests .Response ]:
170187"""Share the group with a group.
171188
172189 Args:
@@ -177,18 +194,21 @@ def share(self, group_id, group_access, expires_at=None, **kwargs):
177194 Raises:
178195 GitlabAuthenticationError: If authentication is not correct
179196 GitlabCreateError: If the server failed to perform the request
197+
198+ Returns:
199+ dict: A representation of the group details.
180200 """
181201path = f"/groups/{ self .get_id ()} /share"
182202data = {
183203"group_id" :group_id ,
184204"group_access" :group_access ,
185205"expires_at" :expires_at ,
186206 }
187- self .manager .gitlab .http_post (path ,post_data = data ,** kwargs )
207+ return self .manager .gitlab .http_post (path ,post_data = data ,** kwargs )
188208
189209@cli .register_custom_action ("Group" , ("group_id" ,))
190210@exc .on_http_error (exc .GitlabDeleteError )
191- def unshare (self ,group_id ,** kwargs ) :
211+ def unshare (self ,group_id : int ,** kwargs : Any ) -> None :
192212"""Delete a shared group link within a group.
193213
194214 Args:
@@ -269,8 +289,18 @@ class GroupManager(CRUDMixin, RESTManager):
269289 )
270290_types = {"avatar" :types .ImageAttribute ,"skip_groups" :types .ListAttribute }
271291
292+ def get (self ,id :Union [str ,int ],lazy :bool = False ,** kwargs :Any )-> Group :
293+ return cast (Group ,super ().get (id = id ,lazy = lazy ,** kwargs ))
294+
272295@exc .on_http_error (exc .GitlabImportError )
273- def import_group (self ,file ,path ,name ,parent_id = None ,** kwargs ):
296+ def import_group (
297+ self ,
298+ file :BinaryIO ,
299+ path :str ,
300+ name :str ,
301+ parent_id :Optional [str ]= None ,
302+ ** kwargs :Any ,
303+ )-> Union [Dict [str ,Any ],requests .Response ]:
274304"""Import a group from an archive file.
275305
276306 Args:
@@ -304,7 +334,7 @@ class GroupSubgroup(RESTObject):
304334
305335class GroupSubgroupManager (ListMixin ,RESTManager ):
306336_path = "/groups/%(group_id)s/subgroups"
307- _obj_cls = GroupSubgroup
337+ _obj_cls : Union [ Type [ "GroupDescendantGroup" ], Type [ GroupSubgroup ]] = GroupSubgroup
308338_from_parent_attrs = {"group_id" :"id" }
309339_list_filters = (
310340"skip_groups" ,
@@ -331,4 +361,4 @@ class GroupDescendantGroupManager(GroupSubgroupManager):
331361 """
332362
333363_path = "/groups/%(group_id)s/descendant_groups"
334- _obj_cls = GroupDescendantGroup
364+ _obj_cls : Type [ GroupDescendantGroup ] = GroupDescendantGroup