Skip to content

chore: improve type-hinting for managers #1512

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions gitlab/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,22 @@ def __hash__(self) -> int:
return hash(self.get_id())

def _create_managers(self) -> None:
managers = getattr(self, "_managers", None)
if 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()
self.__dict__[attr] = manager

def _update_attrs(self, new_attrs: Dict[str, Any]) -> None:
Expand Down
5 changes: 4 additions & 1 deletion gitlab/v4/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,10 @@ def do_custom(self) -> Any:
def do_project_export_download(self) -> None:
try:
project = self.gl.projects.get(int(self.args["project_id"]), lazy=True)
data = project.exports.get().download()
export_status = project.exports.get()
if TYPE_CHECKING:
assert export_status is not None
data = export_status.download()
sys.stdout.buffer.write(data)

except Exception as e:
Expand Down
4 changes: 2 additions & 2 deletions gitlab/v4/objects/boards.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class GroupBoardListManager(CRUDMixin, RESTManager):


class GroupBoard(SaveMixin, ObjectDeleteMixin, RESTObject):
_managers = (("lists", "GroupBoardListManager"),)
lists: GroupBoardListManager


class GroupBoardManager(CRUDMixin, RESTManager):
Expand All @@ -49,7 +49,7 @@ class ProjectBoardListManager(CRUDMixin, RESTManager):


class ProjectBoard(SaveMixin, ObjectDeleteMixin, RESTObject):
_managers = (("lists", "ProjectBoardListManager"),)
lists: ProjectBoardListManager


class ProjectBoardManager(CRUDMixin, RESTManager):
Expand Down
9 changes: 4 additions & 5 deletions gitlab/v4/objects/commits.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,10 @@

class ProjectCommit(RESTObject):
_short_print_attr = "title"
_managers = (
("comments", "ProjectCommitCommentManager"),
("discussions", "ProjectCommitDiscussionManager"),
("statuses", "ProjectCommitStatusManager"),
)

comments: "ProjectCommitCommentManager"
discussions: ProjectCommitDiscussionManager
statuses: "ProjectCommitStatusManager"

@cli.register_custom_action("ProjectCommit")
@exc.on_http_error(exc.GitlabGetError)
Expand Down
2 changes: 1 addition & 1 deletion gitlab/v4/objects/container_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@


class ProjectRegistryRepository(ObjectDeleteMixin, RESTObject):
_managers = (("tags", "ProjectRegistryTagManager"),)
tags: "ProjectRegistryTagManager"


class ProjectRegistryRepositoryManager(DeleteMixin, ListMixin, RESTManager):
Expand Down
2 changes: 1 addition & 1 deletion gitlab/v4/objects/deployments.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


class ProjectDeployment(SaveMixin, RESTObject):
_managers = (("mergerequests", "ProjectDeploymentMergeRequestManager"),)
mergerequests: ProjectDeploymentMergeRequestManager


class ProjectDeploymentManager(RetrieveMixin, CreateMixin, UpdateMixin, RESTManager):
Expand Down
8 changes: 4 additions & 4 deletions gitlab/v4/objects/discussions.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@


class ProjectCommitDiscussion(RESTObject):
_managers = (("notes", "ProjectCommitDiscussionNoteManager"),)
notes: ProjectCommitDiscussionNoteManager


class ProjectCommitDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):
Expand All @@ -32,7 +32,7 @@ class ProjectCommitDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):


class ProjectIssueDiscussion(RESTObject):
_managers = (("notes", "ProjectIssueDiscussionNoteManager"),)
notes: ProjectIssueDiscussionNoteManager


class ProjectIssueDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):
Expand All @@ -43,7 +43,7 @@ class ProjectIssueDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):


class ProjectMergeRequestDiscussion(SaveMixin, RESTObject):
_managers = (("notes", "ProjectMergeRequestDiscussionNoteManager"),)
notes: ProjectMergeRequestDiscussionNoteManager


class ProjectMergeRequestDiscussionManager(
Expand All @@ -59,7 +59,7 @@ class ProjectMergeRequestDiscussionManager(


class ProjectSnippetDiscussion(RESTObject):
_managers = (("notes", "ProjectSnippetDiscussionNoteManager"),)
notes: ProjectSnippetDiscussionNoteManager


class ProjectSnippetDiscussionManager(RetrieveMixin, CreateMixin, RESTManager):
Expand Down
7 changes: 3 additions & 4 deletions gitlab/v4/objects/epics.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,9 @@

class GroupEpic(ObjectDeleteMixin, SaveMixin, RESTObject):
_id_attr = "iid"
_managers = (
("issues", "GroupEpicIssueManager"),
("resourcelabelevents", "GroupEpicResourceLabelEventManager"),
)

issues: "GroupEpicIssueManager"
resourcelabelevents: GroupEpicResourceLabelEventManager


class GroupEpicManager(CRUDMixin, RESTManager):
Expand Down
57 changes: 28 additions & 29 deletions gitlab/v4/objects/groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,35 +43,34 @@

class Group(SaveMixin, ObjectDeleteMixin, RESTObject):
_short_print_attr = "name"
_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"),
)

accessrequests: GroupAccessRequestManager
audit_events: GroupAuditEventManager
badges: GroupBadgeManager
billable_members: GroupBillableMemberManager
boards: GroupBoardManager
clusters: GroupClusterManager
customattributes: GroupCustomAttributeManager
deploytokens: GroupDeployTokenManager
descendant_groups: "GroupDescendantGroupManager"
epics: GroupEpicManager
exports: GroupExportManager
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
wikis: GroupWikiManager

@cli.register_custom_action("Group", ("to_project_id",))
@exc.on_http_error(exc.GitlabTransferProjectError)
Expand Down
17 changes: 8 additions & 9 deletions gitlab/v4/objects/issues.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,15 +105,14 @@ class ProjectIssue(
):
_short_print_attr = "title"
_id_attr = "iid"
_managers = (
("awardemojis", "ProjectIssueAwardEmojiManager"),
("discussions", "ProjectIssueDiscussionManager"),
("links", "ProjectIssueLinkManager"),
("notes", "ProjectIssueNoteManager"),
("resourcelabelevents", "ProjectIssueResourceLabelEventManager"),
("resourcemilestoneevents", "ProjectIssueResourceMilestoneEventManager"),
("resourcestateevents", "ProjectIssueResourceStateEventManager"),
)

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)
Expand Down
3 changes: 2 additions & 1 deletion gitlab/v4/objects/members.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ class GroupMemberManager(MemberAllMixin, CRUDMixin, RESTManager):

class GroupBillableMember(ObjectDeleteMixin, RESTObject):
_short_print_attr = "username"
_managers = (("memberships", "GroupBillableMemberMembershipManager"),)

memberships: "GroupBillableMemberMembershipManager"


class GroupBillableMemberManager(ListMixin, DeleteMixin, RESTManager):
Expand Down
22 changes: 10 additions & 12 deletions gitlab/v4/objects/merge_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,18 +139,16 @@ class ProjectMergeRequest(
):
_id_attr = "iid"

_managers = (
("approvals", "ProjectMergeRequestApprovalManager"),
("approval_rules", "ProjectMergeRequestApprovalRuleManager"),
("awardemojis", "ProjectMergeRequestAwardEmojiManager"),
("diffs", "ProjectMergeRequestDiffManager"),
("discussions", "ProjectMergeRequestDiscussionManager"),
("notes", "ProjectMergeRequestNoteManager"),
("pipelines", "ProjectMergeRequestPipelineManager"),
("resourcelabelevents", "ProjectMergeRequestResourceLabelEventManager"),
("resourcemilestoneevents", "ProjectMergeRequestResourceMilestoneEventManager"),
("resourcestateevents", "ProjectMergeRequestResourceStateEventManager"),
)
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)
Expand Down
6 changes: 3 additions & 3 deletions gitlab/v4/objects/notes.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class ProjectCommitDiscussionNoteManager(


class ProjectIssueNote(SaveMixin, ObjectDeleteMixin, RESTObject):
_managers = (("awardemojis", "ProjectIssueNoteAwardEmojiManager"),)
awardemojis: ProjectIssueNoteAwardEmojiManager


class ProjectIssueNoteManager(CRUDMixin, RESTManager):
Expand Down Expand Up @@ -104,7 +104,7 @@ class ProjectIssueDiscussionNoteManager(


class ProjectMergeRequestNote(SaveMixin, ObjectDeleteMixin, RESTObject):
_managers = (("awardemojis", "ProjectMergeRequestNoteAwardEmojiManager"),)
awardemojis: ProjectMergeRequestNoteAwardEmojiManager


class ProjectMergeRequestNoteManager(CRUDMixin, RESTManager):
Expand Down Expand Up @@ -137,7 +137,7 @@ class ProjectMergeRequestDiscussionNoteManager(


class ProjectSnippetNote(SaveMixin, ObjectDeleteMixin, RESTObject):
_managers = (("awardemojis", "ProjectSnippetNoteAwardEmojiManager"),)
awardemojis: ProjectMergeRequestNoteAwardEmojiManager


class ProjectSnippetNoteManager(CRUDMixin, RESTManager):
Expand Down
2 changes: 1 addition & 1 deletion gitlab/v4/objects/packages.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ class GroupPackageManager(ListMixin, RESTManager):


class ProjectPackage(ObjectDeleteMixin, RESTObject):
_managers = (("package_files", "ProjectPackageFileManager"),)
package_files: "ProjectPackageFileManager"


class ProjectPackageManager(ListMixin, GetMixin, DeleteMixin, RESTManager):
Expand Down
12 changes: 5 additions & 7 deletions gitlab/v4/objects/pipelines.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,10 @@ def __call__(self, **kwargs):


class ProjectPipeline(RefreshMixin, ObjectDeleteMixin, RESTObject):
_managers = (
("jobs", "ProjectPipelineJobManager"),
("bridges", "ProjectPipelineBridgeManager"),
("variables", "ProjectPipelineVariableManager"),
("test_report", "ProjectPipelineTestReportManager"),
)
bridges: "ProjectPipelineBridgeManager"
jobs: "ProjectPipelineJobManager"
test_report: "ProjectPipelineTestReportManager"
variables: "ProjectPipelineVariableManager"

@cli.register_custom_action("ProjectPipeline")
@exc.on_http_error(exc.GitlabPipelineCancelError)
Expand Down Expand Up @@ -199,7 +197,7 @@ class ProjectPipelineScheduleVariableManager(


class ProjectPipelineSchedule(SaveMixin, ObjectDeleteMixin, RESTObject):
_managers = (("variables", "ProjectPipelineScheduleVariableManager"),)
variables: ProjectPipelineScheduleVariableManager

@cli.register_custom_action("ProjectPipelineSchedule")
@exc.on_http_error(exc.GitlabOwnershipError)
Expand Down
Loading