
Библиотека Python для разбора, проверки и создания SPDX-документов.
Статус CI (Linux, macOS и Windows):
Обратите внимание, что предстоящий релиз 0.8 подвергся значительному рефакторингу в рамках подготовки к предстоящему релизу SPDX v3.0, что привело к критическим изменениям в API. Пожалуйста, обратитесь к руководству по миграции, чтобы обновить существующий код.
Основные возможности v0.8:
Обратите внимание, что v0.8 поддерживает только запись, но не чтение SPDX 3.0-документов. Подробности см. в #760.
Эта библиотека реализует парсеры, конвертеры, валидаторы и обработчики SPDX на Python.
Важные обновления, касающиеся этой библиотеки, публикуются в списке рассылки SPDX tech: https://lists.spdx.org/g/Spdx-tech.
AGraph.
Примечание: это опциональная возможность и требует
дополнительной установки опциональных зависимостейСм. Краткое руководство по SPDX 3.0 ниже. Реализация основана на описательных Markdown-файлах в репозитории https://github.com/spdx/spdx-3-model (коммит: a5372a3c145dbdfc1381fc1f791c68889aafc7ff). Последняя модель SPDX 3.0 доступна по адресу https://spdx.github.io/spdx-spec/v3.0/serializations/.
Как всегда, вам следует работать в virtualenv (venv). Вы можете установить локальную копию
этого репозитория с помощью yourenv/bin/pip install . или установить её из PyPI
(проверьте последний релиз и установите его, например, так:
yourenv/bin/pip install spdx-tools==0.8.3). Обратите внимание, что в Windows вместо bin будет Scripts.
РАЗБОР/ПРОВЕРКА (для разбора любого формата):
Используйте pyspdxtools -i <filename>, где <filename> — путь к файлу. Формат входных данных определяется автоматически по расширению файла.
Если вы используете дистрибутив из исходного кода, попробуйте выполнить:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json
КОНВЕРТАЦИЯ (для конвертации одного формата в другой):
Используйте pyspdxtools -i <input_file> -o <output_file>, где <input_file> — путь к файлу, который нужно конвертировать,
а <output_file> — путь к выходному файлу. Форматы ввода и вывода определяются автоматически по расширениям файлов.
Если вы используете дистрибутив из исходного кода, попробуйте выполнить:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json -o output.tag
Если вы хотите пропустить процесс проверки, укажите флаг --novalidation, например:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json -o output.tag --novalidation
(используйте с осторожностью: незамеченные недействительные документы могут привести к непредвиденному поведению инструмента)
МОДЕЛЬ ДАННЫХ
spdx_tools.spdx.model представляет внутреннюю модель данных SPDX v2.3 (v2.2 — просто её подмножество). Все соответствующие классы для создания SPDX-документов доступны в __init__.py, который находится здесь.@dataclass_with_properties — пользовательское расширение @dataclass.ConstructorTypeError или TypeError соответственно). Это позволяет легко выявлять некорректные свойства на раннем этапе и создавать только валидные документы.list.append(item), обходят проверку типов (TypeError всё равно будет вызван при повторном чтении list). Вместо этого мы рекомендуем использовать list = list + [item].Вот несколько примеров возможных сценариев использования, которые помогут вам быстро начать работу с spdx-tools. Если вам нужно больше примеров, например как создать SPDX-документ с нуля, загляните в папку с примерами.
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)
В отличие от SPDX v2, теперь все элементы являются подклассами центрального класса Element.
Сюда входят пакеты, файлы, фрагменты, отношения, аннотации, а также SBOM, SpdxDocuments и другие.
Для целей сериализации все элементы, которые должны быть сериализованы в один файл, собираются в Payload.
Это просто словарь, который сопоставляет SpdxId каждого элемента с самим элементом.
Используйте функции write_payload() для сериализации payload.
Сейчас есть два варианта:
spdx_tools.spdx3.writer.json_ld.json_ld_writer генерирует JSON-LD файл payload.spdx_tools.spdx3.writer.console.payload_writer выводит отладочные данные в консоль. Обратите внимание, что это не является официальной частью спецификации SPDX и, вероятно, будет удалено, как только появится лучший стандарт.Вы можете конвертировать документ SPDX v2 в v3 с помощью модуля spdx_tools.spdx3.bump_from_spdx2.spdx_document.
Функция bump_spdx_document() вернёт payload, содержащий элемент SpdxDocument и по одному элементу для каждого пакета, файла, фрагмента, отношения или аннотации, содержащихся в документе v2.
Вклад очень приветствуется! Инструкции о том, как внести вклад в кодовую базу, см. в CONTRIBUTING.md.
Это результат первоначального вклада в рамках GSoC от @ah450 (или https://github.com/a-h-i); проект поддерживается сообществом пользователей и энтузиастов SPDX. В рамках подготовки к выпуску SPDX v3.0 репозиторий прошёл серьёзный рефакторинг в период с 11/2022 по 07/2023.
Для справки используйте pyspdxtools --help
ГЕНЕРАЦИЯ ГРАФА (опциональная возможность)
Эта возможность создаёт граф, представляющий все элементы SPDX-документа и их связи на основе предоставленных
отношений. Граф можно визуализировать в виде картинки. Ниже приведён пример для файла tests/spdx/data/SPDXJSONExample-v2.3.spdx.json:

Убедитесь, что вы установили опциональные зависимости networkx и pygraphviz. Для этого выполните pip install ".[graph_generation]".
Используйте pyspdxtools -i <input_file> --graph -o <output_file>, где <output_file> — имя выходного файла с допустимым для pygraphviz форматом (см.
документацию здесь).
Если вы используете дистрибутив из исходного кода, попробуйте выполнить
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json --graph -o SPDXJSONExample-v2.3.spdx.png, чтобы сгенерировать
png-файл с обзором структуры примерного файла.
Document из модуля document.py, который связывает все остальные классы.documentDescribes и hasFiles: эти поля будут преобразованы в отношения во внутренней модели данных. Поскольку они устарели, эти поля не будут записаны в выходные данные.РАЗБОР
parse_file(file_name) из модуля parse_anything.py для разбора произвольного файла с одним из поддерживаемых расширений.Document. При неудачном разборе будет вызвано исключение SPDXParsingError со списком всех обнаруженных проблем.ПРОВЕРКА
validate_full_spdx_document(document) для проверки экземпляра класса Document.ValidationMessage, каждый из которых состоит из строки, описывающей недействительность, и ValidationContext для точного указания источника ошибки проверки.SPDX-2.2 и SPDX-2.3.ЗАПИСЬ
write_file(document, file_name) из модуля write_anything.py для записи экземпляра Document в указанный файл.
Формат сериализации определяется по расширению имени файла.write_file(document, file_name, validate=False).
Внимание: надёжно сериализованы могут быть только валидные документы; сериализация недействительных документов не поддерживается.