summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gitlab.py166
1 files changed, 109 insertions, 57 deletions
diff --git a/gitlab.py b/gitlab.py
index a02700b..e108566 100644
--- a/gitlab.py
+++ b/gitlab.py
@@ -25,27 +25,34 @@ __email__ = 'gauvain@pocentek.net'
__license__ = 'LGPL3'
__copyright__ = 'Copyright 2013 Gauvain Pocentek'
+
class GitlabConnectionError(Exception):
pass
+
class GitlabGetError(Exception):
pass
+
class GitlabCreateError(Exception):
pass
+
class GitlabUpdateError(Exception):
pass
+
class GitlabDeleteError(Exception):
pass
+
class GitlabAuthenticationError(Exception):
pass
+
class Gitlab(object):
def __init__(self, url, private_token=None, email=None, password=None):
- self.url = '%s/api/v3'%url
+ self.url = '%s/api/v3' % url
self.private_token = private_token
self.email = email
self.password = password
@@ -62,7 +69,8 @@ class Gitlab(object):
if not self.email or not self.password:
raise GitlabAuthenticationError("Missing email/password")
- r = self.rawPost('/session', {'email': self.email, 'password': self.password})
+ r = self.rawPost('/session',
+ {'email': self.email, 'password': self.password})
if r.status_code == 201:
self.user = CurrentUser(self, r.json)
else:
@@ -78,7 +86,7 @@ class Gitlab(object):
return False
def setUrl(self, url):
- self.url = '%s/api/v3'%url
+ self.url = '%s/api/v3' % url
def setToken(self, token):
self.private_token = token
@@ -88,71 +96,79 @@ class Gitlab(object):
self.password = password
def rawPost(self, path, data):
- url = '%s%s'%(self.url, path)
+ url = '%s%s' % (self.url, path)
try:
r = requests.post(url, data)
except:
- raise GitlabConnectionError('Can\'t connect to GitLab server (%s)'%self.url)
+ raise GitlabConnectionError(
+ "Can't connect to GitLab server (%s)" % self.url)
return r
- def list(self, objClass, **kwargs):
- url = objClass.url
+ def list(self, obj_class, **kwargs):
+ url = obj_class.url
if kwargs:
- url = objClass.url % kwargs
- url = '%s%s?private_token=%s'%(self.url, url, self.private_token)
+ url = obj_class.url % kwargs
+ url = '%s%s?private_token=%s' % (self.url, url, self.private_token)
if kwargs:
- url += "&%s"%("&".join(["%s=%s"%(k,v) for k,v in kwargs.items()]))
+ url += "&%s" % ("&".join(
+ ["%s=%s" % (k, v) for k, v in kwargs.items()]))
try:
r = requests.get(url)
except:
- raise GitlabConnectionError('Can\'t connect to GitLab server (%s)'%self.url)
+ raise GitlabConnectionError(
+ "Can't connect to GitLab server (%s)" % self.url)
if r.status_code == 200:
- cls = objClass
- if objClass.returnClass:
- cls = objClass.returnClass
+ cls = obj_class
+ if obj_class.returnClass:
+ cls = obj_class.returnClass
l = [cls(self, item) for item in r.json]
if kwargs:
- for k,v in kwargs.items():
+ for k, v in kwargs.items():
for obj in l:
obj.__dict__[k] = v
return l
elif r.status_code == 401:
raise GitlabAuthenticationError(r.json['message'])
else:
- raise GitlabGetError('%d: %s'%(r.status_code, r.text))
+ raise GitlabGetError('%d: %s' % (r.status_code, r.text))
- def get(self, objClass, id=None, **kwargs):
- url = objClass.url
+ def get(self, obj_class, id=None, **kwargs):
+ url = obj_class.url
if kwargs:
- url = objClass.url % kwargs
- if id != None:
- url = '%s%s/%d?private_token=%s'%(self.url, url, id, self.private_token)
+ url = obj_class.url % kwargs
+ if id is not None:
+ url = '%s%s/%d?private_token=%s' % \
+ (self.url, url, id, self.private_token)
else:
- url = '%s%s?private_token=%s'%(self.url, url, self.private_token)
+ url = '%s%s?private_token=%s' % \
+ (self.url, url, self.private_token)
try:
r = requests.get(url)
except:
- raise GitlabConnectionError('Can\'t connect to GitLab server (%s)'%self.url)
+ raise GitlabConnectionError(
+ "Can't connect to GitLab server (%s)" % self.url)
if r.status_code == 200:
return r.json
elif r.status_code == 401:
raise GitlabAuthenticationError(r.json['message'])
else:
- raise GitlabGetError('%d: %s'%(r.status_code, r.text))
+ raise GitlabGetError('%d: %s' % (r.status_code, r.text))
def delete(self, obj):
url = obj.url % obj.__dict__
- url = '%s%s/%d?private_token=%s'%(self.url, url, obj.id, self.private_token)
+ url = '%s%s/%d?private_token=%s' % \
+ (self.url, url, obj.id, self.private_token)
try:
r = requests.delete(url)
except:
- raise GitlabConnectionError('Can\'t connect to GitLab server (%s)'%self.url)
+ raise GitlabConnectionError(
+ "Can't connect to GitLab server (%s)" % self.url)
if r.status_code == 200:
return True
@@ -162,35 +178,39 @@ class Gitlab(object):
def create(self, obj):
url = obj.url % obj.__dict__
- url = '%s%s?private_token=%s'%(self.url, url, self.private_token)
+ url = '%s%s?private_token=%s' % (self.url, url, self.private_token)
try:
- # TODO: avoid too much work on the server side by filtering the __dict__ keys
+ # TODO: avoid too much work on the server side by filtering the
+ # __dict__ keys
r = requests.post(url, obj.__dict__)
except:
- raise GitlabConnectionError('Can\'t connect to GitLab server (%s)'%self.url)
+ raise GitlabConnectionError(
+ "Can't connect to GitLab server (%s)" % self.url)
if r.status_code == 201:
return r.json
elif r.status_code == 401:
raise GitlabAuthenticationError(r.json['message'])
else:
- raise GitlabCreateError('%d: %s'%(r.status_code, r.text))
+ raise GitlabCreateError('%d: %s' % (r.status_code, r.text))
def update(self, obj):
url = obj.url % obj.__dict__
- url = '%s%s/%d?private_token=%s'%(self.url, url, obj.id, self.private_token)
+ url = '%s%s/%d?private_token=%s' % \
+ (self.url, url, obj.id, self.private_token)
# build a dict of data that can really be sent to server
d = {}
- for k,v in obj.__dict__.items():
+ for k, v in obj.__dict__.items():
if type(v) in (int, str, unicode, bool):
d[k] = v
try:
r = requests.put(url, d)
except:
- raise GitlabConnectionError('Can\'t connect to GitLab server (%s)'%self.url)
+ raise GitlabConnectionError(
+ "Can't connect to GitLab server (%s)" % self.url)
if r.status_code == 200:
return r.json
@@ -200,7 +220,7 @@ class Gitlab(object):
raise GitlabUpdateError('%d: %s' % (r.status_code, r.text))
def getListOrObject(self, cls, id, **kwargs):
- if id == None:
+ if id is None:
return cls.list(self, **kwargs)
else:
return cls(self, id, **kwargs)
@@ -239,7 +259,7 @@ class GitlabObject(object):
return gl.list(cls, **kwargs)
def getListOrObject(self, cls, id, **kwargs):
- if id == None:
+ if id is None:
if not cls.canGetList:
raise GitlabGetError
@@ -258,13 +278,13 @@ class GitlabObject(object):
def setFromDict(self, data):
for k, v in data.items():
- if isinstance (v, list):
+ if isinstance(v, list):
self.__dict__[k] = []
for i in v:
- self.__dict__[k].append(self.getObject(k,i))
+ self.__dict__[k].append(self.getObject(k, i))
elif v:
- self.__dict__[k] = self.getObject(k,v)
- else: # None object
+ self.__dict__[k] = self.getObject(k, v)
+ else: # None object
self.__dict__[k] = None
def _create(self):
@@ -305,20 +325,22 @@ class GitlabObject(object):
self.setFromDict(data)
if kwargs:
- for k,v in kwargs.items():
+ for k, v in kwargs.items():
self.__dict__[k] = v
def __str__(self):
- return '%s => %s'%(type(self), str(self.__dict__))
+ return '%s => %s' % (type(self), str(self.__dict__))
class User(GitlabObject):
url = '/users'
+
class CurrentUserKey(GitlabObject):
url = '/user/keys'
canUpdate = False
+
class CurrentUser(GitlabObject):
url = '/user'
canGetList = False
@@ -327,15 +349,17 @@ class CurrentUser(GitlabObject):
canDelete = False
def Key(self, id=None):
- if id == None:
+ if id is None:
return CurrentUserKey.list(self.gitlab)
else:
return CurrentUserKey(self.gitlab, id)
+
class Group(GitlabObject):
url = '/groups'
constructorTypes = {'projects': 'Project'}
+
class Issue(GitlabObject):
url = '/issues'
constructorTypes = {'author': 'User', 'assignee': 'User',
@@ -345,12 +369,14 @@ class Issue(GitlabObject):
canUpdate = False
canCreate = False
+
class ProjectBranch(GitlabObject):
url = '/projects/%(project_id)d/repository/branches'
canDelete = False
canUpdate = False
canCreate = False
+
class ProjectCommit(GitlabObject):
url = '/projects/%(project_id)d/repository/commits'
canGet = False
@@ -358,15 +384,18 @@ class ProjectCommit(GitlabObject):
canUpdate = False
canCreate = False
+
class ProjectHook(GitlabObject):
url = '/projects/%(project_id)d/hooks'
+
class ProjectIssueNote(GitlabObject):
url = '/projects/%(project_id)d/issues/%(issue_id)d/notes'
constructorTypes = {'author': 'User'}
canUpdate = False
canDelete = False
+
class ProjectIssue(GitlabObject):
url = '/projects/%(project_id)s/issues/'
constructorTypes = {'author': 'User', 'assignee': 'User',
@@ -374,18 +403,23 @@ class ProjectIssue(GitlabObject):
canDelete = False
def Note(self, id=None):
- return self.getListOrObject(ProjectIssueNote, id, project_id=self.id, issue_id=self.id)
+ return self.getListOrObject(ProjectIssueNote, id,
+ project_id=self.project_id,
+ issue_id=self.id)
+
class ProjectMember(GitlabObject):
url = '/projects/%(project_id)d/members'
returnClass = User
+
class ProjectNote(GitlabObject):
url = '/projects/%(project_id)d/notes'
constructorTypes = {'author': 'User'}
canUpdate = False
canDelete = False
+
class ProjectTag(GitlabObject):
url = '/projects/%(project_id)d/repository/tags'
canGet = False
@@ -393,6 +427,7 @@ class ProjectTag(GitlabObject):
canUpdate = False
canCreate = False
+
class ProjectMergeRequestNote(GitlabObject):
url = '/projects/%(project_id)d/merge_requests/%(merge_request_id)d/notes'
constructorTypes = {'author': 'User'}
@@ -401,6 +436,7 @@ class ProjectMergeRequestNote(GitlabObject):
canUpdate = False
canDelete = False
+
class ProjectMergeRequest(GitlabObject):
url = '/projects/%(project_id)d/merge_request'
constructorTypes = {'author': 'User', 'assignee': 'User'}
@@ -408,25 +444,31 @@ class ProjectMergeRequest(GitlabObject):
def Note(self, id=None):
return self.getListOrObject(ProjectMergeRequestNote, id,
- project_id=self.id, merge_request_id=self.id)
+ project_id=self.id,
+ merge_request_id=self.id)
+
class ProjectMilestone(GitlabObject):
url = '/projects/%(project_id)s/milestones'
canDelete = False
+
class ProjectSnippetNote(GitlabObject):
url = '/projects/%(project_id)d/snippets/%(snippet_id)d/notes'
constructorTypes = {'author': 'User'}
canUpdate = False
canDelete = False
+
class ProjectSnippet(GitlabObject):
url = '/projects/%(project_id)d/snippets'
constructorTypes = {'author': 'User'}
def Note(self, id=None):
return self.getListOrObject(ProjectSnippetNote, id,
- project_id=self.id, snippet_id=self.id)
+ project_id=self.project_id,
+ snippet_id=self.id)
+
class Project(GitlabObject):
url = '/projects'
@@ -435,34 +477,45 @@ class Project(GitlabObject):
canDelete = False
def Branch(self, id=None):
- return self.getListOrObject(ProjectBranch, id, project_id=self.id)
+ return self.getListOrObject(ProjectBranch, id,
+ project_id=self.id)
def Commit(self, id=None):
- return self.getListOrObject(ProjectCommit, id, project_id=self.id)
+ return self.getListOrObject(ProjectCommit, id,
+ project_id=self.id)
def Hook(self, id=None):
- return self.getListOrObject(ProjectHook, id, project_id=self.id)
+ return self.getListOrObject(ProjectHook, id,
+ project_id=self.id)
def Issue(self, id=None):
- return self.getListOrObject(ProjectIssue, id, project_id=self.id)
+ return self.getListOrObject(ProjectIssue, id,
+ project_id=self.id)
def Member(self, id=None):
- return self.getListOrObject(ProjectMember, id, project_id=self.id)
+ return self.getListOrObject(ProjectMember, id,
+ project_id=self.id)
def MergeRequest(self, id=None):
- return self.getListOrObject(ProjectMergeRequest, id, project_id=self.id)
+ return self.getListOrObject(ProjectMergeRequest, id,
+ project_id=self.id)
def Milestone(self, id=None):
- return self.getListOrObject(ProjectMilestone, id, project_id=self.id)
+ return self.getListOrObject(ProjectMilestone, id,
+ project_id=self.id)
def Note(self, id=None):
- return self.getListOrObject(ProjectNote, id, project_id=self.id)
+ return self.getListOrObject(ProjectNote, id,
+ project_id=self.id)
def Snippet(self, id=None):
- return self.getListOrObject(ProjectSnippet, id, project_id=self.id)
+ return self.getListOrObject(ProjectSnippet, id,
+ project_id=self.id)
def Tag(self, id=None):
- return self.getListOrObject(ProjectTag, id, project_id=self.id)
+ return self.getListOrObject(ProjectTag, id,
+ project_id=self.id)
+
if __name__ == '__main__':
# Quick "doc"
@@ -483,8 +536,7 @@ if __name__ == '__main__':
issues = p.Issue()
for issue in issues:
closed = 0 if not issue.closed else 1
- print " %d => %s (closed: %d)"%(issue.id, issue.title, closed)
+ print " %d => %s (closed: %d)" % (issue.id, issue.title, closed)
# and close them all
issue.closed = 1
issue.save()
-