1"""Build Environment used for isolation during sdist building
10from collections
import OrderedDict
11from types
import TracebackType
12from typing
import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
18from pip
import __file__
as pip_location
31def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
32 return (a, b)
if a != b
else (a,)
39 scheme = get_scheme(
"", prefix=path)
45 """Get a file to pass to a Python executable, to run the currently-running pip.
47 This is used to run a pip subprocess, for installing requirements into the build
61 """Get system site packages
63 Usually from site.getsitepackages,
64 but fallback on `get_purelib()/get_platlib()` if unavailable
65 (e.g. in a virtualenv created by virtualenv<20)
67 Returns normalized set of strings.
69 if hasattr(site,
"getsitepackages"):
76 system_sites = [get_purelib(), get_platlib()]
81 """Creates and manages an isolated environment to install build deps"""
88 for name
in (
"normal",
"overlay")
91 self._bin_dirs: List[str] = []
113 # First, drop system-sites related paths.
114 original_sys_path = sys.path[:]
116 for path in {system_sites!r}:
117 site.addsitedir(path, known_paths=known_paths)
119 os.path.normcase(path)
120 for path in sys.path[len(original_sys_path):]
122 original_sys_path = [
123 path for path in original_sys_path
124 if os.path.normcase(path) not in system_paths
126 sys.path = original_sys_path
128 # Second, add lib directories.
129 # ensuring .pth file are processed.
130 for path in {lib_dirs!r}:
131 assert not path in sys.path
132 site.addsitedir(path)
134 ).format(system_sites=system_sites, lib_dirs=self.
_lib_dirs)
140 for name
in (
"PATH",
"PYTHONNOUSERSITE",
"PYTHONPATH")
143 path = self._bin_dirs[:]
153 "PYTHONNOUSERSITE":
"1",
160 exc_type: Optional[Type[BaseException]],
161 exc_val: Optional[BaseException],
162 exc_tb: Optional[TracebackType],
164 for varname, old_value
in self.
_save_env.items():
165 if old_value
is None:
171 self, reqs: Iterable[str]
172 ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
174 - conflicting requirements: set of (installed, wanted) reqs tuples
175 - missing requirements: set of reqs
183 else get_default_environment()
196 installed_req_str = f
"{req.name}=={dist.version}"
198 installed_req_str = f
"{req.name}==={dist.version}"
202 return conflicting, missing
206 finder:
"PackageFinder",
207 requirements: Iterable[str],
208 prefix_as_string: str,
212 prefix = self.
_prefixes[prefix_as_string]
228 finder:
"PackageFinder",
229 requirements: Iterable[str],
238 "--ignore-installed",
242 "--no-warn-script-location",
246 for format_control
in (
"no_binary",
"only_binary"):
251 ",".join(sorted(formats
or {
":none:"})),
258 for extra_index
in index_urls[1:]:
273 extra_environ = {
"_PIP_STANDALONE_CERT": where()}
274 with open_spinner(f
"Installing {kind}")
as spinner:
277 command_desc=f
"pip subprocess to install {kind}",
279 extra_environ=extra_environ,
284 """A no-op drop-in replacement for BuildEnvironment"""
294 exc_type: Optional[Type[BaseException]],
295 exc_val: Optional[BaseException],
296 exc_tb: Optional[TracebackType],
305 finder:
"PackageFinder",
306 requirements: Iterable[str],
307 prefix_as_string: str,
Tuple[Set[Tuple[str, str]], Set[str]] check_requirements(self, Iterable[str] reqs)
None __exit__(self, Optional[Type[BaseException]] exc_type, Optional[BaseException] exc_val, Optional[TracebackType] exc_tb)
None _install_requirements(str pip_runnable, "PackageFinder" finder, Iterable[str] requirements, _Prefix prefix, *str kind)
None install_requirements(self, "PackageFinder" finder, Iterable[str] requirements, str prefix_as_string, *str kind)
None __exit__(self, Optional[Type[BaseException]] exc_type, Optional[BaseException] exc_val, Optional[TracebackType] exc_tb)
None install_requirements(self, "PackageFinder" finder, Iterable[str] requirements, str prefix_as_string, *str kind)
None __init__(self, str path)
Union[Tuple[str], Tuple[str, str]] _dedup(str a, str b)
Set[str] _get_system_sitepackages()