@@ -71,11 +71,13 @@ def __init__( # noqa: PLR0913
7171 include : str = None ,
7272 exclude : str = None ,
7373 explicit : str = None ,
74+ license_sources : list = None ,
7475 ):
7576 super ().__init__ (debug , trace , quiet )
7677 self .result_file_path = result_file_path
7778 self .license_util = LicenseUtil ()
7879 self .license_util .init (include , exclude , explicit )
80+ self .license_sources = license_sources
7981 self .results = self ._load_input_file ()
8082
8183 def get_results (self ) -> Dict [str , Any ]:
@@ -162,9 +164,11 @@ def _append_license_to_component(self,
162164 self .print_debug (f'WARNING: Results missing licenses. Skipping: { new_component } ' )
163165 return
164166
165- licenses_order_by_source_priority = self ._get_licenses_order_by_source_priority (new_component ['licenses' ])
167+ # Select licenses based on configuration (filtering or priority mode)
168+ selected_licenses = self ._select_licenses (new_component ['licenses' ])
169+
166170 # Process licenses for this component
167- for license_item in licenses_order_by_source_priority :
171+ for license_item in selected_licenses :
168172 if license_item .get ('name' ):
169173 spdxid = license_item ['name' ]
170174 source = license_item .get ('source' )
@@ -309,19 +313,26 @@ def convert_components_to_list(self, components: dict):
309313 component ['licenses' ] = []
310314 return results_list
311315
312- def _get_licenses_order_by_source_priority (self ,licenses_data ):
316+ def _select_licenses (self , licenses_data ):
313317 """
314- Select licenses based on source priority:
315- 1. component_declared (highest priority)
316- 2. license_file
317- 3. file_header
318- 4. scancode (lowest priority)
318+ Select licenses based on configuration.
319+
320+ Two modes:
321+ - Filtering mode: If license_sources specified, filter to those sources
322+ - Priority mode: Otherwise, use original priority-based selection
319323
320- If any high-priority source is found, return only licenses from that source.
321- If none found, return all licenses.
324+ Args:
325+ licenses_data: List of license dictionaries
322326
323- Returns: list with ordered licenses by source.
327+ Returns:
328+ Filtered list of licenses based on configuration
324329 """
330+ # Filtering mode, when license_sources is explicitly provided
331+ if self .license_sources :
332+ sources_to_include = set (self .license_sources ) | {'unknown' }
333+ return [lic for lic in licenses_data
334+ if lic .get ('source' ) in sources_to_include or lic .get ('source' ) is None ]
335+
325336 # Define priority order (highest to lowest)
326337 priority_sources = ['component_declared' , 'license_file' , 'file_header' , 'scancode' ]
327338
0 commit comments