spdx_tools.spdx.writer.tagvalue.tagvalue_writer

  1# SPDX-License-Identifier: Apache-2.0
  2#  Copyright (c) 2022 spdx contributors
  3#  Licensed under the Apache License, Version 2.0 (the "License");
  4#  you may not use this file except in compliance with the License.
  5#  You may obtain a copy of the License at
  6#    http://www.apache.org/licenses/LICENSE-2.0
  7#  Unless required by applicable law or agreed to in writing, software
  8#  distributed under the License is distributed on an "AS IS" BASIS,
  9#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 10#  See the License for the specific language governing permissions and
 11#  limitations under the License.
 12from beartype.typing import TextIO
 13
 14from spdx_tools.spdx.model import Document, Relationship, RelationshipType
 15from spdx_tools.spdx.writer.tagvalue.annotation_writer import write_annotation
 16from spdx_tools.spdx.writer.tagvalue.creation_info_writer import write_creation_info
 17from spdx_tools.spdx.writer.tagvalue.extracted_licensing_info_writer import write_extracted_licensing_info
 18from spdx_tools.spdx.writer.tagvalue.file_writer import write_file
 19from spdx_tools.spdx.writer.tagvalue.package_writer import write_package
 20from spdx_tools.spdx.writer.tagvalue.relationship_writer import write_relationship
 21from spdx_tools.spdx.writer.tagvalue.snippet_writer import write_snippet
 22from spdx_tools.spdx.writer.tagvalue.tagvalue_writer_helper_functions import (
 23    get_file_ids_with_contained_snippets,
 24    scan_relationships,
 25    write_list_of_elements,
 26    write_optional_heading,
 27    write_separator,
 28)
 29from spdx_tools.spdx.writer.write_utils import validate_and_deduplicate
 30
 31
 32def write_document_to_stream(document: Document, stream: TextIO, validate: bool = True, drop_duplicates: bool = True):
 33    document = validate_and_deduplicate(document, validate, drop_duplicates)
 34    write_document(document, stream)
 35
 36
 37def write_document_to_file(document: Document, file_name: str, validate: bool = True, drop_duplicates: bool = True):
 38    with open(file_name, "w", encoding="utf-8") as out:
 39        write_document_to_stream(document, out, validate, drop_duplicates)
 40
 41
 42def write_document(document: Document, text_output: TextIO):
 43    relationships_to_write, contained_files_by_package_id = scan_relationships(
 44        document.relationships, document.packages, document.files
 45    )
 46    file_ids_with_contained_snippets = get_file_ids_with_contained_snippets(document.snippets, document.files)
 47    packaged_file_ids = [file.spdx_id for files_list in contained_files_by_package_id.values() for file in files_list]
 48    filed_snippet_ids = [
 49        snippet.spdx_id for snippets_list in file_ids_with_contained_snippets.values() for snippet in snippets_list
 50    ]
 51
 52    text_output.write("## Document Information\n")
 53    write_creation_info(document.creation_info, text_output)
 54    write_separator(text_output)
 55
 56    for snippet in document.snippets:
 57        if snippet.spdx_id not in filed_snippet_ids:
 58            write_snippet(snippet, text_output)
 59            write_separator(text_output)
 60
 61    for file in document.files:
 62        if file.spdx_id not in packaged_file_ids:
 63            write_file(file, text_output)
 64            write_separator(text_output)
 65            if file.spdx_id in file_ids_with_contained_snippets:
 66                write_list_of_elements(
 67                    file_ids_with_contained_snippets[file.spdx_id], write_snippet, text_output, with_separator=True
 68                )
 69
 70    already_written_file_ids = []  # a file can belong to multiple packages but must appear only once
 71    for package in document.packages:
 72        write_package(package, text_output)
 73        write_separator(text_output)
 74        if package.spdx_id in contained_files_by_package_id:
 75            for file in contained_files_by_package_id[package.spdx_id]:
 76                if file.spdx_id in already_written_file_ids:
 77                    relationships_to_write.append(
 78                        Relationship(package.spdx_id, RelationshipType.CONTAINS, file.spdx_id)
 79                    )
 80                else:
 81                    write_file(file, text_output)
 82                    write_separator(text_output)
 83                    if file.spdx_id in file_ids_with_contained_snippets:
 84                        write_list_of_elements(
 85                            file_ids_with_contained_snippets[file.spdx_id],
 86                            write_snippet,
 87                            text_output,
 88                            with_separator=True,
 89                        )
 90                    already_written_file_ids.append(file.spdx_id)
 91
 92    write_optional_heading(document.extracted_licensing_info, "## License Information\n", text_output)
 93    write_list_of_elements(
 94        document.extracted_licensing_info, write_extracted_licensing_info, text_output, with_separator=True
 95    )
 96
 97    write_optional_heading(relationships_to_write, "## Relationships\n", text_output)
 98    write_list_of_elements(relationships_to_write, write_relationship, text_output)
 99    write_separator(text_output)
100
101    write_optional_heading(document.annotations, "## Annotations\n", text_output)
102    write_list_of_elements(document.annotations, write_annotation, text_output, with_separator=True)
def write_document_to_stream( document: spdx_tools.spdx.model.document.Document, stream: <class 'TextIO'>, validate: bool = True, drop_duplicates: bool = True):
33def write_document_to_stream(document: Document, stream: TextIO, validate: bool = True, drop_duplicates: bool = True):
34    document = validate_and_deduplicate(document, validate, drop_duplicates)
35    write_document(document, stream)
def write_document_to_file( document: spdx_tools.spdx.model.document.Document, file_name: str, validate: bool = True, drop_duplicates: bool = True):
38def write_document_to_file(document: Document, file_name: str, validate: bool = True, drop_duplicates: bool = True):
39    with open(file_name, "w", encoding="utf-8") as out:
40        write_document_to_stream(document, out, validate, drop_duplicates)
def write_document( document: spdx_tools.spdx.model.document.Document, text_output: <class 'TextIO'>):
 43def write_document(document: Document, text_output: TextIO):
 44    relationships_to_write, contained_files_by_package_id = scan_relationships(
 45        document.relationships, document.packages, document.files
 46    )
 47    file_ids_with_contained_snippets = get_file_ids_with_contained_snippets(document.snippets, document.files)
 48    packaged_file_ids = [file.spdx_id for files_list in contained_files_by_package_id.values() for file in files_list]
 49    filed_snippet_ids = [
 50        snippet.spdx_id for snippets_list in file_ids_with_contained_snippets.values() for snippet in snippets_list
 51    ]
 52
 53    text_output.write("## Document Information\n")
 54    write_creation_info(document.creation_info, text_output)
 55    write_separator(text_output)
 56
 57    for snippet in document.snippets:
 58        if snippet.spdx_id not in filed_snippet_ids:
 59            write_snippet(snippet, text_output)
 60            write_separator(text_output)
 61
 62    for file in document.files:
 63        if file.spdx_id not in packaged_file_ids:
 64            write_file(file, text_output)
 65            write_separator(text_output)
 66            if file.spdx_id in file_ids_with_contained_snippets:
 67                write_list_of_elements(
 68                    file_ids_with_contained_snippets[file.spdx_id], write_snippet, text_output, with_separator=True
 69                )
 70
 71    already_written_file_ids = []  # a file can belong to multiple packages but must appear only once
 72    for package in document.packages:
 73        write_package(package, text_output)
 74        write_separator(text_output)
 75        if package.spdx_id in contained_files_by_package_id:
 76            for file in contained_files_by_package_id[package.spdx_id]:
 77                if file.spdx_id in already_written_file_ids:
 78                    relationships_to_write.append(
 79                        Relationship(package.spdx_id, RelationshipType.CONTAINS, file.spdx_id)
 80                    )
 81                else:
 82                    write_file(file, text_output)
 83                    write_separator(text_output)
 84                    if file.spdx_id in file_ids_with_contained_snippets:
 85                        write_list_of_elements(
 86                            file_ids_with_contained_snippets[file.spdx_id],
 87                            write_snippet,
 88                            text_output,
 89                            with_separator=True,
 90                        )
 91                    already_written_file_ids.append(file.spdx_id)
 92
 93    write_optional_heading(document.extracted_licensing_info, "## License Information\n", text_output)
 94    write_list_of_elements(
 95        document.extracted_licensing_info, write_extracted_licensing_info, text_output, with_separator=True
 96    )
 97
 98    write_optional_heading(relationships_to_write, "## Relationships\n", text_output)
 99    write_list_of_elements(relationships_to_write, write_relationship, text_output)
100    write_separator(text_output)
101
102    write_optional_heading(document.annotations, "## Annotations\n", text_output)
103    write_list_of_elements(document.annotations, write_annotation, text_output, with_separator=True)