Skip to content

Commit

Permalink
Add: Allow to enforce uploading releases as GitHub pre-releases
Browse files Browse the repository at this point in the history
When creating a release it is now possible to enforce uploading the
release with a pre-release status to GitHub.
  • Loading branch information
bjoernricks committed Oct 5, 2023
1 parent 9222594 commit 46ec70b
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 19 deletions.
19 changes: 16 additions & 3 deletions pontos/release/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,11 @@ def _create_changelog(
)

async def _create_release(
self, release_version: Version, token: str, release_text: str
self,
release_version: Version,
token: str,
release_text: str,
github_pre_release: bool,
) -> None:
github = GitHubAsyncRESTApi(token=token)

Expand All @@ -126,7 +130,7 @@ async def _create_release(
git_version,
name=f"{self.project} {release_version}",
body=release_text,
prerelease=release_version.is_pre_release,
prerelease=release_version.is_pre_release or github_pre_release,
)

async def async_run( # type: ignore[override]
Expand All @@ -146,6 +150,7 @@ async def async_run( # type: ignore[override]
local: Optional[bool] = False,
release_series: Optional[str] = None,
update_project: bool = True,
github_pre_release: bool = False,
) -> CreateReleaseReturnValue:
"""
Create a release
Expand Down Expand Up @@ -177,6 +182,8 @@ async def async_run( # type: ignore[override]
release_series: Optional release series to use.
For example: "1.2", "2", "23".
update_project: Update version in project files.
github_pre_release: Enforce uploading a release as a GitHub pre
release
"""
git_signing_key = (
git_signing_key
Expand Down Expand Up @@ -296,7 +303,12 @@ async def async_run( # type: ignore[override]
try:
self.terminal.info(f"Creating release for {release_version}")

await self._create_release(release_version, token, release_text)
await self._create_release(
release_version,
token,
release_text,
github_pre_release,
)

self.terminal.ok(f"Created release {release_version}")
except httpx.HTTPStatusError as e:
Expand Down Expand Up @@ -385,4 +397,5 @@ def create_release(
local=args.local,
release_series=args.release_series,
update_project=args.update_project,
github_pre_release=args.github_pre_release,
)
5 changes: 5 additions & 0 deletions pontos/release/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,11 @@ def parse_args(args) -> Tuple[Optional[str], Optional[str], Namespace]:
action=BooleanOptionalAction,
default=True,
)
create_parser.add_argument(
"--github-pre-release",
help="Enforce uploading a release as GitHub " "pre-release. ",
action="store_true",
)

sign_parser = subparsers.add_parser(
"sign", help="Create signatures for an existing release"
Expand Down
138 changes: 122 additions & 16 deletions tests/release/test_create.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ def test_release_version(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -335,7 +335,7 @@ def test_initial_release_version(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -440,7 +440,7 @@ def test_release_patch(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -545,7 +545,7 @@ def test_release_calendar(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -652,7 +652,7 @@ def test_release_minor(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -757,7 +757,7 @@ def test_release_major(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -860,7 +860,7 @@ def test_release_alpha(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -965,7 +965,7 @@ def test_release_beta(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -1070,7 +1070,7 @@ def test_release_release_candidate(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_has_calls(
Expand Down Expand Up @@ -1206,7 +1206,7 @@ def test_no_update_project(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_not_called()
Expand Down Expand Up @@ -1479,7 +1479,7 @@ def test_github_create_release_failure(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

@patch("pontos.release.create.Git", autospec=True)
Expand Down Expand Up @@ -1554,7 +1554,7 @@ def test_update_version_after_release_error(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

git_instance_mock.add.assert_called_once_with("MyProject.conf")
Expand Down Expand Up @@ -1646,7 +1646,7 @@ def test_release_to_specific_git_remote(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

command_mock.update_version.assert_has_calls(
Expand Down Expand Up @@ -1743,7 +1743,7 @@ def test_release_without_git_prefix(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

command_mock.update_version.assert_has_calls(
Expand Down Expand Up @@ -2022,7 +2022,7 @@ def test_release_with_go_project(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog"),
(release_version, "foo", "A Changelog", False),
)

self.assertEqual(released, CreateReleaseReturnValue.SUCCESS)
Expand Down Expand Up @@ -2135,7 +2135,7 @@ def test_release_with_changelog(

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", expected_changelog),
(release_version, "foo", expected_changelog, False),
)

git_instance_mock.tag.assert_called_once_with(
Expand Down Expand Up @@ -2250,6 +2250,112 @@ def test_release_local(

self.assertEqual(released, CreateReleaseReturnValue.SUCCESS)

@patch("pontos.release.create.Git", autospec=True)
@patch("pontos.release.create.get_last_release_version", autospec=True)
@patch(
"pontos.release.create.CreateReleaseCommand._create_release",
autospec=True,
)
@patch(
"pontos.release.create.CreateReleaseCommand._create_changelog",
autospec=True,
)
@patch("pontos.release.create.Project._gather_commands", autospec=True)
def test_release_enforce_github_release(
self,
gather_commands_mock: MagicMock,
create_changelog_mock: MagicMock,
create_release_mock: AsyncMock,
get_last_release_version_mock: MagicMock,
git_mock: MagicMock,
):
current_version = PEP440Version("0.0.1")
release_version = PEP440Version("0.0.2")
next_version = PEP440Version("1.0.0.dev1")
command_mock = MagicMock(spec=GoVersionCommand)
gather_commands_mock.return_value = [command_mock]
create_changelog_mock.return_value = "A Changelog"
get_last_release_version_mock.return_value = current_version
command_mock.update_version.side_effect = [
VersionUpdate(
previous=current_version,
new=release_version,
changed_files=["MyProject.conf"],
),
VersionUpdate(
previous=release_version,
new=next_version,
changed_files=["MyProject.conf"],
),
]
git_instance_mock: MagicMock = git_mock.return_value
git_instance_mock.status.return_value = [
StatusEntry("M MyProject.conf")
]

_, token, args = parse_args(
[
"release",
"--project",
"foo",
"--release-type",
"patch",
"--next-version",
"1.0.0.dev1",
"--github-pre-release",
]
)

with temp_git_repository():
released = create_release(
terminal=mock_terminal(),
error_terminal=mock_terminal(),
args=args,
token=token,
)

git_instance_mock.push.assert_has_calls(
[
call(follow_tags=True, remote=None),
call(follow_tags=True, remote=None),
],
)
command_mock.update_version.assert_has_calls(
[
call(release_version, force=False),
call(next_version, force=False),
],
)

self.assertEqual(
create_release_mock.await_args.args[1:],
(release_version, "foo", "A Changelog", True),
)

git_instance_mock.add.assert_has_calls(
[call("MyProject.conf"), call("MyProject.conf")]
)
git_instance_mock.commit.assert_has_calls(
[
call(
"Automatic release to 0.0.2",
verify=False,
gpg_signing_key="1234",
),
call(
"Automatic adjustments after release\n\n"
"* Update to version 1.0.0.dev1\n",
verify=False,
gpg_signing_key="1234",
),
]
)
git_instance_mock.tag.assert_called_once_with(
"v0.0.2", gpg_key_id="1234", message="Automatic release to 0.0.2"
)

self.assertEqual(released, CreateReleaseReturnValue.SUCCESS)


@dataclass
class Release:
Expand Down

0 comments on commit 46ec70b

Please sign in to comment.