Source code for bandersnatch_filter_plugins.latest_name
import logging
from operator import itemgetter
from typing import Dict, Iterator, Tuple
from packaging.version import Version, parse
from bandersnatch.filter import FilterReleasePlugin
logger = logging.getLogger("bandersnatch")
[docs]class LatestReleaseFilter(FilterReleasePlugin):
"""
Plugin to download only latest releases
"""
name = "latest_release"
keep = 0 # by default, keep 'em all
[docs] def initialize_plugin(self) -> None:
"""
Initialize the plugin reading patterns from the config.
"""
if self.keep:
return
try:
self.keep = int(self.configuration["latest_release"]["keep"])
except KeyError:
return
except ValueError:
return
if self.keep > 0:
logger.info(f"Initialized latest releases plugin with keep={self.keep}")
[docs] def filter(self, metadata: Dict) -> bool:
"""
Returns False if version fails the filter, i.e. is not a latest/current release
"""
info: Dict = metadata["info"]
releases: Dict = metadata["releases"]
version: str = metadata["version"]
if self.keep == 0 or self.keep > len(releases):
return True
versions_pair: Iterator[Tuple[Version, str]] = map(
lambda v: (parse(v), v), releases.keys()
)
# Sort all versions
versions_sorted = sorted(versions_pair, reverse=True)
# Select the first few (larger) items
versions_allowed = versions_sorted[: self.keep]
# Collect string versions back into a list
version_names = list(map(itemgetter(1), versions_allowed))
# Add back latest version if necessary
if info.get("version") not in version_names:
version_names[-1] = info.get("version")
return version in version_names