summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGauvain Pocentek <gauvain@pocentek.net>2016-11-05 18:43:19 +0100
committerGauvain Pocentek <gauvain@pocentek.net>2016-11-05 18:43:19 +0100
commit81e1c13e05172d86b613f13ddacc896db5ffd250 (patch)
tree5e9a67c993992163c2428d30f2cd8c2c04ac55f7
parent92180e47f76eaf293728cb1d463f601925404123 (diff)
downloadgitlab-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.py18
-rw-r--r--docs/ext/gl_tmpl.j25
-rw-r--r--gitlab/__init__.py150
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):