Changeset View
Changeset View
Standalone View
Standalone View
swh/loader/package/npm.py
Show First 20 Lines • Show All 67 Lines • ▼ Show 20 Lines | def get_package_info(self, version: str) -> Generator[ | ||||
'filename': os.path.basename(url), | 'filename': os.path.basename(url), | ||||
'raw': meta, | 'raw': meta, | ||||
} | } | ||||
yield release_name(version), p_info | yield release_name(version), p_info | ||||
def resolve_revision_from( | def resolve_revision_from( | ||||
self, known_artifacts: Dict, artifact_metadata: Dict) \ | self, known_artifacts: Dict, artifact_metadata: Dict) \ | ||||
-> Optional[bytes]: | -> Optional[bytes]: | ||||
shasum = artifact_metadata['dist']['shasum'] | return artifact_to_revision_id(known_artifacts, artifact_metadata) | ||||
for rev_id, known_artifact in known_artifacts.items(): | |||||
original_artifact = known_artifact['original_artifact'][0] | |||||
if shasum == original_artifact['checksums']['sha1']: | |||||
return rev_id | |||||
return None | |||||
def build_revision( | def build_revision( | ||||
self, a_metadata: Dict, uncompressed_path: str) -> Dict: | self, a_metadata: Dict, uncompressed_path: str) -> Dict: | ||||
i_metadata = extract_intrinsic_metadata(uncompressed_path) | i_metadata = extract_intrinsic_metadata(uncompressed_path) | ||||
# from intrinsic metadata | # from intrinsic metadata | ||||
author = extract_npm_package_author(i_metadata) | author = extract_npm_package_author(i_metadata) | ||||
message = i_metadata['version'].encode('ascii') | message = i_metadata['version'].encode('ascii') | ||||
Show All 24 Lines | def build_revision( | ||||
'provider': self.provider_url, | 'provider': self.provider_url, | ||||
'when': self.visit_date.isoformat(), | 'when': self.visit_date.isoformat(), | ||||
'raw': a_metadata, | 'raw': a_metadata, | ||||
}, | }, | ||||
}, | }, | ||||
} | } | ||||
def artifact_to_revision_id( | |||||
known_artifacts: Dict, artifact_metadata: Dict) -> Optional[bytes]: | |||||
"""Given metadata artifact, solves the associated revision id. | |||||
The following code allows to deal with 2 metadata formats: | |||||
- old format sample: | |||||
{ | |||||
'package_source': { | |||||
'sha1': '05181c12cd8c22035dd31155656826b85745da37', | |||||
} | |||||
} | |||||
- new format sample: | |||||
{ | |||||
'original_artifact': [{ | |||||
'checksums': { | |||||
'sha256': "6975816f2c5ad4046acc676ba112f2fff945b01522d63948531f11f11e0892ec", # noqa | |||||
... | |||||
}, | |||||
}], | |||||
... | |||||
} | |||||
""" | |||||
shasum = artifact_metadata['dist']['shasum'] | |||||
for rev_id, known_artifact in known_artifacts.items(): | |||||
known_original_artifact = known_artifact.get('original_artifact') | |||||
if not known_original_artifact: | |||||
# previous loader-npm version kept original artifact elsewhere | |||||
known_original_artifact = known_artifact.get('package_source') | |||||
if not known_original_artifact: | |||||
continue | |||||
original_hash = known_original_artifact['sha1'] | |||||
else: | |||||
assert isinstance(known_original_artifact, list) | |||||
original_hash = known_original_artifact[0]['checksums']['sha1'] | |||||
if shasum == original_hash: | |||||
return rev_id | |||||
return None | |||||
def parse_npm_package_author(author_str): | def parse_npm_package_author(author_str): | ||||
""" | """ | ||||
Parse npm package author string. | Parse npm package author string. | ||||
It works with a flexible range of formats, as detailed below:: | It works with a flexible range of formats, as detailed below:: | ||||
name | name | ||||
name <email> (url) | name <email> (url) | ||||
▲ Show 20 Lines • Show All 172 Lines • Show Last 20 Lines |