Changeset View
Changeset View
Standalone View
Standalone View
swh/loader/package/pypi/loader.py
Show First 20 Lines • Show All 115 Lines • ▼ Show 20 Lines | def get_package_info(self, version: str) -> Iterator[Tuple[str, PyPIPackageInfo]]: | ||||
if len(res) == 1: | if len(res) == 1: | ||||
version, p_info = res[0] | version, p_info = res[0] | ||||
yield release_name(version), p_info | yield release_name(version), p_info | ||||
else: | else: | ||||
for version, p_info in res: | for version, p_info in res: | ||||
yield release_name(version, p_info.filename), p_info | yield release_name(version, p_info.filename), p_info | ||||
@staticmethod | |||||
def known_artifact_to_extid(known_artifact: Dict) -> Optional[PartialExtID]: | |||||
extid_str = _artifact_to_sha256(known_artifact) | |||||
if extid_str is None: | |||||
return None | |||||
try: | |||||
return (EXTID_TYPE, hash_to_bytes(extid_str)) if extid_str else None | |||||
except ValueError: | |||||
return None | |||||
def build_revision( | def build_revision( | ||||
self, p_info: PyPIPackageInfo, uncompressed_path: str, directory: Sha1Git | self, p_info: PyPIPackageInfo, uncompressed_path: str, directory: Sha1Git | ||||
) -> Optional[Revision]: | ) -> Optional[Revision]: | ||||
i_metadata = extract_intrinsic_metadata(uncompressed_path) | i_metadata = extract_intrinsic_metadata(uncompressed_path) | ||||
if not i_metadata: | if not i_metadata: | ||||
return None | return None | ||||
# from intrinsic metadata | # from intrinsic metadata | ||||
Show All 10 Lines | ) -> Optional[Revision]: | ||||
message=message.encode("utf-8"), | message=message.encode("utf-8"), | ||||
author=_author, | author=_author, | ||||
date=date, | date=date, | ||||
committer=_author, | committer=_author, | ||||
committer_date=date, | committer_date=date, | ||||
parents=(), | parents=(), | ||||
directory=directory, | directory=directory, | ||||
synthetic=True, | synthetic=True, | ||||
metadata={ | |||||
"intrinsic": {"tool": "PKG-INFO", "raw": i_metadata,}, | |||||
"extrinsic": { | |||||
"provider": self.provider_url, | |||||
"when": self.visit_date.isoformat(), | |||||
"raw": p_info.raw_info, | |||||
}, | |||||
}, | |||||
) | |||||
def _artifact_to_sha256(known_artifact: Dict) -> Optional[str]: | |||||
"""Returns the sha256 from a PyPI 'original_artifact' dict | |||||
The following code allows to deal with 2 metadata formats (column metadata | |||||
in 'revision') | |||||
- old format sample:: | |||||
{ | |||||
'original_artifact': { | |||||
'sha256': '6975816f2c5ad4046acc676ba112f2fff945b01522d63948531f11f11e0892ec', # noqa | |||||
... | |||||
}, | |||||
... | |||||
} | |||||
- new format sample:: | |||||
{ | |||||
'original_artifact': [{ | |||||
'checksums': { | |||||
'sha256': '6975816f2c5ad4046acc676ba112f2fff945b01522d63948531f11f11e0892ec', # noqa | |||||
... | |||||
}, | |||||
}], | |||||
... | |||||
} | |||||
""" | |||||
original_artifact = known_artifact["original_artifact"] | |||||
if isinstance(original_artifact, dict): | |||||
# previous loader-pypi version stored metadata as dict | |||||
return original_artifact["sha256"] | |||||
# new pypi loader actually store metadata dict differently... | |||||
assert isinstance(original_artifact, list) | |||||
# current loader-pypi stores metadata as list of dict | |||||
if len(known_artifact["original_artifact"]) == 0: | |||||
return None | |||||
elif len(known_artifact["original_artifact"]) == 1: | |||||
return original_artifact[0]["checksums"]["sha256"] | |||||
else: | |||||
raise ValueError( | |||||
f"Expected exactly one PyPI original_artifact, got " | |||||
f"{len(known_artifact['original_artifact'])}" | |||||
) | ) | ||||
def pypi_api_url(url: str) -> str: | def pypi_api_url(url: str) -> str: | ||||
"""Compute api url from a project url | """Compute api url from a project url | ||||
Args: | Args: | ||||
url (str): PyPI instance's url (e.g: https://pypi.org/project/requests) | url (str): PyPI instance's url (e.g: https://pypi.org/project/requests) | ||||
▲ Show 20 Lines • Show All 79 Lines • Show Last 20 Lines |