diff --git a/pipenv/patched/pip/_internal/index/package_finder.py b/pipenv/patched/pip/_internal/index/package_finder.py index e74e6623..cc81f35c 100644 --- a/pipenv/patched/pip/_internal/index/package_finder.py +++ b/pipenv/patched/pip/_internal/index/package_finder.py @@ -125,6 +125,7 @@ class LinkEvaluator: target_python: TargetPython, allow_yanked: bool, ignore_requires_python: Optional[bool] = None, + ignore_compatibility: Optional[bool] = None, ) -> None: """ :param project_name: The user supplied package name. @@ -142,6 +143,8 @@ class LinkEvaluator: :param ignore_requires_python: Whether to ignore incompatible PEP 503 "data-requires-python" values in HTML links. Defaults to False. + :param ignore_compatibility: Whether to ignore + compatibility of python versions and allow all versions of packages. """ if ignore_requires_python is None: ignore_requires_python = False @@ -151,6 +154,7 @@ class LinkEvaluator: self._ignore_requires_python = ignore_requires_python self._formats = formats self._target_python = target_python + self._ignore_compatibility = ignore_compatibility self.project_name = project_name @@ -181,10 +185,10 @@ class LinkEvaluator: LinkType.format_unsupported, f"unsupported archive format: {ext}", ) - if "binary" not in self._formats and ext == WHEEL_EXTENSION: + if "binary" not in self._formats and ext == WHEEL_EXTENSION and not self._ignore_compatibility: reason = f"No binaries permitted for {self.project_name}" return (LinkType.format_unsupported, reason) - if "macosx10" in link.path and ext == ".zip": + if "macosx10" in link.path and ext == ".zip" and not self._ignore_compatibility: return (LinkType.format_unsupported, "macosx10 one") if ext == WHEEL_EXTENSION: try: @@ -199,7 +203,7 @@ class LinkEvaluator: return (LinkType.different_project, reason) supported_tags = self._target_python.get_tags() - if not wheel.supported(supported_tags): + if not wheel.supported(supported_tags) and not self._ignore_compatibility: # Include the wheel's tags in the reason string to # simplify troubleshooting compatibility issues. file_tags = ", ".join(wheel.get_formatted_file_tags()) @@ -240,7 +244,7 @@ class LinkEvaluator: version_info=self._target_python.py_version_info, ignore_requires_python=self._ignore_requires_python, ) - if not supports_python: + if not supports_python and not self._ignore_compatibility: reason = f"{version} Requires-Python {link.requires_python}" return (LinkType.requires_python_mismatch, reason) @@ -487,7 +491,11 @@ class CandidateEvaluator: return sorted(filtered_applicable_candidates, key=self._sort_key) - def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey: + def _sort_key( + self, + candidate: InstallationCandidate, + ignore_compatibility: bool = True + ) -> CandidateSortingKey: """ Function to pass as the `key` argument to a call to sorted() to sort InstallationCandidates by preference. @@ -532,10 +540,12 @@ class CandidateEvaluator: ) ) except ValueError: - raise UnsupportedWheel( - "{} is not a supported wheel for this platform. It " - "can't be sorted.".format(wheel.filename) - ) + if not ignore_compatibility: + raise UnsupportedWheel( + "{} is not a supported wheel for this platform. It " + "can't be sorted.".format(wheel.filename) + ) + pri = -support_num if self._prefer_binary: binary_preference = 1 if wheel.build_tag is not None: @@ -602,6 +612,7 @@ class PackageFinder: format_control: Optional[FormatControl] = None, candidate_prefs: Optional[CandidatePreferences] = None, ignore_requires_python: Optional[bool] = None, + ignore_compatibility: Optional[bool] = False, ) -> None: """ This constructor is primarily meant to be used by the create() class @@ -623,6 +634,7 @@ class PackageFinder: self._ignore_requires_python = ignore_requires_python self._link_collector = link_collector self._target_python = target_python + self._ignore_compatibility = ignore_compatibility self.format_control = format_control @@ -723,6 +735,7 @@ class PackageFinder: target_python=self._target_python, allow_yanked=self._allow_yanked, ignore_requires_python=self._ignore_requires_python, + ignore_compatibility=self._ignore_compatibility, ) def _sort_links(self, links: Iterable[Link]) -> List[Link]: diff --git a/tasks/vendoring/patches/patched/pip23-compatability-finder.patch b/tasks/vendoring/patches/patched/pip23-compatability-finder.patch new file mode 100644 index 00000000..4bfbcd29 --- /dev/null +++ b/tasks/vendoring/patches/patched/pip23-compatability-finder.patch @@ -0,0 +1,114 @@ +diff --git a/pipenv/patched/pip/_internal/index/package_finder.py b/pipenv/patched/pip/_internal/index/package_finder.py +index e74e6623..cc81f35c 100644 +--- a/pipenv/patched/pip/_internal/index/package_finder.py ++++ b/pipenv/patched/pip/_internal/index/package_finder.py +@@ -125,6 +125,7 @@ class LinkEvaluator: + target_python: TargetPython, + allow_yanked: bool, + ignore_requires_python: Optional[bool] = None, ++ ignore_compatibility: Optional[bool] = None, + ) -> None: + """ + :param project_name: The user supplied package name. +@@ -142,6 +143,8 @@ class LinkEvaluator: + :param ignore_requires_python: Whether to ignore incompatible + PEP 503 "data-requires-python" values in HTML links. Defaults + to False. ++ :param ignore_compatibility: Whether to ignore ++ compatibility of python versions and allow all versions of packages. + """ + if ignore_requires_python is None: + ignore_requires_python = False +@@ -151,6 +154,7 @@ class LinkEvaluator: + self._ignore_requires_python = ignore_requires_python + self._formats = formats + self._target_python = target_python ++ self._ignore_compatibility = ignore_compatibility + + self.project_name = project_name + +@@ -181,10 +185,10 @@ class LinkEvaluator: + LinkType.format_unsupported, + f"unsupported archive format: {ext}", + ) +- if "binary" not in self._formats and ext == WHEEL_EXTENSION: ++ if "binary" not in self._formats and ext == WHEEL_EXTENSION and not self._ignore_compatibility: + reason = f"No binaries permitted for {self.project_name}" + return (LinkType.format_unsupported, reason) +- if "macosx10" in link.path and ext == ".zip": ++ if "macosx10" in link.path and ext == ".zip" and not self._ignore_compatibility: + return (LinkType.format_unsupported, "macosx10 one") + if ext == WHEEL_EXTENSION: + try: +@@ -199,7 +203,7 @@ class LinkEvaluator: + return (LinkType.different_project, reason) + + supported_tags = self._target_python.get_tags() +- if not wheel.supported(supported_tags): ++ if not wheel.supported(supported_tags) and not self._ignore_compatibility: + # Include the wheel's tags in the reason string to + # simplify troubleshooting compatibility issues. + file_tags = ", ".join(wheel.get_formatted_file_tags()) +@@ -240,7 +244,7 @@ class LinkEvaluator: + version_info=self._target_python.py_version_info, + ignore_requires_python=self._ignore_requires_python, + ) +- if not supports_python: ++ if not supports_python and not self._ignore_compatibility: + reason = f"{version} Requires-Python {link.requires_python}" + return (LinkType.requires_python_mismatch, reason) + +@@ -487,7 +491,11 @@ class CandidateEvaluator: + + return sorted(filtered_applicable_candidates, key=self._sort_key) + +- def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey: ++ def _sort_key( ++ self, ++ candidate: InstallationCandidate, ++ ignore_compatibility: bool = True ++ ) -> CandidateSortingKey: + """ + Function to pass as the `key` argument to a call to sorted() to sort + InstallationCandidates by preference. +@@ -532,10 +540,12 @@ class CandidateEvaluator: + ) + ) + except ValueError: +- raise UnsupportedWheel( +- "{} is not a supported wheel for this platform. It " +- "can't be sorted.".format(wheel.filename) +- ) ++ if not ignore_compatibility: ++ raise UnsupportedWheel( ++ "{} is not a supported wheel for this platform. It " ++ "can't be sorted.".format(wheel.filename) ++ ) ++ pri = -support_num + if self._prefer_binary: + binary_preference = 1 + if wheel.build_tag is not None: +@@ -602,6 +612,7 @@ class PackageFinder: + format_control: Optional[FormatControl] = None, + candidate_prefs: Optional[CandidatePreferences] = None, + ignore_requires_python: Optional[bool] = None, ++ ignore_compatibility: Optional[bool] = False, + ) -> None: + """ + This constructor is primarily meant to be used by the create() class +@@ -623,6 +634,7 @@ class PackageFinder: + self._ignore_requires_python = ignore_requires_python + self._link_collector = link_collector + self._target_python = target_python ++ self._ignore_compatibility = ignore_compatibility + + self.format_control = format_control + +@@ -723,6 +735,7 @@ class PackageFinder: + target_python=self._target_python, + allow_yanked=self._allow_yanked, + ignore_requires_python=self._ignore_requires_python, ++ ignore_compatibility=self._ignore_compatibility, + ) + + def _sort_links(self, links: Iterable[Link]) -> List[Link]: