67 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
# mypy: disallow-untyped-defs
 | 
						|
"""
 | 
						|
Script used to generate a Markdown file containing only the changelog entries of a specific pytest release, which
 | 
						|
is then published as a GitHub Release during deploy (see workflows/deploy.yml).
 | 
						|
 | 
						|
The script requires ``pandoc`` to be previously installed in the system -- we need to convert from RST (the format of
 | 
						|
our CHANGELOG) into Markdown (which is required by GitHub Releases).
 | 
						|
 | 
						|
Requires Python3.6+.
 | 
						|
"""
 | 
						|
import re
 | 
						|
import sys
 | 
						|
from pathlib import Path
 | 
						|
from typing import Sequence
 | 
						|
 | 
						|
import pypandoc
 | 
						|
 | 
						|
 | 
						|
def extract_changelog_entries_for(version: str) -> str:
 | 
						|
    p = Path(__file__).parent.parent / "doc/en/changelog.rst"
 | 
						|
    changelog_lines = p.read_text(encoding="UTF-8").splitlines()
 | 
						|
 | 
						|
    title_regex = re.compile(r"pytest (\d\.\d+\.\d+\w*) \(\d{4}-\d{2}-\d{2}\)")
 | 
						|
    consuming_version = False
 | 
						|
    version_lines = []
 | 
						|
    for line in changelog_lines:
 | 
						|
        m = title_regex.match(line)
 | 
						|
        if m:
 | 
						|
            # Found the version we want: start to consume lines until we find the next version title.
 | 
						|
            if m.group(1) == version:
 | 
						|
                consuming_version = True
 | 
						|
            # Found a new version title while parsing the version we want: break out.
 | 
						|
            elif consuming_version:
 | 
						|
                break
 | 
						|
        if consuming_version:
 | 
						|
            version_lines.append(line)
 | 
						|
 | 
						|
    return "\n".join(version_lines)
 | 
						|
 | 
						|
 | 
						|
def convert_rst_to_md(text: str) -> str:
 | 
						|
    result = pypandoc.convert_text(
 | 
						|
        text, "md", format="rst", extra_args=["--wrap=preserve"]
 | 
						|
    )
 | 
						|
    assert isinstance(result, str), repr(result)
 | 
						|
    return result
 | 
						|
 | 
						|
 | 
						|
def main(argv: Sequence[str]) -> int:
 | 
						|
    if len(argv) != 3:
 | 
						|
        print("Usage: generate-gh-release-notes VERSION FILE")
 | 
						|
        return 2
 | 
						|
 | 
						|
    version, filename = argv[1:3]
 | 
						|
    print(f"Generating GitHub release notes for version {version}")
 | 
						|
    rst_body = extract_changelog_entries_for(version)
 | 
						|
    md_body = convert_rst_to_md(rst_body)
 | 
						|
    Path(filename).write_text(md_body, encoding="UTF-8")
 | 
						|
    print()
 | 
						|
    print(f"Done: {filename}")
 | 
						|
    print()
 | 
						|
    return 0
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    sys.exit(main(sys.argv))
 |