Skip to content

Commit

Permalink
Merge pull request #1522 from PPaques/1521-releases-edit
Browse files Browse the repository at this point in the history
Support Release Update API
  • Loading branch information
nejch committed Jun 26, 2021
2 parents 2c86003 + 13bf61d commit 33d3428
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 7 deletions.
4 changes: 0 additions & 4 deletions docs/gl_objects/projects.rst
Expand Up @@ -412,10 +412,6 @@ Create a tag::

tag = project.tags.create({'tag_name': '1.0', 'ref': 'master'})

Set or update the release note for a tag::

tag.set_release_description('awesome v1.0 release')

Delete a tag::

project.tags.delete('1.0')
Expand Down
6 changes: 6 additions & 0 deletions docs/gl_objects/releases.rst
Expand Up @@ -27,6 +27,12 @@ Get a single release::

release = project.releases.get('v1.2.3')

Edit a release::

release.name = "Demo Release"
release.description = "release notes go here"
release.save()

Create a release for a project tag::

release = project.releases.create({'name':'Demo Release', 'tag_name':'v1.2.3', 'description':'release notes go here'})
Expand Down
9 changes: 6 additions & 3 deletions gitlab/v4/objects/releases.py
@@ -1,5 +1,5 @@
from gitlab.base import RequiredOptional, RESTManager, RESTObject
from gitlab.mixins import CRUDMixin, NoUpdateMixin, ObjectDeleteMixin, SaveMixin
from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin

__all__ = [
"ProjectRelease",
Expand All @@ -9,18 +9,21 @@
]


class ProjectRelease(RESTObject):
class ProjectRelease(SaveMixin, RESTObject):
_id_attr = "tag_name"
_managers = (("links", "ProjectReleaseLinkManager"),)


class ProjectReleaseManager(NoUpdateMixin, RESTManager):
class ProjectReleaseManager(CRUDMixin, RESTManager):
_path = "/projects/%(project_id)s/releases"
_obj_cls = ProjectRelease
_from_parent_attrs = {"project_id": "id"}
_create_attrs = RequiredOptional(
required=("name", "tag_name", "description"), optional=("ref", "assets")
)
_update_attrs = RequiredOptional(
optional=("name", "description", "milestones", "released_at")
)


class ProjectReleaseLink(ObjectDeleteMixin, SaveMixin, RESTObject):
Expand Down
9 changes: 9 additions & 0 deletions tests/functional/api/test_releases.py
Expand Up @@ -23,6 +23,15 @@ def test_create_project_release(project, project_file):
assert release.description == release_description


def test_update_save_project_release(project, release):
updated_description = f"{release.description} updated"
release.description = updated_description
release.save()

release = project.releases.get(release.tag_name)
assert release.description == updated_description


def test_delete_project_release(project, release):
project.releases.delete(release.tag_name)
assert release not in project.releases.list()
Expand Down
39 changes: 39 additions & 0 deletions tests/unit/objects/test_releases.py
Expand Up @@ -10,7 +10,11 @@

from gitlab.v4.objects import ProjectReleaseLink

tag_name = "v1.0.0"
encoded_tag_name = "v1%2E0%2E0"
release_name = "demo-release"
release_description = "my-rel-desc"
released_at = "2019-03-15T08:00:00Z"
link_name = "hello-world"
link_url = "https://gitlab.example.com/group/hello/-/jobs/688/artifacts/raw/bin/hello-darwin-amd64"
direct_url = f"https://gitlab.example.com/group/hello/-/releases/{encoded_tag_name}/downloads/hello-world"
Expand All @@ -24,6 +28,18 @@
"link_type": "other",
}

release_content = {
"id": 3,
"tag_name": tag_name,
"name": release_name,
"description": release_description,
"milestones": [],
"released_at": released_at,
}

release_url = re.compile(
rf"http://localhost/api/v4/projects/1/releases/{encoded_tag_name}"
)
links_url = re.compile(
rf"http://localhost/api/v4/projects/1/releases/{encoded_tag_name}/assets/links"
)
Expand Down Expand Up @@ -100,6 +116,21 @@ def resp_delete_link(no_content):
yield rsps


@pytest.fixture
def resp_update_release():
updated_content = dict(release_content)

with responses.RequestsMock() as rsps:
rsps.add(
method=responses.PUT,
url=release_url,
json=updated_content,
content_type="application/json",
status=200,
)
yield rsps


def test_list_release_links(release, resp_list_links):
links = release.links.list()
assert isinstance(links, list)
Expand Down Expand Up @@ -129,3 +160,11 @@ def test_update_release_link(release, resp_update_link):
def test_delete_release_link(release, resp_delete_link):
link = release.links.get(1, lazy=True)
link.delete()


def test_update_release(release, resp_update_release):
release.name = release_name
release.description = release_description
release.save()
assert release.name == release_name
assert release.description == release_description

0 comments on commit 33d3428

Please sign in to comment.