diff --git a/tutorial/using-spdx3.ipynb b/tutorial/using-spdx3.ipynb index 84613c5..1ff9c8b 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": 2, "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": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -133,91 +96,85 @@ "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", - "Available SPDX bindings in spdx_python_model module:\n", - "v3_0_1\n" + "spdx-python-model library version: 0.0.6\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 bindings:\")\n", + "for module_info in pkgutil.iter_modules(bindings.__path__):\n", + " print(module_info.name)" ] }, { "cell_type": "markdown", - "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" - } + }, + "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`." + ] }, { "cell_type": "code", - "source": [ - "from spdx_python_model import v3_0_1" - ], + "execution_count": 4, "metadata": { "id": "MW10UJY2n7Ot" }, - "execution_count": 4, - "outputs": [] + "outputs": [], + "source": [ + "from spdx_python_model import v3_0_1" + ] }, { "cell_type": "markdown", - "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" - ], - "metadata": { - "id": "bgKEojPtn_yC" }, - "execution_count": 5, - "outputs": [] - }, - { - "cell_type": "markdown", "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", + "Or you may like to assign it to a versionless alias,\n", + "so you can update the version easily later.\n", + "For example, `from spdx_python_model import v3_0_1 as spdx3`.\n", "\n", - "For example, `from spdx_python_model import v3_1 as spdx3`." - ], - "metadata": { - "id": "PC_h1XmSpIF3" - } + "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", + "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": "markdown", - "source": [ - "Once imported, we can now access SPDX 3 model.\n", - "\n", - "Let's print some \"named individuals\" from the model." - ], "metadata": { "id": "9bWRkIYvpkzO" - } + }, + "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", - "source": [ - "list(spdx3.NAMED_INDIVIDUALS)[:8]" - ], + "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -225,79 +182,66 @@ "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/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": 5, "metadata": {}, - "execution_count": 6 + "output_type": "execute_result" } + ], + "source": [ + "list(v3_0_1.NAMED_INDIVIDUALS)[:8]" ] }, { "cell_type": "markdown", - "source": [ - "Some of these could be entries in SPDX 3 vocabularies (enum)." - ], "metadata": { "id": "x6C0wvWRqDIP" - } - }, - { - "cell_type": "markdown", + }, "source": [ - "## Read SPDX data from SPDX 3 JSON file" - ], - "metadata": { - "id": "LeTPh0lsQZBw" - } + "Some of these could be entries in SPDX 3 vocabularies (enum)." + ] }, { "cell_type": "markdown", - "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." - ], "metadata": { "id": "wak3vYKObfXI" - } - }, - { - "cell_type": "code", + }, "source": [ - "from urllib.request import urlretrieve\n", + "## Read SPDX data from SPDX 3 JSON file\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", + "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", - "object_set = spdx3.SHACLObjectSet()\n", + "It returns a tuple of `(model, object_set)` where:\n", "\n", - "with open(filepath, \"r\", encoding=\"utf-8\") as f:\n", - " spdx3.JSONLDDeserializer().read(f, object_set)\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", - "print(object_set)" - ], + "`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": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -305,41 +249,63 @@ "id": "JQ9lTkNdIckN", "outputId": "c5f14a5c-8db2-45d3-b93e-521d704d3823" }, - "execution_count": 7, "outputs": [ { - "output_type": "stream", "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", + "spdx3, object_set = spdx_python_model.load(Path(filepath))\n", + "\n", + "print(object_set)" ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ - "## Some internal works of SHACLObjectSet" - ], + "`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." + ] + }, + { + "cell_type": "markdown", "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": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -347,19 +313,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", @@ -371,22 +343,17 @@ "`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", " 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": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -394,19 +361,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 +387,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": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -436,19 +399,83 @@ "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", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1tiaPV-FKmZh", + "outputId": "0055c4f4-315c-43ce-a81f-9e6b4a55ee74" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Relationship found: 28\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", + "\n", + "software_Package found: 6\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", @@ -471,76 +498,22 @@ " print(o)\n", "\n", "print()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "1tiaPV-FKmZh", - "outputId": "0055c4f4-315c-43ce-a81f-9e6b4a55ee74" - }, - "execution_count": 11, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "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", - "\n", - "LifecycleScopedRelationship found: 1\n", - "(True, )\n", - "\n", - "software_Package found: 6\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "(True, )\n", - "\n" - ] - } ] }, { "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 +521,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": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -566,35 +533,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": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -602,68 +569,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-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-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-gnrtd39')\n", - "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd14')\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-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-gnrtd25')\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-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-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-gnrtd11')\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-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-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-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-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\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": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -671,69 +638,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-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-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-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-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-gnrtd25')\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-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-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-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-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-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-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-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-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-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-gnrtd29')\n", + "Relationship(@id='http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd10')\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": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -741,48 +708,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": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -790,31 +754,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 +795,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": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -868,448 +807,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", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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: 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: 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: 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: 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: 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", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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", - " \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 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_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", - " 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", + " 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", - "\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_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", - " 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", + "┃ 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", + " ↓\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", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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", - " \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 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 Core\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\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", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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 (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", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ (Unresolved spdxId)\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1#SPDXRef-DOCUMENT\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\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", + " ┃ 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_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 Core\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd17\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", - "\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", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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: 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-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-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", - " 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 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", - "\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: 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-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-gnrtd49\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", + " 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 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", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + "┃ SpdxDocument\n", + "┃ - name: examplemaven\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/document0\n", + "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\n", + " │\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", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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", - " 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: 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: 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", - " 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", + "┃ 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", + " ↓\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_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", - " \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-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: Apache Log4j API\n", + "┃ - spdxId: http://spdx.org/documents/examplemaven-0.0.1/enriched-specv3/SPDXRef-gnrtd22\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", - "\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", - " 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", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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", + " ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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 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: 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-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", + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┅\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", - "\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", - " 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_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_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", - " \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-gnrtd9\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": 17, "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": 17, "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,116 +1296,151 @@ "[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": 18, "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[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", + "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": 19, "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": 19, "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", "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/)!\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: 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] 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", - "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" + ] + } + ], + "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" } - ] -} \ No newline at end of file + }, + "nbformat": 4, + "nbformat_minor": 0 +}