
SPDXドキュメントを解析、検証、作成するためのPythonライブラリ。
まもなくリリースされる0.8では、今後のSPDX v3.0リリースに備えて大幅なリファクタリングが行われており、APIに破壊的変更が生じています。 既存のコードを更新する際は、移行ガイド を参照してください。
v0.8の主な機能は次のとおりです:
v0.8はSPDX 3.0ドキュメントの読み取りではなく書き込みのみをサポートしていることに注意してください。 詳細は#760を参照してください。
このライブラリは、SPDXパーサー、コンバーター、バリデーター、ハンドラーをPythonで実装しています。
このライブラリに関する重要なアップデートは、 SPDXテックメーリングリスト: https://lists.spdx.org/g/Spdx-tech で共有されています。
AGraphを作成してSPDXドキュメントの構造を可視化。
注: これはオプション機能であり、追加のオプション依存関係のインストールが必要です以下のSPDX 3.0クイックスタートを参照してください。 実装はリポジトリhttps://github.com/spdx/spdx-3-model内の説明的なMarkdownファイルに基づいています (コミット: 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になることに注意してください。
解析/検証(任意の形式の解析用):
<filename>をファイルの場所として、pyspdxtools -i <filename>を使用します。入力形式はファイルの拡張子から自動的に推測されます。
ソース配布版を使用している場合は、次のコマンドを実行してみてください:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json
変換(ある形式から別の形式への変換用):
<input_file>を変換するファイルの場所、<output_file>を出力ファイルの場所として、pyspdxtools -i <input_file> -o <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
(使用には注意してください: 無効なドキュメントが検出されない場合、ツールが予期しない動作をする可能性があることに注意してください)
ヘルプを表示するにはpyspdxtools --helpを使用します
データモデル
spdx_tools.spdx.modelパッケージは、内部のSPDX v2.3データモデルを構成します(v2.2は単にそのサブセットです)。SPDXドキュメント作成に関連するすべてのクラスは、ここにある__init__.pyで公開されています。@dataclassのカスタム拡張である@dataclass_with_propertiesを介して実装されています。ConstructorTypeErrorまたはTypeErrorを発生させます)。これにより、無効なプロパティを早期に検出し、有効なドキュメントのみを構築することが容易になります。list.append(item)のようなインプレース操作は型チェックを回避します(listを再度読み取るとTypeErrorが依然として発生します)。代わりにlist = list + [item]を使用することをお勧めします。Documentクラスであり、他のすべてのクラスにリンクしています。ここでは、spdx-toolsをすぐに使い始めるためのユースケースの例をいくつか示します。 SPDXドキュメントをゼロから作成する方法など、さらに多くの例が必要な場合は、examplesフォルダをご覧ください。
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やSpdxDocumentなども含まれます。シリアライズの目的で、同じファイルにシリアライズされるすべてのエレメントはPayloadに収集されます。これは各エレメントのSpdxIdをそれ自体にマッピングする単なる辞書です。write_payload()関数を使用してペイロードをシリアライズします。現在、次の2つのオプションがあります:
spdx_tools.spdx3.writer.json_ld.json_ld_writerモジュールは、ペイロードのJSON-LDファイルを生成します。spdx_tools.spdx3.writer.console.payload_writerモジュールは、デバッグ出力をコンソールに出力します。これはSPDX仕様の公式な部分ではなく、より良い標準が登場次第、廃止される可能性が高いことに注意してください。spdx_tools.spdx3.bump_from_spdx2.spdx_documentモジュールを介して、SPDX v2ドキュメントをv3に変換できます。bump_spdx_document()関数は、SpdxDocumentエレメントと、v2ドキュメントに含まれる各パッケージ、ファイル、スニペット、リレーションシップ、またはアノテーションごとに1つのエレメントを含むペイロードを返します。
コントリビューションは大歓迎です! コードベースへの貢献方法については、CONTRIBUTING.mdを参照してください。
これは@ah450(またはhttps://github.com/a-h-i)による最初のGSoCコントリビューションの成果であり、SPDX採用者と愛好家のコミュニティによって維持されています。 SPDX v3.0のリリースに備えて、リポジトリは2022年11月から2023年7月にかけて大規模なリファクタリングが行われました。
グラフ生成(オプション機能)
この機能は、提供されたリレーションシップに基づいて、SPDXドキュメント内のすべてのエレメントとその接続を表すグラフを生成します。グラフは画像にレンダリングできます。以下はtests/spdx/data/SPDXJSONExample-v2.3.spdx.jsonファイルの例です:

オプションの依存関係であるnetworkxとpygraphvizを必ずインストールしてください。インストールするにはpip install ".[graph_generation]"を実行します。
<output_file>をpygraphvizで有効な形式の出力ファイル名として、pyspdxtools -i <input_file> --graph -o <output_file>を使用します(ドキュメントはこちらを確認してください)。
ソース配布版を使用している場合は、次のコマンドを実行して、サンプルファイルの構造の概要を示すpngを生成してみてください:
pyspdxtools -i tests/spdx/data/SPDXJSONExample-v2.3.spdx.json --graph -o SPDXJSONExample-v2.3.spdx.png
documentDescribesとhasFilesに関する注記: これらのフィールドは内部データモデルではリレーションシップに変換されます。これらは非推奨であるため、これらのフィールドは出力に書き込まれません。解析
parse_anything.pyモジュールのparse_file(file_name)を使用して、サポートされているファイル拡張子の任意のファイルを解析します。Documentインスタンスが返されます。解析が失敗すると、遭遇したすべての問題のリストとともにSPDXParsingErrorが発生します。検証
validate_full_spdx_document(document)を使用して、Documentクラスのインスタンスを検証します。ValidationContextで構成されるValidationMessageオブジェクトのリストが返されます。SPDX-2.2およびSPDX-2.3バージョンのみをサポートしていることに注意してください。書き込み
write_anything.pyモジュールのwrite_file(document, file_name)を使用して、Documentインスタンスを指定されたファイルに書き込みます。
シリアライズ形式はファイル名の拡張子から決定されます。write_file(document, file_name, validate=False)を使用して検証をスキップできます。
注意: 有効なドキュメントのみが確実にシリアライズできます。無効なドキュメントのシリアライズはサポートされていません。