Skip to content

Commit fd73a73

Browse files
committed
feat(api): add merge trains
Add support for merge trains
1 parent 5a1678f commit fd73a73

File tree

6 files changed

+116
-0
lines changed

6 files changed

+116
-0
lines changed

docs/api-objects.rst

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ API examples
2929
gl_objects/boards
3030
gl_objects/labels
3131
gl_objects/notifications
32+
gl_objects/merge_trains
3233
gl_objects/mrs
3334
gl_objects/mr_approvals
3435
gl_objects/milestones

docs/gl_objects/merge_trains.rst

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
############
2+
Merge Trains
3+
############
4+
5+
Reference
6+
---------
7+
8+
* v4 API:
9+
10+
+ :class:`gitlab.v4.objects.ProjectMergeTrain`
11+
+ :class:`gitlab.v4.objects.ProjectMergeTrainManager`
12+
+ :attr:`gitlab.v4.objects.Project.merge_trains`
13+
14+
* GitLab API: https://docs.gitlab.com/ee/api/merge_trains.html
15+
16+
Examples
17+
--------
18+
19+
List merge trains for a project::
20+
21+
merge_trains = project.merge_trains.list()
22+
23+
List active merge trains for a project::
24+
25+
merge_trains = project.merge_trains.list(scope="active")
26+
27+
List completed (have been merged) merge trains for a project::
28+
29+
merge_trains = project.merge_trains.list(scope="complete")

gitlab/v4/objects/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
from .members import *
5050
from .merge_request_approvals import *
5151
from .merge_requests import *
52+
from .merge_trains import *
5253
from .milestones import *
5354
from .namespaces import *
5455
from .notes import *

gitlab/v4/objects/merge_trains.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from gitlab.base import RESTManager, RESTObject
2+
from gitlab.mixins import ListMixin
3+
4+
__all__ = [
5+
"ProjectMergeTrain",
6+
"ProjectMergeTrainManager",
7+
]
8+
9+
10+
class ProjectMergeTrain(RESTObject):
11+
pass
12+
13+
14+
class ProjectMergeTrainManager(ListMixin, RESTManager):
15+
_path = "/projects/%(project_id)s/merge_trains"
16+
_obj_cls = ProjectMergeTrain
17+
_from_parent_attrs = {"project_id": "id"}
18+
_list_filters = "scope"

gitlab/v4/objects/projects.py

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
ProjectApprovalRuleManager,
4343
)
4444
from .merge_requests import ProjectMergeRequestManager # noqa: F401
45+
from .merge_trains import ProjectMergeTrainManager # noqa: F401
4546
from .milestones import ProjectMilestoneManager # noqa: F401
4647
from .notes import ProjectNoteManager # noqa: F401
4748
from .notification_settings import ProjectNotificationSettingsManager # noqa: F401
@@ -141,6 +142,7 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO
141142
members: ProjectMemberManager
142143
members_all: ProjectMemberAllManager
143144
mergerequests: ProjectMergeRequestManager
145+
merge_trains: ProjectMergeTrainManager
144146
milestones: ProjectMilestoneManager
145147
notes: ProjectNoteManager
146148
notificationsettings: ProjectNotificationSettingsManager
+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""
2+
GitLab API:
3+
https://docs.gitlab.com/ee/api/merge_trains.html
4+
"""
5+
import pytest
6+
import responses
7+
8+
from gitlab.v4.objects import ProjectMergeTrain
9+
10+
mr_content = {
11+
"id": 110,
12+
"merge_request": {
13+
"id": 1,
14+
"iid": 1,
15+
"project_id": 3,
16+
"title": "Test merge train",
17+
"description": "",
18+
"state": "merged",
19+
"created_at": "2020-02-06T08:39:14.883Z",
20+
"updated_at": "2020-02-06T08:40:57.038Z",
21+
"web_url": "http://gitlab.example.com/root/merge-train-race-condition/-/merge_requests/1",
22+
},
23+
"user": {
24+
"id": 1,
25+
"name": "Administrator",
26+
"username": "root",
27+
"state": "active",
28+
"avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
29+
"web_url": "http://gitlab.example.com/root",
30+
},
31+
"pipeline": {
32+
"id": 246,
33+
"sha": "bcc17a8ffd51be1afe45605e714085df28b80b13",
34+
"ref": "refs/merge-requests/1/train",
35+
"status": "success",
36+
"created_at": "2020-02-06T08:40:42.410Z",
37+
"updated_at": "2020-02-06T08:40:46.912Z",
38+
"web_url": "http://gitlab.example.com/root/merge-train-race-condition/pipelines/246",
39+
},
40+
"created_at": "2020-02-06T08:39:47.217Z",
41+
"updated_at": "2020-02-06T08:40:57.720Z",
42+
"target_branch": "feature-1580973432",
43+
"status": "merged",
44+
"merged_at": "2020-02-06T08:40:57.719Z",
45+
"duration": 70,
46+
}
47+
48+
49+
@pytest.fixture
50+
def resp_list_merge_trains():
51+
with responses.RequestsMock() as rsps:
52+
rsps.add(
53+
method=responses.GET,
54+
url="http://localhost/api/v4/projects/1/merge_trains",
55+
json=[mr_content],
56+
content_type="application/json",
57+
status=200,
58+
)
59+
yield rsps
60+
61+
62+
def test_list_project_merge_requests(project, resp_list_merge_trains):
63+
merge_trains = project.merge_trains.list()
64+
assert isinstance(merge_trains[0], ProjectMergeTrain)
65+
assert merge_trains[0].id == mr_content["id"]

0 commit comments

Comments
 (0)