Skip to content

Commit d6fdfbe

Browse files
Fail verbosely in build_spdx_license_expression
Signed-off-by: Ayan Sinha Mahapatra <[email protected]>
1 parent 190f035 commit d6fdfbe

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

src/licensedcode/cache.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,5 +510,47 @@ def build_spdx_license_expression(license_expression, licensing=None):
510510
"""
511511
if not licensing:
512512
licensing = get_licensing()
513+
validate_spdx_license_keys(license_expression=license_expression, licensing=licensing)
513514
parsed = licensing.parse(license_expression)
514515
return parsed.render(template='{symbol.wrapped.spdx_license_key}')
516+
517+
518+
def validate_spdx_license_keys(license_expression, licensing):
519+
"""
520+
Raise InvalidLicenseKeyError for the cases where the there is no corresponding :
521+
522+
"""
523+
from licensedcode.models import load_licenses
524+
525+
license_keys = licensing.license_keys(license_expression)
526+
license_db = get_licenses_db()
527+
528+
messages = []
529+
530+
for key in license_keys:
531+
if not type(key) == str:
532+
msg = f"Invalid license key: {key} of type {type(key)}, license key should be a string"
533+
messages.append(msg)
534+
535+
lic = license_db.get(key, None)
536+
if not lic:
537+
licenses = load_licenses(with_deprecated=True)
538+
if licenses.get(key, None):
539+
msg = f"License key: {key} is deprecated license key in LicenseDB"
540+
else:
541+
msg = f"License key: {key} is not a valid license key from LicenseDB"
542+
messages.append(msg)
543+
544+
parsed = licensing.parse(key)
545+
try:
546+
parsed.render(template='{symbol.wrapped.spdx_license_key}')
547+
except AttributeError:
548+
messages.append(msg)
549+
pass
550+
551+
if messages:
552+
raise InvalidLicenseKeyError(messages)
553+
554+
555+
class InvalidLicenseKeyError(Exception):
556+
pass

tests/licensedcode/test_zzzz_cache.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,32 @@ def test_get_spdx_symbols_checks_duplicates_with_deprecated_on_live_db(self):
155155
from licensedcode.models import load_licenses
156156
test_licenses = load_licenses(with_deprecated=True)
157157
cache.get_spdx_symbols(licenses_db=test_licenses)
158+
159+
def test_build_spdx_license_expression(self):
160+
from licensedcode.cache import build_spdx_license_expression
161+
assert build_spdx_license_expression("mit")
162+
163+
def test_build_spdx_license_expression_fails_on_invalid_key_none(self):
164+
from licensedcode.cache import build_spdx_license_expression
165+
from licensedcode.cache import InvalidLicenseKeyError
166+
try:
167+
build_spdx_license_expression("mit AND None")
168+
except InvalidLicenseKeyError:
169+
pass
170+
171+
def test_build_spdx_license_expression_fails_on_deprecated_license(self):
172+
# TODO: this should not fail, see https://github.com/nexB/scancode-toolkit/issues/3400
173+
from licensedcode.cache import build_spdx_license_expression
174+
from licensedcode.cache import InvalidLicenseKeyError
175+
try:
176+
assert build_spdx_license_expression("broadcom-linking-unmodified")
177+
except InvalidLicenseKeyError:
178+
pass
179+
180+
def test_build_spdx_license_expression_fails_on_invalid_key(self):
181+
from licensedcode.cache import build_spdx_license_expression
182+
from licensedcode.cache import InvalidLicenseKeyError
183+
try:
184+
assert build_spdx_license_expression("mitt")
185+
except InvalidLicenseKeyError:
186+
pass

0 commit comments

Comments
 (0)