pybind11/tools/make_changelog.py
pre-commit-ci[bot] b17555f340
chore(deps): update pre-commit hooks (#5459)
* chore(deps): update pre-commit hooks

updates:
- [github.com/pre-commit/mirrors-clang-format: v19.1.3 → v19.1.4](https://github.com/pre-commit/mirrors-clang-format/compare/v19.1.3...v19.1.4)
- [github.com/astral-sh/ruff-pre-commit: v0.7.2 → v0.8.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.7.2...v0.8.1)
- [github.com/sirosen/texthooks: 0.6.7 → 0.6.8](https://github.com/sirosen/texthooks/compare/0.6.7...0.6.8)
- [github.com/PyCQA/pylint: v3.3.1 → v3.3.2](https://github.com/PyCQA/pylint/compare/v3.3.1...v3.3.2)
- [github.com/python-jsonschema/check-jsonschema: 0.29.4 → 0.30.0](https://github.com/python-jsonschema/check-jsonschema/compare/0.29.4...0.30.0)

* Resolve ruff pre-commit errors:

```
ruff.....................................................................Failed
- hook id: ruff
- exit code: 1

warning: The following rules have been removed and ignoring them has no effect:
    - PT004

docs/benchmark.py:51:17: UP031 Use format specifiers instead of percent format
   |
50 |     for cl in range(nclasses):
51 |         decl += "class cl%03i {\n" % cl
   |                 ^^^^^^^^^^^^^^^^^^ UP031
52 |         decl += "public:\n"
53 |         bindings += f'    py::class_<cl{cl:03}>("cl{cl:03}")\n'
   |
   = help: Replace with format specifiers

docs/benchmark.py:88:15: UP031 Use format specifiers instead of percent format
   |
86 |         elapsed = (n2 - n1).total_seconds()
87 |         size = os.stat("test.so").st_size
88 |         print("   {%i, %f, %i}," % (nclasses * nfns, elapsed, size))
   |               ^^^^^^^^^^^^^^^^^^ UP031
89 |     print("}")
   |
   = help: Replace with format specifiers

tools/make_changelog.py:62:9: PLC0206 Extracting value from dictionary without calling `.items()`
   |
61 |           msg += f"\n  `#{issue.number} <{issue.html_url}>`_"
62 |           for cat in cats:
   |  _________^
63 | |             if issue.title.lower().startswith(f"{cat}:"):
64 | |                 cats[cat].append(msg)
65 | |                 break
66 | |         else:
67 | |             cats["unknown"].append(msg)
   | |_______________________________________^ PLC0206
68 |
69 |   for cat, msgs in cats.items():
   |

Found 3 errors.

```

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Ralf W. Grosse-Kunstleve <rgrossekunst@nvidia.com>
2024-12-08 15:21:49 -08:00

93 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3
from __future__ import annotations
import re
import ghapi.all
from rich import print
from rich.syntax import Syntax
ENTRY = re.compile(
r"""
Suggested \s changelog \s entry:
.*
```rst
\s*
(.*?)
\s*
```
""",
re.DOTALL | re.VERBOSE,
)
print()
api = ghapi.all.GhApi(owner="pybind", repo="pybind11")
issues_pages = ghapi.page.paged(
api.issues.list_for_repo, labels="needs changelog", state="closed"
)
issues = (issue for page in issues_pages for issue in page)
missing = []
cats_descr = {
"feat": "New Features",
"feat(types)": "",
"feat(cmake)": "",
"fix": "Bug fixes",
"fix(types)": "",
"fix(cmake)": "",
"docs": "Documentation",
"tests": "Tests",
"ci": "CI",
"chore": "Other",
"unknown": "Uncategorised",
}
cats: dict[str, list[str]] = {c: [] for c in cats_descr}
for issue in issues:
changelog = ENTRY.findall(issue.body or "")
if not changelog or not changelog[0]:
missing.append(issue)
else:
(msg,) = changelog
if msg.startswith("- "):
msg = msg[2:]
if not msg.startswith("* "):
msg = "* " + msg
if not msg.endswith("."):
msg += "."
msg += f"\n `#{issue.number} <{issue.html_url}>`_"
for cat, cat_list in cats.items():
if issue.title.lower().startswith(f"{cat}:"):
cat_list.append(msg)
break
else:
cats["unknown"].append(msg)
for cat, msgs in cats.items():
if msgs:
desc = cats_descr[cat]
print(f"[bold]{desc}:" if desc else f".. {cat}")
print()
for msg in msgs:
print(Syntax(msg, "rst", theme="ansi_light", word_wrap=True))
print()
print()
if missing:
print()
print("[blue]" + "-" * 30)
print()
for issue in missing:
print(f"[red bold]Missing:[/red bold][red] {issue.title}")
print(f"[red] {issue.html_url}\n")
print("[bold]Template:\n")
msg = "## Suggested changelog entry:\n\n```rst\n\n```"
print(Syntax(msg, "md", theme="ansi_light"))
print()