diff options
-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): |