Skip to content

Commit 95f8f49

Browse files
committed
[WIP] warn when legacy versions are selected by the resolver
1 parent 09a6a68 commit 95f8f49

File tree

4 files changed

+27
-65
lines changed

4 files changed

+27
-65
lines changed

src/pip/_internal/commands/install.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from optparse import SUPPRESS_HELP, Values
88
from typing import List, Optional
99

10+
from pip._vendor.packaging.version import LegacyVersion
1011
from pip._vendor.rich import print_json
1112

1213
from pip._internal.cache import WheelCache
@@ -30,6 +31,7 @@
3031
check_legacy_setup_py_options,
3132
)
3233
from pip._internal.utils.compat import WINDOWS
34+
from pip._internal.utils.deprecation import deprecated
3335
from pip._internal.utils.filesystem import test_writable_dir
3436
from pip._internal.utils.logging import getLogger
3537
from pip._internal.utils.misc import (
@@ -378,6 +380,22 @@ def run(self, options: Values, args: List[str]) -> int:
378380
reqs, check_supported_wheels=not options.target_dir
379381
)
380382

383+
for requirement in requirement_set.requirements_to_install:
384+
version = requirement.get_dist().version
385+
if isinstance(version, LegacyVersion):
386+
deprecated(
387+
reason=(
388+
f"pip has selected the non standard version {version} "
389+
f"of {requirement}. In the future this version will be "
390+
f"ignored as it isn't standard compliant."
391+
),
392+
replacement=(
393+
"update constraints to select another version "
394+
"or contact the package author to fix the version number"
395+
),
396+
gone_in="23.3",
397+
)
398+
381399
if options.json_report_file:
382400
report = InstallationReport(requirement_set.requirements_to_install)
383401
if options.json_report_file == "-":

src/pip/_vendor/packaging/specifiers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None:
263263

264264
def _coerce_version(self, version: UnparsedVersion) -> LegacyVersion:
265265
if not isinstance(version, LegacyVersion):
266-
version = LegacyVersion(str(version), silence_deprecation_warning=True)
266+
version = LegacyVersion(str(version))
267267
return version
268268

269269
def _compare_equal(self, prospective: LegacyVersion, spec: str) -> bool:

src/pip/_vendor/packaging/version.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -104,23 +104,15 @@ def __ne__(self, other: object) -> bool:
104104

105105

106106
class LegacyVersion(_BaseVersion):
107-
def __init__(
108-
self,
109-
version: str,
110-
silence_deprecation_warning: bool = False,
111-
) -> None:
107+
def __init__(self, version: str) -> None:
112108
self._version = str(version)
113109
self._key = _legacy_cmpkey(self._version)
114110

115-
if not silence_deprecation_warning:
116-
from pip._internal.utils.deprecation import deprecated
117-
118-
deprecated(
119-
reason=(f"This form of version ({version}) has been deprecated."),
120-
replacement="use PEP 440 compatible versions",
121-
gone_in="23.3",
122-
issue=12063,
123-
)
111+
warnings.warn(
112+
"Creating a LegacyVersion has been deprecated and will be "
113+
"removed in the next major release",
114+
DeprecationWarning,
115+
)
124116

125117
def __str__(self) -> str:
126118
return self._version
Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
1-
Surface LegacyVersion and LegacySpecifier deprecation warnings
2-
as pip deprecation warnings.
3-
4-
---
5-
src/pip/_vendor/packaging/specifiers.py | 12 +++++++-----
6-
src/pip/_vendor/packaging/version.py | 19 +++++++++++++------
7-
2 files changed, 20 insertions(+), 11 deletions(-)
8-
91
diff --git a/src/pip/_vendor/packaging/specifiers.py b/src/pip/_vendor/packaging/specifiers.py
10-
index 0e218a6f9f7..b0a1cee288b 100644
2+
index 0e218a6..e89026a 100644
113
--- a/src/pip/_vendor/packaging/specifiers.py
124
+++ b/src/pip/_vendor/packaging/specifiers.py
13-
@@ -252,15 +252,18 @@ class LegacySpecifier(_IndividualSpecifier):
5+
@@ -252,10 +252,13 @@ class LegacySpecifier(_IndividualSpecifier):
146
def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None:
157
super().__init__(spec, prereleases)
168

@@ -28,43 +20,3 @@ index 0e218a6f9f7..b0a1cee288b 100644
2820
)
2921

3022
def _coerce_version(self, version: UnparsedVersion) -> LegacyVersion:
31-
if not isinstance(version, LegacyVersion):
32-
- version = LegacyVersion(str(version))
33-
+ version = LegacyVersion(str(version), silence_deprecation_warning=True)
34-
return version
35-
36-
def _compare_equal(self, prospective: LegacyVersion, spec: str) -> bool:
37-
diff --git a/src/pip/_vendor/packaging/version.py b/src/pip/_vendor/packaging/version.py
38-
index de9a09a4ed3..cc68ed67424 100644
39-
--- a/src/pip/_vendor/packaging/version.py
40-
+++ b/src/pip/_vendor/packaging/version.py
41-
@@ -104,15 +104,23 @@ def __ne__(self, other: object) -> bool:
42-
43-
44-
class LegacyVersion(_BaseVersion):
45-
- def __init__(self, version: str) -> None:
46-
+ def __init__(
47-
+ self,
48-
+ version: str,
49-
+ silence_deprecation_warning: bool = False,
50-
+ ) -> None:
51-
self._version = str(version)
52-
self._key = _legacy_cmpkey(self._version)
53-
54-
- warnings.warn(
55-
- "Creating a LegacyVersion has been deprecated and will be "
56-
- "removed in the next major release",
57-
- DeprecationWarning,
58-
- )
59-
+ if not silence_deprecation_warning:
60-
+ from pip._internal.utils.deprecation import deprecated
61-
+
62-
+ deprecated(
63-
+ reason=(f"This form of version ({version}) has been deprecated."),
64-
+ replacement="use PEP 440 compatible versions",
65-
+ gone_in="23.3",
66-
+ issue=12063,
67-
+ )
68-
69-
def __str__(self) -> str:
70-
return self._version

0 commit comments

Comments
 (0)