Skip to content

Commit 81e1c13

Browse files
author
Gauvain Pocentek
committed
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.
1 parent 92180e4 commit 81e1c13

File tree

3 files changed

+46
-127
lines changed

3 files changed

+46
-127
lines changed

docs/ext/docstrings.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,17 @@ def _build_doc(self, tmpl, **kwargs):
4545
def __init__(self, *args, **kwargs):
4646
super(GitlabDocstring, self).__init__(*args, **kwargs)
4747

48-
if hasattr(self._obj, 'obj_cls') and self._obj.obj_cls is not None:
49-
self._parsed_lines = self._build_doc('manager_tmpl.j2',
50-
cls=self._obj.obj_cls)
48+
if getattr(self._obj, '__name__', None) == 'Gitlab':
49+
mgrs = []
50+
gl = self._obj('http://dummy', private_token='dummy')
51+
for item in vars(gl).items():
52+
if hasattr(item[1], 'obj_cls'):
53+
mgrs.append(item)
54+
self._parsed_lines.extend(self._build_doc('gl_tmpl.j2',
55+
mgrs=sorted(mgrs)))
56+
elif hasattr(self._obj, 'obj_cls') and self._obj.obj_cls is not None:
57+
self._parsed_lines.extend(self._build_doc('manager_tmpl.j2',
58+
cls=self._obj.obj_cls))
5159
elif hasattr(self._obj, 'canUpdate') and self._obj.canUpdate:
52-
self._parsed_lines = self._build_doc('object_tmpl.j2',
53-
obj=self._obj)
60+
self._parsed_lines.extend(self._build_doc('object_tmpl.j2',
61+
obj=self._obj))

docs/ext/gl_tmpl.j2

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{% for attr, mgr in mgrs %}
2+
.. attribute:: {{ attr }}
3+
4+
{{ mgr.__class__ | classref() }} manager for {{ mgr.obj_cls | classref() }} objects.
5+
{% endfor %}

gitlab/__init__.py

+28-122
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import inspect
2323
import itertools
2424
import json
25+
import re
2526
import warnings
2627

2728
import requests
@@ -64,86 +65,6 @@ class Gitlab(object):
6465
timeout (float): Timeout to use for requests to the GitLab server.
6566
http_username (str): Username for HTTP authentication
6667
http_password (str): Password for HTTP authentication
67-
68-
Attributes:
69-
user_emails (UserEmailManager): Manager for GitLab users' emails.
70-
user_keys (UserKeyManager): Manager for GitLab users' SSH keys.
71-
users (UserManager): Manager for GitLab users
72-
broadcastmessages (BroadcastMessageManager): Manager for broadcast
73-
messages
74-
keys (DeployKeyManager): Manager for deploy keys
75-
group_accessrequests (GroupAccessRequestManager): Manager for GitLab
76-
groups access requests
77-
group_issues (GroupIssueManager): Manager for GitLab group issues
78-
group_projects (GroupProjectManager): Manager for GitLab group projects
79-
group_members (GroupMemberManager): Manager for GitLab group members
80-
groups (GroupManager): Manager for GitLab members
81-
hooks (HookManager): Manager for GitLab hooks
82-
issues (IssueManager): Manager for GitLab issues
83-
licenses (LicenseManager): Manager for licenses
84-
namespaces (NamespaceManager): Manager for namespaces
85-
notificationsettings (NotificationSettingsManager): Manager for global
86-
notification settings
87-
project_accessrequests (ProjectAccessRequestManager): Manager for
88-
GitLab projects access requests
89-
project_boards (ProjectBoardManager): Manager for GitLab projects
90-
boards
91-
project_board_lists (ProjectBoardListManager): Manager for GitLab
92-
project board lists
93-
project_branches (ProjectBranchManager): Manager for GitLab projects
94-
branches
95-
project_builds (ProjectBuildManager): Manager for GitLab projects
96-
builds
97-
project_commits (ProjectCommitManager): Manager for GitLab projects
98-
commits
99-
project_commit_comments (ProjectCommitCommentManager): Manager for
100-
GitLab projects commits comments
101-
project_commit_statuses (ProjectCommitStatusManager): Manager for
102-
GitLab projects commits statuses
103-
project_deployments (ProjectDeploymentManager): Manager for GitLab
104-
projects deployments
105-
project_keys (ProjectKeyManager): Manager for GitLab projects keys
106-
project_environments (ProjectEnvironmentManager): Manager for GitLab
107-
projects environments
108-
project_events (ProjectEventManager): Manager for GitLab projects
109-
events
110-
project_forks (ProjectForkManager): Manager for GitLab projects forks
111-
project_hooks (ProjectHookManager): Manager for GitLab projects hooks
112-
project_issue_notes (ProjectIssueNoteManager): Manager for GitLab notes
113-
on issues
114-
project_issues (ProjectIssueManager): Manager for GitLab projects
115-
issues
116-
project_members (ProjectMemberManager): Manager for GitLab projects
117-
members
118-
project_notes (ProjectNoteManager): Manager for GitLab projects notes
119-
project_pipelines (ProjectPipelineManager): Manager for GitLab projects
120-
pipelines
121-
project_tags (ProjectTagManager): Manager for GitLab projects tags
122-
project_mergerequest_notes (ProjectMergeRequestNoteManager): Manager
123-
for GitLab notes on merge requests
124-
project_mergerequests (ProjectMergeRequestManager): Manager for GitLab
125-
projects merge requests
126-
project_milestones (ProjectMilestoneManager): Manager for GitLab
127-
projects milestones
128-
project_labels (ProjectLabelManager): Manager for GitLab projects
129-
labels
130-
project_files (ProjectFileManager): Manager for GitLab projects files
131-
project_services (ProjectServiceManager): Manager for the GitLab
132-
projects services
133-
project_snippet_notes (ProjectSnippetNoteManager): Manager for GitLab
134-
note on snippets
135-
project_snippets (ProjectSnippetManager): Manager for GitLab projects
136-
snippets
137-
project_triggers (ProjectTriggerManager): Manager for build triggers
138-
project_variables (ProjectVariableManager): Manager for build variables
139-
user_projects (UserProjectManager): Manager for GitLab projects users
140-
projects (ProjectManager): Manager for GitLab projects
141-
runners (RunnerManager): Manager for the CI runners
142-
settings (ApplicationSettingsManager): manager for the Gitlab settings
143-
team_members (TeamMemberManager): Manager for GitLab teams members
144-
team_projects (TeamProjectManager): Manager for GitLab teams projects
145-
teams (TeamManager): Manager for GitLab teams
146-
todos (TodoManager): Manager for user todos
14768
"""
14869

14970
def __init__(self, url, private_token=None, email=None, password=None,
@@ -168,60 +89,45 @@ def __init__(self, url, private_token=None, email=None, password=None,
16889
#: Create a session object for requests
16990
self.session = requests.Session()
17091

171-
self.settings = ApplicationSettingsManager(self)
172-
self.user_emails = UserEmailManager(self)
173-
self.user_keys = UserKeyManager(self)
174-
self.users = UserManager(self)
17592
self.broadcastmessages = BroadcastMessageManager(self)
17693
self.keys = KeyManager(self)
177-
self.group_accessrequests = GroupAccessRequestManager(self)
178-
self.group_issues = GroupIssueManager(self)
179-
self.group_projects = GroupProjectManager(self)
180-
self.group_members = GroupMemberManager(self)
18194
self.groups = GroupManager(self)
18295
self.hooks = HookManager(self)
18396
self.issues = IssueManager(self)
18497
self.licenses = LicenseManager(self)
18598
self.namespaces = NamespaceManager(self)
18699
self.notificationsettings = NotificationSettingsManager(self)
187-
self.project_accessrequests = ProjectAccessRequestManager(self)
188-
self.project_boards = ProjectBoardManager(self)
189-
self.project_board_listss = ProjectBoardListManager(self)
190-
self.project_branches = ProjectBranchManager(self)
191-
self.project_builds = ProjectBuildManager(self)
192-
self.project_commits = ProjectCommitManager(self)
193-
self.project_commit_comments = ProjectCommitCommentManager(self)
194-
self.project_commit_statuses = ProjectCommitStatusManager(self)
195-
self.project_deployments = ProjectDeploymentManager(self)
196-
self.project_keys = ProjectKeyManager(self)
197-
self.project_environments = ProjectEnvironmentManager(self)
198-
self.project_events = ProjectEventManager(self)
199-
self.project_forks = ProjectForkManager(self)
200-
self.project_hooks = ProjectHookManager(self)
201-
self.project_issue_notes = ProjectIssueNoteManager(self)
202-
self.project_issues = ProjectIssueManager(self)
203-
self.project_members = ProjectMemberManager(self)
204-
self.project_notes = ProjectNoteManager(self)
205-
self.project_pipelines = ProjectPipelineManager(self)
206-
self.project_tags = ProjectTagManager(self)
207-
self.project_mergerequest_notes = ProjectMergeRequestNoteManager(self)
208-
self.project_mergerequests = ProjectMergeRequestManager(self)
209-
self.project_milestones = ProjectMilestoneManager(self)
210-
self.project_labels = ProjectLabelManager(self)
211-
self.project_files = ProjectFileManager(self)
212-
self.project_services = ProjectServiceManager(self)
213-
self.project_snippet_notes = ProjectSnippetNoteManager(self)
214-
self.project_snippets = ProjectSnippetManager(self)
215-
self.project_triggers = ProjectTriggerManager(self)
216-
self.project_variables = ProjectVariableManager(self)
217-
self.user_projects = UserProjectManager(self)
218100
self.projects = ProjectManager(self)
219101
self.runners = RunnerManager(self)
220-
self.team_members = TeamMemberManager(self)
221-
self.team_projects = TeamProjectManager(self)
102+
self.settings = ApplicationSettingsManager(self)
103+
self.sidekiq = SidekiqManager(self)
104+
self.users = UserManager(self)
222105
self.teams = TeamManager(self)
223106
self.todos = TodoManager(self)
224-
self.sidekiq = SidekiqManager(self)
107+
108+
# build the "submanagers"
109+
for parent_cls in six.itervalues(globals()):
110+
if (not inspect.isclass(parent_cls)
111+
or not issubclass(parent_cls, GitlabObject)
112+
or parent_cls == CurrentUser):
113+
continue
114+
115+
if not parent_cls.managers:
116+
continue
117+
118+
for var, cls, attrs in parent_cls.managers:
119+
var_name = '%s_%s' % (self._cls_to_manager_prefix(parent_cls),
120+
var)
121+
manager = cls(self)
122+
setattr(self, var_name, manager)
123+
124+
def _cls_to_manager_prefix(self, cls):
125+
# Manage bad naming decisions
126+
camel_case = (cls.__name__
127+
.replace('NotificationSettings', 'Notificationsettings')
128+
.replace('MergeRequest', 'Mergerequest')
129+
.replace('AccessRequest', 'Accessrequest'))
130+
return re.sub(r'(.)([A-Z])', r'\1_\2', camel_case).lower()
225131

226132
@staticmethod
227133
def from_config(gitlab_id=None, config_files=None):

0 commit comments

Comments
 (0)