def _from_distribution( cls, dist ): # type: (Union[pkginfo.BDist, pkginfo.SDist, pkginfo.Wheel]) -> PackageInfo """ Helper method to parse package information from a `pkginfo.Distribution` instance. :param dist: The distribution instance to parse information from. """ requirements = None if dist.requires_dist: requirements = list(dist.requires_dist) else: requires = Path(dist.filename) / "requires.txt" if requires.exists(): with requires.open(encoding="utf-8") as f: requirements = parse_requires(f.read()) info = cls( name=dist.name, version=dist.version, summary=dist.summary, platform=dist.supported_platforms, requires_dist=requirements, requires_python=dist.requires_python, ) info._source_type = "file" info._source_url = Path(dist.filename).resolve().as_posix() return info
def test_parse_requires() -> None: requires = """\ jsonschema>=2.6.0.0,<3.0.0.0 lockfile>=0.12.0.0,<0.13.0.0 pip-tools>=1.11.0.0,<2.0.0.0 pkginfo>=1.4.0.0,<2.0.0.0 pyrsistent>=0.14.2.0,<0.15.0.0 toml>=0.9.0.0,<0.10.0.0 cleo>=0.6.0.0,<0.7.0.0 cachy>=0.1.1.0,<0.2.0.0 cachecontrol>=0.12.4.0,<0.13.0.0 requests>=2.18.0.0,<3.0.0.0 msgpack-python>=0.5.0.0,<0.6.0.0 pyparsing>=2.2.0.0,<3.0.0.0 requests-toolbelt>=0.8.0.0,<0.9.0.0 [:(python_version >= "2.7.0.0" and python_version < "2.8.0.0") or (python_version >= "3.4.0.0" and python_version < "3.5.0.0")] typing>=3.6.0.0,<4.0.0.0 [:python_version >= "2.7.0.0" and python_version < "2.8.0.0"] virtualenv>=15.2.0.0,<16.0.0.0 pathlib2>=2.3.0.0,<3.0.0.0 [:python_version >= "3.4.0.0" and python_version < "3.6.0.0"] zipfile36>=0.1.0.0,<0.2.0.0 [dev] isort@ git+git://github.com/timothycrosley/isort.git@e63ae06ec7d70b06df9e528357650281a3d3ec22#egg=isort """ result = parse_requires(requires) expected = [ "jsonschema>=2.6.0.0,<3.0.0.0", "lockfile>=0.12.0.0,<0.13.0.0", "pip-tools>=1.11.0.0,<2.0.0.0", "pkginfo>=1.4.0.0,<2.0.0.0", "pyrsistent>=0.14.2.0,<0.15.0.0", "toml>=0.9.0.0,<0.10.0.0", "cleo>=0.6.0.0,<0.7.0.0", "cachy>=0.1.1.0,<0.2.0.0", "cachecontrol>=0.12.4.0,<0.13.0.0", "requests>=2.18.0.0,<3.0.0.0", "msgpack-python>=0.5.0.0,<0.6.0.0", "pyparsing>=2.2.0.0,<3.0.0.0", "requests-toolbelt>=0.8.0.0,<0.9.0.0", 'typing>=3.6.0.0,<4.0.0.0 ; (python_version >= "2.7.0.0" and python_version <' ' "2.8.0.0") or (python_version >= "3.4.0.0" and python_version < "3.5.0.0")', 'virtualenv>=15.2.0.0,<16.0.0.0 ; python_version >= "2.7.0.0" and' ' python_version < "2.8.0.0"', 'pathlib2>=2.3.0.0,<3.0.0.0 ; python_version >= "2.7.0.0" and python_version <' ' "2.8.0.0"', 'zipfile36>=0.1.0.0,<0.2.0.0 ; python_version >= "3.4.0.0" and python_version <' ' "3.6.0.0"', "isort@" " git+git://github.com/timothycrosley/isort.git@e63ae06ec7d70b06df9e528357650281a3d3ec22#egg=isort" ' ; extra == "dev"', ] assert result == expected
def from_setup_files(cls, path): # type: (Path) -> PackageInfo """ Mechanism to parse package information from a `setup.[py|cfg]` file. This uses the implementation at `poetry.utils.setup_reader.SetupReader` in order to parse the file. This is not reliable for complex setup files and should only attempted as a fallback. :param path: Path to `setup.py` file """ if not cls.has_setup_files(path): raise PackageInfoError( path, "No setup files (setup.py, setup.cfg) was found." ) try: result = SetupReader.read_from_directory(path) except Exception as e: raise PackageInfoError(path, e) python_requires = result["python_requires"] if python_requires is None: python_requires = "*" requires = "" for dep in result["install_requires"]: requires += dep + "\n" if result["extras_require"]: requires += "\n" for extra_name, deps in result["extras_require"].items(): requires += "[{}]\n".format(extra_name) for dep in deps: requires += dep + "\n" requires += "\n" requirements = parse_requires(requires) info = cls( name=result.get("name"), version=result.get("version"), summary=result.get("description", ""), requires_dist=requirements or None, requires_python=python_requires, ) if not (info.name and info.version) and not info.requires_dist: # there is nothing useful here raise PackageInfoError( path, "No core metadata (name, version, requires-dist) could be retrieved.", ) return info