forked from psf/black
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcheck_pre_commit_rev_in_example.py
More file actions
63 lines (54 loc) · 2.14 KB
/
check_pre_commit_rev_in_example.py
File metadata and controls
63 lines (54 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""
Check that the rev value in the example pre-commit configuration matches
the latest version of Black. This saves us from forgetting to update that
during the release process.
Why can't we just use `rev: stable` and call it a day? Well pre-commit
won't auto update the hook as you may expect (and for good reasons, some
technical and some pragmatic). Encouraging bad practice is also just
not ideal. xref: https://github.com/psf/black/issues/420
"""
import os
import sys
import commonmark
import yaml
from bs4 import BeautifulSoup
def main(changes: str, content: str, filename: str) -> None:
changes_html = commonmark.commonmark(changes)
changes_soup = BeautifulSoup(changes_html, "html.parser")
headers = changes_soup.find_all("h2")
latest_tag, *_ = (
(header.string or "").removeprefix("Version ")
for header in headers
if header.string != "Unreleased"
)
source_version_control_html = commonmark.commonmark(content)
source_version_control_soup = BeautifulSoup(
source_version_control_html, "html.parser"
)
codeblocks = source_version_control_soup.find_all(class_="language-yaml")
for codeblock in codeblocks:
parsed = yaml.safe_load(codeblock.string) # type: ignore[arg-type]
if not isinstance(parsed, dict):
return
pre_commit_rev = parsed["repos"][0]["rev"]
if not pre_commit_rev == latest_tag:
print(
f"Please set the rev in ``{filename}`` to be the latest one.\n"
f"Expected {latest_tag}, got {pre_commit_rev}.\n"
)
sys.exit(1)
if __name__ == "__main__":
with open("CHANGES.md", encoding="utf-8") as fd:
changes = fd.read()
with open(
os.path.join("docs", "integrations", "source_version_control.md"),
encoding="utf-8",
) as fd:
content = fd.read()
main(changes, content, "source_version_control.md")
with open(
os.path.join("docs", "guides", "using_black_with_jupyter_notebooks.md"),
encoding="utf-8",
) as fd:
content = fd.read()
main(changes, content, "using_black_with_jupyter_notebooks.md")