Beispiel #1
0
    def resolve_reqs(
        self,
        download_dir: Optional[str],
        ireq: InstallRequirement,
        wheel_cache: WheelCache,
    ) -> Set[InstallationCandidate]:
        with get_build_tracker() as build_tracker, TempDirectory(
            kind="resolver"
        ) as temp_dir, indent_log():
            preparer_kwargs = {
                "temp_build_dir": temp_dir,
                "options": self.options,
                "session": self.session,
                "finder": self.finder,
                "use_user_site": False,
                "download_dir": download_dir,
            }

            if PIP_VERSION[:2] <= (22, 0):
                preparer_kwargs["req_tracker"] = build_tracker
            else:
                preparer_kwargs["build_tracker"] = build_tracker

            preparer = self.command.make_requirement_preparer(**preparer_kwargs)

            reqset = RequirementSet()
            ireq.user_supplied = True
            if PIP_VERSION[:3] < (22, 1, 1):
                reqset.add_requirement(ireq)
            elif getattr(ireq, "name", None):
                reqset.add_named_requirement(ireq)
            else:
                reqset.add_unnamed_requirement(ireq)

            resolver = self.command.make_resolver(
                preparer=preparer,
                finder=self.finder,
                options=self.options,
                wheel_cache=wheel_cache,
                use_user_site=False,
                ignore_installed=True,
                ignore_requires_python=False,
                force_reinstall=False,
                upgrade_strategy="to-satisfy-only",
            )
            results = resolver._resolve_one(reqset, ireq)
            if not ireq.prepared:
                # If still not prepared, e.g. a constraint, do enough to assign
                # the ireq a name:
                resolver._get_dist_for(ireq)

        return set(results)
Beispiel #2
0
 def test_environment_marker_extras(self, data: TestData) -> None:
     """
     Test that the environment marker extras are used with
     non-wheel installs.
     """
     reqset = RequirementSet()
     req = install_req_from_editable(
         os.fspath(data.packages.joinpath("LocalEnvironMarker")), )
     req.user_supplied = True
     reqset.add_unnamed_requirement(req)
     finder = make_test_finder(find_links=[data.find_links])
     with self._basic_resolver(finder) as resolver:
         reqset = resolver.resolve(reqset.all_requirements, True)
     assert not reqset.has_requirement("simple")
Beispiel #3
0
    def test_unsupported_hashes(self, data: TestData) -> None:
        """VCS and dir links should raise errors when --require-hashes is
        on.

        In addition, complaints about the type of requirement (VCS or dir)
        should trump the presence or absence of a hash.

        """
        reqset = RequirementSet()
        reqset.add_unnamed_requirement(
            get_processed_req_from_line(
                "git+git://github.com/pypa/pip-test-package --hash=sha256:123",
                lineno=1,
            ))
        dir_path = data.packages.joinpath("FSPkg")
        reqset.add_unnamed_requirement(
            get_processed_req_from_line(
                f"file://{dir_path}",
                lineno=2,
            ))
        finder = make_test_finder(find_links=[data.find_links])

        sep = os.path.sep
        if sep == "\\":
            sep = "\\\\"  # This needs to be escaped for the regex

        with self._basic_resolver(finder, require_hashes=True) as resolver:
            with pytest.raises(
                    HashErrors,
                    match=
                (r"Can't verify hashes for these requirements because we don't "
                 r"have a way to hash version control repositories:\n"
                 r"    git\+git://github\.com/pypa/pip-test-package \(from -r "
                 r"file \(line 1\)\)\n"
                 r"Can't verify hashes for these file:// requirements because "
                 r"they point to directories:\n"
                 r"    file://.*{sep}data{sep}packages{sep}FSPkg "
                 r"\(from -r file \(line 2\)\)".format(sep=sep)),
            ):
                resolver.resolve(reqset.all_requirements, True)
Beispiel #4
0
 def test_hash_mismatch(self, data: TestData) -> None:
     """A hash mismatch should raise an error."""
     file_url = data.packages.joinpath(
         "simple-1.0.tar.gz").resolve().as_uri()
     reqset = RequirementSet()
     reqset.add_unnamed_requirement(
         get_processed_req_from_line(
             f"{file_url} --hash=sha256:badbad",
             lineno=1,
         ))
     finder = make_test_finder(find_links=[data.find_links])
     with self._basic_resolver(finder, require_hashes=True) as resolver:
         with pytest.raises(
                 HashErrors,
                 match=
             (r"THESE PACKAGES DO NOT MATCH THE HASHES.*\n"
              r"    file:///.*/data/packages/simple-1\.0\.tar\.gz .*:\n"
              r"        Expected sha256 badbad\n"
              r"             Got        393043e672415891885c9a2a0929b1af95fb"
              r"866d6ca016b42d2e6ce53619b653$"),
         ):
             resolver.resolve(reqset.all_requirements, True)