diff --git a/.chronus/changes/python-tooling-minimums-2026-10-22.md b/.chronus/changes/python-tooling-minimums-2026-10-22.md new file mode 100644 index 00000000000..d26180736f7 --- /dev/null +++ b/.chronus/changes/python-tooling-minimums-2026-10-22.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-client-python" +--- + +Upgrade pip in existing generator virtual environments as well as newly created ones. diff --git a/.github/workflows/ci-python.yml b/.github/workflows/ci-python.yml index 1b0fe755b01..7870fb505e1 100644 --- a/.github/workflows/ci-python.yml +++ b/.github/workflows/ci-python.yml @@ -22,6 +22,9 @@ jobs: - name: Install repo dependencies run: pnpm install + - name: Upgrade Python installers + run: python -m pip install --upgrade "pip>=26.2.2" "uv>=0.13.4" + - name: Setup http-client-python # Avoid npm lifecycle side effects and lockfile rewrites in CI; setup still runs build + generator install. run: | @@ -82,6 +85,9 @@ jobs: - name: Install repo dependencies run: pnpm install + - name: Upgrade Python installers + run: python -m pip install --upgrade "pip>=26.2.2" "uv>=0.13.4" + - name: Setup http-client-python # Generated artifacts come from the build job; downstream jobs only need the Python package installed and test tools prepared. run: | @@ -116,6 +122,9 @@ jobs: - name: Install repo dependencies run: pnpm install + - name: Upgrade Python installers + run: python -m pip install --upgrade "pip>=26.2.2" "uv>=0.13.4" + - name: Setup http-client-python # Generated artifacts come from the build job; downstream jobs only need the Python package installed and test tools prepared. run: | @@ -150,6 +159,9 @@ jobs: - name: Install repo dependencies run: pnpm install + - name: Upgrade Python installers + run: python -m pip install --upgrade "pip>=26.2.2" "uv>=0.13.4" + - name: Setup http-client-python # Generated artifacts come from the build job; downstream jobs only need the Python package installed and test tools prepared. run: | @@ -195,6 +207,9 @@ jobs: - name: Install repo dependencies run: pnpm install + - name: Upgrade Python installers + run: python -m pip install --upgrade "pip>=26.2.2" "uv>=0.13.4" + - name: Setup http-client-python # Generated artifacts come from the build job; downstream jobs only need the Python package installed and test tools prepared. run: | @@ -225,6 +240,9 @@ jobs: - name: Install repo dependencies run: pnpm install + - name: Upgrade Python installers + run: python -m pip install --upgrade "pip>=26.2.2" "uv>=0.13.4" + - name: Setup http-client-python # Windows validates build/regenerate/test in one job, so run the full setup instead of restoring Linux artifacts. run: | diff --git a/packages/http-client-python/eng/scripts/setup/package_manager.py b/packages/http-client-python/eng/scripts/setup/package_manager.py index 5725bddab35..61aa68254d8 100644 --- a/packages/http-client-python/eng/scripts/setup/package_manager.py +++ b/packages/http-client-python/eng/scripts/setup/package_manager.py @@ -142,13 +142,17 @@ def __init__(self, venv_path): else str(venv_path / "Scripts" / "python.exe") ) - return MockVenvContext(venv_path) + context = MockVenvContext(venv_path) + install_packages(["--upgrade", "pip"], context, package_manager="uv") + return context else: # Use standard venv for pip if venv_path.exists(): env_builder = venv.EnvBuilder(with_pip=True) - return env_builder.ensure_directories(venv_path) + context = env_builder.ensure_directories(venv_path) + install_packages(["--upgrade", "pip"], context, package_manager) else: env_builder = ExtendedEnvBuilder(with_pip=True, upgrade_deps=True) env_builder.create(venv_path) - return env_builder.context + context = env_builder.context + return context diff --git a/packages/http-client-python/tests/install_packages.py b/packages/http-client-python/tests/install_packages.py index ae7862e33fd..2dfabb5542d 100644 --- a/packages/http-client-python/tests/install_packages.py +++ b/packages/http-client-python/tests/install_packages.py @@ -43,16 +43,10 @@ def build_wheels(flavor, tests_dir): batch_size = 50 for i in range(0, len(packages), batch_size): batch = packages[i:i + batch_size] - try: - subprocess.run( - ["uv", "pip", "wheel", "--no-deps", "--wheel-dir", wheel_dir] + batch, - check=True, - ) - except FileNotFoundError: - subprocess.run( - [sys.executable, "-m", "pip", "wheel", "--no-deps", "--wheel-dir", wheel_dir] + batch, - check=True, - ) + subprocess.run( + [sys.executable, "-m", "pip", "wheel", "--no-deps", "--wheel-dir", wheel_dir] + batch, + check=True, + ) wheel_count = len(glob.glob(os.path.join(wheel_dir, "*.whl"))) print(f"Built {wheel_count} wheels for {flavor}") diff --git a/packages/http-client-python/tests/requirements/docs.txt b/packages/http-client-python/tests/requirements/docs.txt index 5b80499ba34..cf8a59b399b 100644 --- a/packages/http-client-python/tests/requirements/docs.txt +++ b/packages/http-client-python/tests/requirements/docs.txt @@ -1,6 +1,6 @@ # Documentation dependencies -r base.txt -pip +pip>=26.2.2 pylint pkginfo sphinx>=7.0.0