
Una librería de Python para analizar, validar y crear documentos SPDX.
Estado de CI (Linux, macOS y Windows):
Tenga en cuenta que la próxima versión 0.8 ha experimentado una refactorización significativa en preparación para el lanzamiento de SPDX v3.0, lo que conlleva cambios incompatibles en la API. Consulte la guía de migración para actualizar su código existente.
Las principales características de v0.8 son:
Tenga en cuenta que v0.8 solo admite escribir, no leer, documentos SPDX 3.0. Vea #760 para más detalles.
Esta biblioteca implementa analizadores (parsers), conversores, validadores y manejadores de SPDX en Python.
Las actualizaciones importantes sobre esta biblioteca se comparten a través de la lista de correo de tecnología SPDX: https://lists.spdx.org/g/Spdx-tech.
AGraph.
Nota: Esta es una función opcional y requiere
instalación adicional de dependencias opcionalesVea Inicio rápido para SPDX 3.0 a continuación. La implementación se basa en los archivos Markdown descriptivos del repositorio https://github.com/spdx/spdx-3-model (commit: a5372a3c145dbdfc1381fc1f791c68889aafc7ff). El modelo más reciente de SPDX 3.0 está disponible en https://spdx.github.io/spdx-spec/v3.0/serializations/.
Como siempre, debe trabajar en un virtualenv (venv). Puede instalar un clon local
de este repositorio con yourenv/bin/pip install . o instalarlo desde PyPI
(consulte la versión más reciente e instálela como
yourenv/bin/pip install spdx-tools==0.8.3). Tenga en cuenta que en Windows sería Scripts
en lugar de bin.
ANALIZAR/VALIDAR (para analizar cualquier formato):
Use pyspdxtools -i <filename> donde <filename> es la ubicación del archivo. El formato de entrada se infiere automáticamente a partir de la extensión del archivo.
Si está usando una distribución de código fuente, intente ejecutar:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json
CONVERTIR (para convertir un formato a otro):
Use pyspdxtools -i <input_file> -o <output_file> donde <input_file> es la ubicación del archivo a convertir
y <output_file> es la ubicación del archivo de salida. Los formatos de entrada y salida se infieren automáticamente a partir de las extensiones de los archivos.
Si está usando una distribución de código fuente, intente ejecutar:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json -o output.tag
Si desea omitir el proceso de validación, proporcione el indicador --novalidation, así:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json -o output.tag --novalidation
(úselo con precaución: tenga en cuenta que los documentos no válidos no detectados pueden provocar un comportamiento inesperado de la herramienta)
MODELO DE DATOS
spdx_tools.spdx.model constituye el modelo de datos interno de SPDX v2.3 (v2.2 es simplemente un subconjunto de este). Todas las clases relevantes para la creación de documentos SPDX están expuestas en el archivo __init__.py que se encuentra aquí.@dataclass_with_properties, una extensión personalizada de @dataclass.ConstructorTypeError o TypeError, respectivamente). Esto facilita la detección temprana de propiedades no válidas y la construcción de documentos válidos.list.append(item) eluden la verificación de tipos (se seguirá generando un TypeError al volver a leer list). Recomendamos usar en su lugar.Aquí hay algunos ejemplos de casos de uso posibles para comenzar rápidamente con spdx-tools. Si desea más ejemplos, como crear un documento SPDX desde cero, eche un vistazo a la carpeta de ejemplos.
import logging
from license_expression import get_spdx_licensing
from spdx_tools.spdx.model import (Checksum, ChecksumAlgorithm, File,
FileType, Relationship, RelationshipType)
from spdx_tools.spdx.parser.parse_anything import parse_file
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
from spdx_tools.spdx.writer.write_anything import write_file
# read in an SPDX document from a file
document = parse_file("spdx_document.json")
# change the document's name
document.creation_info.name = "new document name"
# define a file and a DESCRIBES relationship between the file and the document
checksum = Checksum(ChecksumAlgorithm.SHA1, "71c4025dd9897b364f3ebbb42c484ff43d00791c")
file = File(name="./fileName.py", spdx_id="SPDXRef-File", checksums=[checksum],
file_types=[FileType.TEXT],
license_concluded=get_spdx_licensing().parse("MIT and GPL-2.0"),
license_comment="licenseComment", copyright_text="copyrightText")
relationship = Relationship("SPDXRef-DOCUMENT", RelationshipType.DESCRIBES, "SPDXRef-File")
# add the file and the relationship to the document
# (note that we do not use "document.files.append(file)" as that would circumvent the type checking)
document.files = document.files + [file]
document.relationships = document.relationships + [relationship]
# validate the edited document and log the validation messages
# (depending on your use case, you might also want to utilize the validation_message.context)
validation_messages = validate_full_spdx_document(document)
for validation_message in validation_messages:
logging.warning(validation_message.validation_message)
# if there are no validation messages, the document is valid
# and we can safely serialize it without validating again
if not validation_messages:
write_file(document, "new_spdx_document.rdf", validate=False)
En contraste con SPDX v2, todos los elementos son ahora subclases de la clase central Element.
Esto incluye paquetes, archivos, fragmentos (snippets), relaciones, anotaciones, pero también SBOMs, SpdxDocuments y más.
Con fines de serialización, todos los elementos que se van a serializar en el mismo archivo se recogen en un Payload.
Esto es solo un diccionario que asigna el SpdxId de cada elemento a sí mismo.
Use las funciones write_payload() para serializar un payload.
Actualmente hay dos opciones:
spdx_tools.spdx3.writer.json_ld.json_ld_writer genera un archivo JSON-LD del payload.spdx_tools.spdx3.writer.console.payload_writer imprime una salida de depuración en la consola. Tenga en cuenta que esto no es una parte oficial de la especificación SPDX y probablemente se eliminará en cuanto surja un estándar mejor.Puede convertir un documento SPDX v2 a v3 mediante el módulo spdx_tools.spdx3.bump_from_spdx2.spdx_document.
La función bump_spdx_document() devolverá un payload que contiene un elemento SpdxDocument y un elemento por cada paquete, archivo, fragmento, relación o anotación contenido en el documento v2.
¡Las contribuciones son muy bienvenidas! Consulte CONTRIBUTING.md para obtener instrucciones sobre cómo contribuir al código.
Este es el resultado de una contribución inicial de GSoC por parte de @ah450 (o https://github.com/a-h-i) y es mantenido por una comunidad de adoptantes y entusiastas de SPDX. Para prepararse para el lanzamiento de SPDX v3.0, el repositorio ha sufrido una refactorización importante durante el período de 11/2022 a 07/2023.
Para obtener ayuda, use pyspdxtools --help
GENERACIÓN DE GRÁFICOS (función opcional)
Esta función genera un gráfico que representa todos los elementos del documento SPDX y sus conexiones en función de las
relaciones proporcionadas. El gráfico se puede renderizar como una imagen. A continuación se muestra un ejemplo para el archivo tests/spdx/data/SPDXJSONExample-v2.3.spdx.json:

Asegúrese de instalar las dependencias opcionales networkx y pygraphviz. Para hacerlo, ejecute pip install ".[graph_generation]".
Use pyspdxtools -i <input_file> --graph -o <output_file> donde <output_file> es un nombre de archivo de salida con formato válido para pygraphviz (consulte
la documentación aquí).
Si está usando una distribución de código fuente, intente ejecutar
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json --graph -o SPDXJSONExample-v2.3.spdx.png para generar
un PNG con una vista general de la estructura del archivo de ejemplo.
list = list + [item]Document del módulo document.py, que enlaza con todas las demás clases.documentDescribes y hasFiles: Estos campos se convertirán en relaciones en el modelo de datos interno. Al estar obsoletos, estos campos no se escribirán en la salida.ANÁLISIS
parse_file(file_name) del módulo parse_anything.py para analizar cualquier archivo con una de las extensiones de archivo admitidas.Document. Un análisis fallido generará SPDXParsingError con una lista de todos los problemas encontrados.VALIDACIÓN
validate_full_spdx_document(document) para validar una instancia de la clase Document.ValidationMessage, cada uno compuesto por una cadena que describe la no validez y un ValidationContext para identificar el origen del error de validación.SPDX-2.2 y SPDX-2.3.ESCRITURA
write_file(document, file_name) del módulo write_anything.py para escribir una instancia de Document en el archivo especificado.
El formato de serialización se determina a partir de la extensión del nombre de archivo.write_file(document, file_name, validate=False).
Precaución: solo los documentos válidos se pueden serializar de manera confiable; no se admite la serialización de documentos no válidos.