spdx_tools.spdx.writer.rdf.snippet_writer

 1# SPDX-FileCopyrightText: 2023 spdx contributors
 2#
 3# SPDX-License-Identifier: Apache-2.0
 4from beartype.typing import Dict, Optional, Tuple
 5from rdflib import RDF, RDFS, BNode, Graph, Literal, URIRef
 6
 7from spdx_tools.spdx.model import Snippet
 8from spdx_tools.spdx.rdfschema.namespace import POINTER_NAMESPACE, SPDX_NAMESPACE
 9from spdx_tools.spdx.writer.rdf.license_expression_writer import add_license_expression_or_none_or_no_assertion
10from spdx_tools.spdx.writer.rdf.writer_utils import add_namespace_to_spdx_id, add_optional_literal
11
12
13def add_snippet_to_graph(
14    snippet: Snippet, graph: Graph, doc_namespace: str, external_doc_ref_to_namespace: Dict[str, str]
15):
16    snippet_resource = URIRef(add_namespace_to_spdx_id(snippet.spdx_id, doc_namespace, external_doc_ref_to_namespace))
17    graph.add((snippet_resource, RDF.type, SPDX_NAMESPACE.Snippet))
18
19    snippet_from_file_ref = URIRef(
20        add_namespace_to_spdx_id(snippet.file_spdx_id, doc_namespace, external_doc_ref_to_namespace)
21    )
22    graph.add((snippet_resource, SPDX_NAMESPACE.snippetFromFile, snippet_from_file_ref))
23    add_range_to_graph(
24        snippet.byte_range, graph, snippet_resource, snippet_from_file_ref, POINTER_NAMESPACE.ByteOffsetPointer
25    )
26    add_range_to_graph(
27        snippet.line_range, graph, snippet_resource, snippet_from_file_ref, POINTER_NAMESPACE.LineCharPointer
28    )
29    add_license_expression_or_none_or_no_assertion(
30        snippet.license_concluded, graph, snippet_resource, SPDX_NAMESPACE.licenseConcluded, doc_namespace
31    )
32    add_license_expression_or_none_or_no_assertion(
33        snippet.license_info_in_snippet, graph, snippet_resource, SPDX_NAMESPACE.licenseInfoInSnippet, doc_namespace
34    )
35    add_optional_literal(snippet.license_comment, graph, snippet_resource, SPDX_NAMESPACE.licenseComments)
36    add_optional_literal(snippet.copyright_text, graph, snippet_resource, SPDX_NAMESPACE.copyrightText)
37    add_optional_literal(snippet.comment, graph, snippet_resource, RDFS.comment)
38    add_optional_literal(snippet.name, graph, snippet_resource, SPDX_NAMESPACE.name)
39    for attribution_text in snippet.attribution_texts:
40        graph.add((snippet_resource, SPDX_NAMESPACE.attributionText, Literal(attribution_text)))
41
42
43def add_range_to_graph(
44    range_information: Optional[Tuple[int, int]],
45    graph: Graph,
46    snippet_node: URIRef,
47    snippet_from_file_ref: URIRef,
48    pointer_class: URIRef,
49):
50    start_end_pointer = BNode()
51    graph.add((start_end_pointer, RDF.type, POINTER_NAMESPACE.StartEndPointer))
52    for predicate, value in [
53        (POINTER_NAMESPACE.startPointer, range_information[0]),
54        (POINTER_NAMESPACE.endPointer, range_information[1]),
55    ]:
56        pointer_node = BNode()
57        graph.add((pointer_node, RDF.type, pointer_class))
58        graph.add((start_end_pointer, predicate, pointer_node))
59        graph.add((pointer_node, POINTER_NAMESPACE.reference, snippet_from_file_ref))
60        if pointer_class == POINTER_NAMESPACE.ByteOffsetPointer:
61            graph.add((pointer_node, POINTER_NAMESPACE.offset, Literal(value)))
62        else:
63            graph.add((pointer_node, POINTER_NAMESPACE.lineNumber, Literal(value)))
64
65    graph.add((snippet_node, SPDX_NAMESPACE.range, start_end_pointer))
def add_snippet_to_graph( snippet: spdx_tools.spdx.model.snippet.Snippet, graph: rdflib.graph.Graph, doc_namespace: str, external_doc_ref_to_namespace: dict[str, str]):
14def add_snippet_to_graph(
15    snippet: Snippet, graph: Graph, doc_namespace: str, external_doc_ref_to_namespace: Dict[str, str]
16):
17    snippet_resource = URIRef(add_namespace_to_spdx_id(snippet.spdx_id, doc_namespace, external_doc_ref_to_namespace))
18    graph.add((snippet_resource, RDF.type, SPDX_NAMESPACE.Snippet))
19
20    snippet_from_file_ref = URIRef(
21        add_namespace_to_spdx_id(snippet.file_spdx_id, doc_namespace, external_doc_ref_to_namespace)
22    )
23    graph.add((snippet_resource, SPDX_NAMESPACE.snippetFromFile, snippet_from_file_ref))
24    add_range_to_graph(
25        snippet.byte_range, graph, snippet_resource, snippet_from_file_ref, POINTER_NAMESPACE.ByteOffsetPointer
26    )
27    add_range_to_graph(
28        snippet.line_range, graph, snippet_resource, snippet_from_file_ref, POINTER_NAMESPACE.LineCharPointer
29    )
30    add_license_expression_or_none_or_no_assertion(
31        snippet.license_concluded, graph, snippet_resource, SPDX_NAMESPACE.licenseConcluded, doc_namespace
32    )
33    add_license_expression_or_none_or_no_assertion(
34        snippet.license_info_in_snippet, graph, snippet_resource, SPDX_NAMESPACE.licenseInfoInSnippet, doc_namespace
35    )
36    add_optional_literal(snippet.license_comment, graph, snippet_resource, SPDX_NAMESPACE.licenseComments)
37    add_optional_literal(snippet.copyright_text, graph, snippet_resource, SPDX_NAMESPACE.copyrightText)
38    add_optional_literal(snippet.comment, graph, snippet_resource, RDFS.comment)
39    add_optional_literal(snippet.name, graph, snippet_resource, SPDX_NAMESPACE.name)
40    for attribution_text in snippet.attribution_texts:
41        graph.add((snippet_resource, SPDX_NAMESPACE.attributionText, Literal(attribution_text)))
def add_range_to_graph( range_information: Optional[tuple[int, int]], graph: rdflib.graph.Graph, snippet_node: rdflib.term.URIRef, snippet_from_file_ref: rdflib.term.URIRef, pointer_class: rdflib.term.URIRef):
44def add_range_to_graph(
45    range_information: Optional[Tuple[int, int]],
46    graph: Graph,
47    snippet_node: URIRef,
48    snippet_from_file_ref: URIRef,
49    pointer_class: URIRef,
50):
51    start_end_pointer = BNode()
52    graph.add((start_end_pointer, RDF.type, POINTER_NAMESPACE.StartEndPointer))
53    for predicate, value in [
54        (POINTER_NAMESPACE.startPointer, range_information[0]),
55        (POINTER_NAMESPACE.endPointer, range_information[1]),
56    ]:
57        pointer_node = BNode()
58        graph.add((pointer_node, RDF.type, pointer_class))
59        graph.add((start_end_pointer, predicate, pointer_node))
60        graph.add((pointer_node, POINTER_NAMESPACE.reference, snippet_from_file_ref))
61        if pointer_class == POINTER_NAMESPACE.ByteOffsetPointer:
62            graph.add((pointer_node, POINTER_NAMESPACE.offset, Literal(value)))
63        else:
64            graph.add((pointer_node, POINTER_NAMESPACE.lineNumber, Literal(value)))
65
66    graph.add((snippet_node, SPDX_NAMESPACE.range, start_end_pointer))