def get_credentials_for_url( self, url ): # type: (str) -> Tuple[Optional[str], Optional[str]] parsed_url = urlparse.urlsplit(url) netloc = parsed_url.netloc credentials = self._credentials.get(netloc, (None, None)) if credentials == (None, None): if "@" not in netloc: credentials = self._get_credentials_for_netloc_from_config(netloc) else: # Split from the right because that's how urllib.parse.urlsplit() # behaves if more than one @ is present (which can be checked using # the password attribute of urlsplit()'s return value). auth, netloc = netloc.rsplit("@", 1) if ":" in auth: # Split from the left because that's how urllib.parse.urlsplit() # behaves if more than one : is present (which again can be checked # using the password attribute of the return value) credentials = auth.split(":", 1) else: credentials = auth, None credentials = tuple( None if x is None else urlparse.unquote(x) for x in credentials ) if credentials[0] is not None or credentials[1] is not None: credentials = (credentials[0] or "", credentials[1] or "") self._credentials[netloc] = credentials return credentials[0], credentials[1]
def _get_credentials_for_netloc_from_config( self, netloc ): # type: (str) -> Tuple[Optional[str], Optional[str]] credentials = (None, None) for repository_name in self._config.get("repositories", []): repository_config = self._config.get( "repositories.{}".format(repository_name) ) if not repository_config: continue url = repository_config.get("url") if not url: continue parsed_url = urlparse.urlsplit(url) if netloc == parsed_url.netloc: auth = self._password_manager.get_http_auth(repository_name) if auth is None: continue return auth["username"], auth["password"] return credentials
def _export_requirements_txt( self, cwd, output, with_hashes=True, dev=False, extras=None, with_credentials=False, ): # type: (Path, Union[IO, str], bool, bool, Optional[Union[bool, Sequence[str]]], bool) -> None indexes = set() content = "" dependency_lines = set() for dependency_package in self._poetry.locker.get_project_dependency_packages( project_requires=self._poetry.package.all_requires, dev=dev, extras=extras ): line = "" dependency = dependency_package.dependency package = dependency_package.package if package.develop: line += "-e " requirement = dependency.to_pep_508(with_extras=False) is_direct_local_reference = ( dependency.is_file() or dependency.is_directory() ) is_direct_remote_reference = dependency.is_vcs() or dependency.is_url() if is_direct_remote_reference: line = requirement elif is_direct_local_reference: dependency_uri = path_to_url(dependency.source_url) line = "{} @ {}".format(dependency.name, dependency_uri) else: line = "{}=={}".format(package.name, package.version) if not is_direct_remote_reference: if ";" in requirement: markers = requirement.split(";", 1)[1].strip() if markers: line += "; {}".format(markers) if ( not is_direct_remote_reference and not is_direct_local_reference and package.source_url ): indexes.add(package.source_url) if package.files and with_hashes: hashes = [] for f in package.files: h = f["hash"] algorithm = "sha256" if ":" in h: algorithm, h = h.split(":") if algorithm not in self.ALLOWED_HASH_ALGORITHMS: continue hashes.append("{}:{}".format(algorithm, h)) if hashes: line += " \\\n" for i, h in enumerate(hashes): line += " --hash={}{}".format( h, " \\\n" if i < len(hashes) - 1 else "" ) dependency_lines.add(line) content += "\n".join(sorted(dependency_lines)) content += "\n" if indexes: # If we have extra indexes, we add them to the beginning of the output indexes_header = "" for index in sorted(indexes): repositories = [ r for r in self._poetry.pool.repositories if r.url == index.rstrip("/") ] if not repositories: continue repository = repositories[0] if ( self._poetry.pool.has_default() and repository is self._poetry.pool.repositories[0] ): url = ( repository.authenticated_url if with_credentials else repository.url ) indexes_header = "--index-url {}\n".format(url) continue url = ( repository.authenticated_url if with_credentials else repository.url ) parsed_url = urlparse.urlsplit(url) if parsed_url.scheme == "http": indexes_header += "--trusted-host {}\n".format(parsed_url.netloc) indexes_header += "--extra-index-url {}\n".format(url) content = indexes_header + "\n" + content self._output(content, cwd, output)