summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNejc Habjan <hab.nejc@gmail.com>2021-11-01 19:58:08 +0100
committerGitHub <noreply@github.com>2021-11-01 19:58:08 +0100
commited88bcea09c337fe9ede822ea88e7770a9c6ade0 (patch)
tree7595e860b397c88df86d2759f7a2fd6d51be9a9a
parentc7fdad42f68927d79e0d1963ade3324370b9d0e2 (diff)
parentfd73a738b429be0a2642d5b777d5e56a4c928787 (diff)
downloadgitlab-ed88bcea09c337fe9ede822ea88e7770a9c6ade0.tar.gz
Merge pull request #1646 from JacobHenner/add-merge-trains
feat(api): add merge trains
-rw-r--r--docs/api-objects.rst1
-rw-r--r--docs/gl_objects/merge_trains.rst29
-rw-r--r--gitlab/v4/objects/__init__.py1
-rw-r--r--gitlab/v4/objects/merge_trains.py18
-rw-r--r--gitlab/v4/objects/projects.py2
-rw-r--r--tests/unit/objects/test_merge_trains.py65
6 files changed, 116 insertions, 0 deletions
diff --git a/docs/api-objects.rst b/docs/api-objects.rst
index 567344f..9c089fe 100644
--- a/docs/api-objects.rst
+++ b/docs/api-objects.rst
@@ -29,6 +29,7 @@ API examples
gl_objects/boards
gl_objects/labels
gl_objects/notifications
+ gl_objects/merge_trains
gl_objects/mrs
gl_objects/mr_approvals
gl_objects/milestones
diff --git a/docs/gl_objects/merge_trains.rst b/docs/gl_objects/merge_trains.rst
new file mode 100644
index 0000000..c0920df
--- /dev/null
+++ b/docs/gl_objects/merge_trains.rst
@@ -0,0 +1,29 @@
+############
+Merge Trains
+############
+
+Reference
+---------
+
+* v4 API:
+
+ + :class:`gitlab.v4.objects.ProjectMergeTrain`
+ + :class:`gitlab.v4.objects.ProjectMergeTrainManager`
+ + :attr:`gitlab.v4.objects.Project.merge_trains`
+
+* GitLab API: https://docs.gitlab.com/ee/api/merge_trains.html
+
+Examples
+--------
+
+List merge trains for a project::
+
+ merge_trains = project.merge_trains.list()
+
+List active merge trains for a project::
+
+ merge_trains = project.merge_trains.list(scope="active")
+
+List completed (have been merged) merge trains for a project::
+
+ merge_trains = project.merge_trains.list(scope="complete") \ No newline at end of file
diff --git a/gitlab/v4/objects/__init__.py b/gitlab/v4/objects/__init__.py
index c2ff4fb..b1d6484 100644
--- a/gitlab/v4/objects/__init__.py
+++ b/gitlab/v4/objects/__init__.py
@@ -49,6 +49,7 @@ from .ldap import *
from .members import *
from .merge_request_approvals import *
from .merge_requests import *
+from .merge_trains import *
from .milestones import *
from .namespaces import *
from .notes import *
diff --git a/gitlab/v4/objects/merge_trains.py b/gitlab/v4/objects/merge_trains.py
new file mode 100644
index 0000000..4b23892
--- /dev/null
+++ b/gitlab/v4/objects/merge_trains.py
@@ -0,0 +1,18 @@
+from gitlab.base import RESTManager, RESTObject
+from gitlab.mixins import ListMixin
+
+__all__ = [
+ "ProjectMergeTrain",
+ "ProjectMergeTrainManager",
+]
+
+
+class ProjectMergeTrain(RESTObject):
+ pass
+
+
+class ProjectMergeTrainManager(ListMixin, RESTManager):
+ _path = "/projects/%(project_id)s/merge_trains"
+ _obj_cls = ProjectMergeTrain
+ _from_parent_attrs = {"project_id": "id"}
+ _list_filters = "scope"
diff --git a/gitlab/v4/objects/projects.py b/gitlab/v4/objects/projects.py
index 551079a..67863eb 100644
--- a/gitlab/v4/objects/projects.py
+++ b/gitlab/v4/objects/projects.py
@@ -42,6 +42,7 @@ from .merge_request_approvals import ( # noqa: F401
ProjectApprovalRuleManager,
)
from .merge_requests import ProjectMergeRequestManager # noqa: F401
+from .merge_trains import ProjectMergeTrainManager # noqa: F401
from .milestones import ProjectMilestoneManager # noqa: F401
from .notes import ProjectNoteManager # noqa: F401
from .notification_settings import ProjectNotificationSettingsManager # noqa: F401
@@ -141,6 +142,7 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO
members: ProjectMemberManager
members_all: ProjectMemberAllManager
mergerequests: ProjectMergeRequestManager
+ merge_trains: ProjectMergeTrainManager
milestones: ProjectMilestoneManager
notes: ProjectNoteManager
notificationsettings: ProjectNotificationSettingsManager
diff --git a/tests/unit/objects/test_merge_trains.py b/tests/unit/objects/test_merge_trains.py
new file mode 100644
index 0000000..a45718e
--- /dev/null
+++ b/tests/unit/objects/test_merge_trains.py
@@ -0,0 +1,65 @@
+"""
+GitLab API:
+https://docs.gitlab.com/ee/api/merge_trains.html
+"""
+import pytest
+import responses
+
+from gitlab.v4.objects import ProjectMergeTrain
+
+mr_content = {
+ "id": 110,
+ "merge_request": {
+ "id": 1,
+ "iid": 1,
+ "project_id": 3,
+ "title": "Test merge train",
+ "description": "",
+ "state": "merged",
+ "created_at": "2020-02-06T08:39:14.883Z",
+ "updated_at": "2020-02-06T08:40:57.038Z",
+ "web_url": "http://gitlab.example.com/root/merge-train-race-condition/-/merge_requests/1",
+ },
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "web_url": "http://gitlab.example.com/root",
+ },
+ "pipeline": {
+ "id": 246,
+ "sha": "bcc17a8ffd51be1afe45605e714085df28b80b13",
+ "ref": "refs/merge-requests/1/train",
+ "status": "success",
+ "created_at": "2020-02-06T08:40:42.410Z",
+ "updated_at": "2020-02-06T08:40:46.912Z",
+ "web_url": "http://gitlab.example.com/root/merge-train-race-condition/pipelines/246",
+ },
+ "created_at": "2020-02-06T08:39:47.217Z",
+ "updated_at": "2020-02-06T08:40:57.720Z",
+ "target_branch": "feature-1580973432",
+ "status": "merged",
+ "merged_at": "2020-02-06T08:40:57.719Z",
+ "duration": 70,
+}
+
+
+@pytest.fixture
+def resp_list_merge_trains():
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.GET,
+ url="http://localhost/api/v4/projects/1/merge_trains",
+ json=[mr_content],
+ content_type="application/json",
+ status=200,
+ )
+ yield rsps
+
+
+def test_list_project_merge_requests(project, resp_list_merge_trains):
+ merge_trains = project.merge_trains.list()
+ assert isinstance(merge_trains[0], ProjectMergeTrain)
+ assert merge_trains[0].id == mr_content["id"]