Source code for bandersnatch_filter_plugins.latest_name
import logging
from collections.abc import Iterator
from operator import itemgetter
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
# by default, sort by parsed version string, time (of release) is the other option
sort_by = "version"
[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}")
try:
sort_by = self.configuration["latest_release"]["sort_by"]
if sort_by in ["time", "version"]:
self.sort_by = sort_by
else:
logger.debug(
"sort_by only allows 'time' and 'version', and not '{}'".format(
sort_by
)
)
logger.info(
f"Initialized latest releases plugin with sort_by={self.sort_by}"
)
except KeyError:
return
[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
getter_index = 1
if self.sort_by == "time":
getter_index = 0
versions_sorted = sorted(
releases.items(),
key=lambda x: x[1][0]["upload_time_iso_8601"],
reverse=True,
)
else:
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(getter_index), 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