spdx_tools.spdx3.bump_from_spdx2.license_expression

 1# SPDX-FileCopyrightText: 2023 spdx contributors
 2#
 3# SPDX-License-Identifier: Apache-2.0
 4from beartype.typing import List, Union
 5from license_expression import AND, OR, LicenseExpression, LicenseSymbol, LicenseWithExceptionSymbol
 6
 7from spdx_tools.common.spdx_licensing import spdx_licensing
 8from spdx_tools.spdx3.model.licensing import (
 9    AnyLicenseInfo,
10    ConjunctiveLicenseSet,
11    CustomLicense,
12    CustomLicenseAddition,
13    DisjunctiveLicenseSet,
14    License,
15    LicenseAddition,
16    LicenseField,
17    ListedLicense,
18    ListedLicenseException,
19    NoAssertionLicense,
20    NoneLicense,
21    WithAdditionOperator,
22)
23from spdx_tools.spdx.model import ExtractedLicensingInfo, SpdxNoAssertion, SpdxNone
24
25
26def bump_license_expression_or_none_or_no_assertion(
27    element: Union[LicenseExpression, SpdxNoAssertion, SpdxNone],
28    extracted_licensing_info: List[ExtractedLicensingInfo],
29) -> LicenseField:
30    if isinstance(element, SpdxNone):
31        return NoneLicense()
32    elif isinstance(element, SpdxNoAssertion):
33        return NoAssertionLicense()
34    else:
35        return bump_license_expression(element, extracted_licensing_info)
36
37
38def bump_license_expression(
39    license_expression: LicenseExpression, extracted_licensing_info: List[ExtractedLicensingInfo]
40) -> AnyLicenseInfo:
41    if isinstance(license_expression, AND):
42        return ConjunctiveLicenseSet(
43            member=[bump_license_expression(element, extracted_licensing_info) for element in license_expression.args]
44        )
45    if isinstance(license_expression, OR):
46        return DisjunctiveLicenseSet(
47            member=[bump_license_expression(element, extracted_licensing_info) for element in license_expression.args]
48        )
49    if isinstance(license_expression, LicenseWithExceptionSymbol):
50        subject_license = bump_license_expression(license_expression.license_symbol, extracted_licensing_info)
51        if not isinstance(subject_license, License):
52            raise ValueError("Subject of LicenseException couldn't be converted to License.")
53        return WithAdditionOperator(
54            subject_license=subject_license,
55            subject_addition=bump_license_exception(license_expression.exception_symbol, extracted_licensing_info),
56        )
57    if isinstance(license_expression, LicenseSymbol):
58        if not spdx_licensing.validate(license_expression).invalid_symbols:
59            return ListedLicense(license_expression.key, license_expression.obj, "blank")
60        else:
61            for licensing_info in extracted_licensing_info:
62                if licensing_info.license_id == license_expression.key:
63                    # the fields are optional in ExtractedLicensingInfo, to prevent type errors we use a type
64                    # conversion to str as a quick fix
65                    return CustomLicense(
66                        str(licensing_info.license_id),
67                        str(licensing_info.license_name),
68                        str(licensing_info.extracted_text),
69                    )
70
71            return CustomLicense(license_expression.key, "", "")
72
73
74def bump_license_exception(
75    license_exception: LicenseSymbol, extracted_licensing_info: List[ExtractedLicensingInfo]
76) -> LicenseAddition:
77    if not spdx_licensing.validate(license_exception).invalid_symbols:
78        return ListedLicenseException(license_exception.key, "", "")
79    else:
80        for licensing_info in extracted_licensing_info:
81            if licensing_info.license_id == license_exception.key:
82                # the fields are optional in ExtractedLicensingInfo, to prevent type errors we use a type conversion
83                # to str as a quick fix
84                return CustomLicenseAddition(
85                    str(licensing_info.license_id),
86                    str(licensing_info.license_name),
87                    str(licensing_info.extracted_text),
88                )
89        return CustomLicenseAddition(license_exception.key, "", "")
def bump_license_expression_or_none_or_no_assertion( element: Union[boolean.boolean.Expression, spdx_tools.spdx.model.spdx_no_assertion.SpdxNoAssertion, spdx_tools.spdx.model.spdx_none.SpdxNone], extracted_licensing_info: list[spdx_tools.spdx.model.extracted_licensing_info.ExtractedLicensingInfo]) -> spdx_tools.spdx3.model.licensing.license_field.LicenseField:
27def bump_license_expression_or_none_or_no_assertion(
28    element: Union[LicenseExpression, SpdxNoAssertion, SpdxNone],
29    extracted_licensing_info: List[ExtractedLicensingInfo],
30) -> LicenseField:
31    if isinstance(element, SpdxNone):
32        return NoneLicense()
33    elif isinstance(element, SpdxNoAssertion):
34        return NoAssertionLicense()
35    else:
36        return bump_license_expression(element, extracted_licensing_info)
def bump_license_expression( license_expression: boolean.boolean.Expression, extracted_licensing_info: list[spdx_tools.spdx.model.extracted_licensing_info.ExtractedLicensingInfo]) -> spdx_tools.spdx3.model.licensing.any_license_info.AnyLicenseInfo:
39def bump_license_expression(
40    license_expression: LicenseExpression, extracted_licensing_info: List[ExtractedLicensingInfo]
41) -> AnyLicenseInfo:
42    if isinstance(license_expression, AND):
43        return ConjunctiveLicenseSet(
44            member=[bump_license_expression(element, extracted_licensing_info) for element in license_expression.args]
45        )
46    if isinstance(license_expression, OR):
47        return DisjunctiveLicenseSet(
48            member=[bump_license_expression(element, extracted_licensing_info) for element in license_expression.args]
49        )
50    if isinstance(license_expression, LicenseWithExceptionSymbol):
51        subject_license = bump_license_expression(license_expression.license_symbol, extracted_licensing_info)
52        if not isinstance(subject_license, License):
53            raise ValueError("Subject of LicenseException couldn't be converted to License.")
54        return WithAdditionOperator(
55            subject_license=subject_license,
56            subject_addition=bump_license_exception(license_expression.exception_symbol, extracted_licensing_info),
57        )
58    if isinstance(license_expression, LicenseSymbol):
59        if not spdx_licensing.validate(license_expression).invalid_symbols:
60            return ListedLicense(license_expression.key, license_expression.obj, "blank")
61        else:
62            for licensing_info in extracted_licensing_info:
63                if licensing_info.license_id == license_expression.key:
64                    # the fields are optional in ExtractedLicensingInfo, to prevent type errors we use a type
65                    # conversion to str as a quick fix
66                    return CustomLicense(
67                        str(licensing_info.license_id),
68                        str(licensing_info.license_name),
69                        str(licensing_info.extracted_text),
70                    )
71
72            return CustomLicense(license_expression.key, "", "")
def bump_license_exception( license_exception: license_expression.LicenseSymbol, extracted_licensing_info: list[spdx_tools.spdx.model.extracted_licensing_info.ExtractedLicensingInfo]) -> spdx_tools.spdx3.model.licensing.license_addition.LicenseAddition:
75def bump_license_exception(
76    license_exception: LicenseSymbol, extracted_licensing_info: List[ExtractedLicensingInfo]
77) -> LicenseAddition:
78    if not spdx_licensing.validate(license_exception).invalid_symbols:
79        return ListedLicenseException(license_exception.key, "", "")
80    else:
81        for licensing_info in extracted_licensing_info:
82            if licensing_info.license_id == license_exception.key:
83                # the fields are optional in ExtractedLicensingInfo, to prevent type errors we use a type conversion
84                # to str as a quick fix
85                return CustomLicenseAddition(
86                    str(licensing_info.license_id),
87                    str(licensing_info.license_name),
88                    str(licensing_info.extracted_text),
89                )
90        return CustomLicenseAddition(license_exception.key, "", "")