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": [
"
"
@@ -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
+}
|