diff --git a/.github/changelog-template.md b/.github/changelog-template.md new file mode 100644 index 00000000..49550ba1 --- /dev/null +++ b/.github/changelog-template.md @@ -0,0 +1,9 @@ +## [{{merge_date.strftime('%Y-%m-%d')}}] +{%- for change_type, pulls in grouped_pulls.items() %} +{%- if pulls %} +### {{ change_type }} +{%- for pull_request in pulls %} +- {{ pull_request.title }} ([#{{ pull_request.number }}]({{ pull_request.url }})) +{%- endfor -%} +{% endif -%} +{% endfor -%} diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml new file mode 100644 index 00000000..562c37eb --- /dev/null +++ b/.github/workflows/update-changelog.yml @@ -0,0 +1,34 @@ +name: Update Changelog + +on: + # Every day at 2am + schedule: + - cron: "0 2 * * *" + # Manual trigger + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Update list + run: python scripts/update_changelog.py + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Update Changelog + file_pattern: CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 27a8578a..f9fab837 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,31 @@ # Change Log All enhancements and patches to Cookiecutter Django will be documented in this file. + + +## [2020-09-02] +### Changed +- Add environment and traces_sample_rate keyword to sentry_sdk.init ([#2777](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2777)) +### Updated +- Update sentry-sdk to 0.17.3 ([#2788](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2788)) +- Update django-extensions to 3.0.7 ([#2787](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2787)) + +## [2020-09-01] +### Changed +- Exclude venv directory and update document link ([#2780](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2780)) +### Updated +- Update tox to 3.20.0 ([#2786](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2786)) +- Update django-storages to 1.10 ([#2781](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2781)) +- Update sentry-sdk to 0.17.2 ([#2784](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2784)) +- Update django to 3.0.10 ([#2785](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2785)) +- Update sphinx-autobuild to 2020.9.1 ([#2782](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2782)) +- Update django-extensions to 3.0.6 ([#2783](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2783)) + +## [2020-08-31] +### Updated +- Update sh to 1.14.0 ([#2779](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2779)) +- Update sentry-sdk to 0.17.1 ([#2778](https://api.github.com/repos/pydanny/cookiecutter-django/pulls/2778)) + ## [2020-04-13] ### Changed - Updated to Python 3.8 (@codnee) diff --git a/scripts/update_changelog.py b/scripts/update_changelog.py new file mode 100644 index 00000000..08ff5b09 --- /dev/null +++ b/scripts/update_changelog.py @@ -0,0 +1,78 @@ +import os +from pathlib import Path +from github import Github +from jinja2 import Template +import datetime as dt + +CURRENT_FILE = Path(__file__) +ROOT = CURRENT_FILE.parents[1] +GITHUB_TOKEN = os.getenv("GITHUB_TOKEN", None) + +# Generate changelog for PRs merged yesterday +MERGED_DATE = dt.date.today() - dt.timedelta(days=1) + + +def main() -> None: + """ + Script entry point. + """ + merged_pulls = list(iter_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) + + # Generate portion of markdown + rendered_content = generate_md(grouped_pulls) + + # Update CHANGELOG.md file + file_path = ROOT / "CHANGELOG.md" + old_content = file_path.read_text() + updated_content = old_content.replace( + "", + f"\n\n{rendered_content}", + ) + file_path.write_text(updated_content) + + +def iter_pulls(): + """Fetch merged pull requests at the date we're interested in.""" + repo = Github(login_or_token=GITHUB_TOKEN).get_repo("pydanny/cookiecutter-django") + recent_pulls = repo.get_pulls( + state="closed", sort="updated", direction="desc" + ).get_page(0) + for pull in recent_pulls: + if pull.merged and pull.merged_at.date() == MERGED_DATE: + yield pull + + +def group_pulls_by_change_type(pull_requests_list): + """Group pull request by change type.""" + grouped_pulls = { + "Changed": [], + "Fixed": [], + "Updated": [], + } + for pull in pull_requests_list: + label_names = {l.name for l in pull.labels} + if "update" in label_names: + group_name = "Updated" + elif "bug" in label_names: + group_name = "Fixed" + else: + group_name = "Changed" + grouped_pulls[group_name].append(pull) + return grouped_pulls + + +def generate_md(grouped_pulls): + """Generate markdown file from Jinja template.""" + changelog_template = ROOT / ".github" / "changelog-template.md" + template = Template(changelog_template.read_text(), autoescape=True) + return template.render(merge_date=MERGED_DATE, grouped_pulls=grouped_pulls) + + +if __name__ == "__main__": + main()