diff --git a/exasol/toolbox/release/__init__.py b/exasol/toolbox/release/__init__.py index 93e7f047..05885048 100644 --- a/exasol/toolbox/release/__init__.py +++ b/exasol/toolbox/release/__init__.py @@ -1,4 +1,6 @@ +from datetime import datetime import subprocess +from inspect import cleandoc from dataclasses import dataclass from functools import total_ordering from shutil import which @@ -62,3 +64,30 @@ def from_poetry(): version = result.stdout.decode().strip() return Version.from_string(version) + + +def changelog(version : Version, content: str, date: datetime | None = None) -> str: + """ + Create a changelog entry for a specific version. + + Args: + version: An instance of the Version class representing the release version. + content: The content of the changelog entry. + date: Optional. The release date. If not provided, the current date will be used. + + Returns: + The generated changelog. + """ + date = datetime.today() if date is None else date + template = cleandoc( + """ + # {version} - {date} + + {content} + """ + ) + return template.format( + version=version, + date=date.strftime('%Y-%m-%d'), + content=content + ) diff --git a/test/unit/release_test.py b/test/unit/release_test.py index 8cdb77bd..f868408d 100644 --- a/test/unit/release_test.py +++ b/test/unit/release_test.py @@ -1,9 +1,14 @@ import subprocess +from datetime import datetime +from inspect import cleandoc from unittest.mock import patch import pytest -from exasol.toolbox.release import Version +from exasol.toolbox.release import ( + Version, + changelog, +) @pytest.mark.parametrize( @@ -61,3 +66,37 @@ def test_version_from_poetry(poetry_version, version, expected): actual = Version.from_poetry() assert expected == actual + + +@pytest.mark.parametrize( + "version,content,date,expected", + [ + ( + Version(0, 1, 0), + cleandoc( + """ + ## Added + * Some great feature + + ## Refactored + * Replaced xyz + """ + ), + datetime(2024, 2, 7), + cleandoc( + """ + # 0.1.0 - 2024-02-07 + + ## Added + * Some great feature + + ## Refactored + * Replaced xyz + """ + ), + ), + ], +) +def test_changelog(version, content, date, expected): + actual = changelog(version, content, date) + assert expected == actual