Changeset View
Changeset View
Standalone View
Standalone View
swh/indexer/metadata_dictionary.py
Show First 20 Lines • Show All 252 Lines • ▼ Show 20 Lines | |||||
class MavenMapping(DictMapping, SingleFileMapping): | class MavenMapping(DictMapping, SingleFileMapping): | ||||
""" | """ | ||||
dedicated class for Maven (pom.xml) mapping and translation | dedicated class for Maven (pom.xml) mapping and translation | ||||
""" | """ | ||||
filename = b'pom.xml' | filename = b'pom.xml' | ||||
mapping = CROSSWALK_TABLE['Java (Maven)'] | mapping = CROSSWALK_TABLE['Java (Maven)'] | ||||
def translate(self, content): | def translate(self, content): | ||||
d = xmltodict.parse(content)['project'] | d = xmltodict.parse(content).get('project') | ||||
metadata = self.translate_dict(d, normalize=False) | metadata = self.translate_dict(d, normalize=False) | ||||
metadata[SCHEMA_URI+'codeRepository'] = self.parse_repositories(d) | metadata[SCHEMA_URI+'codeRepository'] = self.parse_repositories(d) | ||||
metadata[SCHEMA_URI+'license'] = self.parse_licenses(d) | metadata[SCHEMA_URI+'license'] = self.parse_licenses(d) | ||||
return self.normalize_translation(metadata) | return self.normalize_translation(metadata) | ||||
_default_repository = {'url': 'https://repo.maven.apache.org/maven2/'} | _default_repository = {'url': 'https://repo.maven.apache.org/maven2/'} | ||||
def parse_repositories(self, d): | def parse_repositories(self, d): | ||||
"""https://maven.apache.org/pom.html#Repositories""" | """https://maven.apache.org/pom.html#Repositories""" | ||||
if 'repositories' not in d: | if 'repositories' not in d: | ||||
return [self.parse_repository(d, self._default_repository)] | results = [self.parse_repository(d, self._default_repository)] | ||||
else: | else: | ||||
repositories = d['repositories'].get('repository', []) | repositories = d.get('repositories', {}).get('repository', []) | ||||
if not isinstance(repositories, list): | if not isinstance(repositories, list): | ||||
repositories = [repositories] | repositories = [repositories] | ||||
results = [] | results = [self.parse_repository(d, repo) | ||||
for repo in repositories: | for repo in repositories] | ||||
res = self.parse_repository(d, repo) | return [res for res in results if res] or None | ||||
if res: | |||||
results.append(res) | |||||
return results | |||||
def parse_repository(self, d, repo): | def parse_repository(self, d, repo): | ||||
if repo.get('layout', 'default') != 'default': | if repo.get('layout', 'default') != 'default': | ||||
return # TODO ? | return # TODO ? | ||||
url = repo.get('url') | url = repo.get('url') | ||||
group_id = d.get('groupId') | group_id = d.get('groupId') | ||||
artifact_id = d.get('artifactId') | artifact_id = d.get('artifactId') | ||||
if isinstance(url, str): | if (isinstance(url, str) and isinstance(group_id, str) | ||||
if isinstance(group_id, str): | and isinstance(artifact_id, str)): | ||||
url = os.path.join(url, *group_id.split('.')) | repo = os.path.join(url, *group_id.split('.'), artifact_id) | ||||
if isinstance(artifact_id, str): | return {"@id": repo} | ||||
url = os.path.join(url, artifact_id) | |||||
return {"@id": url} | |||||
def normalize_groupId(self, id_): | def normalize_groupId(self, id_): | ||||
return {"@id": id_} | return {"@id": id_} | ||||
def parse_licenses(self, d): | def parse_licenses(self, d): | ||||
"""https://maven.apache.org/pom.html#Licenses | """https://maven.apache.org/pom.html#Licenses | ||||
The origin XML has the form: | The origin XML has the form: | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | def parse_licenses(self, d): | ||||
{'@id': 'https://opensource.org/licenses/MIT'}] | {'@id': 'https://opensource.org/licenses/MIT'}] | ||||
""" | """ | ||||
licenses = d.get('licenses', {}).get('license', []) | licenses = d.get('licenses', {}).get('license', []) | ||||
if isinstance(licenses, dict): | if isinstance(licenses, dict): | ||||
licenses = [licenses] | licenses = [licenses] | ||||
return [{"@id": license['url']} | return [{"@id": license['url']} | ||||
for license in licenses | for license in licenses | ||||
if 'url' in license] | if 'url' in license] or None | ||||
_normalize_pkginfo_key = str.lower | _normalize_pkginfo_key = str.lower | ||||
@register_mapping | @register_mapping | ||||
class PythonPkginfoMapping(DictMapping, SingleFileMapping): | class PythonPkginfoMapping(DictMapping, SingleFileMapping): | ||||
"""Dedicated class for Python's PKG-INFO mapping and translation. | """Dedicated class for Python's PKG-INFO mapping and translation. | ||||
▲ Show 20 Lines • Show All 57 Lines • Show Last 20 Lines |