Source code for bandersnatch_filter_plugins.prerelease_name
import logging
import re
from re import Pattern
from packaging.utils import canonicalize_name
from bandersnatch.filter import FilterReleasePlugin
logger = logging.getLogger("bandersnatch")
[docs]
class PreReleaseFilter(FilterReleasePlugin):
"""
Filters releases considered pre-releases.
"""
name = "prerelease_release"
PRERELEASE_PATTERNS = (
r".+rc\d+$",
r".+a(lpha)?\d+$",
r".+b(eta)?\d+$",
r".+dev\d+$",
)
patterns: list[Pattern] = []
package_names: list[str] = []
[docs]
def initialize_plugin(self) -> None:
"""
Initialize the plugin reading patterns from the config.
"""
if not self.patterns:
self.patterns = [
re.compile(pattern_string)
for pattern_string in self.PRERELEASE_PATTERNS
]
logger.info(f"Initialized prerelease plugin with {self.patterns}")
if not self.package_names:
try:
lines = self.configuration["filter_prerelease"]["packages"]
self.package_names = [
canonicalize_name(package_line.strip())
for package_line in lines.split("\n")
if package_line.strip()
]
except KeyError:
pass
logger.info(
f"Initialized prerelease plugin {self.name}, filtering "
+ f"{self.package_names if self.package_names else 'all packages'}"
)
[docs]
def filter(self, metadata: dict) -> bool:
"""
Returns False if version fails the filter, i.e. follows a prerelease pattern
"""
name = metadata["info"]["name"]
version = metadata["version"]
if self.package_names and name not in self.package_names:
return True
return not any(pattern.match(version) for pattern in self.patterns)