spdx_tools.spdx.writer.rdf.writer_utils

 1# SPDX-FileCopyrightText: 2023 spdx contributors
 2#
 3# SPDX-License-Identifier: Apache-2.0
 4import logging
 5from datetime import datetime
 6
 7from beartype.typing import Any, Dict, Optional
 8from rdflib import Graph, Literal
 9from rdflib.term import Node
10
11from spdx_tools.spdx.datetime_conversions import datetime_to_iso_string
12from spdx_tools.spdx.model import SpdxNoAssertion, SpdxNone
13from spdx_tools.spdx.rdfschema.namespace import SPDX_NAMESPACE
14from spdx_tools.spdx.validation.spdx_id_validators import is_valid_internal_spdx_id
15
16
17def add_optional_literal(value: Any, graph: Graph, parent: Node, predicate: Node):
18    if value is None:
19        return
20    if isinstance(value, list):
21        for element in value:
22            graph.add((parent, predicate, Literal(str(element))))
23        return
24    graph.add((parent, predicate, Literal(str(value))))
25
26
27def add_literal_or_no_assertion_or_none(value: Any, graph: Graph, parent: Node, predicate: Node):
28    if value is None:
29        return
30    if isinstance(value, SpdxNone):
31        graph.add((parent, predicate, SPDX_NAMESPACE.none))
32        return
33    add_literal_or_no_assertion(value, graph, parent, predicate)
34
35
36def add_literal_or_no_assertion(value: Any, graph: Graph, parent: Node, predicate: Node):
37    if value is None:
38        return
39    if isinstance(value, SpdxNoAssertion):
40        graph.add((parent, predicate, SPDX_NAMESPACE.noassertion))
41        return
42    add_optional_literal(value, graph, parent, predicate)
43
44
45def add_datetime_to_graph(value: Optional[datetime], graph: Graph, parent: Node, predicate: Node):
46    if value:
47        graph.add((parent, predicate, Literal(datetime_to_iso_string(value))))
48
49
50def add_namespace_to_spdx_id(spdx_id: str, doc_namespace: str, external_doc_namespaces: Dict[str, str]) -> str:
51    if ":" in spdx_id:
52        external_doc_ref_id = spdx_id.split(":")[0]
53        if external_doc_ref_id not in external_doc_namespaces.keys():
54            logging.warning(f"No namespace for external document reference with id {external_doc_ref_id} provided.")
55            return spdx_id
56        return f"{external_doc_namespaces[external_doc_ref_id]}#{spdx_id.split(':')[1]}"
57
58    if is_valid_internal_spdx_id(spdx_id):
59        return f"{doc_namespace}#{spdx_id}"
60
61    return spdx_id
def add_optional_literal( value: Any, graph: rdflib.graph.Graph, parent: rdflib.term.Node, predicate: rdflib.term.Node):
18def add_optional_literal(value: Any, graph: Graph, parent: Node, predicate: Node):
19    if value is None:
20        return
21    if isinstance(value, list):
22        for element in value:
23            graph.add((parent, predicate, Literal(str(element))))
24        return
25    graph.add((parent, predicate, Literal(str(value))))
def add_literal_or_no_assertion_or_none( value: Any, graph: rdflib.graph.Graph, parent: rdflib.term.Node, predicate: rdflib.term.Node):
28def add_literal_or_no_assertion_or_none(value: Any, graph: Graph, parent: Node, predicate: Node):
29    if value is None:
30        return
31    if isinstance(value, SpdxNone):
32        graph.add((parent, predicate, SPDX_NAMESPACE.none))
33        return
34    add_literal_or_no_assertion(value, graph, parent, predicate)
def add_literal_or_no_assertion( value: Any, graph: rdflib.graph.Graph, parent: rdflib.term.Node, predicate: rdflib.term.Node):
37def add_literal_or_no_assertion(value: Any, graph: Graph, parent: Node, predicate: Node):
38    if value is None:
39        return
40    if isinstance(value, SpdxNoAssertion):
41        graph.add((parent, predicate, SPDX_NAMESPACE.noassertion))
42        return
43    add_optional_literal(value, graph, parent, predicate)
def add_datetime_to_graph( value: Optional[datetime.datetime], graph: rdflib.graph.Graph, parent: rdflib.term.Node, predicate: rdflib.term.Node):
46def add_datetime_to_graph(value: Optional[datetime], graph: Graph, parent: Node, predicate: Node):
47    if value:
48        graph.add((parent, predicate, Literal(datetime_to_iso_string(value))))
def add_namespace_to_spdx_id( spdx_id: str, doc_namespace: str, external_doc_namespaces: dict[str, str]) -> str:
51def add_namespace_to_spdx_id(spdx_id: str, doc_namespace: str, external_doc_namespaces: Dict[str, str]) -> str:
52    if ":" in spdx_id:
53        external_doc_ref_id = spdx_id.split(":")[0]
54        if external_doc_ref_id not in external_doc_namespaces.keys():
55            logging.warning(f"No namespace for external document reference with id {external_doc_ref_id} provided.")
56            return spdx_id
57        return f"{external_doc_namespaces[external_doc_ref_id]}#{spdx_id.split(':')[1]}"
58
59    if is_valid_internal_spdx_id(spdx_id):
60        return f"{doc_namespace}#{spdx_id}"
61
62    return spdx_id