diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8a0c73672..6261c26d6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,12 +29,12 @@ jobs: python-version: ${{ matrix.python-version }} cache: poetry - - name: Install PyGobject dependencies on Ubuntu + - name: Install PyGobject and release script dependencies on Ubuntu if: matrix.platform == 'ubuntu-latest' run: | sudo apt update - sudo apt install ffmpeg gobject-introspection libgirepository1.0-dev - poetry install --extras=replaygain --extras=reflink + sudo apt install ffmpeg gobject-introspection libgirepository1.0-dev pandoc + poetry install --with=release --extras=replaygain --extras=reflink - name: Install Python dependencies run: poetry install --only=main,test --extras=autobpm diff --git a/extra/release.py b/extra/release.py index abbb57bd4..89c6fa72d 100755 --- a/extra/release.py +++ b/extra/release.py @@ -119,13 +119,15 @@ def rst2md(text: str) -> str: ) -def changelog_as_markdown() -> str: +def get_changelog_contents() -> str | None: + if m := RST_LATEST_CHANGES.search(CHANGELOG.read_text()): + return m.group(1) + + return None + + +def changelog_as_markdown(rst: str) -> str: """Get the latest changelog entry as hacked up Markdown.""" - contents = CHANGELOG.read_text() - - m = RST_LATEST_CHANGES.search(contents) - rst = m.group(1) if m else "" - for pattern, repl in RST_REPLACEMENTS: rst = re.sub(pattern, repl, rst, flags=re.M) @@ -155,7 +157,8 @@ def bump(version: Version) -> None: @cli.command() def changelog(): """Get the most recent version's changelog as Markdown.""" - print(changelog_as_markdown()) + if changelog := get_changelog_contents(): + print(changelog_as_markdown(changelog)) if __name__ == "__main__": diff --git a/test/test_release.py b/test/test_release.py new file mode 100644 index 000000000..2e4633409 --- /dev/null +++ b/test/test_release.py @@ -0,0 +1,78 @@ +"""Tests for the release utils.""" + +import os +import shutil +import sys + +import pytest + +from extra.release import changelog_as_markdown + +pytestmark = pytest.mark.skipif( + not ( + (os.environ.get("GITHUB_ACTIONS") == "true" and sys.platform != "win32") + or bool(shutil.which("pandoc")) + ), + reason="pandoc isn't available", +) + + +@pytest.fixture +def rst_changelog(): + return """New features: + +* :doc:`/plugins/substitute`: Some substitute + multi-line change. + :bug:`5467` +* :ref:`list-cmd` Update. + +Bug fixes: + +* Some fix that refers to an issue. + :bug:`5467` +* Some fix that mentions user :user:`username`. + +Empty section: + +Other changes: + +* Changed `bitesize` label to `good first issue`. Our `contribute`_ page is now + automatically populated with these issues. :bug:`4855` + +.. _contribute: https://github.com/beetbox/beets/contribute + +2.1.0 (November 22, 2024) +------------------------- + +Bug fixes: + +* Fixed something.""" + + +@pytest.fixture +def md_changelog(): + return r"""### New features + +- Command **`list`**: Update. +- Plugin **`substitute`**: Some substitute multi-line change. :bug: (\#5467) + +### Bug fixes + +- Some fix that mentions user @username. +- Some fix that refers to an issue. :bug: (\#5467) + +### Other changes + + +# 2.1.0 (November 22, 2024) +- Changed `bitesize` label to `good first issue`. Our [contribute](https://github.com/beetbox/beets/contribute) page is now automatically populated with these issues. :bug: (\#4855) + +### Bug fixes + +- Fixed something.""" # noqa: E501 + + +def test_convert_rst_to_md(rst_changelog, md_changelog): + actual = changelog_as_markdown(rst_changelog) + + assert actual == md_changelog