diff --git a/src/packaging/specifiers.py b/src/packaging/specifiers.py index b8ab9277..18e04b06 100644 --- a/src/packaging/specifiers.py +++ b/src/packaging/specifiers.py @@ -11,12 +11,23 @@ import abc import itertools import re -from typing import Callable, Iterable, Iterator, List, Optional, Set, Tuple, Union +from typing import ( + Callable, + Iterable, + Iterator, + List, + Optional, + Set, + Tuple, + TypeVar, + Union, +) from .utils import canonicalize_version from .version import Version UnparsedVersion = Union[Version, str] +UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) CallableOperator = Callable[[Version, str], bool] @@ -85,8 +96,8 @@ def contains(self, item: str, prereleases: Optional[bool] = None) -> bool: @abc.abstractmethod def filter( - self, iterable: Iterable[UnparsedVersion], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersion]: + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: """ Takes an iterable of items and filters them so that only items which are contained within this specifier are allowed in it. @@ -565,8 +576,8 @@ def contains( return operator_callable(normalized_item, self.version) def filter( - self, iterable: Iterable[UnparsedVersion], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersion]: + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: """Filter items in the given iterable, that match the specifier. :param iterable: @@ -915,8 +926,8 @@ def contains( return all(s.contains(item, prereleases=prereleases) for s in self._specs) def filter( - self, iterable: Iterable[UnparsedVersion], prereleases: Optional[bool] = None - ) -> Iterator[UnparsedVersion]: + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: """Filter items in the given iterable, that match the specifiers in this set. :param iterable: @@ -972,8 +983,8 @@ def filter( # which will filter out any pre-releases, unless there are no final # releases. else: - filtered: List[UnparsedVersion] = [] - found_prereleases: List[UnparsedVersion] = [] + filtered: List[UnparsedVersionVar] = [] + found_prereleases: List[UnparsedVersionVar] = [] for item in iterable: parsed_version = _coerce_version(item)