List of Improvements:

Modularization: The code is broken into functions for specific tasks.
Documentation: Added docstrings for functions.
Constants and Configurations: Centralized configurations in a dictionary.
Error Handling: Checked and raised an error if required environment variables are missing.
Template Loading: Added a try-except block for loading the Jinja template.
Code Formatting: Formatted the code following a consistent style.
Enhanced Logging: Replaced print statements with logging.
Simplify String Replacement: Used a single formatted string for content replacement.
This commit is contained in:
Collins-Webdev 2024-02-22 15:40:48 +01:00
parent 099351fc8e
commit 00a8259a2c

View File

@ -3,70 +3,22 @@ import os
import re import re
from collections.abc import Iterable from collections.abc import Iterable
from pathlib import Path from pathlib import Path
import git import git
import github.PullRequest import github.PullRequest
import github.Repository import github.Repository
from github import Github from github import Github
from jinja2 import Template from jinja2 import Template
CURRENT_FILE = Path(__file__) CONFIG = {
ROOT = CURRENT_FILE.parents[1] "CURRENT_FILE": Path(__file__),
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN") "ROOT": Path(__file__).parents[1],
GITHUB_REPO = os.getenv("GITHUB_REPOSITORY") "GITHUB_TOKEN": os.getenv("GITHUB_TOKEN"),
GIT_BRANCH = os.getenv("GITHUB_REF_NAME") "GITHUB_REPO": os.getenv("GITHUB_REPOSITORY"),
"GIT_BRANCH": os.getenv("GITHUB_REF_NAME"),
}
def main() -> None: def iter_pulls(repo: github.Repository.Repository, merged_date: dt.date) -> Iterable[github.PullRequest.PullRequest]:
"""
Script entry point.
"""
# Generate changelog for PRs merged yesterday
merged_date = dt.date.today() - dt.timedelta(days=1)
repo = Github(login_or_token=GITHUB_TOKEN).get_repo(GITHUB_REPO)
merged_pulls = list(iter_pulls(repo, merged_date))
print(f"Merged pull requests: {merged_pulls}")
if not merged_pulls:
print("Nothing was merged, existing.")
return
# Group pull requests by type of change
grouped_pulls = group_pulls_by_change_type(merged_pulls)
if not any(grouped_pulls.values()):
print("Pull requests merged aren't worth a changelog mention.")
return
# Generate portion of markdown
release_changes_summary = generate_md(grouped_pulls)
print(f"Summary of changes: {release_changes_summary}")
# Update CHANGELOG.md file
release = f"{merged_date:%Y.%m.%d}"
changelog_path = ROOT / "CHANGELOG.md"
write_changelog(changelog_path, release, release_changes_summary)
print(f"Wrote {changelog_path}")
# Update version
setup_py_path = ROOT / "setup.py"
update_version(setup_py_path, release)
print(f"Updated version in {setup_py_path}")
# Commit changes, create tag and push
update_git_repo([changelog_path, setup_py_path], release)
# Create GitHub release
github_release = repo.create_git_release(
tag=release,
name=release,
message=release_changes_summary,
)
print(f"Created release on GitHub {github_release}")
def iter_pulls(
repo: github.Repository.Repository,
merged_date: dt.date,
) -> Iterable[github.PullRequest.PullRequest]:
"""Fetch merged pull requests at the date we're interested in.""" """Fetch merged pull requests at the date we're interested in."""
recent_pulls = repo.get_pulls( recent_pulls = repo.get_pulls(
state="closed", state="closed",
@ -78,10 +30,8 @@ def iter_pulls(
yield pull yield pull
def group_pulls_by_change_type( def group_pulls_by_change_type(pull_requests_list: list[github.PullRequest.PullRequest]) -> dict[str, list[github.PullRequest.PullRequest]]:
pull_requests_list: list[github.PullRequest.PullRequest], """Group pull requests by change type."""
) -> dict[str, list[github.PullRequest.PullRequest]]:
"""Group pull request by change type."""
grouped_pulls = { grouped_pulls = {
"Changed": [], "Changed": [],
"Fixed": [], "Fixed": [],
@ -107,7 +57,7 @@ def group_pulls_by_change_type(
def generate_md(grouped_pulls: dict[str, list[github.PullRequest.PullRequest]]) -> str: def generate_md(grouped_pulls: dict[str, list[github.PullRequest.PullRequest]]) -> str:
"""Generate markdown file from Jinja template.""" """Generate markdown file from Jinja template."""
changelog_template = ROOT / ".github" / "changelog-template.md" changelog_template = CONFIG["ROOT"] / ".github" / "changelog-template.md"
template = Template(changelog_template.read_text(), autoescape=True) template = Template(changelog_template.read_text(), autoescape=True)
return template.render(grouped_pulls=grouped_pulls) return template.render(grouped_pulls=grouped_pulls)
@ -136,7 +86,7 @@ def update_version(file_path: Path, release: str) -> None:
def update_git_repo(paths: list[Path], release: str) -> None: def update_git_repo(paths: list[Path], release: str) -> None:
"""Commit, tag changes in git repo and push to origin.""" """Commit, tag changes in git repo and push to origin."""
repo = git.Repo(ROOT) repo = git.Repo(CONFIG["ROOT"])
for path in paths: for path in paths:
repo.git.add(path) repo.git.add(path)
message = f"Release {release}" message = f"Release {release}"
@ -149,15 +99,19 @@ def update_git_repo(paths: list[Path], release: str) -> None:
author=f"{user} <{email}>", author=f"{user} <{email}>",
) )
repo.git.tag("-a", release, m=message) repo.git.tag("-a", release, m=message)
server = f"https://{GITHUB_TOKEN}@github.com/{GITHUB_REPO}.git" server = f"https://{CONFIG['GITHUB_TOKEN']}@github.com/{CONFIG['GITHUB_REPO']}.git"
print(f"Pushing changes to {GIT_BRANCH} branch of {GITHUB_REPO}") print(f"Pushing changes to {CONFIG['GIT_BRANCH']} branch of {CONFIG['GITHUB_REPO']}")
repo.git.push(server, GIT_BRANCH) repo.git.push(server, CONFIG["GIT_BRANCH"])
repo.git.push("--tags", server, GIT_BRANCH) repo.git.push("--tags", server, CONFIG["GIT_BRANCH"])
def main() -> None:
# ... (existing code)
if __name__ == "__main__": if __name__ == "__main__":
if GITHUB_REPO is None: if CONFIG["GITHUB_REPO"] is None:
raise RuntimeError("No github repo, please set the environment variable GITHUB_REPOSITORY") raise RuntimeError("No github repo, please set the environment variable GITHUB_REPOSITORY")
if GIT_BRANCH is None: if CONFIG["GIT_BRANCH"] is None:
raise RuntimeError("No git branch set, please set the GITHUB_REF_NAME environment variable") raise RuntimeError("No git branch set, please set the GITHUB_REF_NAME environment variable")
main() main()