Skip to content

feat: support PEP639 license strings #915

@schlenk

Description

@schlenk

Describe the bug

An AttributeError is raised by pep621.py, because it tries to use 'get()' on a str value, when parsing the license string from a pyproject.toml file given with --pyproject while also using the --pep639 switch.

To Reproduce

Use a pyproject.toml file with 'license' being just a string, not a table.

See note in https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license-and-license-files about the fact that it was a table in PEP 621 but changed to string in PEP 639)

e.g. a pyproject.toml with a PEP 639 license entry like this.

[project]
name = "platform"
dynamic = ["version"]
description = "Platform"
readme = {file = "README.md", content-type = "text/markdown"}
license = "LicenseRef-Platform-Software-General-1.0"
license-files = []

Expected behavior

No error, handle PEP 639 format (especially when --pep639 is explicitly given on the command line).

Screenshots or output-paste

Commandline was:

sbom/Scripts/cyclonedx-py environment --output-format=xml --schema-version=1.5 --output-reproducible --output-file=".sboms/py.bom.xml" --pyproject="./pyproject.toml" --PEP-639 --gather-license-texts -vvv

Output:

DEBUG    | CDX > Error: 'str' object has no attribute 'get'
Traceback (most recent call last):
  File "C:\code\repos\platform\sbom\Lib\site-packages\cyclonedx_py\_internal\cli.py", line 289, in run
    Command(**args, logger=logger)(**args)
  File "C:\code\repos\platform\sbom\Lib\site-packages\cyclonedx_py\_internal\cli.py", line 251, in __call__
    bom = self._make_bom(**kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\code\repos\platform\sbom\Lib\site-packages\cyclonedx_py\_internal\cli.py", line 246, in _make_bom
    return self._bbc(**self._clean_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\code\repos\platform\sbom\Lib\site-packages\cyclonedx_py\_internal\environment.py", line 154, in __call__
    root_c = pyproject2component(pyproject, ctype=mc_type, fpath=pyproject_file)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\code\repos\platform\sbom\Lib\site-packages\cyclonedx_py\_internal\utils\pyproject.py", line 40, in pyproject2component
    return project2component(project, ctype=ctype, fpath=fpath)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\code\repos\platform\sbom\Lib\site-packages\cyclonedx_py\_internal\utils\pep621.py", line 113, in project2component
    licenses=licenses_fixup(project2licenses(project, LicenseFactory(), fpath=fpath)),
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\code\repos\platform\sbom\Lib\site-packages\cyclonedx_py\_internal\utils\cdx.py", line 99, in licenses_fixup
    licenses = set(licenses)
               ^^^^^^^^^^^^^
  File "C:\code\repos\platform\sbom\Lib\site-packages\cyclonedx_py\_internal\utils\pep621.py", line 81, in project2licenses
    elif len(plicense_text := plicense.get('text', '')) > 0:
                              ^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'get'
CRITICAL | CDX > 'str' object has no attribute 'get'

Environment

  • cyclonedx-py version: 6.1.1
  • Python version: 3.11.0
  • OS: Win 10

Additional context

Contribution

  • I am willing to provide a fix
  • I will wait until somebody else fixes it

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions