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):
def
write_document_to_file( document: spdx_tools.spdx.model.document.Document, file_name: str, validate: bool = True, drop_duplicates: bool = True):
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)