Skip to content

Commit 08e9c03

Browse files
fholgerarmintaenzertng
authored andcommitted
Extract common validation, deduplication and conversion code for the writers
Signed-off-by: Holger Frydrych <holger.frydrych@tngtech.com>
1 parent 14a0707 commit 08e9c03

File tree

6 files changed

+44
-61
lines changed

6 files changed

+44
-61
lines changed

src/spdx_tools/spdx/writer/json/json_writer.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
# SPDX-License-Identifier: Apache-2.0
44
import json
55

6-
from beartype.typing import List, IO
6+
from beartype.typing import IO
77

8-
from spdx_tools.spdx.document_utils import create_document_without_duplicates
98
from spdx_tools.spdx.jsonschema.document_converter import DocumentConverter
109
from spdx_tools.spdx.model import Document
11-
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
12-
from spdx_tools.spdx.validation.validation_message import ValidationMessage
10+
from spdx_tools.spdx.writer.write_utils import convert, validate_and_deduplicate
1311

1412

1513
def write_document_to_stream(
@@ -24,15 +22,8 @@ def write_document_to_stream(
2422
to False, validates the document before serialization. Unless a DocumentConverter instance is provided,
2523
a new one is created.
2624
"""
27-
if validate:
28-
validation_messages: List[ValidationMessage] = validate_full_spdx_document(document)
29-
if validation_messages:
30-
raise ValueError(f"Document is not valid. The following errors were detected: {validation_messages}")
31-
if drop_duplicates:
32-
document = create_document_without_duplicates(document)
33-
if converter is None:
34-
converter = DocumentConverter()
35-
document_dict = converter.convert(document)
25+
document = validate_and_deduplicate(document, validate, drop_duplicates)
26+
document_dict = convert(document, converter)
3627
json.dump(document_dict, stream, indent=4)
3728

3829

src/spdx_tools/spdx/writer/rdf/rdf_writer.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,24 @@
11
# SPDX-FileCopyrightText: 2023 spdx contributors
22
#
33
# SPDX-License-Identifier: Apache-2.0
4-
from beartype.typing import Dict, List, IO
4+
from beartype.typing import IO, Dict
55
from rdflib import DOAP, Graph
66
from rdflib.compare import to_isomorphic
77

8-
from spdx_tools.spdx.document_utils import create_document_without_duplicates
98
from spdx_tools.spdx.model import Document
109
from spdx_tools.spdx.rdfschema.namespace import POINTER_NAMESPACE, SPDX_NAMESPACE
11-
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
12-
from spdx_tools.spdx.validation.validation_message import ValidationMessage
1310
from spdx_tools.spdx.writer.rdf.annotation_writer import add_annotation_to_graph
1411
from spdx_tools.spdx.writer.rdf.creation_info_writer import add_creation_info_to_graph
1512
from spdx_tools.spdx.writer.rdf.extracted_licensing_info_writer import add_extracted_licensing_info_to_graph
1613
from spdx_tools.spdx.writer.rdf.file_writer import add_file_to_graph
1714
from spdx_tools.spdx.writer.rdf.package_writer import add_package_to_graph
1815
from spdx_tools.spdx.writer.rdf.relationship_writer import add_relationship_to_graph
1916
from spdx_tools.spdx.writer.rdf.snippet_writer import add_snippet_to_graph
17+
from spdx_tools.spdx.writer.write_utils import validate_and_deduplicate
2018

2119

2220
def write_document_to_stream(document: Document, stream: IO[bytes], validate: bool, drop_duplicates: bool = True):
23-
if validate:
24-
validation_messages: List[ValidationMessage] = validate_full_spdx_document(document)
25-
if validation_messages:
26-
raise ValueError(f"Document is not valid. The following errors were detected: {validation_messages}")
27-
if drop_duplicates:
28-
document = create_document_without_duplicates(document)
21+
document = validate_and_deduplicate(document, validate, drop_duplicates)
2922
graph = Graph()
3023
doc_namespace = document.creation_info.document_namespace
3124
external_doc_ref_to_namespace: Dict[str, str] = {

src/spdx_tools/spdx/writer/tagvalue/tagvalue_writer.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@
88
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
99
# See the License for the specific language governing permissions and
1010
# limitations under the License.
11-
from beartype.typing import List, TextIO
11+
from beartype.typing import TextIO
1212

13-
from spdx_tools.spdx.document_utils import create_document_without_duplicates
1413
from spdx_tools.spdx.model import Document, Relationship, RelationshipType
15-
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
16-
from spdx_tools.spdx.validation.validation_message import ValidationMessage
1714
from spdx_tools.spdx.writer.tagvalue.annotation_writer import write_annotation
1815
from spdx_tools.spdx.writer.tagvalue.creation_info_writer import write_creation_info
1916
from spdx_tools.spdx.writer.tagvalue.extracted_licensing_info_writer import write_extracted_licensing_info
@@ -28,16 +25,11 @@
2825
write_optional_heading,
2926
write_separator,
3027
)
28+
from spdx_tools.spdx.writer.write_utils import validate_and_deduplicate
3129

3230

3331
def write_document_to_stream(document: Document, stream: TextIO, validate: bool = True, drop_duplicates: bool = True):
34-
if validate:
35-
validation_messages: List[ValidationMessage] = validate_full_spdx_document(document)
36-
if validation_messages:
37-
raise ValueError(f"Document is not valid. The following errors were detected: {validation_messages}")
38-
if drop_duplicates:
39-
document = create_document_without_duplicates(document)
40-
32+
document = validate_and_deduplicate(document, validate, drop_duplicates)
4133
write_document(document, stream)
4234

4335

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# SPDX-FileCopyrightText: 2023 spdx contributors
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
from beartype.typing import List
5+
6+
from spdx_tools.spdx.document_utils import create_document_without_duplicates
7+
from spdx_tools.spdx.jsonschema.document_converter import DocumentConverter
8+
from spdx_tools.spdx.model import Document
9+
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
10+
from spdx_tools.spdx.validation.validation_message import ValidationMessage
11+
12+
13+
def validate_and_deduplicate(document: Document, validate: bool = True, drop_duplicates: bool = True) -> Document:
14+
if validate:
15+
validation_messages: List[ValidationMessage] = validate_full_spdx_document(document)
16+
if validation_messages:
17+
raise ValueError(f"Document is not valid. The following errors were detected: {validation_messages}")
18+
if drop_duplicates:
19+
document = create_document_without_duplicates(document)
20+
return document
21+
22+
23+
def convert(document: Document, converter: DocumentConverter) -> dict:
24+
if converter is None:
25+
converter = DocumentConverter()
26+
return converter.convert(document)

src/spdx_tools/spdx/writer/xml/xml_writer.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22
#
33
# SPDX-License-Identifier: Apache-2.0
44
import xmltodict
5-
from beartype.typing import List, IO
5+
from beartype.typing import IO
66

7-
from spdx_tools.spdx.document_utils import create_document_without_duplicates
87
from spdx_tools.spdx.jsonschema.document_converter import DocumentConverter
98
from spdx_tools.spdx.model import Document
10-
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
11-
from spdx_tools.spdx.validation.validation_message import ValidationMessage
9+
from spdx_tools.spdx.writer.write_utils import convert, validate_and_deduplicate
1210

1311

1412
def write_document_to_stream(
@@ -23,16 +21,8 @@ def write_document_to_stream(
2321
to False, validates the document before serialization. Unless a DocumentConverter instance is provided,
2422
a new one is created.
2523
"""
26-
if validate:
27-
validation_messages: List[ValidationMessage] = validate_full_spdx_document(document)
28-
if validation_messages:
29-
raise ValueError(f"Document is not valid. The following errors were detected: {validation_messages}")
30-
if drop_duplicates:
31-
document = create_document_without_duplicates(document)
32-
33-
if converter is None:
34-
converter = DocumentConverter()
35-
document_dict = {"Document": converter.convert(document)}
24+
document = validate_and_deduplicate(document, validate, drop_duplicates)
25+
document_dict = {"Document": convert(document, converter)}
3626
xmltodict.unparse(document_dict, stream, encoding="utf-8", pretty=True)
3727

3828

src/spdx_tools/spdx/writer/yaml/yaml_writer.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22
#
33
# SPDX-License-Identifier: Apache-2.0
44
import yaml
5-
from beartype.typing import List, IO
5+
from beartype.typing import IO
66

7-
from spdx_tools.spdx.document_utils import create_document_without_duplicates
87
from spdx_tools.spdx.jsonschema.document_converter import DocumentConverter
98
from spdx_tools.spdx.model import Document
10-
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
11-
from spdx_tools.spdx.validation.validation_message import ValidationMessage
9+
from spdx_tools.spdx.writer.write_utils import convert, validate_and_deduplicate
1210

1311

1412
def write_document_to_stream(
@@ -23,15 +21,8 @@ def write_document_to_stream(
2321
to False, validates the document before serialization. Unless a DocumentConverter instance is provided,
2422
a new one is created.
2523
"""
26-
if validate:
27-
validation_messages: List[ValidationMessage] = validate_full_spdx_document(document)
28-
if validation_messages:
29-
raise ValueError(f"Document is not valid. The following errors were detected: {validation_messages}")
30-
if drop_duplicates:
31-
document = create_document_without_duplicates(document)
32-
if converter is None:
33-
converter = DocumentConverter()
34-
document_dict = converter.convert(document)
24+
document = validate_and_deduplicate(document, validate, drop_duplicates)
25+
document_dict = convert(document, converter)
3526
yaml.safe_dump(document_dict, stream, indent=2)
3627

3728

0 commit comments

Comments
 (0)