scanoss 1.20.4__py3-none-any.whl → 1.20.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
scanoss/spdxlite.py CHANGED
@@ -31,6 +31,7 @@ import re
31
31
  import sys
32
32
 
33
33
  import importlib_resources
34
+ from packageurl import PackageURL
34
35
 
35
36
  from . import __version__
36
37
 
@@ -78,15 +79,31 @@ class SpdxLite:
78
79
  return self._process_files(data)
79
80
 
80
81
  def _process_files(self, data: json) -> dict:
81
- """Process each file in the data and build summary."""
82
+ """
83
+ Process raw results and build a component summary.
84
+
85
+ Args:
86
+ data: JSON data containing raw results
87
+
88
+ Returns:
89
+ dict: The built summary dictionary
90
+ """
82
91
  summary = {}
83
92
  for file_path in data:
84
93
  file_details = data.get(file_path)
85
- self._process_file_entries(file_path, file_details, summary)
94
+ # summary is passed by reference and modified inside the function
95
+ self._process_entries(file_path, file_details, summary)
86
96
  return summary
87
97
 
88
- def _process_file_entries(self, file_path: str, file_details: list, summary: dict):
89
- """Process entries for a single file."""
98
+ def _process_entries(self, file_path: str, file_details: list, summary: dict):
99
+ """
100
+ Process entries for a single file.
101
+
102
+ Args:
103
+ file_path: Path to the file being processed
104
+ file_details: Results of the file
105
+ summary: Reference to summary dictionary that will be modified in place
106
+ """
90
107
  for entry in file_details:
91
108
  id_details = entry.get('id')
92
109
  if not id_details or id_details == 'none':
@@ -95,10 +112,17 @@ class SpdxLite:
95
112
  if id_details == 'dependency':
96
113
  self._process_dependency_entry(file_path, entry, summary)
97
114
  else:
98
- self._process_normal_entry(file_path, entry, summary)
115
+ self._process_file_entry(file_path, entry, summary)
99
116
 
100
117
  def _process_dependency_entry(self, file_path: str, entry: dict, summary: dict):
101
- """Process a dependency type entry."""
118
+ """
119
+ Process a dependency type entry.
120
+
121
+ Args:
122
+ file_path: Path to the file being processed
123
+ entry: The dependency entry to process
124
+ summary: Reference to summary dictionary that will be modified in place
125
+ """
102
126
  dependencies = entry.get('dependencies')
103
127
  if not dependencies:
104
128
  self.print_stderr(f'Warning: No Dependencies found for {file_path}')
@@ -108,11 +132,18 @@ class SpdxLite:
108
132
  purl = dep.get('purl')
109
133
  if not self._is_valid_purl(file_path, dep, purl, summary):
110
134
  continue
111
-
135
+ # Modifying the summary dictionary directly as it's passed by reference
112
136
  summary[purl] = self._create_dependency_summary(dep)
113
137
 
114
- def _process_normal_entry(self, file_path: str, entry: dict, summary: dict):
115
- """Process a normal file type entry."""
138
+ def _process_file_entry(self, file_path: str, entry: dict, summary: dict):
139
+ """
140
+ Process file entry.
141
+
142
+ Args:
143
+ file_path: Path to the file being processed
144
+ entry: Process file match entry
145
+ summary: Reference to summary dictionary that will be modified in place
146
+ """
116
147
  purls = entry.get('purl')
117
148
  if not purls:
118
149
  self.print_stderr(f'Purl block missing for {file_path}')
@@ -122,10 +153,21 @@ class SpdxLite:
122
153
  if not self._is_valid_purl(file_path, entry, purl, summary):
123
154
  return
124
155
 
125
- summary[purl] = self._create_normal_summary(entry)
156
+ summary[purl] = self._create_file_summary(entry)
126
157
 
127
158
  def _is_valid_purl(self, file_path: str, entry: dict, purl: str, summary: dict) -> bool:
128
- """Check if PURL is valid and not already processed."""
159
+ """
160
+ Check if purl is valid and not already processed.
161
+
162
+ Args:
163
+ file_path: Path to the file being processed
164
+ entry: The entry containing the PURL
165
+ purl: The PURL to validate
166
+ summary: Reference to summary dictionary to check for existing entries
167
+
168
+ Returns:
169
+ bool: True if purl is valid and not already processed
170
+ """
129
171
  if not purl:
130
172
  self.print_stderr(f'Warning: No PURL found for {file_path}: {entry}')
131
173
  return False
@@ -137,15 +179,37 @@ class SpdxLite:
137
179
  return True
138
180
 
139
181
  def _create_dependency_summary(self, dep: dict) -> dict:
140
- """Create summary for dependency entry."""
182
+ """
183
+ Create summary for dependency entry.
184
+
185
+ This method extracts relevant fields from a dependency entry and creates a
186
+ standardized summary dictionary. It handles fields like component, version,
187
+ and URL, with special processing for licenses.
188
+
189
+ Args:
190
+ dep (dict): The dependency entry containing component information
191
+
192
+ Returns:
193
+ dict: A new summary dictionary containing the extracted and processed fields
194
+ """
141
195
  summary = {}
142
196
  for field in ['component', 'version', 'url']:
143
197
  summary[field] = dep.get(field, '')
144
198
  summary['licenses'] = self._process_licenses(dep.get('licenses'))
145
199
  return summary
146
200
 
147
- def _create_normal_summary(self, entry: dict) -> dict:
148
- """Create summary for normal file entry."""
201
+ def _create_file_summary(self, entry: dict) -> dict:
202
+ """
203
+ Create summary for file entry.
204
+
205
+ This method extracts set of fields from file entry and creates a standardized summary dictionary.
206
+
207
+ Args:
208
+ entry (dict): The file entry containing the metadata to summarize
209
+
210
+ Returns:
211
+ dict: A new summary dictionary containing all extracted and processed fields
212
+ """
149
213
  summary = {}
150
214
  fields = ['id', 'vendor', 'component', 'version', 'latest',
151
215
  'url', 'url_hash', 'download_url']
@@ -155,7 +219,22 @@ class SpdxLite:
155
219
  return summary
156
220
 
157
221
  def _process_licenses(self, licenses: list) -> list:
158
- """Process license information and remove duplicates."""
222
+ """
223
+ Process license information and remove duplicates.
224
+
225
+ This method filters license information to include only licenses from trusted sources
226
+ ('component_declared' or 'license_file') and removes any duplicate license names.
227
+ The result is a simplified list of license dictionaries containing only the 'id' field.
228
+
229
+ Args:
230
+ licenses (list): A list of license dictionaries, each containing at least 'name'
231
+ and 'source' fields. Can be None or empty.
232
+
233
+ Returns:
234
+ list: A filtered and deduplicated list of license dictionaries, where each
235
+ dictionary contains only an 'id' field matching the original license name.
236
+ Returns an empty list if input is None or empty.
237
+ """
159
238
  if not licenses:
160
239
  return []
161
240
 
@@ -164,6 +243,9 @@ class SpdxLite:
164
243
 
165
244
  for license_info in licenses:
166
245
  name = license_info.get('name')
246
+ source = license_info.get('source')
247
+ if source not in ("component_declared", "license_file", "file_header"):
248
+ continue
167
249
  if name and name not in seen_names:
168
250
  processed_licenses.append({'id': name})
169
251
  seen_names.add(name)
@@ -205,7 +287,30 @@ class SpdxLite:
205
287
  return self._write_output(spdx_document, output_file)
206
288
 
207
289
  def _create_base_document(self, raw_data: dict) -> dict:
208
- """Create the base SPDX document structure."""
290
+ """
291
+ Create the base SPDX document structure.
292
+
293
+ This method initializes a new SPDX document with standard fields required by
294
+ the SPDX 2.2 specification. It generates a unique document namespace using
295
+ a hash of the raw data and current timestamp.
296
+
297
+ Args:
298
+ raw_data (dict): The raw component data used to create a unique identifier
299
+ for the document namespace
300
+
301
+ Returns:
302
+ dict: A dictionary containing the base SPDX document structure with the
303
+ following fields:
304
+ - spdxVersion: The SPDX specification version
305
+ - dataLicense: The license for the SPDX document itself
306
+ - SPDXID: The document's unique identifier
307
+ - name: The name of the SBOM
308
+ - creationInfo: Information about when and how the document was created
309
+ - documentNamespace: A unique URI for this document
310
+ - documentDescribes: List of packages described (initially empty)
311
+ - hasExtractedLicensingInfos: List of licenses (initially empty)
312
+ - packages: List of package information (initially empty)
313
+ """
209
314
  now = datetime.datetime.utcnow()
210
315
  md5hex = hashlib.md5(f'{raw_data}-{now}'.encode('utf-8')).hexdigest()
211
316
 
@@ -222,7 +327,23 @@ class SpdxLite:
222
327
  }
223
328
 
224
329
  def _create_creation_info(self, timestamp: datetime.datetime) -> dict:
225
- """Create the creation info section."""
330
+ """
331
+ Create the creation info section of an SPDX document.
332
+
333
+ This method generates the creation information required by the SPDX specification,
334
+ including timestamps, creator information, and document type.
335
+
336
+ Args:
337
+ timestamp (datetime.datetime): The UTC timestamp representing when the
338
+ document was created
339
+
340
+ Returns:
341
+ dict: A dictionary containing creation information with the following fields:
342
+ - created: ISO 8601 formatted timestamp
343
+ - creators: List of entities involved in creating the document
344
+ (tool, person, and organization)
345
+ - comment: Additional information about the SBOM type
346
+ """
226
347
  return {
227
348
  'created': timestamp.strftime('%Y-%m-%dT%H:%M:%SZ'),
228
349
  'creators': [
@@ -234,7 +355,25 @@ class SpdxLite:
234
355
  }
235
356
 
236
357
  def _process_packages(self, raw_data: dict, spdx_document: dict):
237
- """Process packages and add them to the SPDX document."""
358
+ """
359
+ Process packages and add them to the SPDX document.
360
+
361
+ This method iterates through the raw component data, creates package information
362
+ for each component, and adds them to the SPDX document. It also collects
363
+ license references to be processed separately.
364
+
365
+ Args:
366
+ raw_data (dict): Dictionary of package data indexed by PURL
367
+ (Package URL identifiers)
368
+ spdx_document (dict): Reference to the SPDX document being built,
369
+ which will be modified in place
370
+
371
+ Note:
372
+ This method modifies the spdx_document dictionary in place by:
373
+ 1. Adding package information to the 'packages' list
374
+ 2. Adding package SPDXIDs to the 'documentDescribes' list
375
+ 3. Indirectly populating 'hasExtractedLicensingInfos' via _process_license_refs()
376
+ """
238
377
  lic_refs = set()
239
378
 
240
379
  for purl, comp in raw_data.items():
@@ -245,7 +384,36 @@ class SpdxLite:
245
384
  self._process_license_refs(lic_refs, spdx_document)
246
385
 
247
386
  def _create_package_info(self, purl: str, comp: dict, lic_refs: set) -> dict:
248
- """Create package information for SPDX document."""
387
+ """
388
+ Create package information for SPDX document.
389
+
390
+ This method generates a complete package information entry following the SPDX
391
+ specification format. It creates a unique identifier for the package based on
392
+ its PURL and version, processes license information, and formats all required
393
+ fields for the SPDX document.
394
+
395
+ Args:
396
+ purl (str): Package URL identifier for the component
397
+ comp (dict): Component information dictionary containing metadata like
398
+ component name, version, URLs, and license information
399
+ lic_refs (set): Reference to a set that will be populated with license
400
+ references found in this package. This set is modified in place.
401
+
402
+ Returns:
403
+ dict: A dictionary containing all required SPDX package fields including:
404
+ - name: Component name
405
+ - SPDXID: Unique identifier for this package within the document
406
+ - versionInfo: Component version
407
+ - downloadLocation: URL where the package can be downloaded
408
+ - homepage: Component homepage URL
409
+ - licenseDeclared: Formatted license expression
410
+ - licenseConcluded: NOASSERTION as automated conclusion isn't possible
411
+ - filesAnalyzed: False as files are not individually analyzed
412
+ - copyrightText: NOASSERTION as copyright text isn't available
413
+ - supplier: Organization name from vendor information
414
+ - externalRefs: Package URL reference for package manager integration
415
+ - checksums: MD5 hash of the package if available
416
+ """
249
417
  lic_text = self._process_package_licenses(comp.get('licenses', []), lic_refs)
250
418
  comp_ver = comp.get('version')
251
419
  purl_ver = f'{purl}@{comp_ver}'
@@ -265,7 +433,7 @@ class SpdxLite:
265
433
  'externalRefs': [
266
434
  {
267
435
  'referenceCategory': 'PACKAGE-MANAGER',
268
- 'referenceLocator': purl_ver,
436
+ 'referenceLocator': PackageURL.from_string(purl_ver).to_string(),
269
437
  'referenceType': 'purl'
270
438
  }
271
439
  ],
@@ -278,20 +446,47 @@ class SpdxLite:
278
446
  }
279
447
 
280
448
  def _process_package_licenses(self, licenses: list, lic_refs: set) -> str:
281
- """Process licenses and return license text."""
449
+ """
450
+ Process licenses and return license text formatted for SPDX.
451
+
452
+ This method processes a list of license objects, extracts valid license IDs,
453
+ converts them to SPDX format, and combines them into a properly formatted
454
+ license expression.
455
+
456
+ Args:
457
+ licenses (list): List of license dictionaries, each containing at least
458
+ an 'id' field
459
+ lic_refs (set): Reference to a set that will collect license references.
460
+ This set is modified in place.
461
+
462
+ Returns:
463
+ str: A formatted license expression string following SPDX syntax.
464
+ Returns 'NOASSERTION' if no valid licenses are found.
465
+ """
282
466
  if not licenses:
283
467
  return 'NOASSERTION'
284
468
 
285
469
  lic_set = set()
286
470
  for lic in licenses:
287
471
  lc_id = lic.get('id')
288
- if lc_id:
289
- self._process_license_id(lc_id, lic_refs, lic_set)
472
+ self._process_license_id(lc_id, lic_refs, lic_set)
290
473
 
291
474
  return self._format_license_text(lic_set)
292
475
 
293
476
  def _process_license_id(self, lc_id: str, lic_refs: set, lic_set: set):
294
- """Process individual license ID."""
477
+ """
478
+ Process individual license ID and add to appropriate sets.
479
+
480
+ This method attempts to convert a license ID to its SPDX equivalent.
481
+ If not found in the SPDX license list, it's formatted as a LicenseRef
482
+ and added to the license references set.
483
+
484
+ Args:
485
+ lc_id (str): The license ID to process
486
+ lic_refs (set): Reference to a set that collects license references
487
+ for later processing. Modified in place.
488
+ lic_set (set): Reference to a set collecting all license IDs for
489
+ """
295
490
  spdx_id = self.get_spdx_license_id(lc_id)
296
491
  if not spdx_id:
297
492
  if not lc_id.startswith('LicenseRef'):
@@ -300,7 +495,20 @@ class SpdxLite:
300
495
  lic_set.add(spdx_id if spdx_id else lc_id)
301
496
 
302
497
  def _format_license_text(self, lic_set: set) -> str:
303
- """Format the license text with proper syntax."""
498
+ """
499
+ Format the license text with proper SPDX syntax.
500
+
501
+ This method combines multiple license IDs with the 'AND' operator
502
+ according to SPDX specification rules. If multiple licenses are present,
503
+ the expression is enclosed in parentheses.
504
+
505
+ Args:
506
+ lic_set (set): Set of license IDs to format
507
+
508
+ Returns:
509
+ str: A properly formatted SPDX license expression.
510
+ Returns 'NOASSERTION' if the set is empty.
511
+ """
304
512
  if not lic_set:
305
513
  return 'NOASSERTION'
306
514
 
@@ -310,13 +518,44 @@ class SpdxLite:
310
518
  return lic_text
311
519
 
312
520
  def _process_license_refs(self, lic_refs: set, spdx_document: dict):
313
- """Process and add license references to the document."""
521
+ """
522
+ Process and add license references to the SPDX document.
523
+
524
+ This method processes each license reference in the provided set
525
+ and adds corresponding license information to the SPDX document's
526
+ extracted licensing information section.
527
+
528
+ Args:
529
+ lic_refs (set): Set of license references to process
530
+ spdx_document (dict): Reference to the SPDX document being built,
531
+ which will be modified in place
532
+
533
+ Note:
534
+ This method modifies the spdx_document dictionary in place by adding
535
+ entries to the 'hasExtractedLicensingInfos' list.
536
+ """
314
537
  for lic_ref in lic_refs:
315
538
  license_info = self._parse_license_ref(lic_ref)
316
539
  spdx_document['hasExtractedLicensingInfos'].append(license_info)
317
540
 
318
541
  def _parse_license_ref(self, lic_ref: str) -> dict:
319
- """Parse license reference and create info dictionary."""
542
+ """
543
+ Parse license reference and create info dictionary for SPDX document.
544
+
545
+ This method extracts information from a license reference identifier
546
+ and formats it into the structure required by the SPDX specification
547
+ for extracted licensing information.
548
+
549
+ Args:
550
+ lic_ref (str): License reference identifier to parse
551
+
552
+ Returns:
553
+ dict: Dictionary containing required SPDX fields for extracted license info:
554
+ - licenseId: The unique identifier for this license
555
+ - name: A readable name for the license
556
+ - extractedText: A placeholder for the actual license text
557
+ - comment: Information about how the license was detected
558
+ """
320
559
  source, name = self._extract_license_info(lic_ref)
321
560
  source_text = f' by {source}.' if source else '.'
322
561
 
@@ -328,7 +567,21 @@ class SpdxLite:
328
567
  }
329
568
 
330
569
  def _extract_license_info(self, lic_ref: str):
331
- """Extract source and name from license reference."""
570
+ """
571
+ Extract source and name from license reference.
572
+
573
+ This method parses a license reference string to extract the source
574
+ (e.g., scancode, scanoss) and the actual license name using regular
575
+ expressions.
576
+
577
+ Args:
578
+ lic_ref (str): License reference identifier to parse
579
+
580
+ Returns:
581
+ tuple: A tuple containing (source, name) where:
582
+ - source (str): The tool or system that identified the license
583
+ - name (str): The actual license name
584
+ """
332
585
  match = re.search(r'^LicenseRef-(scancode-|scanoss-|)(\S+)$', lic_ref, re.IGNORECASE)
333
586
  if match:
334
587
  source = match.group(1).replace('-', '')
@@ -416,8 +669,6 @@ class SpdxLite:
416
669
  self._spdx_licenses[lic_id_short] = lic_id
417
670
  if lic_name:
418
671
  self._spdx_lic_names[lic_name] = lic_id
419
- # self.print_stderr(f'Licenses: {self._spdx_licenses}')
420
- # self.print_stderr(f'Lookup: {self._spdx_lic_lookup}')
421
672
  return True
422
673
 
423
674
  def get_spdx_license_id(self, lic_name: str) -> str:
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: scanoss
3
- Version: 1.20.4
3
+ Version: 1.20.6
4
4
  Summary: Simple Python library to leverage the SCANOSS APIs
5
5
  Home-page: https://scanoss.com
6
6
  Author: SCANOSS
@@ -31,6 +31,7 @@ Requires-Dist: pathspec
31
31
  Requires-Dist: jsonschema
32
32
  Provides-Extra: fast-winnowing
33
33
  Requires-Dist: scanoss_winnowing>=0.5.0; extra == "fast-winnowing"
34
+ Dynamic: license-file
34
35
 
35
36
  # SCANOSS Python Package
36
37
  The SCANOSS python package provides a simple easy to consume library for interacting with SCANOSS APIs/Engine.
@@ -4,23 +4,23 @@ protoc_gen_swagger/options/annotations_pb2.py,sha256=ycI8kBZqAQkXJTIdOJYBhCRp4Yb
4
4
  protoc_gen_swagger/options/annotations_pb2_grpc.py,sha256=VCyAf0skoHSgQPkD4n8rKQPYesinqHqN8TEwyu7XGUo,159
5
5
  protoc_gen_swagger/options/openapiv2_pb2.py,sha256=BQjXc9AICIKSHMCAmPDiWrZBpNozEOc78TDRf1_ieaE,15243
6
6
  protoc_gen_swagger/options/openapiv2_pb2_grpc.py,sha256=VCyAf0skoHSgQPkD4n8rKQPYesinqHqN8TEwyu7XGUo,159
7
- scanoss/__init__.py,sha256=N6Sdmcm3D_RnGFaFdObTtEKlkSZvfBx2N9eq5SX-f7Y,1146
8
- scanoss/cli.py,sha256=STeBzhpLo0tDLnUSs2Ys3e5KcmFsRVNwmOu7OijdrXQ,53553
9
- scanoss/components.py,sha256=8YbNWl9SgpD0PZRo4DruhQVLR0d4vXC8gtIAwmNTwaw,13957
7
+ scanoss/__init__.py,sha256=4Co5sKPk3hVcMnwB9sH63PFncL0g7WRXkNCu_C7K5nc,1146
8
+ scanoss/cli.py,sha256=LjHyaGxbAmoPR_tSalwRlJV9oKj_JfhZtQUagFZ9ntY,54970
9
+ scanoss/components.py,sha256=pXzF892dDKRagVi2LM3FsQ0U6rciQ-7-5HCDMvfMKhU,14078
10
10
  scanoss/csvoutput.py,sha256=qNKRwcChSkgIwLm00kZiVX6iHVQUF4Apl-sMbzJ5Taw,10192
11
11
  scanoss/cyclonedx.py,sha256=UktDuqZUbXSggdt864Pg8ziTD7sdEQtLxfYL7vd_ZCE,12756
12
12
  scanoss/file_filters.py,sha256=33N5lmr2Tph72wgqils_5HEH_38UpK0G3yxxfUdrK2M,16585
13
13
  scanoss/filecount.py,sha256=RZjKQ6M5P_RQg0_PMD2tsRe5Z8f98ke0sxYVjPDN8iQ,6538
14
14
  scanoss/results.py,sha256=_an1D7BmSWyqzViSh4e8MrJvrUxwX28UXPpUDhhI4uw,9716
15
15
  scanoss/scancodedeps.py,sha256=JbpoGW1POtPMmowzfwa4oh8sSBeeQCqaW9onvc4UFYM,11517
16
- scanoss/scanner.py,sha256=oZi_H_6dSNTe0GUzh2xIT1CVL8C0vMtJQ_EX-okEBSE,45040
16
+ scanoss/scanner.py,sha256=ZL8I8KtVyXgUMcl7Ccbip_Q1IlU9WTgI-mFtSpF1JWw,45223
17
17
  scanoss/scanoss_settings.py,sha256=rWQlspAtMfItX24nUVjpeY37uZuJTD-nTSQE2OuCytY,10628
18
- scanoss/scanossapi.py,sha256=2Pr8rV59BJB16goXiyPoeZSDeseXCkYJJT5SPrM1mEM,12097
18
+ scanoss/scanossapi.py,sha256=v4D9i9Impa82Enw-5hZ7KLlscDIpaILNbGOMj3MJXqs,13067
19
19
  scanoss/scanossbase.py,sha256=_SeQlvnY1SbItpVcX0oyKA3LdaG9ezu8x9ecE2klOoI,3067
20
- scanoss/scanossgrpc.py,sha256=qrIOlQZ6BmopcR879pCcANo0pX2Vv2hssiMpP510hcc,22331
20
+ scanoss/scanossgrpc.py,sha256=sjxXWFQPFTbI8xQ3_Ev01ISBFkggLUYL8e5uMi3VSpg,24313
21
21
  scanoss/scanpostprocessor.py,sha256=-JsThlxrU70r92GHykTMERnicdd-6jmwNsE4PH0MN2o,11063
22
22
  scanoss/scantype.py,sha256=gFmyVmKQpHWogN2iCmMj032e_sZo4T92xS3_EH5B3Tc,1310
23
- scanoss/spdxlite.py,sha256=Wt0fVjhOJtB62AhMCCTnO4_Wpeln-_Rwz4dWlwod44A,17619
23
+ scanoss/spdxlite.py,sha256=MQqFgQhIO-yrbRwEAQS77HmRgP5GDxff-2JYLVoceA0,28946
24
24
  scanoss/threadeddependencies.py,sha256=CAeZnoYd3d1ayoRvfm_aVjYbaTDLsk6DMWDxkoBPvq0,9866
25
25
  scanoss/threadedscanning.py,sha256=QnWdCc7QChUG_dbndLW-4K115qHJcsdUPzUbwihilSs,9326
26
26
  scanoss/winnowing.py,sha256=68_AL3iI-yR8GMfOD1LemToA_rvbNHeghKTX5-AK698,19254
@@ -55,7 +55,7 @@ scanoss/api/vulnerabilities/__init__.py,sha256=IFrDk_DTJgKSZmmU-nuLXuq_s8sQZlrSC
55
55
  scanoss/api/vulnerabilities/v2/__init__.py,sha256=IFrDk_DTJgKSZmmU-nuLXuq_s8sQZlrSCHhIDMJT4r0,1122
56
56
  scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2.py,sha256=q1qt-n8RTRMf05kxvpJgcMFJCbRwsnJSIErJMPAa1ng,5583
57
57
  scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2_grpc.py,sha256=GLD8kmnS4CsBAlOV-P7ZBzmomB3P_1GyC2F7oxs-f_M,6985
58
- scanoss/data/build_date.txt,sha256=d3dmFsMEESCN4FKokMTjOqP0QEQhppPFvahlCIKUPKU,40
58
+ scanoss/data/build_date.txt,sha256=6lDpzNyAqdQwep3HEw65L9KpmO3rNAkrru-JHAYnuqc,40
59
59
  scanoss/data/scanoss-settings-schema.json,sha256=ClkRYAkjAN0Sk704G8BE_Ok006oQ6YnIGmX84CF8h9w,8798
60
60
  scanoss/data/spdx-exceptions.json,sha256=s7UTYxC7jqQXr11YBlIWYCNwN6lRDFTR33Y8rpN_dA4,17953
61
61
  scanoss/data/spdx-licenses.json,sha256=A6Z0q82gaTLtnopBfzeIVZjJFxkdRW1g2TuumQc-lII,228794
@@ -66,9 +66,9 @@ scanoss/inspection/undeclared_component.py,sha256=0YEiWQ4Q1xu7j4YHLPsS3b5Mf9fplH
66
66
  scanoss/inspection/utils/license_utils.py,sha256=Zb6QLmVJb86lKCwZyBsmwakyAtY1SXa54kUyyKmWMqA,5093
67
67
  scanoss/utils/__init__.py,sha256=0hjb5ktavp7utJzFhGMPImPaZiHWgilM2HwvTp5lXJE,1122
68
68
  scanoss/utils/file.py,sha256=yVyv7C7xLWtFNfUrv3r6W8tkIqEuPjZ7_mgIT01IjJs,2933
69
- scanoss-1.20.4.dist-info/LICENSE,sha256=LLUaXoiyOroIbr5ubAyrxBOwSRLTm35ETO2FmLpy8QQ,1074
70
- scanoss-1.20.4.dist-info/METADATA,sha256=0E8hd7h6_VDhIfFzOZWMlC27EbG4QJJQnP3bcySytOw,6019
71
- scanoss-1.20.4.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
72
- scanoss-1.20.4.dist-info/entry_points.txt,sha256=Uy28xnaDL5KQ7V77sZD5VLDXPNxYYzSr5tsqtiXVzAs,48
73
- scanoss-1.20.4.dist-info/top_level.txt,sha256=V11PrQ6Pnrc-nDF9xnisnJ8e6-i7HqSIKVNqduRWcL8,27
74
- scanoss-1.20.4.dist-info/RECORD,,
69
+ scanoss-1.20.6.dist-info/licenses/LICENSE,sha256=LLUaXoiyOroIbr5ubAyrxBOwSRLTm35ETO2FmLpy8QQ,1074
70
+ scanoss-1.20.6.dist-info/METADATA,sha256=uFYgYMz5xNEZd8p_OckRH78i6NNHNbd2nwGmzQULuAs,6041
71
+ scanoss-1.20.6.dist-info/WHEEL,sha256=tTnHoFhvKQHCh4jz3yCn0WPTYIy7wXx3CJtJ7SJGV7c,91
72
+ scanoss-1.20.6.dist-info/entry_points.txt,sha256=Uy28xnaDL5KQ7V77sZD5VLDXPNxYYzSr5tsqtiXVzAs,48
73
+ scanoss-1.20.6.dist-info/top_level.txt,sha256=V11PrQ6Pnrc-nDF9xnisnJ8e6-i7HqSIKVNqduRWcL8,27
74
+ scanoss-1.20.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (77.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5