summaryrefslogtreecommitdiff
path: root/gitlab.py
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab.py')
-rw-r--r--gitlab.py121
1 files changed, 83 insertions, 38 deletions
diff --git a/gitlab.py b/gitlab.py
index c5a5aa6..3fd057b 100644
--- a/gitlab.py
+++ b/gitlab.py
@@ -20,7 +20,7 @@ import json
import requests
__title__ = 'python-gitlab'
-__version__ = '0.1'
+__version__ = '0.2'
__author__ = 'Gauvain Pocentek'
__email__ = 'gauvain@pocentek.net'
__license__ = 'LGPL3'
@@ -74,7 +74,7 @@ class GitlabAuthenticationError(Exception):
class Gitlab(object):
"""Represents a GitLab server connection"""
- def __init__(self, url, private_token=None, email=None, password=None):
+ def __init__(self, url, private_token=None, email=None, password=None, ssl_verify=True):
"""Stores informations about the server
url: the URL of the Gitlab server
@@ -83,9 +83,10 @@ class Gitlab(object):
password: the user password (associated with email)
"""
self._url = '%s/api/v3' % url
- self.private_token = private_token
+ self.setToken(private_token)
self.email = email
self.password = password
+ self.ssl_verify = ssl_verify
def auth(self):
"""Performs an authentication using either the private token, or the
@@ -93,11 +94,9 @@ class Gitlab(object):
The user attribute will hold a CurrentUser object on success.
"""
- r = False
if self.private_token:
- r = self.token_auth()
-
- if not r:
+ self.token_auth()
+ else:
self.credentials_auth()
def credentials_auth(self):
@@ -111,14 +110,10 @@ class Gitlab(object):
else:
raise GitlabAuthenticationError(r.json()['message'])
- self.private_token = self.user.private_token
+ self.setToken(self.user.private_token)
def token_auth(self):
- try:
- self.user = CurrentUser(self)
- return True
- except:
- return False
+ self.user = CurrentUser(self)
def setUrl(self, url):
"""Updates the gitlab URL"""
@@ -126,20 +121,22 @@ class Gitlab(object):
def setToken(self, token):
"""Sets the private token for authentication"""
- self.private_token = token
+ if token:
+ self.private_token = token
+ self.headers = {"PRIVATE-TOKEN": token}
+ else:
+ self.private_token = None
+ self.headers = {}
def setCredentials(self, email, password):
"""Sets the email/login and password for authentication"""
self.email = email
self.password = password
- def rawGet(self, path, with_token=False):
+ def rawGet(self, path):
url = '%s%s' % (self._url, path)
try:
- if with_token:
- r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token})
- else:
- r = requests.get(url)
+ r = requests.get(url, headers=self.headers, verify=self.ssl_verify)
except:
raise GitlabConnectionError(
"Can't connect to GitLab server (%s)" % self._url)
@@ -149,21 +146,20 @@ class Gitlab(object):
def rawPost(self, path, data):
url = '%s%s' % (self._url, path)
try:
- r = requests.post(url, data)
+ r = requests.post(url, data,
+ headers=self.headers,
+ verify=self.ssl_verify)
except:
raise GitlabConnectionError(
"Can't connect to GitLab server (%s)" % self._url)
return r
- def rawPut(self, path, with_token=False):
+ def rawPut(self, path):
url = '%s%s' % (self._url, path)
try:
- if with_token:
- r = requests.put(url, headers={"PRIVATE-TOKEN": self.private_token})
- else:
- r = requests.put(url)
+ r = requests.put(url, headers=self.headers, verify=self.ssl_verify)
except:
raise GitlabConnectionError(
"Can't connect to GitLab server (%s)" % self._url)
@@ -184,11 +180,11 @@ class Gitlab(object):
url = obj_class._url % kwargs
url = '%s%s' % (self._url, url)
if kwargs:
- url += "&%s" % ("&".join(
+ url += "?%s" % ("&".join(
["%s=%s" % (k, v) for k, v in kwargs.items()]))
try:
- r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token})
+ r = requests.get(url, headers=self.headers, verify=self.ssl_verify)
except:
raise GitlabConnectionError(
"Can't connect to GitLab server (%s)" % self._url)
@@ -234,7 +230,7 @@ class Gitlab(object):
(self._url, url)
try:
- r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token})
+ r = requests.get(url, headers=self.headers, verify=self.ssl_verify)
except:
raise GitlabConnectionError(
"Can't connect to GitLab server (%s)" % self._url)
@@ -254,7 +250,7 @@ class Gitlab(object):
(self._url, url, obj.id)
try:
- r = requests.delete(url, headers={"PRIVATE-TOKEN": self.private_token})
+ r = requests.delete(url, headers=self.headers, verify=self.ssl_verify)
except:
raise GitlabConnectionError(
"Can't connect to GitLab server (%s)" % self._url)
@@ -279,13 +275,10 @@ class Gitlab(object):
url = obj._url % obj.__dict__
url = '%s%s' % (self._url, url)
- print url
- print obj.__dict__
-
try:
# TODO: avoid too much work on the server side by filtering the
# __dict__ keys
- r = requests.post(url, obj.__dict__, headers={"PRIVATE-TOKEN": self.private_token})
+ r = requests.post(url, obj.__dict__, headers=self.headers, verify=self.ssl_verify)
except:
raise GitlabConnectionError(
"Can't connect to GitLab server (%s)" % self._url)
@@ -309,7 +302,7 @@ class Gitlab(object):
d[k] = str(v)
try:
- r = requests.put(url, d, headers={"PRIVATE-TOKEN": self.private_token})
+ r = requests.put(url, d, headers=self.headers, verify=self.ssl_verify)
except:
raise GitlabConnectionError(
"Can't connect to GitLab server (%s)" % self._url)
@@ -386,6 +379,20 @@ class Gitlab(object):
"""
return self._getListOrObject(User, id, **kwargs)
+ def Team(self, id=None, **kwargs):
+ """Creates/gets/lists team(s) known by the GitLab server.
+
+ If id is None, returns a list of teams.
+
+ If id is an integer, returns the matching project (or raise a
+ GitlabGetError if not found)
+
+ If id is a dict, create a new object using attributes provided. The
+ object is NOT saved on the server. Use the save() method on the object
+ to write it on the server.
+ """
+ return self._getListOrObject(Team, id, **kwargs)
+
class GitlabObject(object):
_url = None
@@ -579,7 +586,7 @@ class Group(GitlabObject):
def transfer_project(self, id):
url = '/groups/%d/projects/%d' % \
(self.id, id)
- r = self.gitlab.rawPost(url, None, headers={"PRIVATE-TOKEN": self.gitlab.private_token})
+ r = self.gitlab.rawPost(url, None)
if r.status_code != 201:
raise GitlabTransferProjectError()
@@ -617,7 +624,7 @@ class ProjectBranch(GitlabObject):
url = "%s/%s/protect" % (url, self.name)
else:
url = "%s/%s/unprotect" % (url, self.name)
- r = self.gitlab.rawPut(url, True)
+ r = self.gitlab.rawPut(url)
if r.status_code == 200:
if protect:
@@ -727,7 +734,7 @@ class ProjectMergeRequestNote(GitlabObject):
class ProjectMergeRequest(GitlabObject):
- _url = '/projects/%(project_id)s/merge_request'
+ _url = '/projects/%(project_id)s/merge_requests'
_constructorTypes = {'author': 'User', 'assignee': 'User'}
canDelete = False
requiredListAttrs = ['project_id']
@@ -774,7 +781,7 @@ class ProjectSnippet(GitlabObject):
def Content(self):
url = "/projects/%(project_id)s/snippets/%(snippet_id)s/raw" % \
{'project_id': self.project_id, 'snippet_id': self.id}
- r = self.gitlab.rawGet(url, True)
+ r = self.gitlab.rawGet(url)
if r.status_code == 200:
return r.content
@@ -853,3 +860,41 @@ class Project(GitlabObject):
return self._getListOrObject(ProjectTag, id,
project_id=self.id,
**kwargs)
+
+
+class TeamMember(GitlabObject):
+ _url = '/user_teams/%(team_id)s/members'
+ canUpdate = False
+ requiredCreateAttrs = ['team_id', 'user_id', 'access_level']
+ requiredDeleteAttrs = ['team_id']
+ requiredGetAttrs = ['team_id']
+ requiredListAttrs = ['team_id']
+ shortPrintAttr = 'username'
+
+
+class TeamProject(GitlabObject):
+ _url = '/user_teams/%(team_id)s/projects'
+ _constructorTypes = {'owner': 'User', 'namespace': 'Group'}
+ canUpdate = False
+ requiredCreateAttrs = ['team_id', 'project_id', 'greatest_access_level']
+ requiredDeleteAttrs = ['team_id', 'project_id']
+ requiredGetAttrs = ['team_id']
+ requiredListAttrs = ['team_id']
+ shortPrintAttr = 'name'
+
+
+class Team(GitlabObject):
+ _url = '/user_teams'
+ shortPrintAttr = 'name'
+ requiredCreateAttrs = ['name', 'path']
+ canUpdate = False
+
+ def Member(self, id=None, **kwargs):
+ return self._getListOrObject(TeamMember, id,
+ team_id=self.id,
+ **kwargs)
+
+ def Project(self, id=None, **kwargs):
+ return self._getListOrObject(TeamProject, id,
+ team_id=self.id,
+ **kwargs)