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):
def
add_literal_or_no_assertion_or_none( value: Any, graph: rdflib.graph.Graph, parent: rdflib.term.Node, predicate: rdflib.term.Node):
def
add_literal_or_no_assertion( value: Any, graph: rdflib.graph.Graph, parent: rdflib.term.Node, predicate: rdflib.term.Node):
def
add_datetime_to_graph( value: Optional[datetime.datetime], graph: rdflib.graph.Graph, parent: rdflib.term.Node, predicate: rdflib.term.Node):
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