Skip to content

Commit a674047

Browse files
authored
chore: modernize update script (#481)
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
1 parent ad097fd commit a674047

File tree

5 files changed

+135
-100
lines changed

5 files changed

+135
-100
lines changed

.pre-commit-config.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,12 @@ repos:
2222
hooks:
2323
- id: ruff
2424
args: [--fix, --show-fixes]
25+
26+
- repo: https://github.com/pre-commit/mirrors-mypy
27+
rev: "v1.9.0"
28+
hooks:
29+
- id: mypy
30+
files: ^(src|scripts)
31+
exclude: ^src/cmake/__init__.py$
32+
additional_dependencies: [types-requests]
33+
args: []

noxfile.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,16 @@ def _bump(session: nox.Session, name: str, repository: str, branch: str, script:
106106
args = parser.parse_args(session.posargs)
107107

108108
if args.version is None:
109-
session.install("lastversion")
109+
session.install("lastversion", "requests")
110110
lastversion_args = []
111111
if branch:
112112
lastversion_args.extend(("--branch", branch))
113113
lastversion_args.append(repository)
114114
version = session.run("lastversion", *lastversion_args, log=False, silent=True).strip()
115115
else:
116+
session.install("requests")
116117
version = args.version
117118

118-
session.install("requests")
119-
120119
extra = ["--quiet"] if args.commit else []
121120
session.run("python", script, version, *extra)
122121

pyproject.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ inherit.config-settings = "append"
9999
config-settings."cmake.define.RUN_CMAKE_TEST" = "OFF"
100100

101101

102+
[tool.mypy]
103+
files = ["src", "scripts"]
104+
python_version = "3.8"
105+
strict = true
106+
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
107+
warn_unreachable = true
108+
102109
[tool.ruff]
103110
src = ["src"]
104111

scripts/update_cmake_version.py

Lines changed: 85 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,66 @@
11
#!/usr/bin/env python3
2+
#
3+
# /// script
4+
# dependencies = ["requests"]
5+
# ///
6+
27
"""
38
Command line executable allowing to update CMakeUrls.cmake given a CMake
49
version.
510
"""
611

12+
from __future__ import annotations
13+
714
import argparse
815
import contextlib
9-
import os
1016
import re
1117
import textwrap
18+
from pathlib import Path
19+
20+
import requests
1221

13-
try:
14-
import requests
15-
except ImportError:
16-
raise SystemExit(
17-
"requests not available: "
18-
"consider installing it running 'pip install requests'"
19-
) from None
22+
TYPE_CHECKING = False
2023

21-
ROOT_DIR = os.path.join(os.path.dirname(__file__), "..")
24+
if TYPE_CHECKING:
25+
from collections.abc import Generator, Mapping
26+
27+
28+
ROOT_DIR = Path(__file__).parent.parent.resolve()
2229

2330

2431
@contextlib.contextmanager
25-
def _log(txt, verbose=True):
32+
def _log(txt: str, verbose: bool = True) -> Generator[None, None, None]:
2633
if verbose:
2734
print(txt)
2835
yield
2936
if verbose:
30-
print("%s - done" % txt)
37+
print(f"{txt} - done")
3138

3239

33-
def _major_minor(version):
40+
def _major_minor(version: str) -> str:
3441
"""Given a string of the form ``X.Y.Z``, returns ``X.Y``."""
3542
return ".".join(version.split(".")[:2])
3643

3744

38-
def get_cmake_archive_urls_and_sha256s(version, verbose=False):
45+
def get_cmake_archive_urls_and_sha256s(version: str, verbose: bool=False) -> dict[str,tuple[str, str]]:
3946
files_base_url = (
40-
"https://api.github.com/repos/Kitware/CMake/releases/tags/v%s" % version
47+
f"https://api.github.com/repos/Kitware/CMake/releases/tags/v{version}"
4148
)
4249

43-
with _log("Collecting URLs and SHA256s from '%s'" % files_base_url):
50+
with _log(f"Collecting URLs and SHA256s from '{files_base_url}'"):
4451

4552
assets = requests.get(files_base_url).json()["assets"]
4653

47-
sha_256_file = "cmake-%s-SHA-256.txt" % version
54+
sha_256_file = f"cmake-{version}-SHA-256.txt"
4855

4956
expected_files = {
50-
"cmake-%s.tar.gz" % version: "unix_source",
51-
"cmake-%s.zip" % version: "win_source",
52-
"cmake-%s-linux-x86_64.tar.gz" % version: "linux64_binary",
53-
"cmake-%s-macos10.10-universal.tar.gz" % version: "macos10_10_binary",
54-
"cmake-%s-windows-i386.zip" % version: "win32_binary",
55-
"cmake-%s-windows-x86_64.zip" % version: "win64_binary",
56-
"cmake-%s-windows-arm64.zip" % version: "winarm64_binary",
57+
f"cmake-{version}.tar.gz": "unix_source",
58+
f"cmake-{version}.zip": "win_source",
59+
f"cmake-{version}-linux-x86_64.tar.gz": "linux64_binary",
60+
f"cmake-{version}-macos10.10-universal.tar.gz": "macos10_10_binary",
61+
f"cmake-{version}-windows-i386.zip": "win32_binary",
62+
f"cmake-{version}-windows-x86_64.zip": "win64_binary",
63+
f"cmake-{version}-windows-arm64.zip": "winarm64_binary",
5764
}
5865

5966
# Get SHA256s for each asset
@@ -100,13 +107,13 @@ def get_cmake_archive_urls_and_sha256s(version, verbose=False):
100107
return zipped
101108

102109

103-
def generate_cmake_variables(urls_and_sha256s):
110+
def generate_cmake_variables(urls_and_sha256s: Mapping[str, tuple[str, str]]) -> str:
104111
template_inputs = {}
105112

106113
# Get SHA256s and URLs
107114
for var_prefix, urls_and_sha256s_values in urls_and_sha256s.items():
108-
template_inputs["%s_url" % var_prefix] = urls_and_sha256s_values[0]
109-
template_inputs["%s_sha256" % var_prefix] = urls_and_sha256s_values[1]
115+
template_inputs[f"{var_prefix}_url"] = urls_and_sha256s_values[0]
116+
template_inputs[f"{var_prefix}_sha256"] = urls_and_sha256s_values[1]
110117

111118
return textwrap.dedent(
112119
"""
@@ -142,63 +149,69 @@ def generate_cmake_variables(urls_and_sha256s):
142149
).format(**template_inputs)
143150

144151

145-
def update_cmake_urls_script(version):
152+
def update_cmake_urls_script(version: str) -> set[str]:
146153
content = generate_cmake_variables(get_cmake_archive_urls_and_sha256s(version))
147154
cmake_urls_filename = "CMakeUrls.cmake"
148-
cmake_urls_filepath = os.path.join(ROOT_DIR, cmake_urls_filename)
155+
cmake_urls_filepath = ROOT_DIR / cmake_urls_filename
149156

150157
msg = f"Updating '{cmake_urls_filename}' with CMake version {version}"
151-
with _log(msg), open(cmake_urls_filepath, "w") as cmake_file:
158+
with _log(msg), cmake_urls_filepath.open("w") as cmake_file:
152159
cmake_file.write(content)
153160

161+
return {cmake_urls_filename}
162+
154163

155-
def _update_file(filepath, regex, replacement):
156-
msg = "Updating %s" % os.path.relpath(filepath, ROOT_DIR)
157-
with _log(msg):
164+
def _update_file(filepath: Path, regex: re.Pattern[str], replacement: str) -> None:
165+
with _log(f"Updating {filepath.relative_to(ROOT_DIR)}"):
158166
pattern = re.compile(regex)
159-
with open(filepath) as doc_file:
160-
lines = doc_file.readlines()
161-
updated_content = []
162-
for line in lines:
163-
updated_content.append(re.sub(pattern, replacement, line))
164-
with open(filepath, "w") as doc_file:
167+
with filepath.open() as doc_file:
168+
updated_content = [pattern.sub(replacement, line) for line in doc_file]
169+
with filepath.open("w") as doc_file:
165170
doc_file.writelines(updated_content)
166171

167172

168-
def update_docs(version):
173+
def update_docs(version: str) -> set[str]:
169174
pattern = re.compile(
170175
r"CMake \d.(\d)+.\d <https://cmake.org/cmake/help/v\d.(\d)+/index.html>"
171176
)
172177
replacement = f"CMake {version} <https://cmake.org/cmake/help/v{_major_minor(version)}/index.html>"
173-
for filename in ["docs/index.rst", "README.rst"]:
174-
_update_file(os.path.join(ROOT_DIR, filename), pattern, replacement)
178+
files = {"docs/index.rst", "README.rst"}
179+
for filename in files:
180+
_update_file(ROOT_DIR / filename, pattern, replacement)
181+
return files
175182

176183

177-
def update_tests(version):
184+
def update_tests(version: str) -> set[str]:
178185
pattern = re.compile(r'expected_version = "\d.\d+.\d"')
179-
replacement = 'expected_version = "%s"' % version
186+
replacement = f'expected_version = "{version}"'
187+
filename = "tests/test_cmake.py"
180188
_update_file(
181-
os.path.join(ROOT_DIR, "tests/test_cmake.py"), pattern, replacement
189+
ROOT_DIR / filename, pattern, replacement
182190
)
191+
return {filename}
183192

184193

185-
def update_pyproject_toml(version):
194+
def update_pyproject_toml(version: str) -> set[str]:
186195
pattern = re.compile(r'^version = "[\w\.]+"$')
187-
replacement = 'version = "%s"' % version
196+
replacement = f'version = "{version}"'
197+
filename = "pyproject.toml"
188198
_update_file(
189-
os.path.join(ROOT_DIR, "pyproject.toml"), pattern, replacement
199+
ROOT_DIR / filename, pattern, replacement
190200
)
201+
return {filename}
191202

192203

193-
def update_raw_versions(version):
204+
def update_raw_versions(version: str) -> set[str]:
194205
pattern = re.compile(r"\d\.\d+\.\d")
195206
replacement = version
207+
filename = "docs/update_cmake_version.rst"
196208
_update_file(
197-
os.path.join(ROOT_DIR, "docs/update_cmake_version.rst"), pattern, replacement
209+
ROOT_DIR / filename, pattern, replacement
198210
)
211+
return {filename}
199212

200213

201-
def main():
214+
def main() -> None:
202215
parser = argparse.ArgumentParser(description=__doc__)
203216
parser.add_argument(
204217
"cmake_version",
@@ -217,25 +230,30 @@ def main():
217230
help="Hide the output",
218231
)
219232
args = parser.parse_args()
233+
220234
if args.collect_only:
221235
get_cmake_archive_urls_and_sha256s(args.cmake_version, verbose=True)
222-
else:
223-
update_cmake_urls_script(args.cmake_version)
224-
update_docs(args.cmake_version)
225-
update_tests(args.cmake_version)
226-
update_raw_versions(args.cmake_version)
227-
update_pyproject_toml(args.cmake_version)
228-
229-
if not args.quiet:
230-
msg = """\
231-
Complete! Now run:
232-
233-
git switch -c update-to-cmake-{release}
234-
git add -u CMakeUrls.cmake docs/index.rst README.rst tests/test_cmake.py docs/update_cmake_version.rst
235-
git commit -m "Update to CMake {release}"
236-
gh pr create --fill --body "Created by update_cmake_version.py"
237-
"""
238-
print(textwrap.dedent(msg.format(release=args.cmake_version)))
236+
return
237+
238+
filenames = set()
239+
filenames |= update_cmake_urls_script(args.cmake_version)
240+
filenames |= update_docs(args.cmake_version)
241+
filenames |= update_tests(args.cmake_version)
242+
filenames |= update_raw_versions(args.cmake_version)
243+
filenames |= update_pyproject_toml(args.cmake_version)
244+
245+
if args.quiet:
246+
return
247+
248+
msg = f"""\
249+
Complete! Now run:
250+
251+
git switch -c update-to-cmake-{args.cmake_version}
252+
git add -u {' '.join(filenames)}
253+
git commit -m "Update to CMake {args.cmake_version}"
254+
gh pr create --fill --body "Created by update_cmake_version.py"
255+
"""
256+
print(textwrap.dedent(msg))
239257

240258

241259
if __name__ == "__main__":

0 commit comments

Comments
 (0)