summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGauvain Pocentek <gauvain@pocentek.net>2017-06-11 12:10:56 +0200
committerGauvain Pocentek <gauvain@pocentek.net>2017-06-11 12:10:56 +0200
commit3488c5cf137b0dbe6e96a4412698bafaaa640143 (patch)
tree154a42fffad50ca4b189f1d7d291c89bc850e85c
parent68f411478f0d693f7d37436a9280847cb610a15b (diff)
downloadgitlab-3488c5cf137b0dbe6e96a4412698bafaaa640143.tar.gz
Fix a few remaining methods
-rw-r--r--gitlab/base.py12
-rw-r--r--gitlab/v4/objects.py150
2 files changed, 62 insertions, 100 deletions
diff --git a/gitlab/base.py b/gitlab/base.py
index c318c1d..d72a933 100644
--- a/gitlab/base.py
+++ b/gitlab/base.py
@@ -552,6 +552,7 @@ class RESTObject(object):
'_updated_attrs': {},
'_module': importlib.import_module(self.__module__)
})
+ self.__dict__['_parent_attrs'] = self.manager.parent_attrs
# TODO(gpocentek): manage the creation of new objects from the received
# data (_constructor_types)
@@ -565,7 +566,10 @@ class RESTObject(object):
try:
return self.__dict__['_attrs'][name]
except KeyError:
- raise AttributeError(name)
+ try:
+ return self.__dict__['_parent_attrs'][name]
+ except:
+ raise AttributeError(name)
def __setattr__(self, name, value):
self.__dict__['_updated_attrs'][name] = value
@@ -660,7 +664,12 @@ class RESTManager(object):
self._parent = parent # for nested managers
self._computed_path = self._compute_path()
+ @property
+ def parent_attrs(self):
+ return self._parent_attrs
+
def _compute_path(self, path=None):
+ self._parent_attrs = {}
if path is None:
path = self._path
if self._parent is None or not hasattr(self, '_from_parent_attrs'):
@@ -668,6 +677,7 @@ class RESTManager(object):
data = {self_attr: getattr(self._parent, parent_attr)
for self_attr, parent_attr in self._from_parent_attrs.items()}
+ self._parent_attrs = data
return path % data
@property
diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py
index 8eb977b..e9d1d03 100644
--- a/gitlab/v4/objects.py
+++ b/gitlab/v4/objects.py
@@ -906,44 +906,35 @@ class ProjectMergeRequest(SubscribableMixin, TodoMixin, TimeTrackingMixin,
self._update_attrs(server_data)
def closes_issues(self, **kwargs):
- """List issues closed by the MR.
+ """List issues that will close on merge."
Returns:
- list (ProjectIssue): List of closed issues
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabGetError: If the server fails to perform the request.
+ list (ProjectIssue): List of issues
"""
- # FIXME(gpocentek)
- url = ('/projects/%s/merge_requests/%s/closes_issues' %
- (self.project_id, self.iid))
- return self.gitlab._raw_list(url, ProjectIssue, **kwargs)
+ path = '%s/%s/closes_issues' % (self.manager.path, self.get_id())
+ data_list = self.manager.gitlab.http_list(path, **kwargs)
+ manager = ProjectIssueManager(self.manager.gitlab,
+ parent=self.manager._parent)
+ return RESTObjectList(manager, ProjectIssue, data_list)
def commits(self, **kwargs):
"""List the merge request commits.
Returns:
list (ProjectCommit): List of commits
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabListError: If the server fails to perform the request.
"""
- # FIXME(gpocentek)
- url = ('/projects/%s/merge_requests/%s/commits' %
- (self.project_id, self.iid))
- return self.gitlab._raw_list(url, ProjectCommit, **kwargs)
+
+ path = '%s/%s/commits' % (self.manager.path, self.get_id())
+ data_list = self.manager.gitlab.http_list(path, **kwargs)
+ manager = ProjectCommitManager(self.manager.gitlab,
+ parent=self.manager._parent)
+ return RESTObjectList(manager, ProjectCommit, data_list)
def changes(self, **kwargs):
"""List the merge request changes.
Returns:
list (dict): List of changes
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabListError: If the server fails to perform the request.
"""
path = '%s/%s/changes' % (self.manager.path, self.get_id())
return self.manager.gitlab.http_get(path, **kwargs)
@@ -960,14 +951,6 @@ class ProjectMergeRequest(SubscribableMixin, TodoMixin, TimeTrackingMixin,
branch
merged_when_build_succeeds (bool): Wait for the build to succeed,
then merge
-
- Returns:
- ProjectMergeRequest: The updated MR
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabMRForbiddenError: If the user doesn't have permission to
- close thr MR
- GitlabMRClosedError: If the MR is already closed
"""
path = '%s/%s/merge' % (self.manager.path, self.get_id())
data = {}
@@ -1002,23 +985,31 @@ class ProjectMilestone(SaveMixin, RESTObject):
_short_print_attr = 'title'
def issues(self, **kwargs):
- url = '/projects/%s/milestones/%s/issues' % (self.project_id, self.id)
- return self.gitlab._raw_list(url, ProjectIssue, **kwargs)
+ """List issues related to this milestone
+
+ Returns:
+ list (ProjectIssue): The list of issues
+ """
+
+ path = '%s/%s/issues' % (self.manager.path, self.get_id())
+ data_list = self.manager.gitlab.http_list(path, **kwargs)
+ manager = ProjectCommitManager(self.manager.gitlab,
+ parent=self.manager._parent)
+ # FIXME(gpocentek): the computed manager path is not correct
+ return RESTObjectList(manager, ProjectIssue, data_list)
def merge_requests(self, **kwargs):
"""List the merge requests related to this milestone
Returns:
list (ProjectMergeRequest): List of merge requests
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabListError: If the server fails to perform the request.
"""
- # FIXME(gpocentek)
- url = ('/projects/%s/milestones/%s/merge_requests' %
- (self.project_id, self.id))
- return self.gitlab._raw_list(url, ProjectMergeRequest, **kwargs)
+ path = '%s/%s/merge_requests' % (self.manager.path, self.get_id())
+ data_list = self.manager.gitlab.http_list(path, **kwargs)
+ manager = ProjectCommitManager(self.manager.gitlab,
+ parent=self.manager._parent)
+ # FIXME(gpocentek): the computed manager path is not correct
+ return RESTObjectList(manager, ProjectMergeRequest, data_list)
class ProjectMilestoneManager(RetrieveMixin, CreateMixin, DeleteMixin,
@@ -1425,20 +1416,29 @@ class Project(SaveMixin, RESTObject):
Returns:
str: The json representation of the tree.
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabGetError: If the server fails to perform the request.
"""
- path = '/projects/%s/repository/tree' % self.get_id()
+ gl_path = '/projects/%s/repository/tree' % self.get_id()
query_data = {}
if path:
query_data['path'] = path
if ref:
query_data['ref'] = ref
- return self.manager.gitlab.http_get(path, query_data=query_data,
+ return self.manager.gitlab.http_get(gl_path, query_data=query_data,
**kwargs)
+ def repository_blob(self, sha, **kwargs):
+ """Returns a blob by blob SHA.
+
+ Args:
+ sha(str): ID of the blob
+
+ Returns:
+ str: The blob as json
+ """
+
+ path = '/projects/%s/repository/blobs/%s' % (self.get_id(), sha)
+ return self.manager.gitlab.http_get(path, **kwargs)
+
def repository_raw_blob(self, sha, streamed=False, action=None,
chunk_size=1024, **kwargs):
"""Returns the raw file contents for a blob by blob SHA.
@@ -1454,13 +1454,9 @@ class Project(SaveMixin, RESTObject):
Returns:
str: The blob content
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabGetError: If the server fails to perform the request.
"""
- path = '/projects/%s/repository/raw_blobs/%s' % (self.get_id(), sha)
- result = self.gitlab._raw_get(path, streamed=streamed, **kwargs)
+ path = '/projects/%s/repository/blobs/%s/raw' % (self.get_id(), sha)
+ result = self.manager.gitlab.http_get(path, streamed=streamed, **kwargs)
return utils.response_content(result, streamed, action, chunk_size)
def repository_compare(self, from_, to, **kwargs):
@@ -1472,10 +1468,6 @@ class Project(SaveMixin, RESTObject):
Returns:
str: The diff
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabGetError: If the server fails to perform the request.
"""
path = '/projects/%s/repository/compare' % self.get_id()
query_data = {'from': from_, 'to': to}
@@ -1486,11 +1478,7 @@ class Project(SaveMixin, RESTObject):
"""Returns a list of contributors for the project.
Returns:
- list: The contibutors
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabGetError: If the server fails to perform the request.
+ list: The contributors
"""
path = '/projects/%s/repository/contributors' % self.get_id()
return self.manager.gitlab.http_get(path, **kwargs)
@@ -1510,17 +1498,13 @@ class Project(SaveMixin, RESTObject):
Returns:
str: The binary data of the archive.
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabGetError: If the server fails to perform the request.
"""
path = '/projects/%s/repository/archive' % self.get_id()
query_data = {}
if sha:
query_data['sha'] = sha
- result = self.gitlab._raw_get(path, query_data=query_data,
- streamed=streamed, **kwargs)
+ result = self.manager.gitlab.http_get(path, query_data=query_data,
+ streamed=streamed, **kwargs)
return utils.response_content(result, streamed, action, chunk_size)
def create_fork_relation(self, forked_from_id, **kwargs):
@@ -1528,20 +1512,12 @@ class Project(SaveMixin, RESTObject):
Args:
forked_from_id (int): The ID of the project that was forked from
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabCreateError: If the server fails to perform the request.
"""
path = '/projects/%s/fork/%s' % (self.get_id(), forked_from_id)
self.manager.gitlab.http_post(path, **kwargs)
def delete_fork_relation(self, **kwargs):
"""Delete a forked relation between existing projects.
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabDeleteError: If the server fails to perform the request.
"""
path = '/projects/%s/fork' % self.get_id()
self.manager.gitlab.http_delete(path, **kwargs)
@@ -1551,10 +1527,6 @@ class Project(SaveMixin, RESTObject):
Returns:
Project: the updated Project
-
- Raises:
- GitlabCreateError: If the action cannot be done
- GitlabConnectionError: If the server cannot be reached.
"""
path = '/projects/%s/star' % self.get_id()
server_data = self.manager.gitlab.http_post(path, **kwargs)
@@ -1565,10 +1537,6 @@ class Project(SaveMixin, RESTObject):
Returns:
Project: the updated Project
-
- Raises:
- GitlabDeleteError: If the action cannot be done
- GitlabConnectionError: If the server cannot be reached.
"""
path = '/projects/%s/unstar' % self.get_id()
server_data = self.manager.gitlab.http_post(path, **kwargs)
@@ -1579,10 +1547,6 @@ class Project(SaveMixin, RESTObject):
Returns:
Project: the updated Project
-
- Raises:
- GitlabCreateError: If the action cannot be done
- GitlabConnectionError: If the server cannot be reached.
"""
path = '/projects/%s/archive' % self.get_id()
server_data = self.manager.gitlab.http_post(path, **kwargs)
@@ -1593,10 +1557,6 @@ class Project(SaveMixin, RESTObject):
Returns:
Project: the updated Project
-
- Raises:
- GitlabDeleteError: If the action cannot be done
- GitlabConnectionError: If the server cannot be reached.
"""
path = '/projects/%s/unarchive' % self.get_id()
server_data = self.manager.gitlab.http_post(path, **kwargs)
@@ -1608,10 +1568,6 @@ class Project(SaveMixin, RESTObject):
Args:
group_id (int): ID of the group.
group_access (int): Access level for the group.
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabCreateError: If the server fails to perform the request.
"""
path = '/projects/%s/share' % self.get_id()
data = {'group_id': group_id,
@@ -1628,10 +1584,6 @@ class Project(SaveMixin, RESTObject):
ref (str): Commit to build; can be a commit SHA, a branch name, ...
token (str): The trigger token
variables (dict): Variables passed to the build script
-
- Raises:
- GitlabConnectionError: If the server cannot be reached.
- GitlabCreateError: If the server fails to perform the request.
"""
path = '/projects/%s/trigger/pipeline' % self.get_id()
form = {r'variables[%s]' % k: v for k, v in six.iteritems(variables)}