def pip_install( path: Union["Path", Link], environment: "Env", editable: bool = False, deps: bool = False, upgrade: bool = False, ) -> Union[int, str]: path = url_to_path(path.url) if isinstance(path, Link) else path is_wheel = path.suffix == ".whl" # We disable version check here as we are already pinning to version available in # either the virtual environment or the virtualenv package embedded wheel. Version # checks are a wasteful network call that adds a lot of wait time when installing a # lot of packages. args = [ "install", "--disable-pip-version-check", "--prefix", str(environment.path) ] if not is_wheel: args.insert(1, "--use-pep517") if upgrade: args.append("--upgrade") if not deps: args.append("--no-deps") if editable: if not path.is_dir(): raise PoetryException( "Cannot install non directory dependencies in editable mode") args.append("-e") args.append(str(path)) try: return environment.run_pip(*args) except EnvCommandError as e: if sys.version_info < (3, 7) and not is_wheel: # Under certain Python3.6 installs vendored pip wheel does not contain # zip-safe pep517 lib. In this cases we create an isolated ephemeral virtual # environment. with ephemeral_environment(executable=environment.python, with_pip=True, with_setuptools=True) as env: return environment.run( *env.get_pip_command(), *args, env={ **os.environ, "PYTHONPATH": str(env.purelib) }, ) raise PoetryException(f"Failed to install {path.as_posix()}") from e
def pip_install( path: Union[Path, str], environment: Env, editable: bool = False, deps: bool = False, upgrade: bool = False, ) -> Union[int, str]: path = Path(path) if isinstance(path, str) else path args = ["install", "--prefix", str(environment.path)] if upgrade: args.append("--upgrade") if not deps: args.append("--no-deps") if editable: if not path.is_dir(): raise PoetryException( "Cannot install non directory dependencies in editable mode") args.append("-e") args.append(str(path)) if path.is_file() and path.suffix == ".whl": return environment.run_pip(*args) with ephemeral_environment(executable=environment.python, pip=True, setuptools=True) as env: return env.run( "pip", *args, )
def pip_install( path: Union[Path, str], environment: Env, editable: bool = False, deps: bool = False, upgrade: bool = False, ) -> Union[int, str]: path = Path(path) if isinstance(path, str) else path is_wheel = path.suffix == ".whl" args = ["install", "--prefix", str(environment.path)] if not is_wheel: args.insert(1, "--use-pep517") if upgrade: args.append("--upgrade") if not deps: args.append("--no-deps") if editable: if not path.is_dir(): raise PoetryException( "Cannot install non directory dependencies in editable mode") args.append("-e") args.append(str(path)) try: return environment.run_pip(*args) except EnvCommandError as e: if sys.version_info < (3, 7) and not is_wheel: # Under certain Python3.6 installs vendored pip wheel does not contain zip-safe # pep517 lib. In this cases we create an isolated ephemeral virtual environment. with ephemeral_environment(executable=environment.python, pip=True, setuptools=True) as env: return environment.run( env._bin("pip"), *args, env={ **os.environ, "PYTHONPATH": str(env.purelib) }, ) raise PoetryException(f"Failed to install {path.as_posix()}") from e
def request(self, method, url, **kwargs): # type: (str, str, Any) -> requests.Response request = requests.Request(method, url) io = kwargs.get("io") or self._io username, password = self._get_credentials_for_url(url) if username is not None and password is not None: request = requests.auth.HTTPBasicAuth(username, password)(request) session = self.session prepared_request = session.prepare_request(request) proxies = kwargs.get("proxies", {}) stream = kwargs.get("stream") verify = kwargs.get("verify") cert = kwargs.get("cert") settings = session.merge_environment_settings(prepared_request.url, proxies, stream, verify, cert) # Send the request. send_kwargs = { "timeout": kwargs.get("timeout"), "allow_redirects": kwargs.get("allow_redirects", True), } send_kwargs.update(settings) attempt = 0 while True: is_last_attempt = attempt >= 5 try: resp = session.send(prepared_request, **send_kwargs) except (requests.exceptions.ConnectionError, OSError) as e: if is_last_attempt: raise e else: if resp.status_code not in [502, 503, 504] or is_last_attempt: resp.raise_for_status() return resp if not is_last_attempt: attempt += 1 delay = 0.5 * attempt if io is not None: io.write_line( "<debug>Retrying HTTP request in {} seconds.</debug>". format(delay)) time.sleep(delay) continue # this should never really be hit under any sane circumstance raise PoetryException("Failed HTTP {} request", method.upper())
def pip_install( path: Path | Link, environment: Env, editable: bool = False, deps: bool = False, upgrade: bool = False, ) -> int | str: path = url_to_path(path.url) if isinstance(path, Link) else path is_wheel = path.suffix == ".whl" # We disable version check here as we are already pinning to version available in # either the virtual environment or the virtualenv package embedded wheel. Version # checks are a wasteful network call that adds a lot of wait time when installing a # lot of packages. args = [ "install", "--disable-pip-version-check", "--prefix", str(environment.path) ] if not is_wheel: args.insert(1, "--use-pep517") if upgrade: args.append("--upgrade") if not deps: args.append("--no-deps") if editable: if not path.is_dir(): raise PoetryException( "Cannot install non directory dependencies in editable mode") args.append("-e") args.append(str(path)) try: return environment.run_pip(*args) except EnvCommandError as e: raise PoetryException(f"Failed to install {path.as_posix()}") from e
def request(self, method: str, url: str, raise_for_status: bool = True, **kwargs: Any) -> requests.Response: request = requests.Request(method, url) credential = self.get_credentials_for_url(url) if credential.username is not None or credential.password is not None: request = requests.auth.HTTPBasicAuth(credential.username or "", credential.password or "")(request) session = self.get_session(url=url) prepared_request = session.prepare_request(request) proxies = kwargs.get("proxies", {}) stream = kwargs.get("stream") certs = self.get_certs_for_url(url) verify = kwargs.get("verify") or certs.cert or certs.verify cert = kwargs.get("cert") or certs.client_cert if cert is not None: cert = str(cert) verify = str(verify) if isinstance(verify, Path) else verify settings = session.merge_environment_settings( # type: ignore[no-untyped-call] prepared_request.url, proxies, stream, verify, cert) # Send the request. send_kwargs = { "timeout": kwargs.get("timeout", REQUESTS_TIMEOUT), "allow_redirects": kwargs.get("allow_redirects", True), } send_kwargs.update(settings) attempt = 0 while True: is_last_attempt = attempt >= 5 try: resp = session.send(prepared_request, **send_kwargs) except (requests.exceptions.ConnectionError, OSError) as e: if is_last_attempt: raise e else: if resp.status_code not in [502, 503, 504] or is_last_attempt: if raise_for_status: resp.raise_for_status() return resp if not is_last_attempt: attempt += 1 delay = 0.5 * attempt logger.debug(f"Retrying HTTP request in {delay} seconds.") time.sleep(delay) continue # this should never really be hit under any sane circumstance raise PoetryException("Failed HTTP {} request", method.upper())