From ec12d41972fd37cffce110ddcd16afedf211490f Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Wed, 24 Jun 2026 13:35:26 +0100 Subject: [PATCH 1/4] Update using-spdx3.ipynb Signed-off-by: Arthit Suriyawongkul --- tutorial/using-spdx3.ipynb | 1633 ++++++++++++++++++------------------ 1 file changed, 824 insertions(+), 809 deletions(-) diff --git a/tutorial/using-spdx3.ipynb b/tutorial/using-spdx3.ipynb index 84613c5..2abc594 100644 --- a/tutorial/using-spdx3.ipynb +++ b/tutorial/using-spdx3.ipynb @@ -1,26 +1,10 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "authorship_tag": "ABX9TyOys2TFWeUKaj6M6TfFA+yY", - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "markdown", "metadata": { - "id": "view-in-github", - "colab_type": "text" + "colab_type": "text", + "id": "view-in-github" }, "source": [ "\"Open" @@ -28,65 +12,50 @@ }, { "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "fTKOUcN_esq8" + }, + "outputs": [], "source": [ "# SPDX-FileCopyrightText: 2025-present Arthit Suriyawongkul \n", "# SPDX-FileType: SOURCE\n", "# SPDX-License-Identifier: Apache-2.0" - ], - "metadata": { - "id": "fTKOUcN_esq8" - }, - "execution_count": 1, - "outputs": [] + ] }, { "cell_type": "markdown", + "metadata": { + "id": "09M0uv5_Bk7B" + }, "source": [ "# Using SPDX 3 in Python with spdx-python-model\n", "\n", - "- This tutorial demonstrates how to use the [spdx-python-model][] library to:\n", + "- This tutorial demonstrates how to use the [spdx-python-model] library to:\n", " - read the software bill of materials (SBOM) data in the [System Package Data Exchange (SPDX)][spdx] format from an [SPDX 3 JSON][spdx-3-json] file;\n", " - access SPDX objects and their relationships; and\n", " - create a simple SPDX object (also demonstrating the built-in data validation of the library)\n", - "\n", "- The SBOM 3 JSON file examples are taken from [AI Example 2][ai-example-2] and [Software Example 14][sw-example-14] of the spdx-examples repository.\n", - "- This documentation is a contribution to the [NTIA Conformance Checker][ntia-conformance-checker] as part of the [Google Summer of Code 2025 program][gsoc-2025] (mentors: Gary O'Neall and John Speed Meyers).\n", - "\n", - "by [@bact][bact] - Arthit Suriyawongkul\n", - "\n", - "## Change log\n", - "\n", - "- Update: 21 May 2026 - fix handling of unresolved references (spdxId) ([reported](https://github.com/spdx/spdx-python-model/issues/34) by @vargenau and suggested a fix by @benjarobin - thank you both!)\n", - "- Update: 23 February 2026 - add a section on SPDX object creation and validation\n", - "- First published: 7 July 2025\n", "\n", "[spdx]: https://spdx.dev/use/specifications/\n", "[spdx-python-model]: https://github.com/spdx/spdx-python-model\n", "[spdx-3-json]: https://github.com/spdx/spdx-spec/blob/develop/docs/serializations.md#serialization-in-spdx-3-json\n", "[ai-example-2]: https://github.com/spdx/spdx-examples/tree/master/ai/example02/\n", - "[sw-example-14]: https://github.com/spdx/spdx-examples/tree/master/software/example14/\n", - "[ntia-conformance-checker]: https://github.com/spdx/ntia-conformance-checker\n", - "[gsoc-2025]: https://summerofcode.withgoogle.com/programs/2025/projects/CeR3hQTq\n", - "[bact]: https://github.com/bact/" - ], - "metadata": { - "id": "09M0uv5_Bk7B" - } + "[sw-example-14]: https://github.com/spdx/spdx-examples/tree/master/software/example14/" + ] }, { "cell_type": "markdown", - "source": [ - "## Install the spdx-python-model library" - ], "metadata": { "id": "_ZRVMOBvQDuO" - } + }, + "source": [ + "## Install the spdx-python-model library" + ] }, { "cell_type": "code", - "source": [ - "!pip install spdx-python-model" - ], + "execution_count": 39, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -94,38 +63,32 @@ "id": "JsENPjgwHlHc", "outputId": "0c5b73dc-52c8-4bb1-b60b-8a1640df09da" }, - "execution_count": 2, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "Requirement already satisfied: spdx-python-model in /usr/local/lib/python3.12/dist-packages (0.0.5)\n" + "Requirement already satisfied: spdx-python-model in /Users/art/.pyenv/versions/3.10.20/envs/spdx-python-model310/lib/python3.10/site-packages (0.0.6)\n", + "Note: you may need to restart the kernel to use updated packages.\n" ] } + ], + "source": [ + "%pip install spdx-python-model" ] }, { "cell_type": "markdown", - "source": [ - "## Import and check library version" - ], "metadata": { "id": "0rhToD4DQQ0-" - } + }, + "source": [ + "## Import and check library version" + ] }, { "cell_type": "code", - "source": [ - "from spdx_python_model import VERSION, bindings\n", - "\n", - "print(f\"spdx-python-model library version: {VERSION}\")\n", - "\n", - "print(\"Available SPDX bindings in spdx_python_model module:\")\n", - "for name in dir(bindings):\n", - " if not name.startswith(\"__\"):\n", - " print(name)" - ], + "execution_count": 40, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -133,91 +96,100 @@ "id": "977gguFuH1Nt", "outputId": "71a52e69-ff00-4efc-e918-63e0e78fff7d" }, - "execution_count": 3, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "spdx-python-model library version: 0.0.5\n", + "spdx-python-model library version: 0.0.6\n", "Available SPDX bindings in spdx_python_model module:\n", + "_CONTEXT_TABLE\n", + "_DRAFT_VERSIONS\n", "v3_0_1\n" ] } + ], + "source": [ + "from spdx_python_model import __version__, bindings\n", + "\n", + "print(f\"spdx-python-model library version: {__version__}\")\n", + "\n", + "print(\"Available SPDX bindings in spdx_python_model module:\")\n", + "for name in dir(bindings):\n", + " if not name.startswith(\"__\"):\n", + " print(name)" ] }, { "cell_type": "markdown", + "metadata": { + "id": "yuweD-jan0A8" + }, "source": [ "To use a Python binding, import a specific version of the model.\n", "\n", "For example, to import a binding for SPDX model version 3.0.1, import `v3_0_1`." - ], - "metadata": { - "id": "yuweD-jan0A8" - } + ] }, { "cell_type": "code", - "source": [ - "from spdx_python_model import v3_0_1" - ], + "execution_count": 41, "metadata": { "id": "MW10UJY2n7Ot" }, - "execution_count": 4, - "outputs": [] + "outputs": [], + "source": [ + "from spdx_python_model import v3_0_1" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "v7E3Ys6BoBKQ" + }, "source": [ "Or you may like to assign it to a versionless alias,\n", "so you can update the version easily later.\n", "\n", "For example, this will set the import alias as `spdx3`." - ], - "metadata": { - "id": "v7E3Ys6BoBKQ" - } + ] }, { "cell_type": "code", - "source": [ - "from spdx_python_model import v3_0_1 as spdx3" - ], + "execution_count": 42, "metadata": { "id": "bgKEojPtn_yC" }, - "execution_count": 5, - "outputs": [] + "outputs": [], + "source": [ + "from spdx_python_model import v3_0_1 as spdx3" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "PC_h1XmSpIF3" + }, "source": [ "If a new version (e.g., v3_1) is released, you only need to update the import line and can keep the rest of your code intact.\n", "\n", "For example, `from spdx_python_model import v3_1 as spdx3`." - ], - "metadata": { - "id": "PC_h1XmSpIF3" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "9bWRkIYvpkzO" + }, "source": [ "Once imported, we can now access SPDX 3 model.\n", "\n", "Let's print some \"named individuals\" from the model." - ], - "metadata": { - "id": "9bWRkIYvpkzO" - } + ] }, { "cell_type": "code", - "source": [ - "list(spdx3.NAMED_INDIVIDUALS)[:8]" - ], + "execution_count": 43, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -225,47 +197,52 @@ "id": "jh4qYAep0d-L", "outputId": "6334a3f2-9d54-428f-f92f-a89adc8950ca" }, - "execution_count": 6, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ - "['https://spdx.org/rdf/3.0.1/terms/Core/ExternalIdentifierType/email',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Dataset/DatasetAvailabilityType/registration',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/hasDocumentation',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/usesTool',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Dataset/DatasetType/audio',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Software/SbomType/analyzed',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/hasDataFile',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/ExternalIdentifierType/urlScheme']" + "['https://spdx.org/rdf/3.0.1/terms/Core/HashAlgorithm/sha3_512',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Software/ContentIdentifierType/gitoid',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/hasInput',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Security/VexJustificationType/vulnerableCodeCannotBeControlledByAdversary',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/ancestorOf',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/delegatedTo',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/ExternalRefType/issueTracker',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Software/SoftwarePurpose/container']" ] }, + "execution_count": 43, "metadata": {}, - "execution_count": 6 + "output_type": "execute_result" } + ], + "source": [ + "list(spdx3.NAMED_INDIVIDUALS)[:8]" ] }, { "cell_type": "markdown", - "source": [ - "Some of these could be entries in SPDX 3 vocabularies (enum)." - ], "metadata": { "id": "x6C0wvWRqDIP" - } + }, + "source": [ + "Some of these could be entries in SPDX 3 vocabularies (enum)." + ] }, { "cell_type": "markdown", - "source": [ - "## Read SPDX data from SPDX 3 JSON file" - ], "metadata": { "id": "LeTPh0lsQZBw" - } + }, + "source": [ + "## Read SPDX data from SPDX 3 JSON file" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "wak3vYKObfXI" + }, "source": [ "The library offers a built-in JSON-LD deserializer.\n", "To use it, provide the path to your SPDX 3 JSON file and an instance of SHACLObjectSet.\n", @@ -276,13 +253,27 @@ "a generator (iterator) for accessing objects by their type.\n", "\n", "In this example, we will first download the JSON file from the `spdx-examples` repository." - ], - "metadata": { - "id": "wak3vYKObfXI" - } + ] }, { "cell_type": "code", + "execution_count": 44, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JQ9lTkNdIckN", + "outputId": "c5f14a5c-8db2-45d3-b93e-521d704d3823" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ "from urllib.request import urlretrieve\n", "\n", @@ -297,49 +288,29 @@ " spdx3.JSONLDDeserializer().read(f, object_set)\n", "\n", "print(object_set)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "JQ9lTkNdIckN", - "outputId": "c5f14a5c-8db2-45d3-b93e-521d704d3823" - }, - "execution_count": 7, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "\n" - ] - } ] }, { "cell_type": "markdown", - "source": [ - "## Some internal works of SHACLObjectSet" - ], "metadata": { "id": "8llGik8aQdct" - } + }, + "source": [ + "## Some internal works of SHACLObjectSet" + ] }, { "cell_type": "markdown", - "source": [ - "Internally SHACLObjectSet keeps objects in its `objects` set." - ], "metadata": { "id": "jbEuuu53b0Eb" - } + }, + "source": [ + "Internally SHACLObjectSet keeps objects in its `objects` set." + ] }, { "cell_type": "code", - "source": [ - "# see what is inside\n", - "print(list(object_set.objects)[:3])" - ], + "execution_count": 45, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -347,19 +318,25 @@ "id": "y1z84-MK6cnx", "outputId": "cd938a15-85c0-4bc9-f0e9-7e880e769ff7" }, - "execution_count": 8, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "[, , ]\n" + "[, , ]\n" ] } + ], + "source": [ + "# see what is inside\n", + "print(list(object_set.objects)[:3])" ] }, { "cell_type": "markdown", + "metadata": { + "id": "4sqtE2vVcDnx" + }, "source": [ "Internally, for faster lookup, SHACLObjectSet maintains two indexes:\n", "`obj_by_id` and `obj_by_type`.\n", @@ -376,17 +353,11 @@ " 1. A boolean indicating if the SHACLObject in this tuple is an exact type match (True)\n", " or a subclass match (False); and\n", " 2. The SHACLObject instance itself." - ], - "metadata": { - "id": "4sqtE2vVcDnx" - } + ] }, { "cell_type": "code", - "source": [ - "any_license_infos = object_set.obj_by_type[\"simplelicensing_AnyLicenseInfo\"]\n", - "print(any_license_infos)" - ], + "execution_count": 46, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -394,19 +365,25 @@ "id": "xb-edy3n4eRh", "outputId": "c06a9ae7-8f19-4398-e1f8-5862673a04f5" }, - "execution_count": 9, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "{(False, ), (False, ), (False, ), (False, )}\n" + "{(False, ), (False, ), (False, ), (False, )}\n" ] } + ], + "source": [ + "any_license_infos = object_set.obj_by_type[\"simplelicensing_AnyLicenseInfo\"]\n", + "print(any_license_infos)" ] }, { "cell_type": "markdown", + "metadata": { + "id": "S17Cuqt5cgiY" + }, "source": [ "Let's begin with a quick check.\n", "\n", @@ -414,21 +391,11 @@ "and if it is according to the specification.\n", "\n", "See: https://spdx.github.io/spdx-spec/v3.0.1/serializations/#serialization-information" - ], - "metadata": { - "id": "S17Cuqt5cgiY" - } + ] }, { "cell_type": "code", - "source": [ - "spdx_documents = list(object_set.obj_by_type[\"SpdxDocument\"])\n", - "\n", - "if len(spdx_documents) > 1:\n", - " print(\"Warning: A serialization must not contain more than one SpdxDocument.\")\n", - "else:\n", - " print(\"Looks good.\")" - ], + "execution_count": 47, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -436,42 +403,27 @@ "id": "S-Q78uecJ-m9", "outputId": "7b81ac18-6b6c-47d7-de6a-195795da0898" }, - "execution_count": 10, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Looks good.\n" ] } + ], + "source": [ + "spdx_documents = list(object_set.obj_by_type[\"SpdxDocument\"])\n", + "\n", + "if len(spdx_documents) > 1:\n", + " print(\"Warning: A serialization must not contain more than one SpdxDocument.\")\n", + "else:\n", + " print(\"Looks good.\")" ] }, { "cell_type": "code", - "source": [ - "# Get all objects of type \"Relationship\", including its subclasses\n", - "relationships = object_set.obj_by_type[\"Relationship\"]\n", - "print(\"Relationship found:\", len(relationships))\n", - "for o in relationships:\n", - " print(o)\n", - "print()\n", - "\n", - "# Get all objects of type \"LifecycleScopedRelationship\", including its subclasses\n", - "lifecycle_scoped_relationships = object_set.obj_by_type[\"LifecycleScopedRelationship\"]\n", - "print(\"LifecycleScopedRelationship found:\", len(lifecycle_scoped_relationships))\n", - "for o in lifecycle_scoped_relationships:\n", - " print(o)\n", - "print()\n", - "\n", - "# Get all objects of type \"Softare/Package\", including its subclasses\n", - "packages = object_set.obj_by_type[\"software_Package\"]\n", - "print(\"software_Package found:\", len(packages))\n", - "for o in packages:\n", - " print(o)\n", - "\n", - "print()" - ], + "execution_count": 48, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -479,68 +431,93 @@ "id": "1tiaPV-FKmZh", "outputId": "0055c4f4-315c-43ce-a81f-9e6b4a55ee74" }, - "execution_count": 11, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Relationship found: 28\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(False, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(False, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", "\n", "LifecycleScopedRelationship found: 1\n", - "(True, )\n", + "(True, )\n", "\n", "software_Package found: 6\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", "\n" ] } + ], + "source": [ + "# Get all objects of type \"Relationship\", including its subclasses\n", + "relationships = object_set.obj_by_type[\"Relationship\"]\n", + "print(\"Relationship found:\", len(relationships))\n", + "for o in relationships:\n", + " print(o)\n", + "print()\n", + "\n", + "# Get all objects of type \"LifecycleScopedRelationship\", including its subclasses\n", + "lifecycle_scoped_relationships = object_set.obj_by_type[\"LifecycleScopedRelationship\"]\n", + "print(\"LifecycleScopedRelationship found:\", len(lifecycle_scoped_relationships))\n", + "for o in lifecycle_scoped_relationships:\n", + " print(o)\n", + "print()\n", + "\n", + "# Get all objects of type \"Softare/Package\", including its subclasses\n", + "packages = object_set.obj_by_type[\"software_Package\"]\n", + "print(\"software_Package found:\", len(packages))\n", + "for o in packages:\n", + " print(o)\n", + "\n", + "print()" ] }, { "cell_type": "markdown", - "source": [ - "## A proper way to get access to SPDX objects" - ], "metadata": { "id": "qY3_-XIGQoKT" - } + }, + "source": [ + "## A proper way to get access to SPDX objects" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "uqNOwXXAczeW" + }, "source": [ "While direct access to `obj_by_id` and `obj_by_type` is possible,\n", "it is generally recommended to use the provided access methods for better\n", @@ -548,17 +525,11 @@ "\n", "SHACLObjectSet offers the `find_by_id` method to retrieve a specific object\n", "using its unique `spdxId`." - ], - "metadata": { - "id": "uqNOwXXAczeW" - } + ] }, { "cell_type": "code", - "source": [ - "obj = object_set.find_by_id(\"https://spdx.org/spdxdocs/Sbom1-b1b4ff24-5ada-4c22-a9c9-7bd7121978ff\")\n", - "print(obj)" - ], + "execution_count": 49, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -566,35 +537,35 @@ "id": "c-28HXbkudie", "outputId": "267cf2f5-ec77-4fd5-fbe4-721b4d591cb7" }, - "execution_count": 12, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "None\n" ] } + ], + "source": [ + "obj = object_set.find_by_id(\"https://spdx.org/spdxdocs/Sbom1-b1b4ff24-5ada-4c22-a9c9-7bd7121978ff\")\n", + "print(obj)" ] }, { "cell_type": "markdown", + "metadata": { + "id": "wyvA-i5fdB80" + }, "source": [ "SHACLObjectSet also provides `foreach_type`, a generator method that\n", "iterates over all objects of a specified type.\n", "\n", "By default, `foreach_type` will also return instances of subclasses." - ], - "metadata": { - "id": "wyvA-i5fdB80" - } + ] }, { "cell_type": "code", - "source": [ - "for obj in object_set.foreach_type(\"Relationship\"):\n", - " print(obj)" - ], + "execution_count": 50, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -602,68 +573,68 @@ "id": "Qjz-D9iz_p8n", "outputId": "25136d1e-b2e0-4b95-85b0-929c761f1320" }, - "execution_count": 13, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd33')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd13')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd36')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd38')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd21')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd39')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd14')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd16')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd38')\n", "LifecycleScopedRelationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd45')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd14')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd39')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd18')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd48')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd16')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd15')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd3')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd24')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd15')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd13')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd8')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd8')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd18')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd24')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd33')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n" + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd36')\n" ] } + ], + "source": [ + "for obj in object_set.foreach_type(\"Relationship\"):\n", + " print(obj)" ] }, { "cell_type": "markdown", - "source": [ - "Notice the presence of `LifecycleScopedRelationship`, which is a subclass of `Relationship`." - ], "metadata": { "id": "24pEngfddGw1" - } + }, + "source": [ + "Notice the presence of `LifecycleScopedRelationship`, which is a subclass of `Relationship`." + ] }, { "cell_type": "markdown", - "source": [ - "Set `match_subclass` argument to False, to exclude subclasses.\n" - ], "metadata": { "id": "6YbhPUpqdSZ9" - } + }, + "source": [ + "Set `match_subclass` argument to False, to exclude subclasses.\n" + ] }, { "cell_type": "code", - "source": [ - "for obj in object_set.foreach_type(\"Relationship\", match_subclass=False):\n", - " print(obj)" - ], + "execution_count": 51, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -671,69 +642,69 @@ "id": "CLSKgtC7yRmt", "outputId": "2a310168-97c0-448d-d2bb-ef407fb5f16b" }, - "execution_count": 14, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd33')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd13')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd36')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd38')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd21')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd39')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd16')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd38')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd14')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd39')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd18')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd48')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd16')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd15')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd3')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd24')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd15')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd13')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd8')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd8')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd18')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd24')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd33')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n" + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd36')\n" ] } + ], + "source": [ + "for obj in object_set.foreach_type(\"Relationship\", match_subclass=False):\n", + " print(obj)" ] }, { "cell_type": "markdown", - "source": [ - "Notice the absence of `LifecycleScopedRelationship` this time." - ], "metadata": { "id": "_uwUlUordW9R" - } + }, + "source": [ + "Notice the absence of `LifecycleScopedRelationship` this time." + ] }, { "cell_type": "markdown", + "metadata": { + "id": "pDSVRsAXdcqM" + }, "source": [ "Because `foreach_type` is a generator, you can use it like this as well:\n", "\n", "\n" - ], - "metadata": { - "id": "pDSVRsAXdcqM" - } + ] }, { "cell_type": "code", - "source": [ - "objs = set(object_set.foreach_type(\"Relationship\", match_subclass=False))\n", - "print(len(objs))" - ], + "execution_count": 52, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -741,48 +712,45 @@ "id": "1uVFmeYQAcSC", "outputId": "bac9e6b2-ff5e-481a-ef68-fe974cad4e02" }, - "execution_count": 15, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "27\n" ] } + ], + "source": [ + "objs = set(object_set.foreach_type(\"Relationship\", match_subclass=False))\n", + "print(len(objs))" ] }, { "cell_type": "markdown", - "source": [ - "## Accessing SPDX properties" - ], "metadata": { "id": "0GpZV9m1QzI1" - } + }, + "source": [ + "## Accessing SPDX properties" + ] }, { "cell_type": "markdown", + "metadata": { + "id": "vnpIoFf1dli8" + }, "source": [ "SPDX objects and their properties can be accessed directly from Python attributes.\n", "\n", "For example, this SpdxDocument `doc` has an attribute `creationInfo`\n", "and the value of `creationInfo` is a CreationInfo object.\n", "We can directly access `specVersion` attribute of the CreationInfo object like this." - ], - "metadata": { - "id": "vnpIoFf1dli8" - } + ] }, { "cell_type": "code", - "source": [ - "doc = list(object_set.foreach_type(\"SpdxDocument\", match_subclass=False))[0]\n", - "print(\"SPDX Spec Version:\", doc.creationInfo.specVersion)\n", - "\n", - "root_element = doc.rootElement[0] # assume we have only one root element\n", - "print(\"Root element ID:\", root_element.spdxId)" - ], + "execution_count": 53, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -790,31 +758,40 @@ "id": "pXl50kABJXnw", "outputId": "6712992f-9fe3-4100-8c47-92d6b171b0d9" }, - "execution_count": 16, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "SPDX Spec Version: 3.0.1\n", "Root element ID: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n" ] } + ], + "source": [ + "doc = list(object_set.foreach_type(\"SpdxDocument\", match_subclass=False))[0]\n", + "print(\"SPDX Spec Version:\", doc.creationInfo.specVersion)\n", + "\n", + "root_element = doc.rootElement[0] # assume we have only one root element\n", + "print(\"Root element ID:\", root_element.spdxId)" ] }, { "cell_type": "markdown", + "metadata": { + "id": "VgA7RhdiPZjl" + }, "source": [ "The SPDX specification defines the classes and properties of SPDX models.\n", "\n", "For example, the SpdxDocument class is detailed at: https://spdx.github.io/spdx-spec/v3.0.1/model/Core/Classes/SpdxDocument/" - ], - "metadata": { - "id": "VgA7RhdiPZjl" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "rNdl2dqiPht8" + }, "source": [ "## Put things together\n", "\n", @@ -822,45 +799,11 @@ "Let's try to visualize an SPDX 3 SBOM.\n", "\n", "The example below will iterate through all relationships and print relationship types between SPDX objects." - ], - "metadata": { - "id": "rNdl2dqiPht8" - } + ] }, { "cell_type": "code", - "source": [ - "def print_object_info(obj, prefix=\"\"):\n", - " \"\"\"helper function to print a box containing object info.\n", - " obj can be either SHACLObject or just spdxId (string).\"\"\"\n", - " print(f\"{prefix}\u250f\" + \"\u2501\"*50 + \"\u2505\")\n", - " if isinstance(obj, spdx3.SHACLObject):\n", - " print(f\"{prefix}\u2503 {obj.__class__.__name__}\")\n", - " print(f\"{prefix}\u2503 - name: {getattr(obj, 'name', 'N/A')}\")\n", - " print(f\"{prefix}\u2503 - spdxId: {obj.spdxId}\")\n", - " else: # assume it's an spdxId for an external object\n", - " print(f\"{prefix}\u2503 (Unresolved spdxId)\")\n", - " print(f\"{prefix}\u2503 - spdxId: {obj}\")\n", - " print(f\"{prefix}\u2517\" + \"\u2501\"*50 + \"\u2505\")\n", - "\n", - "for rel in object_set.foreach_type(\"Relationship\"):\n", - " # spdx-python-model uses \"from_\" instead of \"from\" to avoid the Python keyword\n", - " from_obj = getattr(rel, \"from_\")\n", - " to_objs = getattr(rel, \"to\")\n", - " # print only the type name, not the full URL, for conciseness\n", - " rel_type = getattr(rel, \"relationshipType\").split(\"/\")[-1]\n", - "\n", - " print_object_info(from_obj)\n", - "\n", - " print( \" \u2502\")\n", - " print(f\" {rel_type}\")\n", - " print( \" \u2193\")\n", - "\n", - " for o in to_objs:\n", - " print_object_info(o, prefix=\" \")\n", - "\n", - " print()" - ], + "execution_count": 54, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -868,448 +811,482 @@ "id": "pAgJZnDJU4Jf", "outputId": "5bcfcb33-f0f0-4350-ffa0-ecbaa30bc62b" }, - "execution_count": 17, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j SLF4J Binding\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasDeclaredLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j API\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasConcludedLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j API\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDynamicLink\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: examplemaven\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasConcludedLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j Core\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDynamicLink\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_File\n", - "\u2503 - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " generates\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_Package\n", - " \u2503 - name: examplemaven\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDeclaredLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: examplemaven\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " contains\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_File\n", - " \u2503 - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " dependsOn\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: JUnit\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: examplemaven\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasTestCase\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_File\n", - " \u2503 - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_File\n", + "┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasConcludedLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: examplemaven\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasDistributionArtifact\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_File\n", - " \u2503 - name: examplemaven-0.0.1.jar\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd35\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ (Unresolved spdxId)\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1#SPDXRef-DOCUMENT\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " amendedBy\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ SpdxDocument\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: examplemaven\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasDeclaredLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_File\n", + "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " generates\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j API\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: SLF4J API Module\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasDynamicLink\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_Package\n", - " \u2503 - name: examplemaven\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 (Unresolved spdxId)\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1#SPDXRef-DOCUMENT\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " amendedBy\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 SpdxDocument\n", - " \u2503 - name: examplemaven\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_File\n", - "\u2503 - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j API\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasConcludedLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: examplemaven\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " dependsOn\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_Package\n", - " \u2503 - name: JUnit\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: JUnit\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: JUnit\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasConcludedLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: SLF4J API Module\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasDynamicLink\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_Package\n", - " \u2503 - name: examplemaven\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j Core\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasConcludedLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: JUnit\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: JUnit\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasDeclaredLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd49\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd49\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j Core\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasDynamicLink\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_Package\n", - " \u2503 - name: examplemaven\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ SpdxDocument\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " describes\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_File\n", - "\u2503 - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_File\n", + "┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasDeclaredLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 SpdxDocument\n", - "\u2503 - name: examplemaven\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " describes\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_Package\n", - " \u2503 - name: examplemaven\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: examplemaven\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " contains\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_File\n", - " \u2503 - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasTestCase\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_File\n", + " ┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j API\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j SLF4J Binding\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasDeclaredLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: SLF4J API Module\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasConcludedLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j SLF4J Binding\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDynamicLink\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_File\n", - "\u2503 - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasDeclaredLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_File\n", + "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasConcludedLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_File\n", - "\u2503 - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: SLF4J API Module\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasConcludedLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j SLF4J Binding\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasDynamicLink\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 software_Package\n", - " \u2503 - name: examplemaven\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_File\n", + "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDeclaredLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j Core\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", - " hasConcludedLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j API\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDeclaredLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: SLF4J API Module\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j Core\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasDeclaredLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j SLF4J Binding\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " contains\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_File\n", + " ┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasConcludedLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j SLF4J Binding\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasConcludedLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", - "\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - "\u2503 software_Package\n", - "\u2503 - name: Apache Log4j Core\n", - "\u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", - "\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2502\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " contains\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_File\n", + " ┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: SLF4J API Module\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", " hasDeclaredLicense\n", - " \u2193\n", - " \u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", - " \u2503 simplelicensing_LicenseExpression\n", - " \u2503 - name: None\n", - " \u2503 - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2505\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDistributionArtifact\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_File\n", + " ┃ - name: examplemaven-0.0.1.jar\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd35\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n" ] } + ], + "source": [ + "def print_object_info(obj, prefix=\"\"):\n", + " \"\"\"helper function to print a box containing object info.\n", + " obj can be either SHACLObject or just spdxId (string).\"\"\"\n", + " print(f\"{prefix}┏\" + \"━\"*50 + \"┅\")\n", + " if isinstance(obj, spdx3.SHACLObject):\n", + " print(f\"{prefix}┃ {obj.__class__.__name__}\")\n", + " print(f\"{prefix}┃ - name: {getattr(obj, 'name', 'N/A')}\")\n", + " print(f\"{prefix}┃ - spdxId: {obj.spdxId}\")\n", + " else: # assume it's an spdxId for an external object\n", + " print(f\"{prefix}┃ (Unresolved spdxId)\")\n", + " print(f\"{prefix}┃ - spdxId: {obj}\")\n", + " print(f\"{prefix}┗\" + \"━\"*50 + \"┅\")\n", + "\n", + "for rel in object_set.foreach_type(\"Relationship\"):\n", + " # spdx-python-model uses \"from_\" instead of \"from\" to avoid the Python keyword\n", + " from_obj = getattr(rel, \"from_\")\n", + " to_objs = getattr(rel, \"to\")\n", + " # print only the type name, not the full URL, for conciseness\n", + " rel_type = getattr(rel, \"relationshipType\").split(\"/\")[-1]\n", + "\n", + " print_object_info(from_obj)\n", + "\n", + " print( \" │\")\n", + " print(f\" {rel_type}\")\n", + " print( \" ↓\")\n", + "\n", + " for o in to_objs:\n", + " print_object_info(o, prefix=\" \")\n", + "\n", + " print()" ] }, { "cell_type": "markdown", + "metadata": { + "id": "D2PljHcL5iH_" + }, "source": [ "## SPDX object creation and built-in validation\n", "\n", "To create an SPDX object,\n", "simply use the standard constructor as you would with any native Python class." - ], - "metadata": { - "id": "D2PljHcL5iH_" - } + ] }, { "cell_type": "code", - "source": [ - "package = spdx3.ai_AIPackage()\n", - "package" - ], + "execution_count": 55, "metadata": { - "id": "9hjARbwm6DUd", - "outputId": "d93e5e20-7271-4f09-9635-62c2511fa923", "colab": { "base_uri": "https://localhost:8080/" - } + }, + "id": "9hjARbwm6DUd", + "outputId": "d93e5e20-7271-4f09-9635-62c2511fa923" }, - "execution_count": 18, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, + "execution_count": 55, "metadata": {}, - "execution_count": 18 + "output_type": "execute_result" } + ], + "source": [ + "package = spdx3.ai_AIPackage()\n", + "package" ] }, { "cell_type": "markdown", + "metadata": { + "id": "68j1H6Fw6xtf" + }, "source": [ "The spdx-python-model library features built-in SHACL-based validation derived\n", "directly from the [SPDX 3 model][spdx-3-model].\n", @@ -1323,95 +1300,95 @@ "[spdx-3-model]: https://spdx.org/rdf/3.0.1/spdx-model.ttl\n", "[ai-package]: https://spdx.github.io/spdx-spec/v3.0.1/model/AI/Classes/AIPackage/\n", "[cardinality]: https://spdx.github.io/spdx-spec/v3.0.1/conformance/" - ], - "metadata": { - "id": "68j1H6Fw6xtf" - } + ] }, { "cell_type": "code", - "source": [ - "package.ai_domain = \"nlp\"" - ], + "execution_count": 56, "metadata": { - "id": "cAzCx9tV6wI-", - "outputId": "1c32fb63-fa35-4b0b-e442-9d439cb3e5de", "colab": { "base_uri": "https://localhost:8080/", "height": 318 - } + }, + "id": "cAzCx9tV6wI-", + "outputId": "1c32fb63-fa35-4b0b-e442-9d439cb3e5de" }, - "execution_count": 19, "outputs": [ { - "output_type": "error", "ename": "TypeError", "evalue": "Value must be one of type: list, ListProxy. Got str", + "output_type": "error", "traceback": [ - "\\^[[0;31m---------------------------------------------------------------------------\\^[[0m", - "\\^[[0;31mTypeError\\^[[0m Traceback (most recent call last)", - "\\^[[0;32m/tmp/ipykernel_20264/179762956.py\\^[[0m in \\^[[0;36m\\^[[0;34m()\\^[[0m\n\\^[[0;32m----> 1\\^[[0;31m \\^[[0mpackage\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0mai_domain\\^[[0m \\^[[0;34m=\\^[[0m \\^[[0;34m\"nlp\"\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0m", - "\\^[[0;32m/usr/local/lib/python3.12/dist-packages/spdx_python_model/bindings/v3_0_1/model.py\\^[[0m in \\^[[0;36m__setattr__\\^[[0;34m(self, name, value)\\^[[0m\n\\^[[1;32m 1061\\^[[0m \\^[[0;32mreturn\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[1;32m 1062\\^[[0m \\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0;32m-> 1063\\^[[0;31m \\^[[0mself\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0m__set\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mself\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0m__get_attr\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mname\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0mvalue\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0m\\^[[1;32m 1064\\^[[0m \\^[[0;34m\\^[[0m\\^[[0m\n\\^[[1;32m 1065\\^[[0m \\^[[0;32mdef\\^[[0m \\^[[0m__getattr__\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mself\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0mname\\^[[0m\\^[[0;34m:\\^[[0m \\^[[0mstr\\^[[0m\\^[[0;34m)\\^[[0m \\^[[0;34m->\\^[[0m \\^[[0mAny\\^[[0m\\^[[0;34m:\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n", - "\\^[[0;32m/usr/local/lib/python3.12/dist-packages/spdx_python_model/bindings/v3_0_1/model.py\\^[[0m in \\^[[0;36m__set\\^[[0;34m(self, p, value)\\^[[0m\n\\^[[1;32m 1034\\^[[0m )\n\\^[[1;32m 1035\\^[[0m \\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0;32m-> 1036\\^[[0;31m \\^[[0mp\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0mprop\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0mvalidate\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mvalue\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0m\\^[[1;32m 1037\\^[[0m \\^[[0;32mif\\^[[0m \\^[[0mp\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0mdeprecated\\^[[0m\\^[[0;34m:\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[1;32m 1038\\^[[0m warnings.warn(\n", - "\\^[[0;32m/usr/local/lib/python3.12/dist-packages/spdx_python_model/bindings/v3_0_1/model.py\\^[[0m in \\^[[0;36mvalidate\\^[[0;34m(self, value)\\^[[0m\n\\^[[1;32m 568\\^[[0m \\^[[0;34m\\^[[0m\\^[[0m\n\\^[[1;32m 569\\^[[0m \\^[[0;32mdef\\^[[0m \\^[[0mvalidate\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mself\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0mvalue\\^[[0m\\^[[0;34m:\\^[[0m \\^[[0mAny\\^[[0m\\^[[0;34m)\\^[[0m \\^[[0;34m->\\^[[0m \\^[[0;32mNone\\^[[0m\\^[[0;34m:\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0;32m--> 570\\^[[0;31m \\^[[0msuper\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0mvalidate\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mvalue\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0m\\^[[1;32m 571\\^[[0m \\^[[0;34m\\^[[0m\\^[[0m\n\\^[[1;32m 572\\^[[0m \\^[[0;32mfor\\^[[0m \\^[[0mi\\^[[0m \\^[[0;32min\\^[[0m \\^[[0mvalue\\^[[0m\\^[[0;34m:\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n", - "\\^[[0;32m/usr/local/lib/python3.12/dist-packages/spdx_python_model/bindings/v3_0_1/model.py\\^[[0m in \\^[[0;36mvalidate\\^[[0;34m(self, value)\\^[[0m\n\\^[[1;32m 76\\^[[0m \\^[[0;34m\\^[[0m\\^[[0m\n\\^[[1;32m 77\\^[[0m \\^[[0;32mdef\\^[[0m \\^[[0mvalidate\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mself\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0mvalue\\^[[0m\\^[[0;34m:\\^[[0m \\^[[0mAny\\^[[0m\\^[[0;34m)\\^[[0m \\^[[0;34m->\\^[[0m \\^[[0;32mNone\\^[[0m\\^[[0;34m:\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0;32m---> 78\\^[[0;31m \\^[[0mcheck_type\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mvalue\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0mself\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0mVALID_TYPES\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0m\\^[[1;32m 79\\^[[0m if self.pattern is not None and not re.search(\n\\^[[1;32m 80\\^[[0m \\^[[0mself\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0mpattern\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0mself\\^[[0m\\^[[0;34m.\\^[[0m\\^[[0mto_string\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mvalue\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n", - "\\^[[0;32m/usr/local/lib/python3.12/dist-packages/spdx_python_model/bindings/v3_0_1/model.py\\^[[0m in \\^[[0;36mcheck_type\\^[[0;34m(obj, types)\\^[[0m\n\\^[[1;32m 51\\^[[0m \\^[[0;32mif\\^[[0m \\^[[0;32mnot\\^[[0m \\^[[0misinstance\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mobj\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0mtypes\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m:\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[1;32m 52\\^[[0m \\^[[0;32mif\\^[[0m \\^[[0misinstance\\^[[0m\\^[[0;34m(\\^[[0m\\^[[0mtypes\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0;34m(\\^[[0m\\^[[0mlist\\^[[0m\\^[[0;34m,\\^[[0m \\^[[0mtuple\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m)\\^[[0m\\^[[0;34m:\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[0;32m---> 53\\^[[0;31m raise TypeError(\n\\^[[0m\\^[[1;32m 54\\^[[0m \\^[[0;34mf\"Value must be one of type: {', '.join(t.__name__ for t in types)}. Got {type(obj).__name__}\"\\^[[0m\\^[[0;34m\\^[[0m\\^[[0;34m\\^[[0m\\^[[0m\n\\^[[1;32m 55\\^[[0m )\n", - "\\^[[0;31mTypeError\\^[[0m: Value must be one of type: list, ListProxy. Got str" + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[56], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mpackage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mai_domain\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnlp\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:1075\u001b[0m, in \u001b[0;36mSHACLObject.__setattr__\u001b[0;34m(self, name, value)\u001b[0m\n\u001b[1;32m 1072\u001b[0m \u001b[38;5;28mobject\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__setattr__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, value)\n\u001b[1;32m 1073\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m-> 1075\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__set\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_attr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:1048\u001b[0m, in \u001b[0;36mSHACLObject.__set\u001b[0;34m(self, p, value)\u001b[0m\n\u001b[1;32m 1043\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_blank_node(value) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_IRI(value):\n\u001b[1;32m 1044\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 1045\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mid\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) Has invalid Property \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mp\u001b[38;5;241m.\u001b[39miri\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m. Must be a blank node or IRI\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1046\u001b[0m )\n\u001b[0;32m-> 1048\u001b[0m \u001b[43mp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1049\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m p\u001b[38;5;241m.\u001b[39mdeprecated:\n\u001b[1;32m 1050\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 1051\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mp\u001b[38;5;241m.\u001b[39mpyname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m is deprecated\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 1052\u001b[0m \u001b[38;5;167;01mDeprecationWarning\u001b[39;00m,\n\u001b[1;32m 1053\u001b[0m )\n", + "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:570\u001b[0m, in \u001b[0;36mListProp.validate\u001b[0;34m(self, value)\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mvalidate\u001b[39m(\u001b[38;5;28mself\u001b[39m, value: Any) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 570\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 572\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m value:\n\u001b[1;32m 573\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprop\u001b[38;5;241m.\u001b[39mvalidate(i)\n", + "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:78\u001b[0m, in \u001b[0;36mProperty.validate\u001b[0;34m(self, value)\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mvalidate\u001b[39m(\u001b[38;5;28mself\u001b[39m, value: Any) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m---> 78\u001b[0m \u001b[43mcheck_type\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mVALID_TYPES\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpattern \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m re\u001b[38;5;241m.\u001b[39msearch(\n\u001b[1;32m 80\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpattern, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mto_string(value)\n\u001b[1;32m 81\u001b[0m ):\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 83\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mValue is not correctly formatted. Got \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mto_string(value)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 84\u001b[0m )\n", + "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:53\u001b[0m, in \u001b[0;36mcheck_type\u001b[0;34m(obj, types)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(obj, types):\n\u001b[1;32m 52\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(types, (\u001b[38;5;28mlist\u001b[39m, \u001b[38;5;28mtuple\u001b[39m)):\n\u001b[0;32m---> 53\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 54\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mValue must be one of type: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(t\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mfor\u001b[39;00m\u001b[38;5;250m \u001b[39mt\u001b[38;5;250m \u001b[39m\u001b[38;5;129;01min\u001b[39;00m\u001b[38;5;250m \u001b[39mtypes)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. Got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(obj)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 55\u001b[0m )\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 57\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mValue must be of type \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtypes\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. Got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(obj)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 58\u001b[0m )\n", + "\u001b[0;31mTypeError\u001b[0m: Value must be one of type: list, ListProxy. Got str" ] } + ], + "source": [ + "package.ai_domain = \"nlp\"" ] }, { "cell_type": "markdown", + "metadata": { + "id": "WWdZwqP9EfnP" + }, "source": [ "Even if there is only a single entry, you must provide it as a single-element\n", "list to satisfy the property's cardinality:" - ], - "metadata": { - "id": "WWdZwqP9EfnP" - } + ] }, { "cell_type": "code", - "source": [ - "package.ai_domain = [\"nlp\"]\n", - "package.ai_domain" - ], + "execution_count": null, "metadata": { - "id": "H6LeOd3_D8rQ", - "outputId": "b9977956-3c4e-4493-a1ef-369b845e0167", "colab": { "base_uri": "https://localhost:8080/" - } + }, + "id": "H6LeOd3_D8rQ", + "outputId": "b9977956-3c4e-4493-a1ef-369b845e0167" }, - "execution_count": 20, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "['nlp']" ] }, + "execution_count": 20, "metadata": {}, - "execution_count": 20 + "output_type": "execute_result" } + ], + "source": [ + "package.ai_domain = [\"nlp\"]\n", + "package.ai_domain" ] }, { "cell_type": "markdown", + "metadata": { + "id": "quqpF4E0E6fv" + }, "source": [ "Refer to the [SPDX specification][spdx-spec]\n", "for detailed information on property types and cardinality.\n", "\n", "[spdx-spec]: https://spdx.github.io/spdx-spec/" - ], - "metadata": { - "id": "quqpF4E0E6fv" - } + ] }, { "cell_type": "markdown", + "metadata": { + "id": "lqg60qPeLaI3" + }, "source": [ "## That's it\n", "\n", @@ -1424,15 +1401,53 @@ "- `spdx-python-model` tests: https://github.com/spdx/spdx-python-model/blob/main/tests/test_import.py\n", "- `shacl2code` (which generates spdx-python-model's Python binding) tests: https://github.com/JPEWdev/shacl2code/blob/main/tests/test_python.py\n", "\n", - "There are many ways to [get involved](https://github.com/spdx/spdx-3-model/blob/develop/Contributing.md) with the SPDX community. If you have questions about using SPDX, feel free to join one of our [online meetings](https://github.com/spdx/meetings/)!\n", + "There are many ways to [get involved](https://github.com/spdx/spdx-3-model/blob/develop/Contributing.md) with the SPDX community. If you have questions about using SPDX, feel free to join one of our [online meetings](https://github.com/spdx/meetings/)!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Change log\n", "\n", - "--\n", + "- Update: 23 June 2026 - included as part of `spdx-python-model` documentation\n", + "- Update: 21 May 2026 - fix handling of unresolved references (spdxId) ([reported](https://github.com/spdx/spdx-python-model/issues/34) by @vargenau and suggested a fix by @benjarobin - thank you both!)\n", + "- Update: 23 February 2026 - add a section on SPDX object creation and validation\n", + "- First published: 7 July 2025 - as part of [@bact][bact] [Arthit Suriyawongkul]'s [Google Summer of Code 2025 program][gsoc-2025] contribution to [NTIA Conformance Checker][ntia-conformance-checker] (mentors: Gary O'Neall and John Speed Meyers).\n", "\n", - "Check out my current project, *[Pitloom](https://github.com/bact/pitloom)*, an SBOM generator for Python projects and AI models. It extracts metadata from fastText, GGUF, ONNX, PyTorch, and Safetensors models, and builds SBOMs directly from Hugging Face URLs. It also includes native Hatchling build-hook support and works with setuptools and Poetry." - ], - "metadata": { - "id": "lqg60qPeLaI3" - } + "[bact]: https://github.com/bact/\n", + "[benjarobin]: https://github.com/benjarobin\n", + "[vargenau]: https://github.com/vargenau]\n", + "[ntia-conformance-checker]: https://github.com/spdx/ntia-conformance-checker\n", + "[gsoc-2025]: https://summerofcode.withgoogle.com/programs/2025/projects/CeR3hQTq\n", + "\n" + ] } - ] -} \ No newline at end of file + ], + "metadata": { + "colab": { + "authorship_tag": "ABX9TyOys2TFWeUKaj6M6TfFA+yY", + "include_colab_link": true, + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.20" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From ca12af064c985cf5424313ad62ecdd3262cbe59c Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Wed, 24 Jun 2026 14:52:19 +0100 Subject: [PATCH 2/4] Use load() Signed-off-by: Arthit Suriyawongkul --- tutorial/using-spdx3.ipynb | 593 +++++++++++++++++-------------------- 1 file changed, 268 insertions(+), 325 deletions(-) diff --git a/tutorial/using-spdx3.ipynb b/tutorial/using-spdx3.ipynb index 2abc594..e31ad26 100644 --- a/tutorial/using-spdx3.ipynb +++ b/tutorial/using-spdx3.ipynb @@ -55,7 +55,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -88,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -102,10 +102,7 @@ "output_type": "stream", "text": [ "spdx-python-model library version: 0.0.6\n", - "Available SPDX bindings in spdx_python_model module:\n", - "_CONTEXT_TABLE\n", - "_DRAFT_VERSIONS\n", - "v3_0_1\n" + "Available SPDX bindings in spdx_python_model module:\n" ] } ], @@ -116,7 +113,7 @@ "\n", "print(\"Available SPDX bindings in spdx_python_model module:\")\n", "for name in dir(bindings):\n", - " if not name.startswith(\"__\"):\n", + " if name.startswith(\"v\"):\n", " print(name)" ] }, @@ -125,15 +122,11 @@ "metadata": { "id": "yuweD-jan0A8" }, - "source": [ - "To use a Python binding, import a specific version of the model.\n", - "\n", - "For example, to import a binding for SPDX model version 3.0.1, import `v3_0_1`." - ] + "source": "To work with SPDX data, import the binding for the SPDX version you need.\n\nFor example, to import the binding for SPDX 3.0.1, import `v3_0_1`.\n\nThe library also provides a way to automatically select the correct binding\nfrom a file's content, without needing to specify the version manually —\nwe will cover that in the next section." }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 4, "metadata": { "id": "MW10UJY2n7Ot" }, @@ -151,27 +144,10 @@ "Or you may like to assign it to a versionless alias,\n", "so you can update the version easily later.\n", "\n", - "For example, this will set the import alias as `spdx3`." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "id": "bgKEojPtn_yC" - }, - "outputs": [], - "source": [ - "from spdx_python_model import v3_0_1 as spdx3" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "PC_h1XmSpIF3" - }, - "source": [ - "If a new version (e.g., v3_1) is released, you only need to update the import line and can keep the rest of your code intact.\n", + "For example, `from spdx_python_model import v3_0_1 as spdx3`.\n", + "\n", + "When a new version (e.g., v3_1) is released, you only need to update the\n", + "import line and can keep the rest of your code intact.\n", "\n", "For example, `from spdx_python_model import v3_1 as spdx3`." ] @@ -181,15 +157,11 @@ "metadata": { "id": "9bWRkIYvpkzO" }, - "source": [ - "Once imported, we can now access SPDX 3 model.\n", - "\n", - "Let's print some \"named individuals\" from the model." - ] + "source": "Once imported, we can now use the binding to access SPDX 3 classes,\nproperties, and vocabulary terms.\n\nLet's print some \"named individuals\" from the binding." }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -201,23 +173,23 @@ { "data": { "text/plain": [ - "['https://spdx.org/rdf/3.0.1/terms/Core/HashAlgorithm/sha3_512',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Software/ContentIdentifierType/gitoid',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/hasInput',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Security/VexJustificationType/vulnerableCodeCannotBeControlledByAdversary',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/ancestorOf',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/delegatedTo',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/ExternalRefType/issueTracker',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Software/SoftwarePurpose/container']" + "['https://spdx.org/rdf/3.0.1/terms/Core/PresenceType/no',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Dataset/DatasetAvailabilityType/registration',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/copiedTo',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/HashAlgorithm/sha224',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipCompleteness/noAssertion',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/ExternalRefType/buildMeta',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/LifecycleScopeType/test',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Software/SoftwarePurpose/manifest']" ] }, - "execution_count": 43, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "list(spdx3.NAMED_INDIVIDUALS)[:8]" + "list(v3_0_1.NAMED_INDIVIDUALS)[:8]" ] }, { @@ -229,35 +201,16 @@ "Some of these could be entries in SPDX 3 vocabularies (enum)." ] }, - { - "cell_type": "markdown", - "metadata": { - "id": "LeTPh0lsQZBw" - }, - "source": [ - "## Read SPDX data from SPDX 3 JSON file" - ] - }, { "cell_type": "markdown", "metadata": { "id": "wak3vYKObfXI" }, - "source": [ - "The library offers a built-in JSON-LD deserializer.\n", - "To use it, provide the path to your SPDX 3 JSON file and an instance of SHACLObjectSet.\n", - "The deserializer will read the JSON file and populate the SHACLObjectSet.\n", - "\n", - "SHACLObjectSet holds SHACLObjects, which are the primary data structures for\n", - "interaction within this library. It also includes helpful utilities, such as\n", - "a generator (iterator) for accessing objects by their type.\n", - "\n", - "In this example, we will first download the JSON file from the `spdx-examples` repository." - ] + "source": "## Read SPDX data from SPDX 3 JSON file\n\nThe library offers a `load()` function that reads an SPDX 3 JSON file and\nautomatically selects the correct Python binding based on the `@context` URL\nin the file.\n\nIt returns a tuple of `(model, object_set)` where:\n\n- `model` is the version-specific binding (e.g., `v3_0_1`) matching the file's context; and\n- `object_set` is a `SHACLObjectSet` populated with the objects from the file.\n\n`SHACLObjectSet` holds `SHACLObject`s, which are the primary data structures\nfor interaction within this library. It also includes helpful utilities,\nsuch as a generator (iterator) for accessing objects by their type.\n\nIn this example, we will first download the JSON file from the `spdx-examples`\nrepository." }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -270,26 +223,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n" + "\n" ] } ], "source": [ "from urllib.request import urlretrieve\n", + "from pathlib import Path\n", + "import spdx_python_model\n", "\n", "# url = \"https://raw.githubusercontent.com/spdx/spdx-examples/refs/heads/master/ai/example02/spdx3.0/sbom.spdx3.json\"\n", "url = \"https://raw.githubusercontent.com/spdx/spdx-examples/refs/heads/master/software/example14/spdx3.0/examplemaven-0.0.1-enriched.spdx3.json\"\n", "filename = \"sbom.spdx.json\"\n", "filepath, _ = urlretrieve(url, filename) # download from url; get the filepath\n", "\n", - "object_set = spdx3.SHACLObjectSet()\n", - "\n", - "with open(filepath, \"r\", encoding=\"utf-8\") as f:\n", - " spdx3.JSONLDDeserializer().read(f, object_set)\n", + "spdx3, object_set = spdx_python_model.load(Path(filepath))\n", "\n", "print(object_set)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "`load()` returns a `(model, object_set)` tuple. Here, `model` is the\nversion-specific Python binding (e.g., `v3_0_1`) automatically selected\nbased on the `@context` URL in the file. We assign it to `spdx3` as the\nversionless alias introduced earlier.\nThe `object_set` is a `SHACLObjectSet` populated with all the SPDX objects\nfrom the file, which we will explore in the next section." + }, { "cell_type": "markdown", "metadata": { @@ -310,7 +267,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -323,7 +280,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[, , ]\n" + "[, , ]\n" ] } ], @@ -357,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -370,7 +327,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{(False, ), (False, ), (False, ), (False, )}\n" + "{(False, ), (False, ), (False, ), (False, )}\n" ] } ], @@ -395,7 +352,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -423,7 +380,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -437,45 +394,45 @@ "output_type": "stream", "text": [ "Relationship found: 28\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(False, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(False, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", "\n", "LifecycleScopedRelationship found: 1\n", - "(True, )\n", + "(True, )\n", "\n", "software_Package found: 6\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", "\n" ] } @@ -529,7 +486,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -565,7 +522,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -578,34 +535,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd21')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd16')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd38')\n", - "LifecycleScopedRelationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd45')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd13')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd33')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd14')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd36')\n", + "LifecycleScopedRelationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd45')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd15')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd38')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd16')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd39')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd18')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd48')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd3')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd15')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd13')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd21')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd8')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd24')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd33')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd36')\n" + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n" ] } ], @@ -634,7 +591,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -647,33 +604,33 @@ "name": "stdout", "output_type": "stream", "text": [ - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd21')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd16')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd38')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd13')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd33')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd14')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd36')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd15')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd38')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd16')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd39')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd18')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd48')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd3')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd15')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd13')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd21')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd8')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd24')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd33')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd36')\n" + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n" ] } ], @@ -704,7 +661,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -750,7 +707,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -803,7 +760,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -818,36 +775,22 @@ "text": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: Apache Log4j API\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", - "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " │\n", - " hasDynamicLink\n", - " ↓\n", - " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_Package\n", - " ┃ - name: examplemaven\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "\n", - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", - "┃ - name: Apache Log4j Core\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", + "┃ - name: SLF4J API Module\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasDynamicLink\n", + " hasConcludedLicense\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_Package\n", - " ┃ - name: examplemaven\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: examplemaven\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┃ - name: SLF4J API Module\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasDeclaredLicense\n", @@ -855,30 +798,30 @@ " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ simplelicensing_LicenseExpression\n", " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: examplemaven\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┃ - name: Apache Log4j SLF4J Binding\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " dependsOn\n", + " hasDynamicLink\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ software_Package\n", - " ┃ - name: JUnit\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_File\n", - "┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", + "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasConcludedLicense\n", + " hasDeclaredLicense\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ simplelicensing_LicenseExpression\n", @@ -887,53 +830,54 @@ " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ (Unresolved spdxId)\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1#SPDXRef-DOCUMENT\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j SLF4J Binding\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " amendedBy\n", + " hasConcludedLicense\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ SpdxDocument\n", - " ┃ - name: examplemaven\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_File\n", - "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " generates\n", + " contains\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_Package\n", - " ┃ - name: examplemaven\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┃ software_File\n", + " ┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: SLF4J API Module\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasDynamicLink\n", + " contains\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_Package\n", - " ┃ - name: examplemaven\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┃ software_File\n", + " ┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: Apache Log4j API\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", + "┃ - name: Apache Log4j SLF4J Binding\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasConcludedLicense\n", + " hasDeclaredLicense\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ simplelicensing_LicenseExpression\n", @@ -943,8 +887,22 @@ "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: JUnit\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasTestCase\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_File\n", + " ┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasConcludedLicense\n", @@ -952,13 +910,13 @@ " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ simplelicensing_LicenseExpression\n", " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", - "┃ - name: Apache Log4j Core\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", + "┃ software_File\n", + "┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasConcludedLicense\n", @@ -966,35 +924,35 @@ " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ simplelicensing_LicenseExpression\n", " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: JUnit\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasDeclaredLicense\n", + " hasDistributionArtifact\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ simplelicensing_LicenseExpression\n", - " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd49\n", + " ┃ software_File\n", + " ┃ - name: examplemaven-0.0.1.jar\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd35\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ SpdxDocument\n", + "┃ software_Package\n", "┃ - name: examplemaven\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " describes\n", + " dependsOn\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ software_Package\n", - " ┃ - name: examplemaven\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┃ - name: JUnit\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", @@ -1017,32 +975,18 @@ "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasTestCase\n", - " ↓\n", - " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_File\n", - " ┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", - " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "\n", - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", - "┃ - name: Apache Log4j SLF4J Binding\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", - "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " │\n", " hasDeclaredLicense\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ simplelicensing_LicenseExpression\n", " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: Apache Log4j SLF4J Binding\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", + "┃ - name: Apache Log4j Core\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasDynamicLink\n", @@ -1054,23 +998,22 @@ " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_File\n", - "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + "┃ (Unresolved spdxId)\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1#SPDXRef-DOCUMENT\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasConcludedLicense\n", + " amendedBy\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ simplelicensing_LicenseExpression\n", - " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┃ SpdxDocument\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: SLF4J API Module\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", + "┃ - name: Apache Log4j Core\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasConcludedLicense\n", @@ -1082,23 +1025,23 @@ " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_File\n", - "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + "┃ software_Package\n", + "┃ - name: JUnit\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasDeclaredLicense\n", + " hasConcludedLicense\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ simplelicensing_LicenseExpression\n", " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: Apache Log4j API\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", + "┃ - name: Apache Log4j Core\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasDeclaredLicense\n", @@ -1111,8 +1054,8 @@ "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: Apache Log4j Core\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\n", + "┃ - name: JUnit\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasDeclaredLicense\n", @@ -1120,41 +1063,55 @@ " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " ┃ simplelicensing_LicenseExpression\n", " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd49\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", + "┃ software_File\n", + "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " generates\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ SpdxDocument\n", "┃ - name: examplemaven\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " contains\n", + " describes\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_File\n", - " ┃ - name: ./src/test/java/org/spdx/examplemaven/AppTest.java\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd12\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: examplemaven\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┃ - name: Apache Log4j API\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasConcludedLicense\n", + " hasDynamicLink\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ simplelicensing_LicenseExpression\n", - " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: Apache Log4j SLF4J Binding\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", + "┃ - name: Apache Log4j API\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasConcludedLicense\n", @@ -1166,23 +1123,23 @@ " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", - "┃ - name: examplemaven\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┃ software_File\n", + "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " contains\n", + " hasConcludedLicense\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_File\n", - " ┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: SLF4J API Module\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", + "┃ - name: Apache Log4j API\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", " hasDeclaredLicense\n", @@ -1195,16 +1152,16 @@ "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", - "┃ - name: examplemaven\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + "┃ - name: SLF4J API Module\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", " │\n", - " hasDistributionArtifact\n", + " hasDynamicLink\n", " ↓\n", " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_File\n", - " ┃ - name: examplemaven-0.0.1.jar\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd35\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n" ] @@ -1257,7 +1214,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1269,10 +1226,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 55, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1304,7 +1261,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1321,7 +1278,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[56], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mpackage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mai_domain\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnlp\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "Cell \u001b[0;32mIn[19], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mpackage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mai_domain\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnlp\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:1075\u001b[0m, in \u001b[0;36mSHACLObject.__setattr__\u001b[0;34m(self, name, value)\u001b[0m\n\u001b[1;32m 1072\u001b[0m \u001b[38;5;28mobject\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__setattr__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, value)\n\u001b[1;32m 1073\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m-> 1075\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__set\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_attr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:1048\u001b[0m, in \u001b[0;36mSHACLObject.__set\u001b[0;34m(self, p, value)\u001b[0m\n\u001b[1;32m 1043\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_blank_node(value) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_IRI(value):\n\u001b[1;32m 1044\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 1045\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mid\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) Has invalid Property \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mp\u001b[38;5;241m.\u001b[39miri\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m. Must be a blank node or IRI\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1046\u001b[0m )\n\u001b[0;32m-> 1048\u001b[0m \u001b[43mp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1049\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m p\u001b[38;5;241m.\u001b[39mdeprecated:\n\u001b[1;32m 1050\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 1051\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mp\u001b[38;5;241m.\u001b[39mpyname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m is deprecated\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 1052\u001b[0m \u001b[38;5;167;01mDeprecationWarning\u001b[39;00m,\n\u001b[1;32m 1053\u001b[0m )\n", "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:570\u001b[0m, in \u001b[0;36mListProp.validate\u001b[0;34m(self, value)\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mvalidate\u001b[39m(\u001b[38;5;28mself\u001b[39m, value: Any) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 570\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 572\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m value:\n\u001b[1;32m 573\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprop\u001b[38;5;241m.\u001b[39mvalidate(i)\n", @@ -1355,18 +1312,7 @@ "id": "H6LeOd3_D8rQ", "outputId": "b9977956-3c4e-4493-a1ef-369b845e0167" }, - "outputs": [ - { - "data": { - "text/plain": [ - "['nlp']" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "package.ai_domain = [\"nlp\"]\n", "package.ai_domain" @@ -1394,14 +1340,12 @@ "\n", "That's it for now! Hope you enjoyed the tutorial.\n", "\n", - "Special thanks to Joshua Watt for the spdx-python-model library, making SPDX 3 more accessible for Python developers.\n", - "\n", "Find more examples of how to use the library:\n", "\n", "- `spdx-python-model` tests: https://github.com/spdx/spdx-python-model/blob/main/tests/test_import.py\n", "- `shacl2code` (which generates spdx-python-model's Python binding) tests: https://github.com/JPEWdev/shacl2code/blob/main/tests/test_python.py\n", "\n", - "There are many ways to [get involved](https://github.com/spdx/spdx-3-model/blob/develop/Contributing.md) with the SPDX community. If you have questions about using SPDX, feel free to join one of our [online meetings](https://github.com/spdx/meetings/)!" + "There are many ways to [get involved](https://github.com/spdx/spdx-3-model/blob/develop/Contributing.md) with the SPDX community. If you have questions about using SPDX, feel free to join one of our [online meetings](https://github.com/spdx/meetings/)." ] }, { @@ -1410,17 +1354,16 @@ "source": [ "## Change log\n", "\n", - "- Update: 23 June 2026 - included as part of `spdx-python-model` documentation\n", + "- Update: 24 June 2026 - update code to spdx-python-model 0.0.6; included as part of spdx-python-model documentation\n", "- Update: 21 May 2026 - fix handling of unresolved references (spdxId) ([reported](https://github.com/spdx/spdx-python-model/issues/34) by @vargenau and suggested a fix by @benjarobin - thank you both!)\n", "- Update: 23 February 2026 - add a section on SPDX object creation and validation\n", - "- First published: 7 July 2025 - as part of [@bact][bact] [Arthit Suriyawongkul]'s [Google Summer of Code 2025 program][gsoc-2025] contribution to [NTIA Conformance Checker][ntia-conformance-checker] (mentors: Gary O'Neall and John Speed Meyers).\n", + "- First published: 7 July 2025 - as part of [@bact][bact] Arthit Suriyawongkul's [Google Summer of Code 2025 program][gsoc-2025] contribution to [NTIA Conformance Checker][ntia-conformance-checker] (mentors: Gary O'Neall, John Speed Meyers, and Joshua Watt).\n", "\n", "[bact]: https://github.com/bact/\n", "[benjarobin]: https://github.com/benjarobin\n", "[vargenau]: https://github.com/vargenau]\n", "[ntia-conformance-checker]: https://github.com/spdx/ntia-conformance-checker\n", - "[gsoc-2025]: https://summerofcode.withgoogle.com/programs/2025/projects/CeR3hQTq\n", - "\n" + "[gsoc-2025]: https://summerofcode.withgoogle.com/programs/2025/projects/CeR3hQTq" ] } ], @@ -1450,4 +1393,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file From 6add07633ff959b0613c0c98d6a395e83c111369 Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Wed, 24 Jun 2026 15:11:50 +0100 Subject: [PATCH 3/4] Update using-spdx3.ipynb Signed-off-by: Arthit Suriyawongkul --- tutorial/using-spdx3.ipynb | 377 +++++++++++++++++++++---------------- 1 file changed, 214 insertions(+), 163 deletions(-) diff --git a/tutorial/using-spdx3.ipynb b/tutorial/using-spdx3.ipynb index e31ad26..62622a2 100644 --- a/tutorial/using-spdx3.ipynb +++ b/tutorial/using-spdx3.ipynb @@ -102,19 +102,21 @@ "output_type": "stream", "text": [ "spdx-python-model library version: 0.0.6\n", - "Available SPDX bindings in spdx_python_model module:\n" + "Available bindings:\n", + "v3_0_1\n", + "v3_1\n" ] } ], "source": [ + "import pkgutil\n", "from spdx_python_model import __version__, bindings\n", "\n", "print(f\"spdx-python-model library version: {__version__}\")\n", "\n", - "print(\"Available SPDX bindings in spdx_python_model module:\")\n", - "for name in dir(bindings):\n", - " if name.startswith(\"v\"):\n", - " print(name)" + "print(\"Available bindings:\")\n", + "for module_info in pkgutil.iter_modules(bindings.__path__):\n", + " print(module_info.name)" ] }, { @@ -122,7 +124,15 @@ "metadata": { "id": "yuweD-jan0A8" }, - "source": "To work with SPDX data, import the binding for the SPDX version you need.\n\nFor example, to import the binding for SPDX 3.0.1, import `v3_0_1`.\n\nThe library also provides a way to automatically select the correct binding\nfrom a file's content, without needing to specify the version manually —\nwe will cover that in the next section." + "source": [ + "To work with SPDX data, import the binding for the SPDX version you need.\n", + "\n", + "For example, to import the binding for SPDX 3.0.1, import `v3_0_1`.\n", + "\n", + "The library also provides a way to automatically select the correct binding\n", + "from a file's content, without needing to specify the version manually —\n", + "we will cover that in the next section." + ] }, { "cell_type": "code", @@ -157,11 +167,16 @@ "metadata": { "id": "9bWRkIYvpkzO" }, - "source": "Once imported, we can now use the binding to access SPDX 3 classes,\nproperties, and vocabulary terms.\n\nLet's print some \"named individuals\" from the binding." + "source": [ + "Once imported, we can now use the binding to access SPDX 3 classes,\n", + "properties, and vocabulary terms.\n", + "\n", + "Let's print some \"named individuals\" from the binding." + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -173,17 +188,17 @@ { "data": { "text/plain": [ - "['https://spdx.org/rdf/3.0.1/terms/Core/PresenceType/no',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Dataset/DatasetAvailabilityType/registration',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/copiedTo',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/HashAlgorithm/sha224',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipCompleteness/noAssertion',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/ExternalRefType/buildMeta',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Core/LifecycleScopeType/test',\n", - " 'https://spdx.org/rdf/3.0.1/terms/Software/SoftwarePurpose/manifest']" + "['https://spdx.org/rdf/3.0.1/terms/Dataset/DatasetType/timeseries',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/AnnotationType/other',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/ExternalRefType/privacyAssessment',\n", + " 'https://spdx.org/rdf/3.0.1/terms/AI/SafetyRiskAssessmentType/high',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/ExternalRefType/funding',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/coordinatedBy',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/doesNotAffect',\n", + " 'https://spdx.org/rdf/3.0.1/terms/Core/RelationshipType/other']" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -206,11 +221,29 @@ "metadata": { "id": "wak3vYKObfXI" }, - "source": "## Read SPDX data from SPDX 3 JSON file\n\nThe library offers a `load()` function that reads an SPDX 3 JSON file and\nautomatically selects the correct Python binding based on the `@context` URL\nin the file.\n\nIt returns a tuple of `(model, object_set)` where:\n\n- `model` is the version-specific binding (e.g., `v3_0_1`) matching the file's context; and\n- `object_set` is a `SHACLObjectSet` populated with the objects from the file.\n\n`SHACLObjectSet` holds `SHACLObject`s, which are the primary data structures\nfor interaction within this library. It also includes helpful utilities,\nsuch as a generator (iterator) for accessing objects by their type.\n\nIn this example, we will first download the JSON file from the `spdx-examples`\nrepository." + "source": [ + "## Read SPDX data from SPDX 3 JSON file\n", + "\n", + "The library offers a `load()` function that reads an SPDX 3 JSON file and\n", + "automatically selects the correct Python binding based on the `@context` URL\n", + "in the file.\n", + "\n", + "It returns a tuple of `(model, object_set)` where:\n", + "\n", + "- `model` is the version-specific binding (e.g., `v3_0_1`) matching the file's context; and\n", + "- `object_set` is a `SHACLObjectSet` populated with the objects from the file.\n", + "\n", + "`SHACLObjectSet` holds `SHACLObject`s, which are the primary data structures\n", + "for interaction within this library. It also includes helpful utilities,\n", + "such as a generator (iterator) for accessing objects by their type.\n", + "\n", + "In this example, we will first download the JSON file from the `spdx-examples`\n", + "repository." + ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -223,7 +256,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\n" + "\n" ] } ], @@ -245,7 +278,14 @@ { "cell_type": "markdown", "metadata": {}, - "source": "`load()` returns a `(model, object_set)` tuple. Here, `model` is the\nversion-specific Python binding (e.g., `v3_0_1`) automatically selected\nbased on the `@context` URL in the file. We assign it to `spdx3` as the\nversionless alias introduced earlier.\nThe `object_set` is a `SHACLObjectSet` populated with all the SPDX objects\nfrom the file, which we will explore in the next section." + "source": [ + "`load()` returns a `(model, object_set)` tuple. Here, `model` is the\n", + "version-specific Python binding (e.g., `v3_0_1`) automatically selected\n", + "based on the `@context` URL in the file. We assign it to `spdx3` as the\n", + "versionless alias introduced earlier.\n", + "The `object_set` is a `SHACLObjectSet` populated with all the SPDX objects\n", + "from the file, which we will explore in the next section." + ] }, { "cell_type": "markdown", @@ -267,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -280,7 +320,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[, , ]\n" + "[, , ]\n" ] } ], @@ -314,7 +354,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -327,7 +367,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{(False, ), (False, ), (False, ), (False, )}\n" + "{(False, ), (False, ), (False, ), (False, )}\n" ] } ], @@ -352,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -380,7 +420,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -394,45 +434,45 @@ "output_type": "stream", "text": [ "Relationship found: 28\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(False, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(False, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", "\n", "LifecycleScopedRelationship found: 1\n", - "(True, )\n", + "(True, )\n", "\n", "software_Package found: 6\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", + "(True, )\n", "\n" ] } @@ -486,7 +526,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -522,7 +562,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -535,11 +575,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", @@ -555,6 +590,7 @@ "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd18')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd48')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd3')\n", @@ -562,7 +598,11 @@ "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd8')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd24')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n" + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n" ] } ], @@ -591,7 +631,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -604,11 +644,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd5')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd11')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd32')\n", @@ -623,6 +658,7 @@ "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd18')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd46')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd20')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd31')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd48')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd7')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd3')\n", @@ -630,7 +666,11 @@ "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd23')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd8')\n", "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd24')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n" + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd25')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd27')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd28')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\n" ] } ], @@ -661,7 +701,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -707,7 +747,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -760,7 +800,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -773,76 +813,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", - "┃ - name: SLF4J API Module\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", - "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " │\n", - " hasConcludedLicense\n", - " ↓\n", - " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ simplelicensing_LicenseExpression\n", - " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "\n", - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", - "┃ - name: SLF4J API Module\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", - "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " │\n", - " hasDeclaredLicense\n", - " ↓\n", - " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ simplelicensing_LicenseExpression\n", - " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "\n", - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", - "┃ - name: Apache Log4j SLF4J Binding\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", - "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " │\n", - " hasDynamicLink\n", - " ↓\n", - " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ software_Package\n", - " ┃ - name: examplemaven\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", - " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "\n", - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_File\n", - "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", - "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " │\n", - " hasDeclaredLicense\n", - " ↓\n", - " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ simplelicensing_LicenseExpression\n", - " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", - " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "\n", - "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "┃ software_Package\n", - "┃ - name: Apache Log4j SLF4J Binding\n", - "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", - "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " │\n", - " hasConcludedLicense\n", - " ↓\n", - " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - " ┃ simplelicensing_LicenseExpression\n", - " ┃ - name: None\n", - " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", - " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", - "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", "┃ - name: examplemaven\n", @@ -1054,6 +1024,20 @@ "\n", "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "┃ software_Package\n", + "┃ - name: Apache Log4j SLF4J Binding\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasConcludedLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", "┃ - name: JUnit\n", "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd44\n", "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", @@ -1163,6 +1147,62 @@ " ┃ - name: examplemaven\n", " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: SLF4J API Module\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasConcludedLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: SLF4J API Module\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd26\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDeclaredLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd19\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_Package\n", + "┃ - name: Apache Log4j SLF4J Binding\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd30\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDynamicLink\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ software_Package\n", + " ┃ - name: examplemaven\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd4\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "\n", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ software_File\n", + "┃ - name: ./src/main/java/org/spdx/examplemaven/App.java\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd6\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\n", + " hasDeclaredLicense\n", + " ↓\n", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " ┃ simplelicensing_LicenseExpression\n", + " ┃ - name: None\n", + " ┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd9\n", + " ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", "\n" ] } @@ -1214,7 +1254,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1226,10 +1266,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1261,7 +1301,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", @@ -1278,7 +1318,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[19], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mpackage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mai_domain\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnlp\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "Cell \u001b[0;32mIn[18], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mpackage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mai_domain\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnlp\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:1075\u001b[0m, in \u001b[0;36mSHACLObject.__setattr__\u001b[0;34m(self, name, value)\u001b[0m\n\u001b[1;32m 1072\u001b[0m \u001b[38;5;28mobject\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__setattr__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, value)\n\u001b[1;32m 1073\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[0;32m-> 1075\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__set\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__get_attr\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:1048\u001b[0m, in \u001b[0;36mSHACLObject.__set\u001b[0;34m(self, p, value)\u001b[0m\n\u001b[1;32m 1043\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_blank_node(value) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_IRI(value):\n\u001b[1;32m 1044\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 1045\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mid\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m) Has invalid Property \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mp\u001b[38;5;241m.\u001b[39miri\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mvalue\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m. Must be a blank node or IRI\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1046\u001b[0m )\n\u001b[0;32m-> 1048\u001b[0m \u001b[43mp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1049\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m p\u001b[38;5;241m.\u001b[39mdeprecated:\n\u001b[1;32m 1050\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 1051\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mp\u001b[38;5;241m.\u001b[39mpyname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m is deprecated\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 1052\u001b[0m \u001b[38;5;167;01mDeprecationWarning\u001b[39;00m,\n\u001b[1;32m 1053\u001b[0m )\n", "File \u001b[0;32m~/projects/spdx-python-model/src/spdx_python_model/bindings/v3_0_1/model.py:570\u001b[0m, in \u001b[0;36mListProp.validate\u001b[0;34m(self, value)\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mvalidate\u001b[39m(\u001b[38;5;28mself\u001b[39m, value: Any) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 570\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 572\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m value:\n\u001b[1;32m 573\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprop\u001b[38;5;241m.\u001b[39mvalidate(i)\n", @@ -1304,7 +1344,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -1312,7 +1352,18 @@ "id": "H6LeOd3_D8rQ", "outputId": "b9977956-3c4e-4493-a1ef-369b845e0167" }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['nlp']" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "package.ai_domain = [\"nlp\"]\n", "package.ai_domain" @@ -1355,13 +1406,13 @@ "## Change log\n", "\n", "- Update: 24 June 2026 - update code to spdx-python-model 0.0.6; included as part of spdx-python-model documentation\n", - "- Update: 21 May 2026 - fix handling of unresolved references (spdxId) ([reported](https://github.com/spdx/spdx-python-model/issues/34) by @vargenau and suggested a fix by @benjarobin - thank you both!)\n", + "- Update: 21 May 2026 - fix handling of unresolved references (spdxId) ([reported](https://github.com/spdx/spdx-python-model/issues/34) by [@vargenau] and suggested a fix by [@benjarobin] - thank you both!)\n", "- Update: 23 February 2026 - add a section on SPDX object creation and validation\n", - "- First published: 7 July 2025 - as part of [@bact][bact] Arthit Suriyawongkul's [Google Summer of Code 2025 program][gsoc-2025] contribution to [NTIA Conformance Checker][ntia-conformance-checker] (mentors: Gary O'Neall, John Speed Meyers, and Joshua Watt).\n", + "- First published: 7 July 2025 - as part of [@bact] Arthit Suriyawongkul's [Google Summer of Code 2025 program][gsoc-2025] contribution to [NTIA Conformance Checker][ntia-conformance-checker] (mentors: Gary O'Neall, John Speed Meyers, and Joshua Watt).\n", "\n", - "[bact]: https://github.com/bact/\n", - "[benjarobin]: https://github.com/benjarobin\n", - "[vargenau]: https://github.com/vargenau]\n", + "[@bact]: https://github.com/bact/\n", + "[@benjarobin]: https://github.com/benjarobin\n", + "[@vargenau]: https://github.com/vargenau]\n", "[ntia-conformance-checker]: https://github.com/spdx/ntia-conformance-checker\n", "[gsoc-2025]: https://summerofcode.withgoogle.com/programs/2025/projects/CeR3hQTq" ] @@ -1393,4 +1444,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} \ No newline at end of file +} From 3ec254d7ff219393f5fad54ed818b8cd0ddd0e3f Mon Sep 17 00:00:00 2001 From: Arthit Suriyawongkul Date: Wed, 24 Jun 2026 15:28:35 +0100 Subject: [PATCH 4/4] Revise flow Signed-off-by: Arthit Suriyawongkul --- tutorial/using-spdx3.ipynb | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/tutorial/using-spdx3.ipynb b/tutorial/using-spdx3.ipynb index 62622a2..1ff9c8b 100644 --- a/tutorial/using-spdx3.ipynb +++ b/tutorial/using-spdx3.ipynb @@ -127,11 +127,7 @@ "source": [ "To work with SPDX data, import the binding for the SPDX version you need.\n", "\n", - "For example, to import the binding for SPDX 3.0.1, import `v3_0_1`.\n", - "\n", - "The library also provides a way to automatically select the correct binding\n", - "from a file's content, without needing to specify the version manually —\n", - "we will cover that in the next section." + "For example, to import the binding for SPDX 3.0.1, import `v3_0_1`." ] }, { @@ -153,13 +149,15 @@ "source": [ "Or you may like to assign it to a versionless alias,\n", "so you can update the version easily later.\n", - "\n", "For example, `from spdx_python_model import v3_0_1 as spdx3`.\n", "\n", - "When a new version (e.g., v3_1) is released, you only need to update the\n", + "When a new version (e.g., 3.1) is released, you only need to update the\n", "import line and can keep the rest of your code intact.\n", + "For example, `from spdx_python_model import v3_1 as spdx3`.\n", "\n", - "For example, `from spdx_python_model import v3_1 as spdx3`." + "The library also provides a way to automatically select the correct binding\n", + "from a file's content, without needing to specify the version manually —\n", + "we will cover that in the next section." ] }, { @@ -279,10 +277,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "`load()` returns a `(model, object_set)` tuple. Here, `model` is the\n", - "version-specific Python binding (e.g., `v3_0_1`) automatically selected\n", - "based on the `@context` URL in the file. We assign it to `spdx3` as the\n", - "versionless alias introduced earlier.\n", + "`load()` returns a `(model, object_set)` tuple.\n", + "Here, `model` is the version-specific Python binding (e.g., `v3_0_1`)\n", + "automatically selected based on the `@context` URL in the file.\n", + "We assign it to `spdx3` as the versionless alias introduced earlier.\n", "The `object_set` is a `SHACLObjectSet` populated with all the SPDX objects\n", "from the file, which we will explore in the next section." ] @@ -345,7 +343,8 @@ "`obj_by_type` is a dictionary where:\n", "- Keys are the `type` property values of the objects.\n", " (e.g., \"SpdxDocument\", \"software_Package\", \"simplelicensing_LicenseExpression\").\n", - " Note: Core Profile types do not require a prefix, while other Profiles do (e.g., \"software_\").\n", + " - Note: Core namespace does not require a prefix, while other namespaces do\n", + " (e.g., \"software_\"). This follows convention for SPDX 3 JSON serialization.\n", "- Values are sets of tuples. Each tuple contains:\n", " 1. A boolean indicating if the SHACLObject in this tuple is an exact type match (True)\n", " or a subclass match (False); and\n",