Skip to content

Commit

Permalink
Add support for project services API
Browse files Browse the repository at this point in the history
  • Loading branch information
Gauvain Pocentek committed Aug 13, 2016
1 parent ded5258 commit ef2dbf7
Show file tree
Hide file tree
Showing 4 changed files with 137 additions and 1 deletion.
21 changes: 21 additions & 0 deletions docs/gl_objects/projects.py
Expand Up @@ -361,3 +361,24 @@
# notes delete
note.delete()
# end notes delete

# service get
service = gl.project_services.get(service_name='asana', project_id=1)
# or
service = project.services.get(service_name='asana', project_id=1)
# display it's status (enabled/disabled)
print(service.active)
# end service get

# service list
services = gl.project_services.available()
# end service list

# service update
service.api_key = 'randomkey'
service.save()
# end service update

# service delete
service.delete()
# end service delete
34 changes: 33 additions & 1 deletion docs/gl_objects/projects.rst
Expand Up @@ -371,7 +371,7 @@ List the project hooks:
:start-after: # hook list
:end-before: # end hook list

Get a project hook
Get a project hook:

.. literalinclude:: projects.py
:start-after: # hook get
Expand All @@ -394,3 +394,35 @@ Delete a project hook:
.. literalinclude:: projects.py
:start-after: # hook delete
:end-before: # end hook delete

Services
--------

Use :class:`~gitlab.objects.ProjectService` objects to manipulate projects
services. The :attr:`gitlab.Gitlab.project_services` and
:attr:`Project.services <gitlab.objects.Projects.services>` manager objects
provide helper functions.

Get a service:

.. literalinclude:: projects.py
:start-after: # service get
:end-before: # end service get

List the code names of available services (doesn't return objects):

.. literalinclude:: projects.py
:start-after: # service list
:end-before: # end service list

Configure and enable a service:

.. literalinclude:: projects.py
:start-after: # service update
:end-before: # end service update

Disable a service:

.. literalinclude:: projects.py
:start-after: # service delete
:end-before: # end service delete
3 changes: 3 additions & 0 deletions gitlab/__init__.py
Expand Up @@ -112,6 +112,8 @@ class Gitlab(object):
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
Expand Down Expand Up @@ -183,6 +185,7 @@ def __init__(self, url, private_token=None, email=None, password=None,
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)
Expand Down
80 changes: 80 additions & 0 deletions gitlab/objects.py
Expand Up @@ -287,6 +287,9 @@ def _get_object(self, k, v):
return v

def _set_from_dict(self, data):
if not hasattr(data, 'items'):
return

for k, v in data.items():
if isinstance(v, list):
self.__dict__[k] = []
Expand Down Expand Up @@ -1687,6 +1690,82 @@ class ProjectVariableManager(BaseManager):
obj_cls = ProjectVariable


class ProjectService(GitlabObject):
_url = '/projects/%(project_id)s/services/%(service_name)s'
canList = False
canCreate = False
_id_in_update_url = False
_id_in_delete_url = False
requiredUrlAttrs = ['project_id', 'service_name']

_service_attrs = {
'asana': (('api_key', ), ('restrict_to_branch', )),
'assembla': (('token', ), ('subdomain', )),
'bamboo': (('bamboo_url', 'build_key', 'username', 'password'),
tuple()),
'buildkite': (('token', 'project_url'), ('enable_ssl_verification', )),
'campfire': (('token', ), ('subdomain', 'room')),
'custom-issue-tracker': (('new_issue_url', 'issues_url',
'project_url'),
('description', 'title')),
'drone-ci': (('token', 'drone_url'), ('enable_ssl_verification', )),
'emails-on-push': (('recipients', ), ('disable_diffs',
'send_from_committer_email')),
'external-wiki': (('external_wiki_url', ), tuple()),
'flowdock': (('token', ), tuple()),
'gemnasium': (('api_key', 'token', ), tuple()),
'hipchat': (('token', ), ('color', 'notify', 'room', 'api_version',
'server')),
'irker': (('recipients', ), ('default_irc_uri', 'server_port',
'server_host', 'colorize_messages')),
'jira': (('new_issue_url', 'project_url', 'issues_url'),
('description', 'username', 'password')),
'pivotaltracker': (('token', ), tuple()),
'pushover': (('api_key', 'user_key', 'priority'), ('device', 'sound')),
'redmine': (('new_issue_url', 'project_url', 'issues_url'),
('description', )),
'slack': (('webhook', ), ('username', 'channel')),
'teamcity': (('teamcity_url', 'build_type', 'username', 'password'),
tuple())
}

def _data_for_gitlab(self, extra_parameters={}, update=False,
as_json=True):
data = (super(ProjectService, self)
._data_for_gitlab(extra_parameters, update=update,
as_json=False))
missing = []
# Mandatory args
for attr in self._service_attrs[self.service_name][0]:
if not hasattr(self, attr):
missing.append(attr)
else:
data[attr] = getattr(self, attr)

if missing:
raise GitlabUpdateError('Missing attribute(s): %s' %
", ".join(missing))

# Optional args
for attr in self._service_attrs[self.service_name][1]:
if hasattr(self, attr):
data[attr] = getattr(self, attr)

return json.dumps(data)


class ProjectServiceManager(BaseManager):
obj_cls = ProjectService

def available(self, **kwargs):
"""List the services known by python-gitlab.
Returns:
list (str): The list of service code names.
"""
return json.dumps(ProjectService._service_attrs.keys())


class Project(GitlabObject):
_url = '/projects'
_constructorTypes = {'owner': 'User', 'namespace': 'Group'}
Expand Down Expand Up @@ -1725,6 +1804,7 @@ class Project(GitlabObject):
('mergerequests', ProjectMergeRequestManager, [('project_id', 'id')]),
('milestones', ProjectMilestoneManager, [('project_id', 'id')]),
('notes', ProjectNoteManager, [('project_id', 'id')]),
('services', ProjectServiceManager, [('project_id', 'id')]),
('snippets', ProjectSnippetManager, [('project_id', 'id')]),
('tags', ProjectTagManager, [('project_id', 'id')]),
('triggers', ProjectTriggerManager, [('project_id', 'id')]),
Expand Down

0 comments on commit ef2dbf7

Please sign in to comment.