summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gitlab/__init__.py54
-rw-r--r--gitlab/tests/test_manager.py2
-rw-r--r--gitlab/v3/__init__.py0
-rw-r--r--gitlab/v3/objects.py (renamed from gitlab/objects.py)598
-rw-r--r--gitlab/v4/__init__.py0
-rw-r--r--gitlab/v4/objects.py18
-rw-r--r--tools/python_test.py2
7 files changed, 98 insertions, 576 deletions
diff --git a/gitlab/__init__.py b/gitlab/__init__.py
index 1091319..b3f6dcd 100644
--- a/gitlab/__init__.py
+++ b/gitlab/__init__.py
@@ -19,6 +19,7 @@
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
+import importlib
import inspect
import itertools
import json
@@ -31,7 +32,7 @@ import six
import gitlab.config
from gitlab.const import * # noqa
from gitlab.exceptions import * # noqa
-from gitlab.objects import * # noqa
+from gitlab.v3.objects import * # noqa
__title__ = 'python-gitlab'
__version__ = '0.20'
@@ -91,40 +92,43 @@ class Gitlab(object):
#: Create a session object for requests
self.session = requests.Session()
- self.broadcastmessages = BroadcastMessageManager(self)
- self.keys = KeyManager(self)
- self.deploykeys = DeployKeyManager(self)
- self.gitlabciymls = GitlabciymlManager(self)
- self.gitignores = GitignoreManager(self)
- self.groups = GroupManager(self)
- self.hooks = HookManager(self)
- self.issues = IssueManager(self)
- self.licenses = LicenseManager(self)
- self.namespaces = NamespaceManager(self)
- self.notificationsettings = NotificationSettingsManager(self)
- self.projects = ProjectManager(self)
- self.runners = RunnerManager(self)
- self.settings = ApplicationSettingsManager(self)
- self.sidekiq = SidekiqManager(self)
- self.snippets = SnippetManager(self)
- self.users = UserManager(self)
- self.teams = TeamManager(self)
- self.todos = TodoManager(self)
+ objects = importlib.import_module('gitlab.v%s.objects' %
+ self._api_version)
+
+ self.broadcastmessages = objects.BroadcastMessageManager(self)
+ self.keys = objects.KeyManager(self)
+ self.deploykeys = objects.DeployKeyManager(self)
+ self.gitlabciymls = objects.GitlabciymlManager(self)
+ self.gitignores = objects.GitignoreManager(self)
+ self.groups = objects.GroupManager(self)
+ self.hooks = objects.HookManager(self)
+ self.issues = objects.IssueManager(self)
+ self.licenses = objects.LicenseManager(self)
+ self.namespaces = objects.NamespaceManager(self)
+ self.notificationsettings = objects.NotificationSettingsManager(self)
+ self.projects = objects.ProjectManager(self)
+ self.runners = objects.RunnerManager(self)
+ self.settings = objects.ApplicationSettingsManager(self)
+ self.sidekiq = objects.SidekiqManager(self)
+ self.snippets = objects.SnippetManager(self)
+ self.users = objects.UserManager(self)
+ self.teams = objects.TeamManager(self)
+ self.todos = objects.TodoManager(self)
# build the "submanagers"
- for parent_cls in six.itervalues(globals()):
+ for parent_cls in six.itervalues(vars(objects)):
if (not inspect.isclass(parent_cls)
- or not issubclass(parent_cls, GitlabObject)
- or parent_cls == CurrentUser):
+ or not issubclass(parent_cls, objects.GitlabObject)
+ or parent_cls == objects.CurrentUser):
continue
if not parent_cls.managers:
continue
- for var, cls, attrs in parent_cls.managers:
+ for var, cls_name, attrs in parent_cls.managers:
var_name = '%s_%s' % (self._cls_to_manager_prefix(parent_cls),
var)
- manager = cls(self)
+ manager = getattr(objects, cls_name)(self)
setattr(self, var_name, manager)
@property
diff --git a/gitlab/tests/test_manager.py b/gitlab/tests/test_manager.py
index 16e13f2..4f4dbe1 100644
--- a/gitlab/tests/test_manager.py
+++ b/gitlab/tests/test_manager.py
@@ -25,7 +25,7 @@ from httmock import response # noqa
from httmock import urlmatch # noqa
from gitlab import * # noqa
-from gitlab.objects import BaseManager # noqa
+from gitlab.v3.objects import BaseManager # noqa
class FakeChildObject(GitlabObject):
diff --git a/gitlab/v3/__init__.py b/gitlab/v3/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gitlab/v3/__init__.py
diff --git a/gitlab/objects.py b/gitlab/v3/objects.py
index 630d415..01bb670 100644
--- a/gitlab/objects.py
+++ b/gitlab/v3/objects.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2013-2015 Gauvain Pocentek <gauvain@pocentek.net>
+# Copyright (C) 2013-2017 Gauvain Pocentek <gauvain@pocentek.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
@@ -19,519 +19,18 @@ from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import base64
-import copy
-import itertools
import json
-import sys
import urllib
import warnings
import six
import gitlab
+from gitlab.base import * # noqa
from gitlab.exceptions import * # noqa
from gitlab import utils
-class jsonEncoder(json.JSONEncoder):
- def default(self, obj):
- if isinstance(obj, GitlabObject):
- return obj.as_dict()
- elif isinstance(obj, gitlab.Gitlab):
- return {'url': obj._url}
- return json.JSONEncoder.default(self, obj)
-
-
-class BaseManager(object):
- """Base manager class for API operations.
-
- Managers provide method to manage GitLab API objects, such as retrieval,
- listing, creation.
-
- Inherited class must define the ``obj_cls`` attribute.
-
- Attributes:
- obj_cls (class): class of objects wrapped by this manager.
- """
-
- obj_cls = None
-
- def __init__(self, gl, parent=None, args=[]):
- """Constructs a manager.
-
- Args:
- gl (gitlab.Gitlab): Gitlab object referencing the GitLab server.
- parent (Optional[Manager]): A parent manager.
- args (list): A list of tuples defining a link between the
- parent/child attributes.
-
- Raises:
- AttributeError: If `obj_cls` is None.
- """
- self.gitlab = gl
- self.args = args
- self.parent = parent
-
- if self.obj_cls is None:
- raise AttributeError("obj_cls must be defined")
-
- def _set_parent_args(self, **kwargs):
- args = copy.copy(kwargs)
- if self.parent is not None:
- for attr, parent_attr in self.args:
- args.setdefault(attr, getattr(self.parent, parent_attr))
-
- return args
-
- def get(self, id=None, **kwargs):
- """Get a GitLab object.
-
- Args:
- id: ID of the object to retrieve.
- **kwargs: Additional arguments to send to GitLab.
-
- Returns:
- object: An object of class `obj_cls`.
-
- Raises:
- NotImplementedError: If objects cannot be retrieved.
- GitlabGetError: If the server fails to perform the request.
- """
- args = self._set_parent_args(**kwargs)
- if not self.obj_cls.canGet:
- raise NotImplementedError
- if id is None and self.obj_cls.getRequiresId is True:
- raise ValueError('The id argument must be defined.')
- return self.obj_cls.get(self.gitlab, id, **args)
-
- def list(self, **kwargs):
- """Get a list of GitLab objects.
-
- Args:
- **kwargs: Additional arguments to send to GitLab.
-
- Returns:
- list[object]: A list of `obj_cls` objects.
-
- Raises:
- NotImplementedError: If objects cannot be listed.
- GitlabListError: If the server fails to perform the request.
- """
- args = self._set_parent_args(**kwargs)
- if not self.obj_cls.canList:
- raise NotImplementedError
- return self.obj_cls.list(self.gitlab, **args)
-
- def create(self, data, **kwargs):
- """Create a new object of class `obj_cls`.
-
- Args:
- data (dict): The parameters to send to the GitLab server to create
- the object. Required and optional arguments are defined in the
- `requiredCreateAttrs` and `optionalCreateAttrs` of the
- `obj_cls` class.
- **kwargs: Additional arguments to send to GitLab.
-
- Returns:
- object: A newly create `obj_cls` object.
-
- Raises:
- NotImplementedError: If objects cannot be created.
- GitlabCreateError: If the server fails to perform the request.
- """
- args = self._set_parent_args(**kwargs)
- if not self.obj_cls.canCreate:
- raise NotImplementedError
- return self.obj_cls.create(self.gitlab, data, **args)
-
- def delete(self, id, **kwargs):
- """Delete a GitLab object.
-
- Args:
- id: ID of the object to delete.
-
- Raises:
- NotImplementedError: If objects cannot be deleted.
- GitlabDeleteError: If the server fails to perform the request.
- """
- args = self._set_parent_args(**kwargs)
- if not self.obj_cls.canDelete:
- raise NotImplementedError
- self.gitlab.delete(self.obj_cls, id, **args)
-
-
-class GitlabObject(object):
- """Base class for all classes that interface with GitLab."""
- #: Url to use in GitLab for this object
- _url = None
- # Some objects (e.g. merge requests) have different urls for singular and
- # plural
- _urlPlural = None
- _id_in_delete_url = True
- _id_in_update_url = True
- _constructorTypes = None
-
- #: Tells if GitLab-api allows retrieving single objects.
- canGet = True
- #: Tells if GitLab-api allows listing of objects.
- canList = True
- #: Tells if GitLab-api allows creation of new objects.
- canCreate = True
- #: Tells if GitLab-api allows updating object.
- canUpdate = True
- #: Tells if GitLab-api allows deleting object.
- canDelete = True
- #: Attributes that are required for constructing url.
- requiredUrlAttrs = []
- #: Attributes that are required when retrieving list of objects.
- requiredListAttrs = []
- #: Attributes that are optional when retrieving list of objects.
- optionalListAttrs = []
- #: Attributes that are optional when retrieving single object.
- optionalGetAttrs = []
- #: Attributes that are required when retrieving single object.
- requiredGetAttrs = []
- #: Attributes that are required when deleting object.
- requiredDeleteAttrs = []
- #: Attributes that are required when creating a new object.
- requiredCreateAttrs = []
- #: Attributes that are optional when creating a new object.
- optionalCreateAttrs = []
- #: Attributes that are required when updating an object.
- requiredUpdateAttrs = []
- #: Attributes that are optional when updating an object.
- optionalUpdateAttrs = []
- #: Whether the object ID is required in the GET url.
- getRequiresId = True
- #: List of managers to create.
- managers = []
- #: Name of the identifier of an object.
- idAttr = 'id'
- #: Attribute to use as ID when displaying the object.
- shortPrintAttr = None
-
- def _data_for_gitlab(self, extra_parameters={}, update=False,
- as_json=True):
- data = {}
- if update and (self.requiredUpdateAttrs or self.optionalUpdateAttrs):
- attributes = itertools.chain(self.requiredUpdateAttrs,
- self.optionalUpdateAttrs)
- else:
- attributes = itertools.chain(self.requiredCreateAttrs,
- self.optionalCreateAttrs)
- attributes = list(attributes) + ['sudo', 'page', 'per_page']
- for attribute in attributes:
- if hasattr(self, attribute):
- value = getattr(self, attribute)
- # labels need to be sent as a comma-separated list
- if attribute == 'labels' and isinstance(value, list):
- value = ", ".join(value)
- elif attribute == 'sudo':
- value = str(value)
- data[attribute] = value
-
- data.update(extra_parameters)
-
- return json.dumps(data) if as_json else data
-
- @classmethod
- def list(cls, gl, **kwargs):
- """Retrieve a list of objects from GitLab.
-
- Args:
- gl (gitlab.Gitlab): Gitlab object referencing the GitLab server.
- per_page (int): Maximum number of items to return.
- page (int): ID of the page to return when using pagination.
-
- Returns:
- list[object]: A list of objects.
-
- Raises:
- NotImplementedError: If objects can't be listed.
- GitlabListError: If the server cannot perform the request.
- """
- if not cls.canList:
- raise NotImplementedError
-
- if not cls._url:
- raise NotImplementedError
-
- return gl.list(cls, **kwargs)
-
- @classmethod
- def get(cls, gl, id, **kwargs):
- """Retrieve a single object.
-
- Args:
- gl (gitlab.Gitlab): Gitlab object referencing the GitLab server.
- id (int or str): ID of the object to retrieve.
-
- Returns:
- object: The found GitLab object.
-
- Raises:
- NotImplementedError: If objects can't be retrieved.
- GitlabGetError: If the server cannot perform the request.
- """
-
- if cls.canGet is False:
- raise NotImplementedError
- elif cls.canGet is True:
- return cls(gl, id, **kwargs)
- elif cls.canGet == 'from_list':
- for obj in cls.list(gl, **kwargs):
- obj_id = getattr(obj, obj.idAttr)
- if str(obj_id) == str(id):
- return obj
-
- raise GitlabGetError("Object not found")
-
- def _get_object(self, k, v, **kwargs):
- if self._constructorTypes and k in self._constructorTypes:
- return globals()[self._constructorTypes[k]](self.gitlab, v,
- **kwargs)
- else:
- return v
-
- def _set_from_dict(self, data, **kwargs):
- if not hasattr(data, 'items'):
- return
-
- for k, v in data.items():
- # If a k attribute already exists and is a Manager, do nothing (see
- # https://github.com/python-gitlab/python-gitlab/issues/209)
- if isinstance(getattr(self, k, None), BaseManager):
- continue
-
- if isinstance(v, list):
- self.__dict__[k] = []
- for i in v:
- self.__dict__[k].append(self._get_object(k, i, **kwargs))
- elif v is None:
- self.__dict__[k] = None
- else:
- self.__dict__[k] = self._get_object(k, v, **kwargs)
-
- def _create(self, **kwargs):
- if not self.canCreate:
- raise NotImplementedError
-
- json = self.gitlab.create(self, **kwargs)
- self._set_from_dict(json)
- self._from_api = True
-
- def _update(self, **kwargs):
- if not self.canUpdate:
- raise NotImplementedError
-
- json = self.gitlab.update(self, **kwargs)
- self._set_from_dict(json)
-
- def save(self, **kwargs):
- if self._from_api:
- self._update(**kwargs)
- else:
- self._create(**kwargs)
-
- def delete(self, **kwargs):
- if not self.canDelete:
- raise NotImplementedError
-
- if not self._from_api:
- raise GitlabDeleteError("Object not yet created")
-
- return self.gitlab.delete(self, **kwargs)
-
- @classmethod
- def create(cls, gl, data, **kwargs):
- """Create an object.
-
- Args:
- gl (gitlab.Gitlab): Gitlab object referencing the GitLab server.
- data (dict): The data used to define the object.
-
- Returns:
- object: The new object.
-
- Raises:
- NotImplementedError: If objects can't be created.
- GitlabCreateError: If the server cannot perform the request.
- """
- if not cls.canCreate:
- raise NotImplementedError
-
- obj = cls(gl, data, **kwargs)
- obj.save()
-
- return obj
-
- def __init__(self, gl, data=None, **kwargs):
- """Constructs a new object.
-
- Do not use this method. Use the `get` or `create` class methods
- instead.
-
- Args:
- gl (gitlab.Gitlab): Gitlab object referencing the GitLab server.
- data: If `data` is a dict, create a new object using the
- information. If it is an int or a string, get a GitLab object
- from an API request.
- **kwargs: Additional arguments to send to GitLab.
- """
- self._from_api = False
- #: (gitlab.Gitlab): Gitlab connection.
- self.gitlab = gl
-
- if (data is None or isinstance(data, six.integer_types) or
- isinstance(data, six.string_types)):
- if not self.canGet:
- raise NotImplementedError
- data = self.gitlab.get(self.__class__, data, **kwargs)
- self._from_api = True
-
- # the API returned a list because custom kwargs where used
- # instead of the id to request an object. Usually parameters
- # other than an id return ambiguous results. However in the
- # gitlab universe iids together with a project_id are
- # unambiguous for merge requests and issues, too.
- # So if there is only one element we can use it as our data
- # source.
- if 'iid' in kwargs and isinstance(data, list):
- if len(data) < 1:
- raise GitlabGetError('Not found')
- elif len(data) == 1:
- data = data[0]
- else:
- raise GitlabGetError('Impossible! You found multiple'
- ' elements with the same iid.')
-
- self._set_from_dict(data, **kwargs)
-
- if kwargs:
- for k, v in kwargs.items():
- # Don't overwrite attributes returned by the server (#171)
- if k not in self.__dict__ or not self.__dict__[k]:
- self.__dict__[k] = v
-
- # Special handling for api-objects that don't have id-number in api
- # responses. Currently only Labels and Files
- if not hasattr(self, "id"):
- self.id = None
-
- def _set_manager(self, var, cls, attrs):
- manager = cls(self.gitlab, self, attrs)
- setattr(self, var, manager)
-
- def __getattr__(self, name):
- # build a manager if it doesn't exist yet
- for var, cls, attrs in self.managers:
- if var != name:
- continue
- self._set_manager(var, cls, attrs)
- return getattr(self, var)
-
- raise AttributeError
-
- def __str__(self):
- return '%s => %s' % (type(self), str(self.__dict__))
-
- def __repr__(self):
- return '<%s %s:%s>' % (self.__class__.__name__,
- self.idAttr,
- getattr(self, self.idAttr))
-
- def display(self, pretty):
- if pretty:
- self.pretty_print()
- else:
- self.short_print()
-
- def short_print(self, depth=0):
- """Print the object on the standard output (verbose).
-
- Args:
- depth (int): Used internaly for recursive call.
- """
- id = self.__dict__[self.idAttr]
- print("%s%s: %s" % (" " * depth * 2, self.idAttr, id))
- if self.shortPrintAttr:
- print("%s%s: %s" % (" " * depth * 2,
- self.shortPrintAttr.replace('_', '-'),
- self.__dict__[self.shortPrintAttr]))
-
- @staticmethod
- def _get_display_encoding():
- return sys.stdout.encoding or sys.getdefaultencoding()
-
- @staticmethod
- def _obj_to_str(obj):
- if isinstance(obj, dict):
- s = ", ".join(["%s: %s" %
- (x, GitlabObject._obj_to_str(y))
- for (x, y) in obj.items()])
- return "{ %s }" % s
- elif isinstance(obj, list):
- s = ", ".join([GitlabObject._obj_to_str(x) for x in obj])
- return "[ %s ]" % s
- elif six.PY2 and isinstance(obj, six.text_type):
- return obj.encode(GitlabObject._get_display_encoding(), "replace")
- else:
- return str(obj)
-
- def pretty_print(self, depth=0):
- """Print the object on the standard output (verbose).
-
- Args:
- depth (int): Used internaly for recursive call.
- """
- id = self.__dict__[self.idAttr]
- print("%s%s: %s" % (" " * depth * 2, self.idAttr, id))
- for k in sorted(self.__dict__.keys()):
- if k in (self.idAttr, 'id', 'gitlab'):
- continue
- if k[0] == '_':
- continue
- v = self.__dict__[k]
- pretty_k = k.replace('_', '-')
- if six.PY2:
- pretty_k = pretty_k.encode(
- GitlabObject._get_display_encoding(), "replace")
- if isinstance(v, GitlabObject):
- if depth == 0:
- print("%s:" % pretty_k)
- v.pretty_print(1)
- else:
- print("%s: %s" % (pretty_k, v.id))
- elif isinstance(v, BaseManager):
- continue
- else:
- if hasattr(v, __name__) and v.__name__ == 'Gitlab':
- continue
- v = GitlabObject._obj_to_str(v)
- print("%s%s: %s" % (" " * depth * 2, pretty_k, v))
-
- def json(self):
- """Dump the object as json.
-
- Returns:
- str: The json string.
- """
- return json.dumps(self, cls=jsonEncoder)
-
- def as_dict(self):
- """Dump the object as a dict."""
- return {k: v for k, v in six.iteritems(self.__dict__)
- if (not isinstance(v, BaseManager) and not k[0] == '_')}
-
- def __eq__(self, other):
- if type(other) is type(self):
- return self.as_dict() == other.as_dict()
- return False
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
-
class SidekiqManager(object):
"""Manager for the Sidekiq methods.
@@ -627,9 +126,9 @@ class User(GitlabObject):
'admin', 'can_create_group', 'website_url',
'confirm', 'external', 'organization', 'location']
managers = (
- ('emails', UserEmailManager, [('user_id', 'id')]),
- ('keys', UserKeyManager, [('user_id', 'id')]),
- ('projects', UserProjectManager, [('user_id', 'id')]),
+ ('emails', 'UserEmailManager', [('user_id', 'id')]),
+ ('keys', 'UserKeyManager', [('user_id', 'id')]),
+ ('projects', 'UserProjectManager', [('user_id', 'id')]),
)
def _data_for_gitlab(self, extra_parameters={}, update=False,
@@ -736,8 +235,8 @@ class CurrentUser(GitlabObject):
canDelete = False
shortPrintAttr = 'username'
managers = (
- ('emails', CurrentUserEmailManager, [('user_id', 'id')]),
- ('keys', CurrentUserKeyManager, [('user_id', 'id')]),
+ ('emails', 'CurrentUserEmailManager', [('user_id', 'id')]),
+ ('keys', 'CurrentUserKeyManager', [('user_id', 'id')]),
)
@@ -1069,7 +568,7 @@ class ProjectBoard(GitlabObject):
canCreate = False
canDelete = False
managers = (
- ('lists', ProjectBoardListManager,
+ ('lists', 'ProjectBoardListManager',
[('project_id', 'project_id'), ('board_id', 'id')]),
)
@@ -1246,9 +745,9 @@ class ProjectCommit(GitlabObject):
optionalCreateAttrs = ['author_email', 'author_name']
shortPrintAttr = 'title'
managers = (
- ('comments', ProjectCommitCommentManager,
+ ('comments', 'ProjectCommitCommentManager',
[('project_id', 'project_id'), ('commit_id', 'id')]),
- ('statuses', ProjectCommitStatusManager,
+ ('statuses', 'ProjectCommitStatusManager',
[('project_id', 'project_id'), ('commit_id', 'id')]),
)
@@ -1433,7 +932,7 @@ class ProjectIssue(GitlabObject):
'updated_at', 'state_event', 'due_date']
shortPrintAttr = 'title'
managers = (
- ('notes', ProjectIssueNoteManager,
+ ('notes', 'ProjectIssueNoteManager',
[('project_id', 'project_id'), ('issue_id', 'id')]),
)
@@ -1682,9 +1181,9 @@ class ProjectMergeRequest(GitlabObject):
optionalListAttrs = ['iid', 'state', 'order_by', 'sort']
managers = (
- ('notes', ProjectMergeRequestNoteManager,
+ ('notes', 'ProjectMergeRequestNoteManager',
[('project_id', 'project_id'), ('merge_request_id', 'id')]),
- ('diffs', ProjectMergeRequestDiffManager,
+ ('diffs', 'ProjectMergeRequestDiffManager',
[('project_id', 'project_id'), ('merge_request_id', 'id')]),
)
@@ -2080,7 +1579,7 @@ class ProjectSnippet(GitlabObject):
optionalUpdateAttrs = ['title', 'file_name', 'code', 'visibility_level']
shortPrintAttr = 'title'
managers = (
- ('notes', ProjectSnippetNoteManager,
+ ('notes', 'ProjectSnippetNoteManager',
[('project_id', 'project_id'), ('snippet_id', 'id')]),
)
@@ -2299,35 +1798,36 @@ class Project(GitlabObject):
'lfs_enabled', 'request_access_enabled']
shortPrintAttr = 'path'
managers = (
- ('accessrequests', ProjectAccessRequestManager,
+ ('accessrequests', 'ProjectAccessRequestManager',
+ [('project_id', 'id')]),
+ ('boards', 'ProjectBoardManager', [('project_id', 'id')]),
+ ('board_lists', 'ProjectBoardListManager', [('project_id', 'id')]),
+ ('branches', 'ProjectBranchManager', [('project_id', 'id')]),
+ ('builds', 'ProjectBuildManager', [('project_id', 'id')]),
+ ('commits', 'ProjectCommitManager', [('project_id', 'id')]),
+ ('deployments', 'ProjectDeploymentManager', [('project_id', 'id')]),
+ ('environments', 'ProjectEnvironmentManager', [('project_id', 'id')]),
+ ('events', 'ProjectEventManager', [('project_id', 'id')]),
+ ('files', 'ProjectFileManager', [('project_id', 'id')]),
+ ('forks', 'ProjectForkManager', [('project_id', 'id')]),
+ ('hooks', 'ProjectHookManager', [('project_id', 'id')]),
+ ('keys', 'ProjectKeyManager', [('project_id', 'id')]),
+ ('issues', 'ProjectIssueManager', [('project_id', 'id')]),
+ ('labels', 'ProjectLabelManager', [('project_id', 'id')]),
+ ('members', 'ProjectMemberManager', [('project_id', 'id')]),
+ ('mergerequests', 'ProjectMergeRequestManager',
[('project_id', 'id')]),
- ('boards', ProjectBoardManager, [('project_id', 'id')]),
- ('board_lists', ProjectBoardListManager, [('project_id', 'id')]),
- ('branches', ProjectBranchManager, [('project_id', 'id')]),
- ('builds', ProjectBuildManager, [('project_id', 'id')]),
- ('commits', ProjectCommitManager, [('project_id', 'id')]),
- ('deployments', ProjectDeploymentManager, [('project_id', 'id')]),
- ('environments', ProjectEnvironmentManager, [('project_id', 'id')]),
- ('events', ProjectEventManager, [('project_id', 'id')]),
- ('files', ProjectFileManager, [('project_id', 'id')]),
- ('forks', ProjectForkManager, [('project_id', 'id')]),
- ('hooks', ProjectHookManager, [('project_id', 'id')]),
- ('keys', ProjectKeyManager, [('project_id', 'id')]),
- ('issues', ProjectIssueManager, [('project_id', 'id')]),
- ('labels', ProjectLabelManager, [('project_id', 'id')]),
- ('members', ProjectMemberManager, [('project_id', 'id')]),
- ('mergerequests', ProjectMergeRequestManager, [('project_id', 'id')]),
- ('milestones', ProjectMilestoneManager, [('project_id', 'id')]),
- ('notes', ProjectNoteManager, [('project_id', 'id')]),
- ('notificationsettings', ProjectNotificationSettingsManager,
+ ('milestones', 'ProjectMilestoneManager', [('project_id', 'id')]),
+ ('notes', 'ProjectNoteManager', [('project_id', 'id')]),
+ ('notificationsettings', 'ProjectNotificationSettingsManager',
[('project_id', 'id')]),
- ('pipelines', ProjectPipelineManager, [('project_id', 'id')]),
- ('runners', ProjectRunnerManager, [('project_id', 'id')]),
- ('services', ProjectServiceManager, [('project_id', 'id')]),
- ('snippets', ProjectSnippetManager, [('project_id', 'id')]),
- ('tags', ProjectTagManager, [('project_id', 'id')]),
- ('triggers', ProjectTriggerManager, [('project_id', 'id')]),
- ('variables', ProjectVariableManager, [('project_id', 'id')]),
+ ('pipelines', 'ProjectPipelineManager', [('project_id', 'id')]),
+ ('runners', 'ProjectRunnerManager', [('project_id', 'id')]),
+ ('services', 'ProjectServiceManager', [('project_id', 'id')]),
+ ('snippets', 'ProjectSnippetManager', [('project_id', 'id')]),
+ ('tags', 'ProjectTagManager', [('project_id', 'id')]),
+ ('triggers', 'ProjectTriggerManager', [('project_id', 'id')]),
+ ('variables', 'ProjectVariableManager', [('project_id', 'id')]),
)
VISIBILITY_PRIVATE = gitlab.VISIBILITY_PRIVATE
@@ -2768,12 +2268,12 @@ class Group(GitlabObject):
'lfs_enabled', 'request_access_enabled']
shortPrintAttr = 'name'
managers = (
- ('accessrequests', GroupAccessRequestManager, [('group_id', 'id')]),
- ('members', GroupMemberManager, [('group_id', 'id')]),
- ('notificationsettings', GroupNotificationSettingsManager,
+ ('accessrequests', 'GroupAccessRequestManager', [('group_id', 'id')]),
+ ('members', 'GroupMemberManager', [('group_id', 'id')]),
+ ('notificationsettings', 'GroupNotificationSettingsManager',
[('group_id', 'id')]),
- ('projects', GroupProjectManager, [('group_id', 'id')]),
- ('issues', GroupIssueManager, [('group_id', 'id')]),
+ ('projects', 'GroupProjectManager', [('group_id', 'id')]),
+ ('issues', 'GroupIssueManager', [('group_id', 'id')]),
)
GUEST_ACCESS = gitlab.GUEST_ACCESS
@@ -2842,8 +2342,8 @@ class Team(GitlabObject):
requiredCreateAttrs = ['name', 'path']
canUpdate = False
managers = (
- ('members', TeamMemberManager, [('team_id', 'id')]),
- ('projects', TeamProjectManager, [('team_id', 'id')]),
+ ('members', 'TeamMemberManager', [('team_id', 'id')]),
+ ('projects', 'TeamProjectManager', [('team_id', 'id')]),
)
diff --git a/gitlab/v4/__init__.py b/gitlab/v4/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gitlab/v4/__init__.py
diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py
new file mode 100644
index 0000000..5ffd017
--- /dev/null
+++ b/gitlab/v4/objects.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-2015 Gauvain Pocentek <gauvain@pocentek.net>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from gitlab.v3.objects import * # noqa
diff --git a/tools/python_test.py b/tools/python_test.py
index 41df221..b56a97d 100644
--- a/tools/python_test.py
+++ b/tools/python_test.py
@@ -29,7 +29,7 @@ token_from_auth = gl.private_token
gl = gitlab.Gitlab.from_config(config_files=['/tmp/python-gitlab.cfg'])
assert(token_from_auth == gl.private_token)
gl.auth()
-assert(isinstance(gl.user, gitlab.objects.CurrentUser))
+assert(isinstance(gl.user, gitlab.v3.objects.CurrentUser))
# settings
settings = gl.settings.get()