11#!/usr/bin/env python3
2+ #
3+ # /// script
4+ # dependencies = ["requests"]
5+ # ///
6+
27"""
38Command line executable allowing to update CMakeUrls.cmake given a CMake
49version.
510"""
611
12+ from __future__ import annotations
13+
714import argparse
815import contextlib
9- import os
1016import re
1117import 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
241259if __name__ == "__main__" :
0 commit comments