From 203564091f1cd85b9985dd995a7ed990d756ee02 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 12 Jan 2026 11:48:46 -0500 Subject: [PATCH 1/3] fix: legacy_packaging fix Signed-off-by: Henry Schreiner --- src/packaging/version.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/packaging/version.py b/src/packaging/version.py index e4e11a20b..279335cda 100644 --- a/src/packaging/version.py +++ b/src/packaging/version.py @@ -83,9 +83,7 @@ class InvalidVersion(ValueError): class _BaseVersion: __slots__ = () - @property - def _key(self) -> tuple[Any, ...]: - raise NotImplementedError # pragma: no cover + key: typle[Any, ...] def __hash__(self) -> int: return hash(self._key) From f8b42b48dcfadb7b4c9bd7f2a0dc6f7632e92766 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 12 Jan 2026 11:59:05 -0500 Subject: [PATCH 2/3] Update src/packaging/version.py --- src/packaging/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/packaging/version.py b/src/packaging/version.py index 279335cda..0587792e2 100644 --- a/src/packaging/version.py +++ b/src/packaging/version.py @@ -83,7 +83,7 @@ class InvalidVersion(ValueError): class _BaseVersion: __slots__ = () - key: typle[Any, ...] + _key: tuple[Any, ...] def __hash__(self) -> int: return hash(self._key) From 0188fe9039ce191b897d1dd9c7b9edbc1e5c9ed3 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 12 Jan 2026 12:09:34 -0500 Subject: [PATCH 3/3] fix: legacy_packaging fix - try two Signed-off-by: Henry Schreiner --- src/packaging/version.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/packaging/version.py b/src/packaging/version.py index 0587792e2..5d85084a9 100644 --- a/src/packaging/version.py +++ b/src/packaging/version.py @@ -83,7 +83,13 @@ class InvalidVersion(ValueError): class _BaseVersion: __slots__ = () - _key: tuple[Any, ...] + # This can also be a normal member (see the packaging_legacy package); + # we are just requiring it to be readable. Actually defining a property + # has runtime effect on subclasses, so it's typing only. + if typing.TYPE_CHECKING: + + @property + def _key(self) -> tuple[Any, ...]: ... def __hash__(self) -> int: return hash(self._key)