Skip to content

Commit f91ab03

Browse files
chore: add type-hints to gitlab/v4/objects/groups.py
* Add type-hints to gitlab/v4/objects/groups.py * Add return value to share() function as GitLab docs show it returns a value. * Add 'get()' method so that type-checkers will understand that getting a group is of type Group.
1 parent 4ab9e92 commit f91ab03

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

gitlab/v4/objects/groups.py

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
from typing import Any, BinaryIO, cast, Dict, List, Optional, Type, Union
2+
3+
import requests
4+
5+
import gitlab
16
from gitlab import cli
27
from gitlab import exceptions as exc
38
from 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
"""
181201
path = f"/groups/{self.get_id()}/share"
182202
data = {
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

305335
class 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

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ ignore_errors = true
2323

2424
[[tool.mypy.overrides]] # Overrides to negate above patterns
2525
module = [
26+
"gitlab.v4.objects.groups",
2627
"gitlab.v4.objects.projects",
27-
"gitlab.v4.objects.users"
28+
"gitlab.v4.objects.users",
2829
]
2930
ignore_errors = false
3031

0 commit comments

Comments
 (0)