summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn L. Villalovos <john@sodarock.com>2021-06-13 14:40:46 -0700
committerJohn L. Villalovos <john@sodarock.com>2021-09-08 07:18:48 -0700
commitd8de4dc373dc608be6cf6ba14a2acc7efd3fa7a7 (patch)
treed587e4cb383b136cd9947377e43bd52900121994
parentc9b5d3bac8f7c1f779dd57653f718dd0fac4db4b (diff)
downloadgitlab-d8de4dc373dc608be6cf6ba14a2acc7efd3fa7a7.tar.gz
chore: convert to using type-annotations for managers
Convert our manager usage to be done via type annotations. Now to define a manager to be used in a RESTObject subclass can simply do: class ExampleClass(CRUDMixin, RESTObject): my_manager: MyManager Any type-annotation that annotates it to be of type *Manager (with the exception of RESTManager) will cause the manager to be created on the object.
-rw-r--r--gitlab/base.py18
-rw-r--r--gitlab/v4/objects/boards.py2
-rw-r--r--gitlab/v4/objects/commits.py5
-rw-r--r--gitlab/v4/objects/container_registry.py1
-rw-r--r--gitlab/v4/objects/deployments.py1
-rw-r--r--gitlab/v4/objects/discussions.py4
-rw-r--r--gitlab/v4/objects/epics.py4
-rw-r--r--gitlab/v4/objects/groups.py29
-rw-r--r--gitlab/v4/objects/issues.py9
-rw-r--r--gitlab/v4/objects/members.py1
-rw-r--r--gitlab/v4/objects/merge_requests.py12
-rw-r--r--gitlab/v4/objects/notes.py3
-rw-r--r--gitlab/v4/objects/packages.py1
-rw-r--r--gitlab/v4/objects/pipelines.py7
-rw-r--r--gitlab/v4/objects/projects.py57
-rw-r--r--gitlab/v4/objects/releases.py1
-rw-r--r--gitlab/v4/objects/runners.py1
-rw-r--r--gitlab/v4/objects/snippets.py5
-rw-r--r--gitlab/v4/objects/users.py20
-rw-r--r--tests/unit/objects/test_type_hints.py74
-rw-r--r--tests/unit/test_base.py2
21 files changed, 15 insertions, 242 deletions
diff --git a/gitlab/base.py b/gitlab/base.py
index 361832e..bc96e0f 100644
--- a/gitlab/base.py
+++ b/gitlab/base.py
@@ -49,7 +49,6 @@ class RESTObject(object):
_parent_attrs: Dict[str, Any]
_short_print_attr: Optional[str] = None
_updated_attrs: Dict[str, Any]
- _managers: Optional[Iterable[Tuple[str, str]]] = None
manager: "RESTManager"
def __init__(self, manager: "RESTManager", attrs: Dict[str, Any]) -> None:
@@ -151,10 +150,19 @@ class RESTObject(object):
return hash(self.get_id())
def _create_managers(self) -> None:
- if self._managers is None:
- return
-
- for attr, cls_name in self._managers:
+ # NOTE(jlvillal): We are creating our managers by looking at the class
+ # annotations. If an attribute is annotated as being a *Manager type
+ # then we create the manager and assign it to the attribute.
+ for attr, annotation in sorted(self.__annotations__.items()):
+ if not isinstance(annotation, (type, str)):
+ continue
+ if isinstance(annotation, type):
+ cls_name = annotation.__name__
+ else:
+ cls_name = annotation
+ # All *Manager classes are used except for the base "RESTManager" class
+ if cls_name == "RESTManager" or not cls_name.endswith("Manager"):
+ continue
cls = getattr(self._module, cls_name)
manager = cls(self.manager.gitlab, parent=self)
# Since we have our own __setattr__ method, we can't use setattr()
diff --git a/gitlab/v4/objects/boards.py b/gitlab/v4/objects/boards.py
index ef8d040..8b2959d 100644
--- a/gitlab/v4/objects/boards.py
+++ b/gitlab/v4/objects/boards.py
@@ -27,7 +27,6 @@ class GroupBoardListManager(CRUDMixin, RESTManager):
class GroupBoard(SaveMixin, ObjectDeleteMixin, RESTObject):
lists: GroupBoardListManager
- _managers = (("lists", "GroupBoardListManager"),)
class GroupBoardManager(CRUDMixin, RESTManager):
@@ -51,7 +50,6 @@ class ProjectBoardListManager(CRUDMixin, RESTManager):
class ProjectBoard(SaveMixin, ObjectDeleteMixin, RESTObject):
lists: ProjectBoardListManager
- _managers = (("lists", "ProjectBoardListManager"),)
class ProjectBoardManager(CRUDMixin, RESTManager):
diff --git a/gitlab/v4/objects/commits.py b/gitlab/v4/objects/commits.py
index 0ddff9d..05b55b0 100644
--- a/gitlab/v4/objects/commits.py
+++ b/gitlab/v4/objects/commits.py
@@ -21,11 +21,6 @@ class ProjectCommit(RESTObject):
comments: "ProjectCommitCommentManager"
discussions: ProjectCommitDiscussionManager
statuses: "ProjectCommitStatusManager"
- _managers = (
- ("comments", "ProjectCommitCommentManager"),
- ("discussions", "ProjectCommitDiscussionManager"),
- ("statuses", "ProjectCommitStatusManager"),
- )
@cli.register_custom_action("ProjectCommit")
@exc.on_http_error(exc.GitlabGetError)
diff --git a/gitlab/v4/objects/container_registry.py b/gitlab/v4/objects/container_registry.py
index 39f1602..8164e17 100644
--- a/gitlab/v4/objects/container_registry.py
+++ b/gitlab/v4/objects/container_registry.py
@@ -13,7 +13,6 @@ __all__ = [
class ProjectRegistryRepository(ObjectDeleteMixin, RESTObject):
tags: "ProjectRegistryTagManager"
- _managers = (("tags", "ProjectRegistryTagManager"),)
class ProjectRegistryRepositoryManager(DeleteMixin, ListMixin, RESTManager):
diff --git a/gitlab/v4/objects/deployments.py b/gitlab/v4/objects/deployments.py
index 73f9672..11c60d1 100644
--- a/gitlab/v4/objects/deployments.py
+++ b/gitlab/v4/objects/deployments.py
@@ -11,7 +11,6 @@ __all__ = [
class ProjectDeployment(SaveMixin, RESTObject):
mergerequests: ProjectDeploymentMergeRequestManager
- _managers = (("mergerequests", "ProjectDeploymentMergeRequestManager"),)
class ProjectDeploymentManager(RetrieveMixin, CreateMixin, UpdateMixin, RESTManager):
diff --git a/gitlab/v4/objects/discussions.py b/gitlab/v4/objects/discussions.py
index 19d1a06..ae7a4d5 100644
--- a/gitlab/v4/objects/discussions.py
+++ b/gitlab/v4/objects/discussions.py
@@ -22,7 +22,6 @@ __all__ = [
class ProjectCommitDiscussion(RESTObject):
notes: ProjectCommitDiscussionNoteManager
- _managers = (("notes", "ProjectCommitDiscussionNoteManager"),)
class ProjectCommitDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):
@@ -34,7 +33,6 @@ class ProjectCommitDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):
class ProjectIssueDiscussion(RESTObject):
notes: ProjectIssueDiscussionNoteManager
- _managers = (("notes", "ProjectIssueDiscussionNoteManager"),)
class ProjectIssueDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):
@@ -46,7 +44,6 @@ class ProjectIssueDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):
class ProjectMergeRequestDiscussion(SaveMixin, RESTObject):
notes: ProjectMergeRequestDiscussionNoteManager
- _managers = (("notes", "ProjectMergeRequestDiscussionNoteManager"),)
class ProjectMergeRequestDiscussionManager(
@@ -63,7 +60,6 @@ class ProjectMergeRequestDiscussionManager(
class ProjectSnippetDiscussion(RESTObject):
notes: ProjectSnippetDiscussionNoteManager
- _managers = (("notes", "ProjectSnippetDiscussionNoteManager"),)
class ProjectSnippetDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):
diff --git a/gitlab/v4/objects/epics.py b/gitlab/v4/objects/epics.py
index 4ee3611..90dc6ad 100644
--- a/gitlab/v4/objects/epics.py
+++ b/gitlab/v4/objects/epics.py
@@ -26,10 +26,6 @@ class GroupEpic(ObjectDeleteMixin, SaveMixin, RESTObject):
issues: "GroupEpicIssueManager"
resourcelabelevents: GroupEpicResourceLabelEventManager
- _managers = (
- ("issues", "GroupEpicIssueManager"),
- ("resourcelabelevents", "GroupEpicResourceLabelEventManager"),
- )
class GroupEpicManager(CRUDMixin, RESTManager):
diff --git a/gitlab/v4/objects/groups.py b/gitlab/v4/objects/groups.py
index 67fe91c..7de4f84 100644
--- a/gitlab/v4/objects/groups.py
+++ b/gitlab/v4/objects/groups.py
@@ -71,35 +71,6 @@ class Group(SaveMixin, ObjectDeleteMixin, RESTObject):
subgroups: "GroupSubgroupManager"
variables: GroupVariableManager
wikis: GroupWikiManager
- _managers = (
- ("accessrequests", "GroupAccessRequestManager"),
- ("audit_events", "GroupAuditEventManager"),
- ("badges", "GroupBadgeManager"),
- ("billable_members", "GroupBillableMemberManager"),
- ("boards", "GroupBoardManager"),
- ("customattributes", "GroupCustomAttributeManager"),
- ("descendant_groups", "GroupDescendantGroupManager"),
- ("exports", "GroupExportManager"),
- ("epics", "GroupEpicManager"),
- ("hooks", "GroupHookManager"),
- ("imports", "GroupImportManager"),
- ("issues", "GroupIssueManager"),
- ("issues_statistics", "GroupIssuesStatisticsManager"),
- ("labels", "GroupLabelManager"),
- ("members", "GroupMemberManager"),
- ("members_all", "GroupMemberAllManager"),
- ("mergerequests", "GroupMergeRequestManager"),
- ("milestones", "GroupMilestoneManager"),
- ("notificationsettings", "GroupNotificationSettingsManager"),
- ("packages", "GroupPackageManager"),
- ("projects", "GroupProjectManager"),
- ("runners", "GroupRunnerManager"),
- ("subgroups", "GroupSubgroupManager"),
- ("variables", "GroupVariableManager"),
- ("clusters", "GroupClusterManager"),
- ("deploytokens", "GroupDeployTokenManager"),
- ("wikis", "GroupWikiManager"),
- )
@cli.register_custom_action("Group", ("to_project_id",))
@exc.on_http_error(exc.GitlabTransferProjectError)
diff --git a/gitlab/v4/objects/issues.py b/gitlab/v4/objects/issues.py
index cc1ac3f..9272908 100644
--- a/gitlab/v4/objects/issues.py
+++ b/gitlab/v4/objects/issues.py
@@ -113,15 +113,6 @@ class ProjectIssue(
resourcelabelevents: ProjectIssueResourceLabelEventManager
resourcemilestoneevents: ProjectIssueResourceMilestoneEventManager
resourcestateevents: ProjectIssueResourceStateEventManager
- _managers = (
- ("awardemojis", "ProjectIssueAwardEmojiManager"),
- ("discussions", "ProjectIssueDiscussionManager"),
- ("links", "ProjectIssueLinkManager"),
- ("notes", "ProjectIssueNoteManager"),
- ("resourcelabelevents", "ProjectIssueResourceLabelEventManager"),
- ("resourcemilestoneevents", "ProjectIssueResourceMilestoneEventManager"),
- ("resourcestateevents", "ProjectIssueResourceStateEventManager"),
- )
@cli.register_custom_action("ProjectIssue", ("to_project_id",))
@exc.on_http_error(exc.GitlabUpdateError)
diff --git a/gitlab/v4/objects/members.py b/gitlab/v4/objects/members.py
index 3812bcb..b2f4c07 100644
--- a/gitlab/v4/objects/members.py
+++ b/gitlab/v4/objects/members.py
@@ -45,7 +45,6 @@ class GroupBillableMember(ObjectDeleteMixin, RESTObject):
_short_print_attr = "username"
memberships: "GroupBillableMemberMembershipManager"
- _managers = (("memberships", "GroupBillableMemberMembershipManager"),)
class GroupBillableMemberManager(ListMixin, DeleteMixin, RESTManager):
diff --git a/gitlab/v4/objects/merge_requests.py b/gitlab/v4/objects/merge_requests.py
index 63f2786..4def98c 100644
--- a/gitlab/v4/objects/merge_requests.py
+++ b/gitlab/v4/objects/merge_requests.py
@@ -149,18 +149,6 @@ class ProjectMergeRequest(
resourcelabelevents: ProjectMergeRequestResourceLabelEventManager
resourcemilestoneevents: ProjectMergeRequestResourceMilestoneEventManager
resourcestateevents: ProjectMergeRequestResourceStateEventManager
- _managers = (
- ("approval_rules", "ProjectMergeRequestApprovalRuleManager"),
- ("approvals", "ProjectMergeRequestApprovalManager"),
- ("awardemojis", "ProjectMergeRequestAwardEmojiManager"),
- ("diffs", "ProjectMergeRequestDiffManager"),
- ("discussions", "ProjectMergeRequestDiscussionManager"),
- ("notes", "ProjectMergeRequestNoteManager"),
- ("pipelines", "ProjectMergeRequestPipelineManager"),
- ("resourcelabelevents", "ProjectMergeRequestResourceLabelEventManager"),
- ("resourcemilestoneevents", "ProjectMergeRequestResourceMilestoneEventManager"),
- ("resourcestateevents", "ProjectMergeRequestResourceStateEventManager"),
- )
@cli.register_custom_action("ProjectMergeRequest")
@exc.on_http_error(exc.GitlabMROnBuildSuccessError)
diff --git a/gitlab/v4/objects/notes.py b/gitlab/v4/objects/notes.py
index b8a3215..cbd237e 100644
--- a/gitlab/v4/objects/notes.py
+++ b/gitlab/v4/objects/notes.py
@@ -72,7 +72,6 @@ class ProjectCommitDiscussionNoteManager(
class ProjectIssueNote(SaveMixin, ObjectDeleteMixin, RESTObject):
awardemojis: ProjectIssueNoteAwardEmojiManager
- _managers = (("awardemojis", "ProjectIssueNoteAwardEmojiManager"),)
class ProjectIssueNoteManager(CRUDMixin, RESTManager):
@@ -106,7 +105,6 @@ class ProjectIssueDiscussionNoteManager(
class ProjectMergeRequestNote(SaveMixin, ObjectDeleteMixin, RESTObject):
awardemojis: ProjectMergeRequestNoteAwardEmojiManager
- _managers = (("awardemojis", "ProjectMergeRequestNoteAwardEmojiManager"),)
class ProjectMergeRequestNoteManager(CRUDMixin, RESTManager):
@@ -140,7 +138,6 @@ class ProjectMergeRequestDiscussionNoteManager(
class ProjectSnippetNote(SaveMixin, ObjectDeleteMixin, RESTObject):
awardemojis: ProjectMergeRequestNoteAwardEmojiManager
- _managers = (("awardemojis", "ProjectMergeRequestNoteAwardEmojiManager"),)
class ProjectSnippetNoteManager(CRUDMixin, RESTManager):
diff --git a/gitlab/v4/objects/packages.py b/gitlab/v4/objects/packages.py
index fee043a..d7fe9dc 100644
--- a/gitlab/v4/objects/packages.py
+++ b/gitlab/v4/objects/packages.py
@@ -144,7 +144,6 @@ class GroupPackageManager(ListMixin, RESTManager):
class ProjectPackage(ObjectDeleteMixin, RESTObject):
package_files: "ProjectPackageFileManager"
- _managers = (("package_files", "ProjectPackageFileManager"),)
class ProjectPackageManager(ListMixin, GetMixin, DeleteMixin, RESTManager):
diff --git a/gitlab/v4/objects/pipelines.py b/gitlab/v4/objects/pipelines.py
index bf41ce1..d604a3a 100644
--- a/gitlab/v4/objects/pipelines.py
+++ b/gitlab/v4/objects/pipelines.py
@@ -78,12 +78,6 @@ class ProjectPipeline(RefreshMixin, ObjectDeleteMixin, RESTObject):
jobs: "ProjectPipelineJobManager"
test_report: "ProjectPipelineTestReportManager"
variables: "ProjectPipelineVariableManager"
- _managers = (
- ("bridges", "ProjectPipelineBridgeManager"),
- ("jobs", "ProjectPipelineJobManager"),
- ("test_report", "ProjectPipelineTestReportManager"),
- ("variables", "ProjectPipelineVariableManager"),
- )
@cli.register_custom_action("ProjectPipeline")
@exc.on_http_error(exc.GitlabPipelineCancelError)
@@ -204,7 +198,6 @@ class ProjectPipelineScheduleVariableManager(
class ProjectPipelineSchedule(SaveMixin, ObjectDeleteMixin, RESTObject):
variables: ProjectPipelineScheduleVariableManager
- _managers = (("variables", "ProjectPipelineScheduleVariableManager"),)
@cli.register_custom_action("ProjectPipelineSchedule")
@exc.on_http_error(exc.GitlabOwnershipError)
diff --git a/gitlab/v4/objects/projects.py b/gitlab/v4/objects/projects.py
index 71d4564..8392dda 100644
--- a/gitlab/v4/objects/projects.py
+++ b/gitlab/v4/objects/projects.py
@@ -135,7 +135,7 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO
imports: ProjectImportManager
issues: ProjectIssueManager
issues_statistics: ProjectIssuesStatisticsManager
- issuesstatistics: ProjectIssuesStatisticsManager
+ issuesstatistics: ProjectIssuesStatisticsManager # Deprecated
jobs: ProjectJobManager
keys: ProjectKeyManager
labels: ProjectLabelManager
@@ -164,61 +164,6 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO
variables: ProjectVariableManager
wikis: ProjectWikiManager
- _managers = (
- ("access_tokens", "ProjectAccessTokenManager"),
- ("accessrequests", "ProjectAccessRequestManager"),
- ("additionalstatistics", "ProjectAdditionalStatisticsManager"),
- ("approvalrules", "ProjectApprovalRuleManager"),
- ("approvals", "ProjectApprovalManager"),
- ("audit_events", "ProjectAuditEventManager"),
- ("badges", "ProjectBadgeManager"),
- ("boards", "ProjectBoardManager"),
- ("branches", "ProjectBranchManager"),
- ("clusters", "ProjectClusterManager"),
- ("commits", "ProjectCommitManager"),
- ("customattributes", "ProjectCustomAttributeManager"),
- ("deployments", "ProjectDeploymentManager"),
- ("deploytokens", "ProjectDeployTokenManager"),
- ("environments", "ProjectEnvironmentManager"),
- ("events", "ProjectEventManager"),
- ("exports", "ProjectExportManager"),
- ("files", "ProjectFileManager"),
- ("forks", "ProjectForkManager"),
- ("generic_packages", "GenericPackageManager"),
- ("hooks", "ProjectHookManager"),
- ("imports", "ProjectImportManager"),
- ("issues", "ProjectIssueManager"),
- ("issues_statistics", "ProjectIssuesStatisticsManager"),
- ("issuesstatistics", "ProjectIssuesStatisticsManager"), # Deprecated
- ("jobs", "ProjectJobManager"),
- ("keys", "ProjectKeyManager"),
- ("labels", "ProjectLabelManager"),
- ("members", "ProjectMemberManager"),
- ("members_all", "ProjectMemberAllManager"),
- ("mergerequests", "ProjectMergeRequestManager"),
- ("milestones", "ProjectMilestoneManager"),
- ("notes", "ProjectNoteManager"),
- ("notificationsettings", "ProjectNotificationSettingsManager"),
- ("packages", "ProjectPackageManager"),
- ("pagesdomains", "ProjectPagesDomainManager"),
- ("pipelines", "ProjectPipelineManager"),
- ("pipelineschedules", "ProjectPipelineScheduleManager"),
- ("protectedbranches", "ProjectProtectedBranchManager"),
- ("protectedtags", "ProjectProtectedTagManager"),
- ("pushrules", "ProjectPushRulesManager"),
- ("releases", "ProjectReleaseManager"),
- ("remote_mirrors", "ProjectRemoteMirrorManager"),
- ("repositories", "ProjectRegistryRepositoryManager"),
- ("runners", "ProjectRunnerManager"),
- ("services", "ProjectServiceManager"),
- ("snippets", "ProjectSnippetManager"),
- ("tags", "ProjectTagManager"),
- ("triggers", "ProjectTriggerManager"),
- ("users", "ProjectUserManager"),
- ("variables", "ProjectVariableManager"),
- ("wikis", "ProjectWikiManager"),
- )
-
@cli.register_custom_action("Project", ("forked_from_id",))
@exc.on_http_error(exc.GitlabCreateError)
def create_fork_relation(self, forked_from_id: int, **kwargs: Any) -> None:
diff --git a/gitlab/v4/objects/releases.py b/gitlab/v4/objects/releases.py
index fb7f4f0..2af3248 100644
--- a/gitlab/v4/objects/releases.py
+++ b/gitlab/v4/objects/releases.py
@@ -13,7 +13,6 @@ class ProjectRelease(SaveMixin, RESTObject):
_id_attr = "tag_name"
links: "ProjectReleaseLinkManager"
- _managers = (("links", "ProjectReleaseLinkManager"),)
class ProjectReleaseManager(CRUDMixin, RESTManager):
diff --git a/gitlab/v4/objects/runners.py b/gitlab/v4/objects/runners.py
index c9e93b8..a32dc84 100644
--- a/gitlab/v4/objects/runners.py
+++ b/gitlab/v4/objects/runners.py
@@ -35,7 +35,6 @@ class RunnerJobManager(ListMixin, RESTManager):
class Runner(SaveMixin, ObjectDeleteMixin, RESTObject):
jobs: RunnerJobManager
- _managers = (("jobs", "RunnerJobManager"),)
class RunnerManager(CRUDMixin, RESTManager):
diff --git a/gitlab/v4/objects/snippets.py b/gitlab/v4/objects/snippets.py
index 161129d..164b30c 100644
--- a/gitlab/v4/objects/snippets.py
+++ b/gitlab/v4/objects/snippets.py
@@ -81,11 +81,6 @@ class ProjectSnippet(UserAgentDetailMixin, SaveMixin, ObjectDeleteMixin, RESTObj
awardemojis: ProjectSnippetAwardEmojiManager
discussions: ProjectSnippetDiscussionManager
notes: ProjectSnippetNoteManager
- _managers = (
- ("awardemojis", "ProjectSnippetAwardEmojiManager"),
- ("discussions", "ProjectSnippetDiscussionManager"),
- ("notes", "ProjectSnippetNoteManager"),
- )
@cli.register_custom_action("ProjectSnippet")
@exc.on_http_error(exc.GitlabGetError)
diff --git a/gitlab/v4/objects/users.py b/gitlab/v4/objects/users.py
index ad907df..c0f8745 100644
--- a/gitlab/v4/objects/users.py
+++ b/gitlab/v4/objects/users.py
@@ -102,12 +102,6 @@ class CurrentUser(RESTObject):
gpgkeys: CurrentUserGPGKeyManager
keys: CurrentUserKeyManager
status: CurrentUserStatusManager
- _managers = (
- ("emails", "CurrentUserEmailManager"),
- ("gpgkeys", "CurrentUserGPGKeyManager"),
- ("keys", "CurrentUserKeyManager"),
- ("status", "CurrentUserStatusManager"),
- )
class CurrentUserManager(GetWithoutIdMixin, RESTManager):
@@ -130,20 +124,6 @@ class User(SaveMixin, ObjectDeleteMixin, RESTObject):
memberships: "UserMembershipManager"
projects: "UserProjectManager"
status: "UserStatusManager"
- _managers = (
- ("customattributes", "UserCustomAttributeManager"),
- ("emails", "UserEmailManager"),
- ("events", "UserEventManager"),
- ("followers_users", "UserFollowersManager"),
- ("following_users", "UserFollowingManager"),
- ("gpgkeys", "UserGPGKeyManager"),
- ("identityproviders", "UserIdentityProviderManager"),
- ("impersonationtokens", "UserImpersonationTokenManager"),
- ("keys", "UserKeyManager"),
- ("memberships", "UserMembershipManager"),
- ("projects", "UserProjectManager"),
- ("status", "UserStatusManager"),
- )
@cli.register_custom_action("User")
@exc.on_http_error(exc.GitlabBlockError)
diff --git a/tests/unit/objects/test_type_hints.py b/tests/unit/objects/test_type_hints.py
deleted file mode 100644
index 6742698..0000000
--- a/tests/unit/objects/test_type_hints.py
+++ /dev/null
@@ -1,74 +0,0 @@
-import inspect
-from typing import Dict
-
-import gitlab
-import gitlab.v4.objects
-
-
-def test_managers_annotated():
- """Ensure _managers have been type annotated"""
-
- failed_messages = []
- for module_name, module_value in inspect.getmembers(gitlab.v4.objects):
- if not inspect.ismodule(module_value):
- # We only care about the modules
- continue
- # Iterate through all the classes in our module
- for class_name, class_value in sorted(inspect.getmembers(module_value)):
- if not inspect.isclass(class_value):
- continue
-
- # Ignore imported classes from gitlab.base
- if class_value.__module__ == "gitlab.base":
- continue
-
- # A '_managers' attribute is only on a RESTObject
- if not issubclass(class_value, gitlab.base.RESTObject):
- continue
-
- if class_value._managers is None:
- continue
-
- # Collect all of our annotations into a Dict[str, str]
- annotations: Dict[str, str] = {}
- for attr, annotation in sorted(class_value.__annotations__.items()):
- if isinstance(annotation, type):
- type_name = annotation.__name__
- else:
- type_name = annotation
- annotations[attr] = type_name
-
- for attr, manager_class_name in sorted(class_value._managers):
- # All of our managers need to end with "Manager" for example
- # "ProjectManager"
- if not manager_class_name.endswith("Manager"):
- failed_messages.append(
- (
- f"ERROR: Class: {class_name!r} for '_managers' attribute "
- f"{attr!r} The specified manager class "
- f"{manager_class_name!r} does not have a name ending in "
- f"'Manager'. Manager class names are required to end in "
- f"'Manager'"
- )
- )
- continue
- if attr not in annotations:
- failed_messages.append(
- (
- f"ERROR: Class: {class_name!r}: Type annotation missing "
- f"for '_managers' attribute {attr!r}"
- )
- )
- continue
- if manager_class_name != annotations[attr]:
- failed_messages.append(
- (
- f"ERROR: Class: {class_name!r}: Type annotation mismatch "
- f"for '_managers' attribute {attr!r}. Type annotation is "
- f"{annotations[attr]!r} while '_managers' is "
- f"{manager_class_name!r}"
- )
- )
-
- failed_msg = "\n".join(failed_messages)
- assert not failed_messages, failed_msg
diff --git a/tests/unit/test_base.py b/tests/unit/test_base.py
index 8872dbd..cccdfad 100644
--- a/tests/unit/test_base.py
+++ b/tests/unit/test_base.py
@@ -147,7 +147,7 @@ class TestRESTObject:
def test_create_managers(self, fake_gitlab, fake_manager):
class ObjectWithManager(FakeObject):
- _managers = (("fakes", "FakeManager"),)
+ fakes: "FakeManager"
obj = ObjectWithManager(fake_manager, {"foo": "bar"})
obj.id = 42