@@ -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
384416def 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