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)
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")
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)
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)