diff options
author | Gauvain Pocentek <gauvain@pocentek.net> | 2016-11-05 18:43:19 +0100 |
---|---|---|
committer | Gauvain Pocentek <gauvain@pocentek.net> | 2016-11-05 18:43:19 +0100 |
commit | 81e1c13e05172d86b613f13ddacc896db5ffd250 (patch) | |
tree | 5e9a67c993992163c2428d30f2cd8c2c04ac55f7 | |
parent | 92180e47f76eaf293728cb1d463f601925404123 (diff) | |
download | gitlab-81e1c13e05172d86b613f13ddacc896db5ffd250.tar.gz |
Make the manager objects create mor dynamic
For the gitlab.Gitlab object make the detection of "submanagers" more
dynamic. This will avoid duplication of definitions.
Update the sphinx extension to add these managers in the list of
attributes.
-rw-r--r-- | docs/ext/docstrings.py | 18 | ||||
-rw-r--r-- | docs/ext/gl_tmpl.j2 | 5 | ||||
-rw-r--r-- | gitlab/__init__.py | 150 |
3 files changed, 46 insertions, 127 deletions
diff --git a/docs/ext/docstrings.py b/docs/ext/docstrings.py index b380b64..5e5f82f 100644 --- a/docs/ext/docstrings.py +++ b/docs/ext/docstrings.py @@ -45,9 +45,17 @@ class GitlabDocstring(GoogleDocstring): def __init__(self, *args, **kwargs): super(GitlabDocstring, self).__init__(*args, **kwargs) - if hasattr(self._obj, 'obj_cls') and self._obj.obj_cls is not None: - self._parsed_lines = self._build_doc('manager_tmpl.j2', - cls=self._obj.obj_cls) + if getattr(self._obj, '__name__', None) == 'Gitlab': + mgrs = [] + gl = self._obj('http://dummy', private_token='dummy') + for item in vars(gl).items(): + if hasattr(item[1], 'obj_cls'): + mgrs.append(item) + self._parsed_lines.extend(self._build_doc('gl_tmpl.j2', + mgrs=sorted(mgrs))) + elif hasattr(self._obj, 'obj_cls') and self._obj.obj_cls is not None: + self._parsed_lines.extend(self._build_doc('manager_tmpl.j2', + cls=self._obj.obj_cls)) elif hasattr(self._obj, 'canUpdate') and self._obj.canUpdate: - self._parsed_lines = self._build_doc('object_tmpl.j2', - obj=self._obj) + self._parsed_lines.extend(self._build_doc('object_tmpl.j2', + obj=self._obj)) diff --git a/docs/ext/gl_tmpl.j2 b/docs/ext/gl_tmpl.j2 new file mode 100644 index 0000000..dbccbcc --- /dev/null +++ b/docs/ext/gl_tmpl.j2 @@ -0,0 +1,5 @@ +{% for attr, mgr in mgrs %} +.. attribute:: {{ attr }} + + {{ mgr.__class__ | classref() }} manager for {{ mgr.obj_cls | classref() }} objects. +{% endfor %} diff --git a/gitlab/__init__.py b/gitlab/__init__.py index d4de709..f91fdf2 100644 --- a/gitlab/__init__.py +++ b/gitlab/__init__.py @@ -22,6 +22,7 @@ from __future__ import absolute_import import inspect import itertools import json +import re import warnings import requests @@ -64,86 +65,6 @@ class Gitlab(object): timeout (float): Timeout to use for requests to the GitLab server. http_username (str): Username for HTTP authentication http_password (str): Password for HTTP authentication - - Attributes: - user_emails (UserEmailManager): Manager for GitLab users' emails. - user_keys (UserKeyManager): Manager for GitLab users' SSH keys. - users (UserManager): Manager for GitLab users - broadcastmessages (BroadcastMessageManager): Manager for broadcast - messages - keys (DeployKeyManager): Manager for deploy keys - group_accessrequests (GroupAccessRequestManager): Manager for GitLab - groups access requests - group_issues (GroupIssueManager): Manager for GitLab group issues - group_projects (GroupProjectManager): Manager for GitLab group projects - group_members (GroupMemberManager): Manager for GitLab group members - groups (GroupManager): Manager for GitLab members - hooks (HookManager): Manager for GitLab hooks - issues (IssueManager): Manager for GitLab issues - licenses (LicenseManager): Manager for licenses - namespaces (NamespaceManager): Manager for namespaces - notificationsettings (NotificationSettingsManager): Manager for global - notification settings - project_accessrequests (ProjectAccessRequestManager): Manager for - GitLab projects access requests - project_boards (ProjectBoardManager): Manager for GitLab projects - boards - project_board_lists (ProjectBoardListManager): Manager for GitLab - project board lists - project_branches (ProjectBranchManager): Manager for GitLab projects - branches - project_builds (ProjectBuildManager): Manager for GitLab projects - builds - project_commits (ProjectCommitManager): Manager for GitLab projects - commits - project_commit_comments (ProjectCommitCommentManager): Manager for - GitLab projects commits comments - project_commit_statuses (ProjectCommitStatusManager): Manager for - GitLab projects commits statuses - project_deployments (ProjectDeploymentManager): Manager for GitLab - projects deployments - project_keys (ProjectKeyManager): Manager for GitLab projects keys - project_environments (ProjectEnvironmentManager): Manager for GitLab - projects environments - project_events (ProjectEventManager): Manager for GitLab projects - events - project_forks (ProjectForkManager): Manager for GitLab projects forks - project_hooks (ProjectHookManager): Manager for GitLab projects hooks - project_issue_notes (ProjectIssueNoteManager): Manager for GitLab notes - on issues - project_issues (ProjectIssueManager): Manager for GitLab projects - issues - project_members (ProjectMemberManager): Manager for GitLab projects - members - project_notes (ProjectNoteManager): Manager for GitLab projects notes - project_pipelines (ProjectPipelineManager): Manager for GitLab projects - pipelines - project_tags (ProjectTagManager): Manager for GitLab projects tags - project_mergerequest_notes (ProjectMergeRequestNoteManager): Manager - for GitLab notes on merge requests - project_mergerequests (ProjectMergeRequestManager): Manager for GitLab - projects merge requests - project_milestones (ProjectMilestoneManager): Manager for GitLab - projects milestones - project_labels (ProjectLabelManager): Manager for GitLab projects - labels - project_files (ProjectFileManager): Manager for GitLab projects files - project_services (ProjectServiceManager): Manager for the GitLab - projects services - project_snippet_notes (ProjectSnippetNoteManager): Manager for GitLab - note on snippets - project_snippets (ProjectSnippetManager): Manager for GitLab projects - snippets - project_triggers (ProjectTriggerManager): Manager for build triggers - project_variables (ProjectVariableManager): Manager for build variables - user_projects (UserProjectManager): Manager for GitLab projects users - projects (ProjectManager): Manager for GitLab projects - runners (RunnerManager): Manager for the CI runners - settings (ApplicationSettingsManager): manager for the Gitlab settings - team_members (TeamMemberManager): Manager for GitLab teams members - team_projects (TeamProjectManager): Manager for GitLab teams projects - teams (TeamManager): Manager for GitLab teams - todos (TodoManager): Manager for user todos """ def __init__(self, url, private_token=None, email=None, password=None, @@ -168,60 +89,45 @@ class Gitlab(object): #: Create a session object for requests self.session = requests.Session() - self.settings = ApplicationSettingsManager(self) - self.user_emails = UserEmailManager(self) - self.user_keys = UserKeyManager(self) - self.users = UserManager(self) self.broadcastmessages = BroadcastMessageManager(self) self.keys = KeyManager(self) - self.group_accessrequests = GroupAccessRequestManager(self) - self.group_issues = GroupIssueManager(self) - self.group_projects = GroupProjectManager(self) - self.group_members = GroupMemberManager(self) self.groups = GroupManager(self) self.hooks = HookManager(self) self.issues = IssueManager(self) self.licenses = LicenseManager(self) self.namespaces = NamespaceManager(self) self.notificationsettings = NotificationSettingsManager(self) - self.project_accessrequests = ProjectAccessRequestManager(self) - self.project_boards = ProjectBoardManager(self) - self.project_board_listss = ProjectBoardListManager(self) - self.project_branches = ProjectBranchManager(self) - self.project_builds = ProjectBuildManager(self) - self.project_commits = ProjectCommitManager(self) - self.project_commit_comments = ProjectCommitCommentManager(self) - self.project_commit_statuses = ProjectCommitStatusManager(self) - self.project_deployments = ProjectDeploymentManager(self) - self.project_keys = ProjectKeyManager(self) - self.project_environments = ProjectEnvironmentManager(self) - self.project_events = ProjectEventManager(self) - self.project_forks = ProjectForkManager(self) - self.project_hooks = ProjectHookManager(self) - self.project_issue_notes = ProjectIssueNoteManager(self) - self.project_issues = ProjectIssueManager(self) - self.project_members = ProjectMemberManager(self) - self.project_notes = ProjectNoteManager(self) - self.project_pipelines = ProjectPipelineManager(self) - self.project_tags = ProjectTagManager(self) - self.project_mergerequest_notes = ProjectMergeRequestNoteManager(self) - self.project_mergerequests = ProjectMergeRequestManager(self) - self.project_milestones = ProjectMilestoneManager(self) - self.project_labels = ProjectLabelManager(self) - self.project_files = ProjectFileManager(self) - self.project_services = ProjectServiceManager(self) - self.project_snippet_notes = ProjectSnippetNoteManager(self) - self.project_snippets = ProjectSnippetManager(self) - self.project_triggers = ProjectTriggerManager(self) - self.project_variables = ProjectVariableManager(self) - self.user_projects = UserProjectManager(self) self.projects = ProjectManager(self) self.runners = RunnerManager(self) - self.team_members = TeamMemberManager(self) - self.team_projects = TeamProjectManager(self) + self.settings = ApplicationSettingsManager(self) + self.sidekiq = SidekiqManager(self) + self.users = UserManager(self) self.teams = TeamManager(self) self.todos = TodoManager(self) - self.sidekiq = SidekiqManager(self) + + # build the "submanagers" + for parent_cls in six.itervalues(globals()): + if (not inspect.isclass(parent_cls) + or not issubclass(parent_cls, GitlabObject) + or parent_cls == CurrentUser): + continue + + if not parent_cls.managers: + continue + + for var, cls, attrs in parent_cls.managers: + var_name = '%s_%s' % (self._cls_to_manager_prefix(parent_cls), + var) + manager = cls(self) + setattr(self, var_name, manager) + + def _cls_to_manager_prefix(self, cls): + # Manage bad naming decisions + camel_case = (cls.__name__ + .replace('NotificationSettings', 'Notificationsettings') + .replace('MergeRequest', 'Mergerequest') + .replace('AccessRequest', 'Accessrequest')) + return re.sub(r'(.)([A-Z])', r'\1_\2', camel_case).lower() @staticmethod def from_config(gitlab_id=None, config_files=None): |