def __init__(self, name, path=None, file_name=None, parent=None): self.name = name self.file = file_name self.path = path self.code = None self.parent = parent self.global_names = set() self.exclude_names = set() self.ignore_names = set() self.source_is_zip_file = False self.in_import = True self.store_in_file_system = True # distribution files (metadata) dist_files = [] packages = [name] try: requires = importlib_metadata.requires(packages[0]) except importlib_metadata.PackageNotFoundError: requires = None if requires is not None: packages += [req.partition(" ")[0] for req in requires] for package_name in packages: try: files = importlib_metadata.files(package_name) except importlib_metadata.PackageNotFoundError: files = None if files is not None: # cache file names to use in write modules for file in files: if not file.match("*.dist-info/*"): continue dist_path = str(file.locate()) arc_path = file.as_posix() dist_files.append((dist_path, arc_path)) self.dist_files = dist_files
def __init__( self, name: str, path: Optional[str] = None, file_name: Optional[str] = None, parent: Optional["Module"] = None, *, rootcachedir: TemporaryDirectory, ): self.name: str = name self.path: Optional[str] = path self.file: Optional[str] = file_name self.parent: Optional["Module"] = parent self.rootcachedir = rootcachedir self.code: Optional[CodeType] = None self.dist_files: List[str] = [] self.exclude_names: Set[str] = set() self.global_names: Set[str] = set() self.ignore_names: Set[str] = set() self.in_import: bool = True self.source_is_zip_file: bool = False self._in_file_system: bool = True # dist-info files (metadata) self._cache_dist_info(name) try: requires = importlib_metadata.requires(name) except importlib_metadata.PackageNotFoundError: requires = None if requires is not None: for req in requires: req_name = req.partition(" ")[0] self._cache_dist_info(req_name)
def _get_importlib_metadata_requires(package_name): # type: (str) -> None """Retrieve requires based on the given package.""" import sys import importlib_metadata import json print(json.dumps(importlib_metadata.requires(package_name))) sys.exit(0)
def test_requires(self): deps = importlib_metadata.requires('importlib_metadata') parsed = list(map(packaging.requirements.Requirement, deps)) assert all(parsed) assert any( dep.name == 'pathlib2' and dep.marker for dep in parsed )
def _get_importlib_metadata_requires(package_name): # type: (str) -> None """Retrieve requires based on the given package.""" import sys try: import importlib_metadata except ImportError: import importlib.metadata as importlib_metadata # type: ignore import json print(json.dumps(importlib_metadata.requires(package_name))) sys.exit(0)
def package_deps(package, deps): pdeps = pkgmd.requires(package) or () for r in pdeps: # skip optional deps if ';' in r: continue for idx, c in enumerate(r): if not c.isalnum() and c not in ('-', '_', '.'): break if idx + 1 == len(r): idx += 1 pkg_name = r[:idx] if pkg_name not in deps: deps.append(pkg_name) package_deps(pkg_name, deps) return deps
def update_distribution(self, name: str) -> None: """Update the distribution cache based on its name. This method may be used to link an distribution's name to a module. Example: ModuleFinder cannot detects the distribution of _cffi_backend but in a hook we can link it to 'cffi'. """ try: distribution = DistributionCache.from_name(name) except importlib_metadata.PackageNotFoundError: distribution = None if distribution is None: return try: requires = importlib_metadata.requires(distribution.name) or [] except importlib_metadata.PackageNotFoundError: requires = [] for req in requires: req_name = req.partition(" ")[0] with suppress(importlib_metadata.PackageNotFoundError): DistributionCache.from_name(req_name) self.distribution = distribution
def test_requires_dist_info(self): deps = requires('distinfo-pkg') assert len(deps) == 2 assert all(deps) assert 'wheel >= 1.0' in deps assert "pytest; extra == 'test'" in deps
def test_requires_egg_info(self): deps = requires('egginfo-pkg') assert len(deps) == 2 assert any(dep == 'wheel >= 1.0; python_version >= "2.7"' for dep in deps)
def test_requires_egg_info_file(self): requirements = requires('egginfo-file') self.assertIsNone(requirements)
def test_requires(self): deps = importlib_metadata.requires('egginfo-pkg') assert any(dep == 'wheel >= 1.0; python_version >= "2.7"' for dep in deps)
def test_requires_dist_info(self): deps = list(importlib_metadata.requires('distinfo-pkg')) assert deps and all(deps)
def test_requires_dist_info(self): # assume 'packaging' is installed as a wheel with dist-info deps = importlib_metadata.requires('packaging') parsed = list(map(packaging.requirements.Requirement, deps)) assert parsed