From 946704696af895adacc5857c3b19ef63f860e976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Cabe=CC=81?= Date: Fri, 3 Jul 2026 14:25:32 +0200 Subject: [PATCH] Add support for SPDX version 3.1 bindings and update tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: spdx/spdx-python-model#17 Signed-off-by: Benjamin Cabé --- gen/generate-bindings | 2 +- pyproject.toml | 7 +- tests/data/3.1/example.spdx3.json | 238 ++++++++++++++++++++++++++++++ tests/test_load.py | 5 + tests/test_mypy.py | 6 + 5 files changed, 255 insertions(+), 3 deletions(-) create mode 100644 tests/data/3.1/example.spdx3.json diff --git a/gen/generate-bindings b/gen/generate-bindings index c751826..62f1392 100755 --- a/gen/generate-bindings +++ b/gen/generate-bindings @@ -8,7 +8,7 @@ set -e # SPDX versions to generate -SPDX_VERSIONS="3.0.1" +SPDX_VERSIONS="3.0.1 3.1" get_context_url() { echo "https://spdx.org/rdf/$1/spdx-context.jsonld" diff --git a/pyproject.toml b/pyproject.toml index 94b511c..0f44f82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,5 +83,8 @@ addopts = [ ] [tool.pylint.main] -# The generated binding fails style checks. Ignore it. -ignore-paths = ['^src/spdx_python_model/bindings/v3_0_1/.*$'] +# The generated bindings fail style checks. Ignore them. +ignore-paths = [ + '^src/spdx_python_model/bindings/v3_0_1/.*$', + '^src/spdx_python_model/bindings/v3_1/.*$', +] diff --git a/tests/data/3.1/example.spdx3.json b/tests/data/3.1/example.spdx3.json new file mode 100644 index 0000000..0be9d5d --- /dev/null +++ b/tests/data/3.1/example.spdx3.json @@ -0,0 +1,238 @@ +{ + "@context" : "https://spdx.org/rdf/3.1/spdx-context.jsonld", + "@graph" : [ { + "@id" : "_:creationInfo_0", + "type" : "CreationInfo", + "specVersion" : "3.1.0", + "createdBy" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd0" ], + "createdUsing" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/additionalToolSPDXRef-gnrtd2", "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/additionalToolSPDXRef-gnrtd1" ], + "created" : "2021-08-26T01:46:00Z" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd3", + "type" : "Relationship", + "relationshipType" : "describes", + "completeness" : "noAssertion", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/document0", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd5", + "type" : "Relationship", + "relationshipType" : "contains", + "completeness" : "noAssertion", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd6" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd7", + "type" : "Relationship", + "relationshipType" : "hasConcludedLicense", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd8" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd6", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd9", + "type" : "Relationship", + "relationshipType" : "hasDeclaredLicense", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd8" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd6", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd10", + "type" : "Relationship", + "relationshipType" : "contains", + "completeness" : "noAssertion", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd11" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd12", + "type" : "Relationship", + "relationshipType" : "generates", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd11" ], + "completeness" : "noAssertion", + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd13", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd15", + "type" : "Relationship", + "relationshipType" : "hasConcludedLicense", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd8" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd13", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd16", + "type" : "Relationship", + "relationshipType" : "hasDeclaredLicense", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd8" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd13", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd17", + "type" : "Relationship", + "relationshipType" : "generates", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd11" ], + "completeness" : "noAssertion", + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd6", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd18", + "type" : "Relationship", + "relationshipType" : "hasConcludedLicense", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd8" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd11", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd19", + "type" : "Relationship", + "relationshipType" : "hasDeclaredLicense", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd20" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd11", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd21", + "type" : "Relationship", + "relationshipType" : "contains", + "completeness" : "noAssertion", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd13" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd22", + "type" : "Relationship", + "relationshipType" : "hasConcludedLicense", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd8" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd23", + "type" : "Relationship", + "relationshipType" : "hasDeclaredLicense", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd8" ], + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/document0", + "type" : "SpdxDocument", + "dataLicense" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd24", + "rootElement" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4" ], + "name" : "hello", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/additionalToolSPDXRef-gnrtd1", + "type" : "Tool", + "name" : "github.com/spdx/tools-golang/builder", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/additionalToolSPDXRef-gnrtd2", + "type" : "Tool", + "name" : "github.com/spdx/tools-golang/idsearcher", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd8", + "type" : "simplelicensing_LicenseExpression", + "simplelicensing_licenseExpression" : "GPL-3.0-or-later", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd20", + "type" : "simplelicensing_LicenseExpression", + "simplelicensing_licenseExpression" : "NOASSERTION", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd24", + "type" : "simplelicensing_LicenseExpression", + "simplelicensing_licenseExpression" : "CC0-1.0", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd14", + "type" : "LifecycleScopedRelationship", + "relationshipType" : "usesTool", + "scope" : "build", + "to" : [ "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd13" ], + "completeness" : "noAssertion", + "from" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd0", + "type" : "Person", + "externalIdentifier" : [ { + "type" : "ExternalIdentifier", + "identifier" : "steve@swinslow.net", + "externalIdentifierType" : "email" + } ], + "name" : "Steve Winslow", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd6", + "type" : "software_File", + "software_copyrightText" : "Copyright Contributors to the spdx-examples project.", + "verifiedUsing" : [ { + "type" : "Hash", + "algorithm" : "md5", + "hashValue" : "935054fe899ca782e11003bbae5e166c" + }, { + "type" : "Hash", + "algorithm" : "sha1", + "hashValue" : "20862a6d08391d07d09344029533ec644fac6b21" + }, { + "type" : "Hash", + "algorithm" : "sha256", + "hashValue" : "b4e5ca56d1f9110ca94ed0bf4e6d9ac11c2186eb7cd95159c6fdb50e8db5a823" + } ], + "name" : "./src/hello.c", + "software_primaryPurpose" : "source", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd11", + "type" : "software_File", + "software_copyrightText" : "NOASSERTION", + "verifiedUsing" : [ { + "type" : "Hash", + "algorithm" : "sha1", + "hashValue" : "20291a81ef065ff891b537b64d4fdccaf6f5ac02" + }, { + "type" : "Hash", + "algorithm" : "sha256", + "hashValue" : "83a33ff09648bb5fc5272baca88cf2b59fd81ac4cc6817b86998136af368708e" + }, { + "type" : "Hash", + "algorithm" : "md5", + "hashValue" : "08a12c966d776864cc1eb41fd03c3c3d" + } ], + "name" : "./build/hello", + "contentType" : "application/octet-stream", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd13", + "type" : "software_File", + "software_copyrightText" : "NOASSERTION", + "verifiedUsing" : [ { + "type" : "Hash", + "algorithm" : "sha1", + "hashValue" : "69a2e85696fff1865c3f0686d6c3824b59915c80" + }, { + "type" : "Hash", + "algorithm" : "sha256", + "hashValue" : "5da19033ba058e322e21c90e6d6d859c90b1b544e7840859c12cae5da005e79c" + }, { + "type" : "Hash", + "algorithm" : "md5", + "hashValue" : "559424589a4f3f75fd542810473d8bc1" + } ], + "name" : "./src/Makefile", + "software_primaryPurpose" : "source", + "creationInfo" : "_:creationInfo_0" + }, { + "spdxId" : "https://swinslow.net/spdx-examples/example1/hello-v3-specv3/SPDXRef-gnrtd4", + "type" : "software_Package", + "software_copyrightText" : "NOASSERTION", + "software_downloadLocation" : "git+https://github.com/swinslow/spdx-examples.git#example1/content", + "verifiedUsing" : [ { + "type" : "PackageVerificationCode", + "algorithm" : "sha1", + "hashValue" : "9d20237bb72087e87069f96afb41c6ca2fa2a342" + } ], + "name" : "hello", + "creationInfo" : "_:creationInfo_0" + } ] +} \ No newline at end of file diff --git a/tests/test_load.py b/tests/test_load.py index 849ce9a..bfa6445 100644 --- a/tests/test_load.py +++ b/tests/test_load.py @@ -17,6 +17,11 @@ "3.0.1", id="3.0.1", ), + pytest.param( + DATA_DIR / "3.1" / "example.spdx3.json", + "3.1", + id="3.1", + ), ], ) def test_load(datapath, version): diff --git a/tests/test_mypy.py b/tests/test_mypy.py index 685d9fd..5a25660 100644 --- a/tests/test_mypy.py +++ b/tests/test_mypy.py @@ -15,6 +15,12 @@ p: v3_0_1.Person = v3_0_1.Person() q: b.Person = b.Person() + +from spdx_python_model import v3_1 +from spdx_python_model.bindings import v3_1 as b1 + +r: v3_1.Person = v3_1.Person() +s: b1.Person = b1.Person() """