Skip to content

Commit 94dcb06

Browse files
chore: add type-hints to gitlab/v4/objects/groups.py
* Add type-hints to gitlab/v4/objects/groups.py * Have share() function update object attributes. * Add 'get()' method so that type-checkers will understand that getting a group is of type Group.
1 parent 32ea954 commit 94dcb06

File tree

2 files changed

+46
-12
lines changed

2 files changed

+46
-12
lines changed

gitlab/v4/objects/groups.py

Lines changed: 44 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, TYPE_CHECKING, 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+
) -> None:
170187
"""Share the group with a group.
171188
172189
Args:
@@ -177,18 +194,24 @@ 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+
Group
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+
server_data = self.manager.gitlab.http_post(path, post_data=data, **kwargs)
208+
if TYPE_CHECKING:
209+
assert isinstance(server_data, dict)
210+
self._update_attrs(server_data)
188211

189212
@cli.register_custom_action("Group", ("group_id",))
190213
@exc.on_http_error(exc.GitlabDeleteError)
191-
def unshare(self, group_id, **kwargs):
214+
def unshare(self, group_id: int, **kwargs: Any) -> None:
192215
"""Delete a shared group link within a group.
193216
194217
Args:
@@ -269,8 +292,18 @@ class GroupManager(CRUDMixin, RESTManager):
269292
)
270293
_types = {"avatar": types.ImageAttribute, "skip_groups": types.ListAttribute}
271294

295+
def get(self, id: Union[str, int], lazy: bool = False, **kwargs: Any) -> Group:
296+
return cast(Group, super().get(id=id, lazy=lazy, **kwargs))
297+
272298
@exc.on_http_error(exc.GitlabImportError)
273-
def import_group(self, file, path, name, parent_id=None, **kwargs):
299+
def import_group(
300+
self,
301+
file: BinaryIO,
302+
path: str,
303+
name: str,
304+
parent_id: Optional[str] = None,
305+
**kwargs: Any,
306+
) -> Union[Dict[str, Any], requests.Response]:
274307
"""Import a group from an archive file.
275308
276309
Args:
@@ -304,7 +337,7 @@ class GroupSubgroup(RESTObject):
304337

305338
class GroupSubgroupManager(ListMixin, RESTManager):
306339
_path = "/groups/%(group_id)s/subgroups"
307-
_obj_cls = GroupSubgroup
340+
_obj_cls: Union[Type["GroupDescendantGroup"], Type[GroupSubgroup]] = GroupSubgroup
308341
_from_parent_attrs = {"group_id": "id"}
309342
_list_filters = (
310343
"skip_groups",
@@ -331,4 +364,4 @@ class GroupDescendantGroupManager(GroupSubgroupManager):
331364
"""
332365

333366
_path = "/groups/%(group_id)s/descendant_groups"
334-
_obj_cls = GroupDescendantGroup
367+
_obj_cls: Type[GroupDescendantGroup] = GroupDescendantGroup

pyproject.toml

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

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

0 commit comments

Comments
 (0)