@@ -66,6 +66,11 @@ def url(self) -> str:
66
66
"""Return the download url."""
67
67
return self .data ["url" ]
68
68
69
+ @property
70
+ def is_yanked (self ) -> bool :
71
+ """Return whether the package is yanked."""
72
+ return self .data .get ("yanked" , False )
73
+
69
74
@property
70
75
def is_wheel (self ) -> bool :
71
76
"""Return whether the package is a wheel."""
@@ -191,6 +196,7 @@ def __init__(
191
196
for version in self .data .get ("releases" , {}):
192
197
try :
193
198
v = packaging .version .parse (version )
199
+
194
200
if (not v .is_prerelease and not v .is_devrelease ) or (
195
201
v .is_prerelease and self .name in pypi .allowed_prerelease
196
202
):
@@ -236,9 +242,15 @@ def latest_release(self) -> list[PackageFile]:
236
242
for f in all_files
237
243
if f .is_compatible_with_cpython3 (self .pypi .python3_version )
238
244
and f .is_compatible_with_platforms (self .pypi .platforms )
245
+ and (not f .is_yanked or self .name in self .pypi .allowed_yanked )
239
246
]
240
247
if any ((f .is_generic_wheel for f in all_files )):
241
248
all_files = [f for f in all_files if f .is_wheel ]
249
+
250
+ if not all_files :
251
+ self .versions .remove (packaging .version .parse (self .latest_version ))
252
+ return self .latest_release
253
+
242
254
self .releases [self .latest_version ] = all_files
243
255
244
256
return self .releases [self .latest_version ]
@@ -365,6 +377,7 @@ def __init__(
365
377
cache_file : str | None = None ,
366
378
pypi_url : str = "https://pypi.org/pypi" ,
367
379
allowed_prerelease : list [str ] | None = None ,
380
+ allowed_yanked : list [str ] | None = None ,
368
381
) -> None :
369
382
"""Initialize a PyPI session.
370
383
@@ -375,6 +388,10 @@ def __init__(
375
388
data is cached a maximum of 24h. The cache contains results of requests to
376
389
PyPI.
377
390
:param pypi_url: set Python package registry URL. Default is PyPI
391
+ :param allowed_prerelease: list of package names authorized to be into
392
+ pre-release.
393
+ :param allowed_yanked: list of package names authorized to have yanked flags set
394
+ to true (see: PEP_592).
378
395
"""
379
396
self .cache_file = cache_file
380
397
self .cache_dir = cache_dir
@@ -385,6 +402,7 @@ def __init__(
385
402
self .requirements : set [Requirement ] = set ()
386
403
self .explicit_requirements : set [Requirement ] = set ()
387
404
self .allowed_prerelease = allowed_prerelease or []
405
+ self .allowed_yanked = allowed_yanked or []
388
406
389
407
self .platforms = platforms
390
408
self .sys_platforms = set ()
0 commit comments