Skip to content

Commit b279d1c

Browse files
resolve conversation
1 parent 6581ba3 commit b279d1c

File tree

4 files changed

+40
-48
lines changed

4 files changed

+40
-48
lines changed

doc/changes/unreleased.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@
33
## Bugfixes
44

55
* #397: Fix handling empty coverage
6+
7+
## ✨ Features
8+
9+
* [#378](https://github.com/exasol/python-toolbox/pull/378/files): Add Nox task to trigger a release

doc/shared_content/how_release.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Creating a Release
88

99
.. code-block:: shell
1010
11-
nox -s release:prepare -- [-h] [-v | --version VERSION] [-t | --type {major,minor,patch}]
11+
nox -s release:prepare -- [-h]
1212
1313
#. Merge your **Pull Request** to the **default branch**
1414

@@ -28,13 +28,13 @@ The release failed during pre-release checks
2828

2929
.. code-block:: shell
3030
31-
git tag -d "${TAG}"
31+
git tag -d "<major>.<minor>.<patch>""
3232
3333
#. Delete the remote tag
3434
3535
.. code-block:: shell
3636
37-
git push --delete origin "${TAG}"
37+
git push --delete origin "<major>.<minor>.<patch>"
3838
3939
#. Fix the issue(s) which lead to the failing checks
4040
#. Start the release process from the beginning

exasol/toolbox/nox/_release.py

Lines changed: 6 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import re
55
import subprocess
66
import sys
7-
from enum import Enum
87
from pathlib import Path
98
from typing import (
109
List,
@@ -21,6 +20,7 @@
2120
)
2221
from exasol.toolbox.nox.plugin import NoxTasks
2322
from exasol.toolbox.release import (
23+
ReleaseTypes,
2424
Version,
2525
extract_release_notes,
2626
new_changelog,
@@ -33,24 +33,15 @@
3333
def _create_parser() -> argparse.ArgumentParser:
3434
parser = argparse.ArgumentParser(
3535
prog="nox -s release:prepare",
36-
usage="nox -s release:experimental -- [-h] [-v | --version VERSION] [-t | --type {major,minor,patch}]",
36+
usage="nox -s release:prepare -- [-h] [-t | --type {major,minor,patch}]",
3737
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
3838
)
39-
group = parser.add_mutually_exclusive_group(required=True)
40-
group.add_argument(
41-
"-v",
42-
"--version",
43-
type=cli.version,
44-
help="A version string of the following format:" '"NUMBER.NUMBER.NUMBER"',
45-
required=False,
46-
default=argparse.SUPPRESS,
47-
)
48-
group.add_argument(
39+
parser.add_argument(
4940
"-t",
5041
"--type",
5142
type=ReleaseTypes,
5243
help="specifies which type of upgrade is to be performed",
53-
required=False,
44+
required=True,
5445
choices=[rt.value for rt in list(ReleaseTypes)],
5546
default=argparse.SUPPRESS,
5647
)
@@ -106,12 +97,6 @@ def _add_files_to_index(session: Session, files: list[Path]) -> None:
10697
session.run("git", "add", f"{file}")
10798

10899

109-
class ReleaseTypes(Enum):
110-
Major = "major"
111-
Minor = "minor"
112-
Patch = "patch"
113-
114-
115100
def _type_release(release_type: ReleaseTypes, old_version: Version) -> Version:
116101
upgrade = {
117102
ReleaseTypes.Major: Version(old_version.major + 1, 0, 0),
@@ -123,29 +108,6 @@ def _type_release(release_type: ReleaseTypes, old_version: Version) -> Version:
123108
return upgrade[release_type]
124109

125110

126-
def _version_control(
127-
session: Session,
128-
args: argparse.Namespace,
129-
) -> Version:
130-
has_release_version = hasattr(args, "version")
131-
has_release_type = hasattr(args, "type")
132-
133-
old_version = Version.from_poetry()
134-
135-
if has_release_version and not has_release_type:
136-
if not _is_valid_version(old=old_version, new=args.version):
137-
session.error(
138-
f"Invalid version: the release version ({args.version}) "
139-
f"must be greater than or equal to the current version ({args.version})"
140-
)
141-
return args.version
142-
143-
if not has_release_version and has_release_type:
144-
return _type_release(release_type=args.type, old_version=old_version)
145-
146-
session.error("version not allowed with type")
147-
148-
149111
class ReleaseError(Exception):
150112
"""Error during trigger release"""
151113

@@ -188,8 +150,7 @@ def prepare_release(session: Session, python=False) -> None:
188150
parser = _create_parser()
189151
args = parser.parse_args(session.posargs)
190152

191-
new_version = _version_control(session, args)
192-
print(f"release version: {new_version}")
153+
new_version = Version.upgrade_version_from_poetry(args.type)
193154

194155
if not args.no_branch and not args.no_add:
195156
session.run("git", "switch", "-c", f"release/prepare-{new_version}")
@@ -236,4 +197,4 @@ def prepare_release(session: Session, python=False) -> None:
236197
@nox.session(name="release:trigger", python=False)
237198
def trigger_release(session: Session) -> None:
238199
"""releases the project automatically"""
239-
print(_trigger_release())
200+
print(f"new version: {_trigger_release()}")

exasol/toolbox/release/__init__.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import subprocess
44
from dataclasses import dataclass
55
from datetime import datetime
6+
from enum import Enum
67
from functools import total_ordering
78
from inspect import cleandoc
89
from pathlib import Path
@@ -18,6 +19,15 @@ def _index_or(container, index, default):
1819
return default
1920

2021

22+
class ReleaseTypes(Enum):
23+
Major = "major"
24+
Minor = "minor"
25+
Patch = "patch"
26+
27+
def __str__(self):
28+
return self.name.lower()
29+
30+
2131
@total_ordering
2232
@dataclass(frozen=True)
2333
class Version:
@@ -77,6 +87,23 @@ def from_poetry():
7787

7888
return Version.from_string(version)
7989

90+
@staticmethod
91+
def upgrade_version_from_poetry(t: ReleaseTypes):
92+
poetry = which("poetry")
93+
if not poetry:
94+
raise ToolboxError("Couldn't find poetry executable")
95+
96+
try:
97+
result = subprocess.run(
98+
[poetry, "version", str(t), "--dry-run", "--no-ansi", "--short"],
99+
capture_output=True,
100+
)
101+
except subprocess.CalledProcessError as ex:
102+
raise ToolboxError() from ex
103+
version = result.stdout.decode().strip()
104+
105+
return Version.from_string(version)
106+
80107

81108
def extract_release_notes(file: str | Path) -> str:
82109
"""

0 commit comments

Comments
 (0)