diff --git a/src/spdx_tools/spdx3/writer/json_ld/json_ld_writer.py b/src/spdx_tools/spdx3/writer/json_ld/json_ld_writer.py index 69a4d763c..3c3e0819a 100644 --- a/src/spdx_tools/spdx3/writer/json_ld/json_ld_writer.py +++ b/src/spdx_tools/spdx3/writer/json_ld/json_ld_writer.py @@ -2,20 +2,24 @@ # # SPDX-License-Identifier: Apache-2.0 import json -import os +from importlib import resources from spdx_tools.spdx3.payload import Payload -from spdx_tools.spdx3.writer.json_ld.json_ld_converter import convert_payload_to_json_ld_list_of_elements +from spdx_tools.spdx3.writer.json_ld.json_ld_converter import ( + convert_payload_to_json_ld_list_of_elements, +) def write_payload(payload: Payload, file_name: str): element_list = convert_payload_to_json_ld_list_of_elements(payload) # this will be obsolete as soon as the context is publicly available under some URI - with open(os.path.join(os.path.dirname(__file__), "context.json"), "r") as infile: + # Note: 3.0.1 context is now available at + # https://spdx.org/rdf/3.0.1/spdx-context.jsonld + with resources.files("spdx_tools.spdx3.writer.json_ld").joinpath("context.json").open("r") as infile: context = json.load(infile) complete_dict = {"@context": context, "@graph": element_list} - with open(file_name + ".jsonld", "w") as out: + with open(file_name + ".jsonld", "w", encoding="utf-8") as out: json.dump(complete_dict, out, indent=2) diff --git a/src/spdx_tools/spdx3/writer/json_ld/owl_to_context.py b/src/spdx_tools/spdx3/writer/json_ld/owl_to_context.py index f6bc7c35a..cdeb3144e 100644 --- a/src/spdx_tools/spdx3/writer/json_ld/owl_to_context.py +++ b/src/spdx_tools/spdx3/writer/json_ld/owl_to_context.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 import json -import os.path +from importlib import resources # current workflow: markdown files + spec_parser -> model.ttl -> convert to json_ld: SPDX_OWL.json -> # use the function below to generate context.json @@ -108,8 +108,11 @@ def convert_spdx_owl_to_jsonld_context(spdx_owl: str = "SPDX_OWL.json"): else: print(f"unknown node_type: {node_type}") - with open(os.path.join(os.path.dirname(__file__), "context.json"), "w") as infile: - json.dump(context_dict, infile) + with resources.as_file( + resources.files("spdx_tools.spdx3.writer.json_ld").joinpath("context.json") + ) as context_path: + with open(context_path, "w", encoding="utf-8") as outfile: + json.dump(context_dict, outfile) if __name__ == "__main__": diff --git a/tests/spdx/test_cli.py b/tests/spdx/test_cli.py index 0019cf3a3..52ea85cf5 100644 --- a/tests/spdx/test_cli.py +++ b/tests/spdx/test_cli.py @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: 2023 spdx contributors # # SPDX-License-Identifier: Apache-2.0 -import os +from importlib import resources import pytest from click.testing import CliRunner @@ -12,16 +12,16 @@ @pytest.mark.parametrize( "options", [ - ("--infile", os.path.join(os.path.dirname(__file__), "data/SPDXJSONExample-v2.3.spdx.json")), - ("-i", os.path.join(os.path.dirname(__file__), "data/SPDXJSONExample-v2.3.spdx.json"), "--novalidation"), + ("--infile", str(resources.files("tests.spdx.data").joinpath("SPDXJSONExample-v2.3.spdx.json"))), + ("-i", str(resources.files("tests.spdx.data").joinpath("SPDXJSONExample-v2.3.spdx.json")), "--novalidation"), ( "-i", - os.path.join(os.path.dirname(__file__), "data/SPDXJSONExample-v2.3.spdx.json"), + str(resources.files("tests.spdx.data").joinpath("SPDXJSONExample-v2.3.spdx.json")), "--novalidation", "--version", "SPDX-2.3", ), - ("-i", os.path.join(os.path.dirname(__file__), "data/SPDXJSONExample-v2.3.spdx.json"), "-o", "-"), + ("-i", str(resources.files("tests.spdx.data").joinpath("SPDXJSONExample-v2.3.spdx.json")), "-o", "-"), ], ) def test_cli_with_system_exit_code_0(options): @@ -37,9 +37,10 @@ def test_cli_with_system_exit_code_0(options): [ ( "-i", - os.path.join( - os.path.dirname(__file__), - "data/invalid/spdx-trivy-vmware_log-intelligence-fluentd-sha256_086af034f561f343f633be9d9f9e95f65ae6c61b8ddb2c6755ef5bb25b40f53a.json", # noqa: E501 + str( + resources.files("tests.spdx.data.invalid").joinpath( + "spdx-trivy-vmware_log-intelligence-fluentd-sha256_086af034f561f343f633be9d9f9e95f65ae6c61b8ddb2c6755ef5bb25b40f53a.json" + ) ), ), ("-i", "non_existent_file.spdx"), @@ -57,8 +58,8 @@ def test_cli_with_system_exit_code_1(options): "options", [ (), - ("-i", os.path.join(os.path.dirname(__file__), "data/SPDXJSONExample-v2.3.spdx.json"), "--version"), - ("-i", os.path.join(os.path.dirname(__file__), "data/SPDXJSONExample-v2.3.spdx.json"), "-o"), + ("-i", str(resources.files("tests.spdx.data").joinpath("SPDXJSONExample-v2.3.spdx.json")), "--version"), + ("-i", str(resources.files("tests.spdx.data").joinpath("SPDXJSONExample-v2.3.spdx.json")), "-o"), ], ) def test_cli_with_system_exit_code_2(options): diff --git a/tests/spdx3/writer/json_ld/test_json_ld_writer.py b/tests/spdx3/writer/json_ld/test_json_ld_writer.py index f46469b1f..4718f3e6e 100644 --- a/tests/spdx3/writer/json_ld/test_json_ld_writer.py +++ b/tests/spdx3/writer/json_ld/test_json_ld_writer.py @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: 2023 spdx contributors # # SPDX-License-Identifier: Apache-2.0 -import os +from importlib import resources from spdx_tools.spdx3.bump_from_spdx2.spdx_document import bump_spdx_document from spdx_tools.spdx3.payload import Payload @@ -15,4 +15,5 @@ def test_json_writer(): payload: Payload = bump_spdx_document(spdx2_document) # this currently generates an actual file to look at, this should be changed to a temp file later - write_payload(payload, os.path.join(os.path.dirname(__file__), "../../../SPDX3_jsonld_test")) + with resources.as_file(resources.files("tests.spdx3.writer.json_ld").joinpath("SPDX3_jsonld_test")) as output_file: + write_payload(payload, str(output_file))