mirror of
https://github.com/astral-sh/uv.git
synced 2026-05-07 01:11:18 -04:00
42c85f654f
Applies a patch to use Python 3.6 compatible types in our vendored `packaging` implementation used in the interpreter query script. Adds Python 3.6 and 3.7 test coverage in CI.
140 lines
5.4 KiB
Diff
140 lines
5.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
Subject: [PATCH] python36-support
|
|
|
|
Remove `from __future__ import annotations` and quote PEP 604 (`X | Y`) union
|
|
annotations and PEP 585 (`dict[K, V]`) lowercase generics so these vendored
|
|
modules remain compatible with Python 3.6.
|
|
|
|
---
|
|
diff --git a/crates/uv-python/python/packaging/_elffile.py b/crates/uv-python/python/packaging/_elffile.py
|
|
index 8dc7fb32a..f1907a595 100644
|
|
--- a/crates/uv-python/python/packaging/_elffile.py
|
|
+++ b/crates/uv-python/python/packaging/_elffile.py
|
|
@@ -8,8 +8,6 @@ Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
|
|
ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
|
|
"""
|
|
|
|
-from __future__ import annotations
|
|
-
|
|
import enum
|
|
import os
|
|
import struct
|
|
@@ -88,11 +86,11 @@ class ELFFile:
|
|
except struct.error as e:
|
|
raise ELFInvalid("unable to parse machine and section information") from e
|
|
|
|
- def _read(self, fmt: str) -> tuple[int, ...]:
|
|
+ def _read(self, fmt: str) -> "tuple[int, ...]":
|
|
return struct.unpack(fmt, self._f.read(struct.calcsize(fmt)))
|
|
|
|
@property
|
|
- def interpreter(self) -> str | None:
|
|
+ def interpreter(self) -> "str | None":
|
|
"""
|
|
The path recorded in the ``PT_INTERP`` section header.
|
|
"""
|
|
diff --git a/crates/uv-python/python/packaging/_manylinux.py b/crates/uv-python/python/packaging/_manylinux.py
|
|
index 7b52a5581..d3c871aab 100644
|
|
--- a/crates/uv-python/python/packaging/_manylinux.py
|
|
+++ b/crates/uv-python/python/packaging/_manylinux.py
|
|
@@ -1,5 +1,3 @@
|
|
-from __future__ import annotations
|
|
-
|
|
import collections
|
|
import contextlib
|
|
import functools
|
|
@@ -19,7 +17,7 @@ EF_ARM_ABI_FLOAT_HARD = 0x00000400
|
|
# `os.PathLike` not a generic type until Python 3.9, so sticking with `str`
|
|
# as the type for `path` until then.
|
|
@contextlib.contextmanager
|
|
-def _parse_elf(path: str) -> Generator[ELFFile | None, None, None]:
|
|
+def _parse_elf(path: str) -> "Generator[ELFFile | None, None, None]":
|
|
try:
|
|
with open(path, "rb") as f:
|
|
yield ELFFile(f)
|
|
@@ -74,7 +72,7 @@ def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool:
|
|
# For now, guess what the highest minor version might be, assume it will
|
|
# be 50 for testing. Once this actually happens, update the dictionary
|
|
# with the actual value.
|
|
-_LAST_GLIBC_MINOR: dict[int, int] = collections.defaultdict(lambda: 50)
|
|
+_LAST_GLIBC_MINOR: "dict[int, int]" = collections.defaultdict(lambda: 50)
|
|
|
|
|
|
class _GLibCVersion(NamedTuple):
|
|
@@ -82,7 +80,7 @@ class _GLibCVersion(NamedTuple):
|
|
minor: int
|
|
|
|
|
|
-def _glibc_version_string_confstr() -> str | None:
|
|
+def _glibc_version_string_confstr() -> "str | None":
|
|
"""
|
|
Primary implementation of glibc_version_string using os.confstr.
|
|
"""
|
|
@@ -92,7 +90,7 @@ def _glibc_version_string_confstr() -> str | None:
|
|
# https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183
|
|
try:
|
|
# Should be a string like "glibc 2.17".
|
|
- version_string: str | None = os.confstr("CS_GNU_LIBC_VERSION")
|
|
+ version_string: "str | None" = os.confstr("CS_GNU_LIBC_VERSION")
|
|
assert version_string is not None
|
|
_, version = version_string.rsplit()
|
|
except (AssertionError, AttributeError, OSError, ValueError):
|
|
@@ -101,7 +99,7 @@ def _glibc_version_string_confstr() -> str | None:
|
|
return version
|
|
|
|
|
|
-def _glibc_version_string_ctypes() -> str | None:
|
|
+def _glibc_version_string_ctypes() -> "str | None":
|
|
"""
|
|
Fallback implementation of glibc_version_string using ctypes.
|
|
"""
|
|
@@ -145,7 +143,7 @@ def _glibc_version_string_ctypes() -> str | None:
|
|
return version_str
|
|
|
|
|
|
-def _glibc_version_string() -> str | None:
|
|
+def _glibc_version_string() -> "str | None":
|
|
"""Returns glibc version string, or None if not using glibc."""
|
|
return _glibc_version_string_confstr() or _glibc_version_string_ctypes()
|
|
|
|
@@ -203,7 +201,7 @@ def _is_compatible(arch: str, version: _GLibCVersion) -> bool:
|
|
return True
|
|
|
|
|
|
-_LEGACY_MANYLINUX_MAP: dict[_GLibCVersion, str] = {
|
|
+_LEGACY_MANYLINUX_MAP: "dict[_GLibCVersion, str]" = {
|
|
# CentOS 7 w/ glibc 2.17 (PEP 599)
|
|
_GLibCVersion(2, 17): "manylinux2014",
|
|
# CentOS 6 w/ glibc 2.12 (PEP 571)
|
|
diff --git a/crates/uv-python/python/packaging/_musllinux.py b/crates/uv-python/python/packaging/_musllinux.py
|
|
index b4ca23804..40a72f05b 100644
|
|
--- a/crates/uv-python/python/packaging/_musllinux.py
|
|
+++ b/crates/uv-python/python/packaging/_musllinux.py
|
|
@@ -4,8 +4,6 @@ This module implements logic to detect if the currently running Python is
|
|
linked against musl, and what musl version is used.
|
|
"""
|
|
|
|
-from __future__ import annotations
|
|
-
|
|
import functools
|
|
import re
|
|
import subprocess
|
|
@@ -20,7 +18,7 @@ class _MuslVersion(NamedTuple):
|
|
minor: int
|
|
|
|
|
|
-def _parse_musl_version(output: str) -> _MuslVersion | None:
|
|
+def _parse_musl_version(output: str) -> "_MuslVersion | None":
|
|
lines = [n for n in (n.strip() for n in output.splitlines()) if n]
|
|
if len(lines) < 2 or lines[0][:4] != "musl":
|
|
return None
|
|
@@ -31,7 +29,7 @@ def _parse_musl_version(output: str) -> _MuslVersion | None:
|
|
|
|
|
|
@functools.lru_cache()
|
|
-def _get_musl_version(executable: str) -> _MuslVersion | None:
|
|
+def _get_musl_version(executable: str) -> "_MuslVersion | None":
|
|
"""Detect currently-running musl runtime version.
|
|
|
|
This is done by checking the specified executable's dynamic linking
|