29
29
30
30
# global in-memory cache of the LicenseCache
31
31
_LICENSE_CACHE = None
32
+ _CACHED_DIRECTORIES = []
32
33
33
34
LICENSE_INDEX_LOCK_TIMEOUT = 60 * 4
34
35
LICENSE_INDEX_DIR = 'license_index'
@@ -58,6 +59,7 @@ def load_or_build(
58
59
timeout = LICENSE_INDEX_LOCK_TIMEOUT ,
59
60
licenses_data_dir = None ,
60
61
rules_data_dir = None ,
62
+ additional_directories = None ,
61
63
):
62
64
"""
63
65
Load or build and save and return a LicenseCache object.
@@ -92,6 +94,8 @@ def load_or_build(
92
94
from licensedcode .models import licenses_data_dir as ldd
93
95
from licensedcode .models import rules_data_dir as rdd
94
96
from licensedcode .models import load_licenses
97
+ from licensedcode .models import load_licenses_from_multiple_dirs
98
+ from licensedcode .models import get_license_dirs
95
99
from scancode import lockfile
96
100
97
101
licenses_data_dir = licenses_data_dir or ldd
@@ -106,13 +110,21 @@ def load_or_build(
106
110
# Here, the cache is either stale or non-existing: we need to
107
111
# rebuild all cached data (e.g. mostly the index) and cache it
108
112
109
- licenses_db = load_licenses (licenses_data_dir = licenses_data_dir )
113
+ if additional_directories :
114
+ additional_license_dirs = get_license_dirs (additional_dirs = additional_directories )
115
+ combined_directories = [licenses_data_dir ] + additional_license_dirs
116
+ licenses_db = load_licenses_from_multiple_dirs (license_directories = combined_directories )
117
+ else :
118
+ licenses_db = load_licenses (licenses_data_dir = licenses_data_dir )
110
119
120
+ # create a single merged index containing license data from licenses_data_dir
121
+ # and data from additional directories
111
122
index = build_index (
112
123
licenses_db = licenses_db ,
113
124
licenses_data_dir = licenses_data_dir ,
114
125
rules_data_dir = rules_data_dir ,
115
126
index_all_languages = index_all_languages ,
127
+ additional_directories = additional_directories ,
116
128
)
117
129
118
130
spdx_symbols = build_spdx_symbols (licenses_db = licenses_db )
@@ -143,6 +155,7 @@ def build_index(
143
155
licenses_data_dir = None ,
144
156
rules_data_dir = None ,
145
157
index_all_languages = False ,
158
+ additional_directories = None ,
146
159
):
147
160
"""
148
161
Return an index built from rules and licenses directories
@@ -151,19 +164,35 @@ def build_index(
151
164
Otherwise, only include the English license texts and rules (the default)
152
165
"""
153
166
from licensedcode .index import LicenseIndex
167
+ from licensedcode .models import get_license_dirs
168
+ from licensedcode .models import get_rule_dirs
154
169
from licensedcode .models import get_rules
170
+ from licensedcode .models import get_rules_from_multiple_dirs
155
171
from licensedcode .models import get_all_spdx_key_tokens
156
172
from licensedcode .models import get_license_tokens
157
173
from licensedcode .models import licenses_data_dir as ldd
158
174
from licensedcode .models import rules_data_dir as rdd
159
175
from licensedcode .models import load_licenses
176
+ from licensedcode .models import load_licenses_from_multiple_dirs
160
177
from licensedcode .legalese import common_license_words
161
178
162
179
licenses_data_dir = licenses_data_dir or ldd
163
180
rules_data_dir = rules_data_dir or rdd
164
181
165
- licenses_db = licenses_db or load_licenses (licenses_data_dir = licenses_data_dir )
166
- rules = get_rules (licenses_db = licenses_db , rules_data_dir = rules_data_dir )
182
+ if not licenses_db :
183
+ if additional_directories :
184
+ additional_license_dirs = get_license_dirs (additional_dirs = additional_directories )
185
+ combined_license_directories = [licenses_data_dir ] + additional_license_dirs
186
+ licenses_db = load_licenses_from_multiple_dirs (license_dirs = combined_license_directories )
187
+ else :
188
+ licenses_db = load_licenses (licenses_data_dir = licenses_data_dir )
189
+
190
+ if additional_directories :
191
+ additional_rule_dirs = get_rule_dirs (additional_dirs = additional_directories )
192
+ combined_rule_directories = [rules_data_dir ] + additional_rule_dirs
193
+ rules = get_rules_from_multiple_dirs (licenses_db = licenses_db , rule_directories = combined_rule_directories )
194
+ else :
195
+ rules = get_rules (licenses_db = licenses_db , rules_data_dir = rules_data_dir )
167
196
168
197
legalese = common_license_words
169
198
spdx_tokens = set (get_all_spdx_key_tokens (licenses_db ))
@@ -299,33 +328,45 @@ def build_unknown_spdx_symbol(licenses_db=None):
299
328
return LicenseSymbolLike (licenses_db ['unknown-spdx' ])
300
329
301
330
302
- def get_cache (force = False , index_all_languages = False ):
331
+ def get_cache (force = False , index_all_languages = False , additional_directories = None ):
303
332
"""
304
333
Return a LicenseCache either rebuilt, cached or loaded from disk.
305
334
306
335
If ``index_all_languages`` is True, include texts in all languages when
307
336
building the license index. Otherwise, only include the English license \
308
337
texts and rules (the default)
309
338
"""
310
- populate_cache (force = force , index_all_languages = index_all_languages )
339
+ populate_cache (force = force , index_all_languages = index_all_languages , additional_directories = additional_directories )
311
340
global _LICENSE_CACHE
312
341
return _LICENSE_CACHE
313
342
314
343
315
- def populate_cache (force = False , index_all_languages = False ):
344
+ def populate_cache (force = False , index_all_languages = False , additional_directories = None ):
316
345
"""
317
346
Load or build and cache a LicenseCache. Return None.
318
347
"""
319
348
global _LICENSE_CACHE
320
- if force or not _LICENSE_CACHE :
349
+ global _CACHED_DIRECTORIES
350
+ # check if we've already cached this set of additional directories
351
+ # if we have, pass
352
+ # otherwise, call LicenseCache.load_or_build() for every directory by using its path as licenses_data_dir
353
+ # and rules_data_dir
354
+ should_cache_additional_directories = additional_directories is not None \
355
+ and sorted (additional_directories ) != sorted (_CACHED_DIRECTORIES )
356
+ if should_cache_additional_directories :
357
+ # otherwise we will just return previous cache on line 84
358
+ force = True
359
+ if force or not _LICENSE_CACHE or should_cache_additional_directories :
321
360
_LICENSE_CACHE = LicenseCache .load_or_build (
322
361
licensedcode_cache_dir = licensedcode_cache_dir ,
323
362
scancode_cache_dir = scancode_cache_dir ,
324
363
force = force ,
325
364
index_all_languages = index_all_languages ,
326
365
# used for testing only
327
366
timeout = LICENSE_INDEX_LOCK_TIMEOUT ,
367
+ additional_directories = additional_directories ,
328
368
)
369
+ _CACHED_DIRECTORIES = additional_directories
329
370
330
371
331
372
def load_cache_file (cache_file ):
@@ -346,11 +387,15 @@ def load_cache_file(cache_file):
346
387
raise Exception (msg ) from e
347
388
348
389
349
- def get_index (force = False , index_all_languages = False ):
390
+ def get_index (force = False , index_all_languages = False , additional_directories = None ):
350
391
"""
351
392
Return and eventually build and cache a LicenseIndex.
352
393
"""
353
- return get_cache (force = force , index_all_languages = index_all_languages ).index
394
+ return get_cache (
395
+ force = force ,
396
+ index_all_languages = index_all_languages ,
397
+ additional_directories = additional_directories
398
+ ).index
354
399
355
400
356
401
get_cached_index = get_index
0 commit comments