def make_install_requirement(name, version, extras, markers, constraint=False): """make_install_requirement Generates an :class:`~pip._internal.req.req_install.InstallRequirement`. Create an InstallRequirement from the supplied metadata. :param name: The requirement's name. :type name: str :param version: The requirement version (must be pinned). :type version: str. :param extras: The desired extras. :type extras: list[str] :param markers: The desired markers, without a preceding semicolon. :type markers: str :param constraint: Whether to flag the requirement as a constraint, defaults to False. :param constraint: bool, optional :return: A generated InstallRequirement :rtype: :class:`~pip._internal.req.req_install.InstallRequirement` """ # If no extras are specified, the extras string is blank extras_string = "" if extras: # Sort extras for stability extras_string = "[{}]".format(",".join(sorted(extras))) if not markers: return InstallRequirement.from_line(str('{}{}=={}'.format( name, extras_string, version)), constraint=constraint) else: return InstallRequirement.from_line(str('{}{}=={}; {}'.format( name, extras_string, version, str(markers))), constraint=constraint)
def as_ireq(self): ireq_line = self.as_line(include_hashes=False) if self.editable or self.req.editable: if ireq_line.startswith("-e "): ireq_line = ireq_line[len("-e "):] ireq = InstallRequirement.from_editable(ireq_line) else: ireq = InstallRequirement.from_line(ireq_line) if not getattr(ireq, "req", None): ireq.req = self.req.req else: ireq.req.extras = self.req.req.extras ireq.req.marker = self.req.req.marker return ireq
def get_name(self): loc = self.path or self.uri if loc: self._uri_scheme = "path" if self.path else "uri" name = None if self.link and self.link.egg_fragment: return self.link.egg_fragment elif self.link and self.link.is_wheel: return Wheel(self.link.filename).name if (self._uri_scheme != "uri" and self.path and self.setup_path and self.setup_path.exists()): from setuptools.dist import distutils old_curdir = os.path.abspath(os.getcwd()) try: os.chdir(str(self.setup_path.parent)) dist = distutils.core.run_setup(self.setup_path.as_posix()) name = dist.get_name() except (FileNotFoundError, IOError) as e: dist = None except Exception as e: from pip_shims.shims import InstallRequirement, make_abstract_dist try: if not isinstance(Path, self.path): _path = Path(self.path) else: _path = self.path if self.editable: _ireq = InstallRequirement.from_editable( _path.as_uri()) else: _ireq = InstallRequirement.from_line(_path.as_posix()) dist = make_abstract_dist(_ireq).get_dist() name = dist.project_name except (TypeError, ValueError, AttributeError) as e: dist = None finally: os.chdir(old_curdir) hashed_loc = hashlib.sha256(loc.encode("utf-8")).hexdigest() hashed_name = hashed_loc[-7:] if not name or name == "UNKNOWN": self._has_hashed_name = True name = hashed_name if self.link and not self._has_hashed_name: self.link = Link("{0}#egg={1}".format(self.link.url, name)) return name
def populate_link(finder: PackageFinder, ireq: InstallRequirement, upgrade: bool = False): """Populate ireq's link attribute""" if ireq.link: return link = finder.find_requirement(ireq, upgrade) if not link: return link = getattr(link, "link", link) ireq.link = link
def build(self, ireq: shims.InstallRequirement, hashes: Optional[Dict[str, str]] = None) -> str: """Build egg_info directory for editable candidates and a wheel for others. :param ireq: the InstallRequirment of the candidate. :param hashes: a dictionary of filename: hash_value to check against downloaded artifacts. :returns: The full path of the built artifact. """ from pip._internal.utils.temp_dir import global_tempdir_manager from pdm.builders import EditableBuilder from pdm.builders import WheelBuilder kwargs = self._make_building_args(ireq) with self.get_finder() as finder: with allow_all_wheels(): # temporarily allow all wheels to get a link. ireq.populate_link(finder, False, bool(hashes)) if not ireq.editable and not ireq.req.name: ireq.source_dir = kwargs["build_dir"] else: ireq.ensure_has_source_dir(kwargs["build_dir"]) download_dir = kwargs["download_dir"] only_download = False if ireq.link.is_wheel: download_dir = kwargs["wheel_download_dir"] only_download = True if hashes: ireq.options["hashes"] = convert_hashes(hashes) if not (ireq.editable and ireq.req.is_local_dir): with global_tempdir_manager(): downloaded = shims.shim_unpack( link=ireq.link, download_dir=download_dir, location=ireq.source_dir, hashes=ireq.hashes(False), only_download=only_download, session=finder.session, ) # Preserve the downloaded file so that it won't be cleared. if downloaded and only_download: try: shutil.copy(downloaded, download_dir) except shutil.SameFileError: pass # Now all source is prepared, build it. if ireq.link.is_wheel: return (context.cache("wheels") / ireq.link.filename).as_posix() builder_class = EditableBuilder if ireq.editable else WheelBuilder kwargs["finder"] = finder with builder_class(ireq) as builder: return builder.build(**kwargs)
def build( self, ireq: shims.InstallRequirement, hashes: Optional[Dict[str, str]] = None, allow_all: bool = True, ) -> str: """Build egg_info directory for editable candidates and a wheel for others. :param ireq: the InstallRequirment of the candidate. :param hashes: a dictionary of filename: hash_value to check against downloaded artifacts. :param allow_all: Allow building incompatible wheels. :returns: The full path of the built artifact. """ from pdm.builders import EditableBuilder, WheelBuilder kwargs = self._make_building_args(ireq) with self.get_finder() as finder: if allow_all: with allow_all_wheels(): # temporarily allow all wheels to get a link. populate_link(finder, ireq, False) else: populate_link(finder, ireq, False) if not ireq.editable and not ireq.req.name: ireq.source_dir = kwargs["build_dir"] else: ireq.ensure_has_source_dir(kwargs["build_dir"]) download_dir = kwargs["download_dir"] only_download = False if ireq.link.is_wheel: download_dir = kwargs["wheel_download_dir"] only_download = True if hashes: ireq.hash_options = convert_hashes(hashes) if not (ireq.editable and ireq.req.is_local_dir): downloader = shims.Downloader(finder.session, "off") downloaded = shims.unpack_url( ireq.link, ireq.source_dir, downloader, download_dir, ireq.hashes(False), ) # Preserve the downloaded file so that it won't be cleared. if downloaded and only_download: try: shutil.copy(downloaded.path, download_dir) except shutil.SameFileError: pass # Now all source is prepared, build it. if ireq.link.is_wheel: return (self.project.cache("wheels") / ireq.link.filename).as_posix() self.ensure_essential_packages() if ireq.editable: builder_class = EditableBuilder else: builder_class = WheelBuilder kwargs["finder"] = finder with builder_class(ireq) as builder, self.activate(True): return builder.build(**kwargs)