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'] | # indirection needed because the method becomes a mess | ||||
for rev_id, known_artifact in known_artifacts.items(): | return artifact_to_revision_id(known_artifacts, artifact_metadata) | ||||
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 code is difficult to read because of at least 2 metadata format | |||||
versions. | |||||
old format: | |||||
revision: metadata: package_source: Dict with key 'sha1' | |||||
new format: | |||||
revision: metadata: List[ | |||||
original_artifact: List[Dict[checksums -> sha1]] | |||||
] | |||||
""" | |||||
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 origal artifact in | |||||
# package-source key | |||||
known_original_artifact = known_artifact.get('package_source') | |||||
if not known_original_artifact: | |||||
continue | |||||
original_artifact = known_original_artifact | |||||
original_hash = original_artifact['sha1'] | |||||
else: | |||||
assert isinstance(known_original_artifact, list) | |||||
original_artifact = known_original_artifact[0] | |||||
original_hash = original_artifact['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 |