@@ -66,6 +66,11 @@ def url(self) -> str:
6666 """Return the download url."""
6767 return self .data ["url" ]
6868
69+ @property
70+ def is_yanked (self ) -> bool :
71+ """Return whether the package is yanked."""
72+ return self .data .get ("yanked" , False )
73+
6974 @property
7075 def is_wheel (self ) -> bool :
7176 """Return whether the package is a wheel."""
@@ -191,6 +196,7 @@ def __init__(
191196 for version in self .data .get ("releases" , {}):
192197 try :
193198 v = packaging .version .parse (version )
199+
194200 if (not v .is_prerelease and not v .is_devrelease ) or (
195201 v .is_prerelease and self .name in pypi .allowed_prerelease
196202 ):
@@ -236,9 +242,15 @@ def latest_release(self) -> list[PackageFile]:
236242 for f in all_files
237243 if f .is_compatible_with_cpython3 (self .pypi .python3_version )
238244 and f .is_compatible_with_platforms (self .pypi .platforms )
245+ and (not f .is_yanked or self .name in self .pypi .allowed_yanked )
239246 ]
240247 if any ((f .is_generic_wheel for f in all_files )):
241248 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+
242254 self .releases [self .latest_version ] = all_files
243255
244256 return self .releases [self .latest_version ]
@@ -365,6 +377,7 @@ def __init__(
365377 cache_file : str | None = None ,
366378 pypi_url : str = "https://pypi.org/pypi" ,
367379 allowed_prerelease : list [str ] | None = None ,
380+ allowed_yanked : list [str ] | None = None ,
368381 ) -> None :
369382 """Initialize a PyPI session.
370383
@@ -375,6 +388,10 @@ def __init__(
375388 data is cached a maximum of 24h. The cache contains results of requests to
376389 PyPI.
377390 :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).
378395 """
379396 self .cache_file = cache_file
380397 self .cache_dir = cache_dir
@@ -385,6 +402,7 @@ def __init__(
385402 self .requirements : set [Requirement ] = set ()
386403 self .explicit_requirements : set [Requirement ] = set ()
387404 self .allowed_prerelease = allowed_prerelease or []
405+ self .allowed_yanked = allowed_yanked or []
388406
389407 self .platforms = platforms
390408 self .sys_platforms = set ()
0 commit comments