Changeset View
Changeset View
Standalone View
Standalone View
swh/loader/package/pypi/loader.py
# Copyright (C) 2019-2020 The Software Heritage developers | # Copyright (C) 2019-2020 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import logging | import logging | ||||
import json | import json | ||||
import os | import os | ||||
from typing import Any, Dict, Iterator, Optional, Sequence, Tuple | from typing import Any, Dict, Iterator, Optional, Sequence, Tuple | ||||
from urllib.parse import urlparse | from urllib.parse import urlparse | ||||
import attr | import attr | ||||
from pkginfo import UnpackedSDist | from pkginfo import UnpackedSDist | ||||
from swh.model.model import ( | from swh.model.model import ( | ||||
MetadataAuthority, | |||||
MetadataAuthorityType, | |||||
Person, | Person, | ||||
Sha1Git, | Sha1Git, | ||||
TimestampWithTimezone, | TimestampWithTimezone, | ||||
Revision, | Revision, | ||||
RevisionType, | RevisionType, | ||||
) | ) | ||||
from swh.loader.package.loader import BasePackageInfo, PackageLoader | from swh.loader.package.loader import ( | ||||
BasePackageInfo, | |||||
PackageLoader, | |||||
RawExtrinsicMetadataCore, | |||||
) | |||||
from swh.loader.package.utils import api_info, release_name, EMPTY_AUTHOR | from swh.loader.package.utils import api_info, release_name, EMPTY_AUTHOR | ||||
logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||
@attr.s | @attr.s | ||||
class PyPIPackageInfo(BasePackageInfo): | class PyPIPackageInfo(BasePackageInfo): | ||||
raw_info = attr.ib(type=Dict[str, Any]) | raw_info = attr.ib(type=Dict[str, Any]) | ||||
Show All 27 Lines | def __init__(self, url): | ||||
self.provider_url = pypi_api_url(self.url) | self.provider_url = pypi_api_url(self.url) | ||||
@property | @property | ||||
def info(self) -> Dict: | def info(self) -> Dict: | ||||
"""Return the project metadata information (fetched from pypi registry) | """Return the project metadata information (fetched from pypi registry) | ||||
""" | """ | ||||
if not self._info: | if not self._info: | ||||
self._info = json.loads(api_info(self.provider_url)) | self._raw_info = api_info(self.provider_url) | ||||
self._info = json.loads(self._raw_info) | |||||
return self._info | return self._info | ||||
def get_versions(self) -> Sequence[str]: | def get_versions(self) -> Sequence[str]: | ||||
return self.info["releases"].keys() | return self.info["releases"].keys() | ||||
def get_default_version(self) -> str: | def get_default_version(self) -> str: | ||||
return self.info["info"]["version"] | return self.info["info"]["version"] | ||||
def get_metadata_authority(self): | |||||
p_url = urlparse(self.url) | |||||
return MetadataAuthority( | |||||
type=MetadataAuthorityType.FORGE, | |||||
url=f"{p_url.scheme}://{p_url.netloc}/", | |||||
metadata={}, | |||||
) | |||||
def get_extrinsic_snapshot_metadata(self): | |||||
return [ | |||||
RawExtrinsicMetadataCore( | |||||
format="pypi-project-json", metadata=self._raw_info, | |||||
), | |||||
] | |||||
def get_package_info(self, version: str) -> Iterator[Tuple[str, PyPIPackageInfo]]: | def get_package_info(self, version: str) -> Iterator[Tuple[str, PyPIPackageInfo]]: | ||||
res = [] | res = [] | ||||
for meta in self.info["releases"][version]: | for meta in self.info["releases"][version]: | ||||
if meta["packagetype"] != "sdist": | if meta["packagetype"] != "sdist": | ||||
continue | continue | ||||
p_info = PyPIPackageInfo.from_metadata(meta) | p_info = PyPIPackageInfo.from_metadata(meta) | ||||
res.append((version, p_info)) | res.append((version, p_info)) | ||||
▲ Show 20 Lines • Show All 182 Lines • Show Last 20 Lines |