From aad2e59c1c2d077825a8872b6c5a863af92d47dc Mon Sep 17 00:00:00 2001 From: claudi Date: Wed, 18 Feb 2026 13:54:17 +0100 Subject: [PATCH] refactor: Enhance Unicode handling in build scripts and rename sync_version function --- build/scripts/build_windows.py | 25 +++++++++++++-------- build/scripts/sync_version.py | 41 ++++++++++++++++++++++------------ 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/build/scripts/build_windows.py b/build/scripts/build_windows.py index 6186032..064844c 100644 --- a/build/scripts/build_windows.py +++ b/build/scripts/build_windows.py @@ -20,21 +20,28 @@ Usage: """ import sys -import subprocess import os + +# Fix Unicode output on Windows BEFORE any other imports +if sys.platform == "win32": + os.environ["PYTHONIOENCODING"] = "utf-8" + import io + # Reconfigure stdout/stderr for UTF-8 output + sys.stdout = io.TextIOWrapper( + sys.stdout.buffer, encoding="utf-8", errors="replace" + ) + sys.stderr = io.TextIOWrapper( + sys.stderr.buffer, encoding="utf-8", errors="replace" + ) + +import subprocess import shutil import argparse from pathlib import Path from datetime import datetime # Import shared version utilities -from sync_version import get_current_version, sync_version - -# Fix Unicode output on Windows (removed TextIOWrapper due to subprocess conflicts) -# TextIOWrapper causes issues when subprocess tries to write to file descriptors -if sys.platform == "win32": - import os - os.environ["PYTHONIOENCODING"] = "utf-8" +from sync_version import get_current_version, do_sync_version class WindowsBuilder: @@ -397,7 +404,7 @@ def main() -> int: args = parser.parse_args() print("🔄 Syncing version...") - sync_version() + do_sync_version() try: builder = WindowsBuilder(env_file=args.env_file) diff --git a/build/scripts/sync_version.py b/build/scripts/sync_version.py index 0500497..abafa7e 100644 --- a/build/scripts/sync_version.py +++ b/build/scripts/sync_version.py @@ -130,34 +130,26 @@ def update_changelog(version: str) -> None: print(f"✓ Added version header to CHANGELOG.md for {version}") -def sync_version() -> int: +def do_sync_version(version: str | None = None) -> int: """Sync version across project. Updates __init__.py (source of truth) and changelog. Config and pyproject.toml automatically read from __init__.py. + Args: + version: Version to set (if None, reads from __init__.py) + Returns: 0 on success, 1 on error """ - parser = argparse.ArgumentParser( - description="Sync version from __init__.py to dependent files" - ) - parser.add_argument( - "--version", - type=str, - help="Version to set (if not provided, reads from __init__.py)", - ) - args = parser.parse_args() - try: - if args.version: - if not re.match(r"^\d+\.\d+\.\d+", args.version): + if version: + if not re.match(r"^\d+\.\d+\.\d+", version): print( "❌ Invalid version format. Use semantic versioning" " (e.g., 1.2.3)" ) return 1 - version = args.version update_init_version(version) else: version = get_current_version_from_init() @@ -174,5 +166,26 @@ def sync_version() -> int: return 1 +def sync_version() -> int: + """Sync version across project (command-line interface). + + Parses command-line arguments and calls do_sync_version(). + This function is only called when the script is run directly. + + Returns: + 0 on success, 1 on error + """ + parser = argparse.ArgumentParser( + description="Sync version from __init__.py to dependent files" + ) + parser.add_argument( + "--version", + type=str, + help="Version to set (if not provided, reads from __init__.py)", + ) + args = parser.parse_args() + return do_sync_version(args.version) + + if __name__ == "__main__": sys.exit(sync_version())