Skip to content

Commit 43ca60c

Browse files
committed
Ensure license names are unique ignoring case
Signed-off-by: Philippe Ombredanne <[email protected]>
1 parent 609314c commit 43ca60c

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

src/licensedcode/models.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -516,17 +516,23 @@ def validate(licenses, verbose=False, no_dupe_urls=False):
516516
errors = defaultdict(list)
517517

518518
# used for global dedupe of texts
519-
by_spdx_key = defaultdict(list)
519+
by_spdx_key_lowered = defaultdict(list)
520520
by_text = defaultdict(list)
521-
by_short_name = defaultdict(list)
522-
by_name = defaultdict(list)
521+
by_short_name_lowered = defaultdict(list)
522+
by_name_lowered = defaultdict(list)
523523

524524
for key, lic in licenses.items():
525525
warn = warnings[key].append
526526
info = infos[key].append
527527
error = errors[key].append
528-
by_name[lic.name].append(lic)
529-
by_short_name[lic.short_name].append(lic)
528+
if lic.name:
529+
by_name_lowered[lic.name.lower()].append(lic)
530+
else:
531+
by_name_lowered[lic.name].append(lic)
532+
if lic.short_name:
533+
by_short_name_lowered[lic.short_name.lower()].append(lic)
534+
else:
535+
by_short_name_lowered[lic.short_name].append(lic)
530536

531537
if lic.key != lic.key.lower():
532538
error('Incorrect license key case. Should be lowercase.')
@@ -608,17 +614,17 @@ def validate(licenses, verbose=False, no_dupe_urls=False):
608614
if len(lic.spdx_license_key) > 50:
609615
error('spdx_license_key must be 50 characters or less.')
610616

611-
by_spdx_key[lic.spdx_license_key].append(key)
617+
by_spdx_key_lowered[lic.spdx_license_key.lower()].append(key)
612618
else:
613619
# SPDX license key is now mandatory
614620
error('No SPDX license key')
615621

616622
for oslk in lic.other_spdx_license_keys:
617-
by_spdx_key[oslk].append(key)
623+
by_spdx_key_lowered[oslk].append(key)
618624

619625
# global SPDX consistency
620626
multiple_spdx_keys_used = {
621-
k: v for k, v in by_spdx_key.items()
627+
k: v for k, v in by_spdx_key_lowered.items()
622628
if len(v) > 1
623629
}
624630

@@ -638,20 +644,20 @@ def validate(licenses, verbose=False, no_dupe_urls=False):
638644
)
639645

640646
# global short_name dedupe
641-
for short_name, licenses in by_short_name.items():
647+
for short_name, licenses in by_short_name_lowered.items():
642648
if len(licenses) == 1:
643649
continue
644650
errors['GLOBAL'].append(
645-
f'Duplicate short name: {short_name} in licenses: ' +
651+
f'Duplicate short name (ignoring case): {short_name} in licenses: ' +
646652
', '.join(l.key for l in licenses)
647653
)
648654

649655
# global name dedupe
650-
for name, licenses in by_name.items():
656+
for name, licenses in by_name_lowered.items():
651657
if len(licenses) == 1:
652658
continue
653659
errors['GLOBAL'].append(
654-
f'Duplicate name: {name} in licenses: ' +
660+
f'Duplicate name (ignoring case): {name} in licenses: ' +
655661
', '.join(l.key for l in licenses)
656662
)
657663

@@ -837,7 +843,6 @@ def build_rule_from_license(license_obj):
837843
)
838844

839845

840-
841846
def get_all_spdx_keys(licenses_db):
842847
"""
843848
Return an iterable of SPDX license keys collected from a `licenses_db`

tests/licensedcode/test_models.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ def test_build_rules_from_licenses(self):
106106
expected = self.get_test_loc('models/license_rules.expected.json')
107107
check_json(expected, results)
108108

109-
def test_validate_license_library(self):
109+
def test_validate_license_library_data(self):
110110
errors, warnings, infos = models.License.validate(
111-
licenses=models.load_licenses(),
111+
licenses=models.load_licenses(with_deprecated=False),
112112
verbose=False,
113113
)
114114
assert errors == {}
@@ -127,8 +127,8 @@ def test_validate_license_library_can_return_errors(self):
127127
expected_errors = {
128128
'GLOBAL': [
129129
'Duplicate texts in multiple licenses: apache-2.0: TEXT, bsd-ack-carrot2: TEXT',
130-
'Duplicate short name: GPL 1.0 in licenses: gpl-1.0-plus, gpl-1.0',
131-
'Duplicate name: GNU General Public License 1.0 in licenses: gpl-1.0-plus, gpl-1.0'],
130+
'Duplicate short name (ignoring case): gpl 1.0 in licenses: gpl-1.0-plus, gpl-1.0',
131+
'Duplicate name (ignoring case): gnu general public license 1.0 in licenses: gpl-1.0-plus, gpl-1.0'],
132132
'bsd-ack-carrot2': [
133133
'No short name',
134134
'No name',

0 commit comments

Comments
 (0)