Skip to content

Commit 435255b

Browse files
Skip creating required phrase rules for generic licenses
Signed-off-by: Ayan Sinha Mahapatra <[email protected]>
1 parent 0a44594 commit 435255b

File tree

1 file changed

+43
-6
lines changed

1 file changed

+43
-6
lines changed

src/licensedcode/required_phrases.py

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,13 +243,22 @@ class RequiredPhraseDetails:
243243
)
244244
)
245245

246+
# Generic licenses should not be dumped as required phrase rules
247+
has_generic_license = attr.ib(
248+
default=0,
249+
metadata=dict(
250+
help='Has a generic license key in its license expression'
251+
)
252+
)
253+
246254
@classmethod
247255
def create_required_phrase_details(
248256
cls,
249257
license_expression,
250258
required_phrase_text,
251259
sources,
252260
length,
261+
has_generic_license=False,
253262
):
254263

255264
base_name = f"{license_expression}_required_phrase"
@@ -269,14 +278,17 @@ def create_required_phrase_details(
269278
rule.is_license_reference = True
270279
else:
271280
rule.is_license_tag = True
272-
rule.dump(rules_data_dir)
281+
282+
if not has_generic_license:
283+
rule.dump(rules_data_dir)
273284

274285
return cls(
275286
license_expression=license_expression,
276287
rule=rule,
277288
required_phrase_text=normalized_text,
278289
sources=sources,
279290
length=length,
291+
has_generic_license=has_generic_license,
280292
)
281293

282294
def update_sources(self, source_identifier):
@@ -313,7 +325,7 @@ def match_required_phrase_present(self, required_phrase_text):
313325
if rule:
314326
return rule
315327

316-
def update_required_phrase_sources(self, rule):
328+
def update_required_phrase_sources(self, rule, has_generic_license=False):
317329
"""
318330
Given a rule update the required phrases list with this rule
319331
@@ -333,7 +345,7 @@ def update_required_phrase_sources(self, rule):
333345

334346
# if rule is present as a rule in the index, set the is_required_phrase flag
335347
# and add to the list of required phrase rules
336-
if not rule.is_required_phrase:
348+
if not rule.is_required_phrase and not has_generic_license:
337349
rule.is_required_phrase = True
338350
rule.dump(rules_data_dir)
339351

@@ -344,6 +356,7 @@ def update_required_phrase_sources(self, rule):
344356
required_phrase_text=normalized_text,
345357
sources=[rule.identifier],
346358
length=len(normalized_text),
359+
has_generic_license=has_generic_license,
347360
)
348361
self.required_phrases.append(required_phrase_detail)
349362

@@ -369,16 +382,35 @@ def add_variations_of_required_phrases(self):
369382
if matched_rule and matched_rule.skip_collecting_required_phrases:
370383
continue
371384

385+
has_generic_license = does_have_generic_licenses(required_phrase.license_expression)
372386
if not matched_rule:
373387
required_phrase_detail = RequiredPhraseDetails.create_required_phrase_details(
374388
license_expression=required_phrase.license_expression,
375389
required_phrase_text=required_phrase_without_skip_word,
376390
sources=[required_phrase.rule.identifier],
377391
length=len(required_phrase_without_skip_word),
392+
has_generic_license=has_generic_license,
378393
)
379394
self.required_phrases.append(required_phrase_detail)
380395
else:
381-
self.update_required_phrase_sources(matched_rule)
396+
self.update_required_phrase_sources(
397+
rule=matched_rule,
398+
has_generic_license=has_generic_license,
399+
)
400+
401+
402+
def does_have_generic_licenses(license_expression):
403+
licensing = Licensing()
404+
license_keys = licensing.license_keys(license_expression)
405+
licenses_by_keys = load_licenses()
406+
has_generic_license = False
407+
for lic_key in license_keys:
408+
lic = licenses_by_keys.get(lic_key)
409+
if lic and lic.is_generic:
410+
has_generic_license = True
411+
break
412+
413+
return has_generic_license
382414

383415

384416
def collect_required_phrases_in_rules(
@@ -424,17 +456,22 @@ def collect_required_phrases_in_rules(
424456
if required_phrase_rule and required_phrase_rule.skip_collecting_required_phrases:
425457
continue
426458

459+
has_generic_license = does_have_generic_licenses(license_expression)
427460
if not required_phrase_rule:
428461
if not is_text_license_reference(required_phrase_text):
429462
required_phrase_detail = RequiredPhraseDetails.create_required_phrase_details(
430463
license_expression=license_expression,
431464
required_phrase_text=required_phrase_text,
432465
sources=[rule.identifier],
433466
length=len(required_phrase_text),
467+
has_generic_license=has_generic_license,
434468
)
435469
required_phrases_list.required_phrases.append(required_phrase_detail)
436470
elif required_phrase_rule.license_expression == license_expression:
437-
required_phrases_list.update_required_phrase_sources(required_phrase_rule)
471+
required_phrases_list.update_required_phrase_sources(
472+
rule=required_phrase_rule,
473+
has_generic_license=has_generic_license,
474+
)
438475

439476
if rule.identifier in TRACE_REQUIRED_PHRASE_FOR_RULES:
440477
click.echo(
@@ -493,7 +530,7 @@ def update_required_phrases_from_other_rules(
493530
click.echo(f'Writing required phrases sources for license_expression: {license_expression}')
494531

495532
for required_phrase_detail in required_phrases_list.required_phrases:
496-
if required_phrase_detail.sources:
533+
if required_phrase_detail.sources and not required_phrase_detail.has_generic_license:
497534
required_phrase_detail.rule.dump(
498535
rules_data_dir=rules_data_dir,
499536
sources=required_phrase_detail.sources

0 commit comments

Comments
 (0)