Source code for swh.indexer.metadata_dictionary.dart
# Copyright (C) 2022 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
import os.path
import re
from rdflib import RDF, BNode, Graph, Literal, URIRef
from swh.indexer.codemeta import _DATA_DIR, read_crosstable
from swh.indexer.namespaces import SCHEMA
from .base import SingleFileIntrinsicMapping, YamlMapping
from .utils import add_map
SPDX = URIRef("https://spdx.org/licenses/")
PUB_TABLE_PATH = os.path.join(_DATA_DIR, "pubspec.csv")
with open(PUB_TABLE_PATH) as fd:
(CODEMETA_TERMS, PUB_TABLE) = read_crosstable(fd)
[docs]
def name_to_person(name):
return {
"@type": SCHEMA.Person,
SCHEMA.name: name,
}
[docs]
class PubspecMapping(YamlMapping, SingleFileIntrinsicMapping):
name = "pubspec"
filename = b"pubspec.yaml"
mapping = PUB_TABLE["Pubspec"]
string_fields = [
"repository",
"keywords",
"description",
"name",
"issue_tracker",
"platforms",
"license",
# license will only be used with the SPDX Identifier
]
uri_fields = ["homepage"]
[docs]
def normalize_license(self, s):
if isinstance(s, str):
return SPDX + s
def _translate_author(self, graph, s):
name_email_re = re.compile("(?P<name>.*?)( <(?P<email>.*)>)")
if isinstance(s, str):
author = BNode()
graph.add((author, RDF.type, SCHEMA.Person))
match = name_email_re.search(s)
if match:
name = match.group("name")
email = match.group("email")
graph.add((author, SCHEMA.email, Literal(email)))
else:
name = s
graph.add((author, SCHEMA.name, Literal(name)))
return author
[docs]
def translate_author(self, graph: Graph, root, s) -> None:
add_map(graph, root, SCHEMA.author, self._translate_author, [s])
[docs]
def translate_authors(self, graph: Graph, root, authors) -> None:
if isinstance(authors, list):
add_map(graph, root, SCHEMA.author, self._translate_author, authors)