Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions docs/gl_objects/milestones.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
Milestones
##########

Project milestones
==================

Reference
---------

Expand Down Expand Up @@ -70,3 +73,33 @@ List the issues related to a milestone::
List the merge requests related to a milestone::

merge_requests = milestone.merge_requests()

Milestone events
============

Resource milestone events keep track of what happens to GitLab issues and merge requests.

Reference
---------

* v4 API:

+ :class:`gitlab.v4.objects.ProjectIssueResourceMilestoneEvent`
+ :class:`gitlab.v4.objects.ProjectIssueResourceMilestoneEventManager`
+ :attr:`gitlab.v4.objects.ProjectIssue.resourcemilestoneevents`
+ :class:`gitlab.v4.objects.ProjectMergeRequestResourceMilestoneEvent`
+ :class:`gitlab.v4.objects.ProjectMergeRequestResourceMilestoneEventManager`
+ :attr:`gitlab.v4.objects.ProjectMergeRequest.resourcemilestoneevents`

* GitLab API: https://docs.gitlab.com/ee/api/resource_milestone_events.html

Examples
--------

Get milestones for a resource (issue, merge request)::

milestones = resource.resourcemilestoneevents.list()

Get a specific milestone for a resource::

milestone = resource.resourcemilestoneevents.get(milestone_id)
8 changes: 7 additions & 1 deletion gitlab/tests/objects/test_commits.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,13 @@ def test_create_commit(project, resp_create_commit):
data = {
"branch": "master",
"commit_message": "Commit message",
"actions": [{"action": "create", "file_path": "README", "content": "",}],
"actions": [
{
"action": "create",
"file_path": "README",
"content": "",
}
],
}
commit = project.commits.create(data)
assert commit.short_id == "ed899a2f"
Expand Down
73 changes: 73 additions & 0 deletions gitlab/tests/objects/test_resource_milestone_events.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
"""
GitLab API: https://docs.gitlab.com/ee/api/resource_milestone_events.html
"""

import pytest
import responses

from gitlab.v4.objects import (
ProjectIssueResourceMilestoneEvent,
ProjectMergeRequestResourceMilestoneEvent,
)


@pytest.fixture()
def resp_merge_request_milestone_events():
mr_content = {"iid": 1}
events_content = {"id": 1, "resource_type": "MergeRequest"}
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/merge_requests",
json=[mr_content],
content_type="application/json",
status=200,
)
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/merge_requests/1/resource_milestone_events",
json=[events_content],
content_type="application/json",
status=200,
)
yield rsps


@pytest.fixture()
def resp_project_issue_milestone_events():
issue_content = {"iid": 1}
events_content = {"id": 1, "resource_type": "Issue"}
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/issues",
json=[issue_content],
content_type="application/json",
status=200,
)
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/issues/1/resource_milestone_events",
json=[events_content],
content_type="application/json",
status=200,
)
yield rsps


def test_project_issue_milestone_events(project, resp_project_issue_milestone_events):
issue = project.issues.list()[0]
milestone_events = issue.resourcemilestoneevents.list()
assert isinstance(milestone_events, list)
milestone_event = milestone_events[0]
assert isinstance(milestone_event, ProjectIssueResourceMilestoneEvent)
assert milestone_event.resource_type == "Issue"


def test_merge_request_milestone_events(project, resp_merge_request_milestone_events):
mr = project.mergerequests.list()[0]
milestone_events = mr.resourcemilestoneevents.list()
assert isinstance(milestone_events, list)
milestone_event = milestone_events[0]
assert isinstance(milestone_event, ProjectMergeRequestResourceMilestoneEvent)
assert milestone_event.resource_type == "MergeRequest"
12 changes: 9 additions & 3 deletions gitlab/tests/objects/test_runners.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,9 @@ def resp_runner_delete():
status=200,
)
rsps.add(
method=responses.DELETE, url=pattern, status=204,
method=responses.DELETE,
url=pattern,
status=204,
)
yield rsps

Expand All @@ -177,7 +179,9 @@ def resp_runner_disable():
with responses.RequestsMock() as rsps:
pattern = re.compile(r".*?/(groups|projects)/1/runners/6")
rsps.add(
method=responses.DELETE, url=pattern, status=204,
method=responses.DELETE,
url=pattern,
status=204,
)
yield rsps

Expand All @@ -187,7 +191,9 @@ def resp_runner_verify():
with responses.RequestsMock() as rsps:
pattern = re.compile(r".*?/runners/verify")
rsps.add(
method=responses.POST, url=pattern, status=200,
method=responses.POST,
url=pattern,
status=200,
)
yield rsps

Expand Down
50 changes: 45 additions & 5 deletions gitlab/v4/objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -711,8 +711,14 @@ class ProjectDeployTokenManager(ListMixin, CreateMixin, DeleteMixin, RESTManager
_from_parent_attrs = {"project_id": "id"}
_obj_cls = ProjectDeployToken
_create_attrs = (
("name", "scopes",),
("expires_at", "username",),
(
"name",
"scopes",
),
(
"expires_at",
"username",
),
)


Expand All @@ -725,8 +731,14 @@ class GroupDeployTokenManager(ListMixin, CreateMixin, DeleteMixin, RESTManager):
_from_parent_attrs = {"group_id": "id"}
_obj_cls = GroupDeployToken
_create_attrs = (
("name", "scopes",),
("expires_at", "username",),
(
"name",
"scopes",
),
(
"expires_at",
"username",
),
)


Expand Down Expand Up @@ -2652,6 +2664,16 @@ class ProjectIssueResourceLabelEventManager(RetrieveMixin, RESTManager):
_from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"}


class ProjectIssueResourceMilestoneEvent(RESTObject):
pass


class ProjectIssueResourceMilestoneEventManager(RetrieveMixin, RESTManager):
_path = "/projects/%(project_id)s/issues/%(issue_iid)s/resource_milestone_events"
_obj_cls = ProjectIssueResourceMilestoneEvent
_from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"}


class ProjectIssue(
UserAgentDetailMixin,
SubscribableMixin,
Expand All @@ -2670,6 +2692,7 @@ class ProjectIssue(
("links", "ProjectIssueLinkManager"),
("notes", "ProjectIssueNoteManager"),
("resourcelabelevents", "ProjectIssueResourceLabelEventManager"),
("resourcemilestoneevents", "ProjectIssueResourceMilestoneEventManager"),
)

@cli.register_custom_action("ProjectIssue", ("to_project_id",))
Expand Down Expand Up @@ -3063,6 +3086,18 @@ class ProjectMergeRequestResourceLabelEventManager(RetrieveMixin, RESTManager):
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}


class ProjectMergeRequestResourceMilestoneEvent(RESTObject):
pass


class ProjectMergeRequestResourceMilestoneEventManager(RetrieveMixin, RESTManager):
_path = (
"/projects/%(project_id)s/merge_requests/%(mr_iid)s/resource_milestone_events"
)
_obj_cls = ProjectMergeRequestResourceMilestoneEvent
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}


class ProjectMergeRequest(
SubscribableMixin,
TodoMixin,
Expand All @@ -3081,6 +3116,7 @@ class ProjectMergeRequest(
("discussions", "ProjectMergeRequestDiscussionManager"),
("notes", "ProjectMergeRequestNoteManager"),
("resourcelabelevents", "ProjectMergeRequestResourceLabelEventManager"),
("resourcemilestoneevents", "ProjectMergeRequestResourceMilestoneEventManager"),
)

@cli.register_custom_action("ProjectMergeRequest")
Expand Down Expand Up @@ -4181,7 +4217,11 @@ class ProjectServiceManager(GetMixin, UpdateMixin, DeleteMixin, ListMixin, RESTM
),
),
"jira": (
("url", "username", "password",),
(
"url",
"username",
"password",
),
(
"api_url",
"active",
Expand Down
20 changes: 19 additions & 1 deletion tools/python_test_v4.py
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,12 @@

# Remove once https://gitlab.com/gitlab-org/gitlab/-/issues/211878 is fixed
deploy_token = deploy_token_group.deploytokens.create(
{"name": "foo", "username": "", "expires_at": "", "scopes": ["read_repository"],}
{
"name": "foo",
"username": "",
"expires_at": "",
"scopes": ["read_repository"],
}
)

assert len(deploy_token_group.deploytokens.list()) == 1
Expand Down Expand Up @@ -782,6 +787,11 @@
event = issue1.resourcelabelevents.get(events[0].id)
assert event

# issue milestones
milestones = issue1.resourcemilestoneevents.list()
assert milestones
milestone = issue1.resourcemilestoneevents.get(milestones[0].id)
assert milestone

size = len(issue1.discussions.list())
discussion = issue1.discussions.create({"body": "Discussion body"})
Expand Down Expand Up @@ -891,6 +901,14 @@
event = mr.resourcelabelevents.get(events[0].id)
assert event

# mr milestone events
mr.milestone_id = m1.id
mr.save()
milestones = mr.resourcemilestoneevents.list()
assert milestones
milestone = mr.resourcemilestoneevents.get(milestones[0].id)
assert milestone

# rebasing
assert mr.rebase()

Expand Down