@@ -189,6 +189,13 @@ class License:
189189 help = 'Free text notes.' )
190190 )
191191
192+ is_builtin = attr .ib (
193+ default = True ,
194+ repr = False ,
195+ metadata = dict (
196+ help = 'Flag set to True if this license is a built in license in the ScanCode LicenseDB.' )
197+ )
198+
192199 # TODO: add the license key(s) this exception applies to
193200 is_exception = attr .ib (
194201 default = False ,
@@ -349,12 +356,12 @@ class License:
349356 )
350357
351358 @classmethod
352- def from_dir (cls , key , licenses_data_dir = licenses_data_dir ):
359+ def from_dir (cls , key , licenses_data_dir = licenses_data_dir , is_builtin = True ):
353360 """
354361 Return a new License object for a license ``key`` and load its attribute
355362 from a data file stored in ``licenses_data_dir``.
356363 """
357- lic = cls (key = key )
364+ lic = cls (key = key , is_builtin = is_builtin )
358365 data_file = lic .data_file (licenses_data_dir = licenses_data_dir )
359366 if exists (data_file ):
360367 text_file = lic .text_file (licenses_data_dir = licenses_data_dir )
@@ -685,6 +692,7 @@ def load_licenses(
685692 licenses_data_dir = licenses_data_dir ,
686693 with_deprecated = False ,
687694 check_dangling = True ,
695+ is_builtin = True ,
688696):
689697 """
690698 Return a mapping of {key: License} loaded from license data and text files
@@ -712,7 +720,7 @@ def load_licenses(
712720 key = file_base_name (data_file )
713721
714722 try :
715- lic = License .from_dir (key = key , licenses_data_dir = licenses_data_dir )
723+ lic = License .from_dir (key = key , licenses_data_dir = licenses_data_dir , is_builtin = is_builtin )
716724 except Exception as e :
717725 raise Exception (f'Failed to load license: { key } from: file://{ licenses_data_dir } /{ key } .yml with error: { e } ' ) from e
718726
@@ -752,6 +760,7 @@ def get_rules(
752760 licenses_data_dir = licenses_data_dir ,
753761 rules_data_dir = rules_data_dir ,
754762 validate = False ,
763+ is_builtin = True ,
755764):
756765 """
757766 Yield Rule objects loaded from a ``licenses_db`` and license files found in
@@ -764,6 +773,7 @@ def get_rules(
764773
765774 rules = list (load_rules (
766775 rules_data_dir = rules_data_dir ,
776+ is_builtin = is_builtin ,
767777 ))
768778
769779 if validate :
@@ -815,6 +825,7 @@ def get_paths_to_installed_licenses_and_rules():
815825
816826def load_licenses_from_multiple_dirs (
817827 license_directories ,
828+ scancode_license_dir ,
818829 with_deprecated = False ,
819830):
820831 """
@@ -824,7 +835,8 @@ def load_licenses_from_multiple_dirs(
824835 combined_licenses = {}
825836 combined_licenses_keys = set ()
826837 for license_dir in license_directories :
827- licenses = load_licenses (licenses_data_dir = license_dir , with_deprecated = False )
838+ is_builtin = scancode_license_dir == license_dir
839+ licenses = load_licenses (licenses_data_dir = license_dir , with_deprecated = False , is_builtin = is_builtin )
828840 # check if two dictionaries have duplicate keys
829841 licenses_keys = set (licenses .keys ())
830842 duplicate_keys = combined_licenses_keys .intersection (licenses_keys )
@@ -842,6 +854,7 @@ def load_licenses_from_multiple_dirs(
842854def get_rules_from_multiple_dirs (
843855 licenses_db ,
844856 rule_directories ,
857+ scancode_rules_dir ,
845858):
846859 """
847860 Return a mapping of {key: License} built from a list of ``license_directories``.
@@ -851,8 +864,10 @@ def get_rules_from_multiple_dirs(
851864 if rule_directories :
852865 combined_rules = []
853866 for rules_dir in rule_directories :
867+ is_builtin = rules_dir == scancode_rules_dir
854868 r = list (load_rules (
855869 rules_data_dir = rules_dir ,
870+ is_builtin = is_builtin ,
856871 ))
857872 combined_rules .append (r )
858873 # flatten lists of rules into a single iterable
@@ -868,12 +883,12 @@ class InvalidLicense(Exception):
868883 pass
869884
870885
871- def validate_additional_license_data (additional_directories ):
886+ def validate_additional_license_data (additional_directories , scancode_license_dir ):
872887 """
873888 Raises an exception if there are any invalid licenses in the directories of
874889 additional licenses.
875890 """
876- licenses = load_licenses_from_multiple_dirs (additional_directories )
891+ licenses = load_licenses_from_multiple_dirs (additional_directories , scancode_license_dir )
877892 errors , _ , _ = License .validate (
878893 licenses ,
879894 verbose = False ,
@@ -907,7 +922,7 @@ def _ignorable_clue_error(rule):
907922 return result , expected
908923
909924
910- def validate_ignorable_clues (rule_directories ):
925+ def validate_ignorable_clues (rule_directories , is_builtin ):
911926 """
912927 Raises an exception if any ignorable clues declared in a Rule are improperly detected
913928 in the rule text file.
@@ -916,6 +931,7 @@ def validate_ignorable_clues(rule_directories):
916931 for rules_dir in rule_directories :
917932 r = list (load_rules (
918933 rules_data_dir = rules_dir ,
934+ is_builtin = is_builtin ,
919935 ))
920936 combined_rules .append (r )
921937 # flatten lists of rules into a single iterable
@@ -1012,6 +1028,7 @@ def build_rule_from_license(license_obj):
10121028 has_stored_minimum_coverage = bool (minimum_coverage ),
10131029 minimum_coverage = minimum_coverage ,
10141030
1031+ is_builtin = license_obj .is_builtin ,
10151032 is_from_license = True ,
10161033 is_license_text = True ,
10171034
@@ -1064,7 +1081,7 @@ def get_license_tokens():
10641081 yield 'licensed'
10651082
10661083
1067- def load_rules (rules_data_dir = rules_data_dir , with_checks = True ):
1084+ def load_rules (rules_data_dir = rules_data_dir , with_checks = True , is_builtin = True ):
10681085 """
10691086 Return an iterable of rules loaded from rule files in ``rules_data_dir``.
10701087 Optionally check for consistency if ``with_checks`` is True.
@@ -1088,7 +1105,7 @@ def load_rules(rules_data_dir=rules_data_dir, with_checks=True):
10881105 text_file = join (rules_data_dir , f'{ base_name } .RULE' )
10891106
10901107 try :
1091- yield Rule .from_files (data_file = data_file , text_file = text_file )
1108+ yield Rule .from_files (data_file = data_file , text_file = text_file , is_builtin = is_builtin )
10921109 except Exception as re :
10931110 if with_checks :
10941111 model_errors .append (str (re ))
@@ -1193,6 +1210,13 @@ class BasicRule:
11931210 'string.' )
11941211 )
11951212
1213+ is_builtin = attr .ib (
1214+ default = True ,
1215+ repr = False ,
1216+ metadata = dict (
1217+ help = 'Flag set to True if this license is a built in license in the ScanCode LicenseDB.' )
1218+ )
1219+
11961220 # The is_license_xxx flags below are nn indication of what this rule
11971221 # importance is (e.g. how important is its text when detected as a licensing
11981222 # clue) as one of several "is_license_xxx" flags. These flags are mutually
@@ -1877,12 +1901,12 @@ def __attrs_post_init__(self, *args, **kwargs):
18771901 self .setup ()
18781902
18791903 @classmethod
1880- def from_files (cls , data_file , text_file ):
1904+ def from_files (cls , data_file , text_file , is_builtin ):
18811905 """
18821906 Return a new Rule object loaded from a data file stored at
18831907 ``data_file`` and a companion ``text_file``.
18841908 """
1885- rule = Rule ()
1909+ rule = Rule (is_builtin = is_builtin )
18861910 rule .load_data (data_file = data_file , text_file = text_file )
18871911 return rule
18881912
0 commit comments