From 7601b46c3d178f0e316e158eb7f6d156b4a6a8a2 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 11 May 2026 10:33:25 +0300 Subject: [PATCH 1/3] Re-use single session instead of opening many connections --- add_to_pydotorg.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/add_to_pydotorg.py b/add_to_pydotorg.py index 9c6e0c49..5884366c 100755 --- a/add_to_pydotorg.py +++ b/add_to_pydotorg.py @@ -74,7 +74,10 @@ def run_cmd( tag_cre = re.compile(r"(\d+)(?:\.(\d+)(?:\.(\d+))?)?(?:([ab]|rc)(\d+))?$") -headers = {"Authorization": f"ApiKey {auth_info}", "Content-Type": "application/json"} +session = requests.Session() +session.headers.update( + {"Authorization": f"ApiKey {auth_info}", "Content-Type": "application/json"} +) github_oidc_provider = "https://github.com/login/oauth" google_oidc_provider = "https://accounts.google.com" @@ -297,7 +300,7 @@ def query_object(base_url: str, objtype: str, **params: Any) -> int: """Find an API object by query parameters.""" uri = base_url + f"downloads/{objtype}/" uri += "?" + "&".join(f"{k}={v}" for k, v in params.items()) - resp = requests.get(uri, headers=headers) + resp = session.get(uri) if resp.status_code != 200 or not json.loads(resp.text)["objects"]: raise RuntimeError(f"no object for {objtype} params={params!r}") obj = json.loads(resp.text)["objects"][0] @@ -306,10 +309,9 @@ def query_object(base_url: str, objtype: str, **params: Any) -> int: def post_object(base_url: str, objtype: str, datadict: dict[str, Any]) -> int: """Create a new API object.""" - resp = requests.post( + resp = session.post( base_url + "downloads/" + objtype + "/", data=json.dumps(datadict), - headers=headers, ) if resp.status_code != 201: try: @@ -472,9 +474,7 @@ def main() -> None: raise RuntimeError(f"duplicate slug generated: {key}") file_dicts[key] = file_dict print("Deleting previous release files") - resp = requests.delete( - args.base_url + f"downloads/release_file/?release={rel_pk}", headers=headers - ) + resp = session.delete(f"{args.base_url}downloads/release_file/?release={rel_pk}") if resp.status_code != 204: raise RuntimeError(f"deleting previous releases failed: {resp.status_code}") for file_dict in file_dicts.values(): From ce78dc722871e5970e1bb3092ec6d2be1e25bd03 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 25 May 2026 23:05:45 +0200 Subject: [PATCH 2/3] More f-strings Co-authored-by: Savannah Ostrowski --- add_to_pydotorg.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/add_to_pydotorg.py b/add_to_pydotorg.py index 5884366c..9f3b4700 100755 --- a/add_to_pydotorg.py +++ b/add_to_pydotorg.py @@ -298,7 +298,7 @@ def list_files( def query_object(base_url: str, objtype: str, **params: Any) -> int: """Find an API object by query parameters.""" - uri = base_url + f"downloads/{objtype}/" + uri = f"{base_url}downloads/{objtype}/" uri += "?" + "&".join(f"{k}={v}" for k, v in params.items()) resp = session.get(uri) if resp.status_code != 200 or not json.loads(resp.text)["objects"]: @@ -309,10 +309,7 @@ def query_object(base_url: str, objtype: str, **params: Any) -> int: def post_object(base_url: str, objtype: str, datadict: dict[str, Any]) -> int: """Create a new API object.""" - resp = session.post( - base_url + "downloads/" + objtype + "/", - data=json.dumps(datadict), - ) + resp = session.post(f"{base_url}downloads/{objtype}/", data=json.dumps(datadict)) if resp.status_code != 201: try: info = json.loads(resp.text) From 011195e3edfa30f6cc821ce617af0f65a6454be9 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Mon, 25 May 2026 23:13:06 +0200 Subject: [PATCH 3/3] And some more f-strings --- add_to_pydotorg.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/add_to_pydotorg.py b/add_to_pydotorg.py index 9f3b4700..966a0a26 100755 --- a/add_to_pydotorg.py +++ b/add_to_pydotorg.py @@ -176,7 +176,7 @@ def slug_for(release: str) -> str: def sigfile_for(release: str, rfile: str) -> str: - return download_root + f"{release}/{rfile}.asc" + return f"{download_root}{release}/{rfile}.asc" def sha256sum_for(filename: str) -> str: @@ -235,7 +235,7 @@ def build_file_dict( "release": f"/api/v1/downloads/release/{rel_pk}/", "description": add_desc, "is_source": os_pk == 3, - "url": download_root + f"{base_version(release)}/{rfile}", + "url": f"{download_root}{base_version(release)}/{rfile}", "sha256_sum": sha256sum_for(filename), "filesize": filesize_for(filename), "download_button": add_download, @@ -246,20 +246,20 @@ def build_file_dict( # Upload Sigstore signature if os.path.exists(filename + ".sig"): d["sigstore_signature_file"] = ( - download_root + f"{base_version(release)}/{rfile}.sig" + f"{download_root}{base_version(release)}/{rfile}.sig" ) # Upload Sigstore certificate if os.path.exists(filename + ".crt"): - d["sigstore_cert_file"] = download_root + f"{base_version(release)}/{rfile}.crt" + d["sigstore_cert_file"] = f"{download_root}{base_version(release)}/{rfile}.crt" # Upload Sigstore bundle if os.path.exists(filename + ".sigstore"): d["sigstore_bundle_file"] = ( - download_root + f"{base_version(release)}/{rfile}.sigstore" + f"{download_root}{base_version(release)}/{rfile}.sigstore" ) # Upload SPDX SBOM file if os.path.exists(filename + ".spdx.json"): d["sbom_spdx2_file"] = ( - download_root + f"{base_version(release)}/{rfile}.spdx.json" + f"{download_root}{base_version(release)}/{rfile}.spdx.json" ) return d @@ -328,7 +328,7 @@ def sign_release_files_with_sigstore( ftp_root: str, release: str, release_files: list[tuple[str, str, str, bool, str]] ) -> None: filenames = [ - ftp_root + f"{base_version(release)}/{rfile}" for rfile, *_ in release_files + f"{ftp_root}{base_version(release)}/{rfile}" for rfile, *_ in release_files ] def has_sigstore_signature(filename: str) -> bool: