scanoss 1.12.2__py3-none-any.whl → 1.43.1__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.
Files changed (109) hide show
  1. protoc_gen_swagger/__init__.py +13 -13
  2. protoc_gen_swagger/options/__init__.py +13 -13
  3. protoc_gen_swagger/options/annotations_pb2.py +18 -12
  4. protoc_gen_swagger/options/annotations_pb2.pyi +48 -0
  5. protoc_gen_swagger/options/annotations_pb2_grpc.py +20 -0
  6. protoc_gen_swagger/options/openapiv2_pb2.py +110 -99
  7. protoc_gen_swagger/options/openapiv2_pb2.pyi +1317 -0
  8. protoc_gen_swagger/options/openapiv2_pb2_grpc.py +20 -0
  9. scanoss/__init__.py +18 -18
  10. scanoss/api/__init__.py +17 -17
  11. scanoss/api/common/__init__.py +17 -17
  12. scanoss/api/common/v2/__init__.py +17 -17
  13. scanoss/api/common/v2/scanoss_common_pb2.py +49 -20
  14. scanoss/api/common/v2/scanoss_common_pb2_grpc.py +25 -0
  15. scanoss/api/components/__init__.py +17 -17
  16. scanoss/api/components/v2/__init__.py +17 -17
  17. scanoss/api/components/v2/scanoss_components_pb2.py +68 -43
  18. scanoss/api/components/v2/scanoss_components_pb2_grpc.py +83 -22
  19. scanoss/api/cryptography/v2/scanoss_cryptography_pb2.py +136 -21
  20. scanoss/api/cryptography/v2/scanoss_cryptography_pb2_grpc.py +766 -13
  21. scanoss/api/dependencies/__init__.py +17 -17
  22. scanoss/api/dependencies/v2/__init__.py +17 -17
  23. scanoss/api/dependencies/v2/scanoss_dependencies_pb2.py +56 -29
  24. scanoss/api/dependencies/v2/scanoss_dependencies_pb2_grpc.py +94 -8
  25. scanoss/api/geoprovenance/__init__.py +23 -0
  26. scanoss/api/geoprovenance/v2/__init__.py +23 -0
  27. scanoss/api/geoprovenance/v2/scanoss_geoprovenance_pb2.py +92 -0
  28. scanoss/api/geoprovenance/v2/scanoss_geoprovenance_pb2_grpc.py +381 -0
  29. scanoss/api/licenses/__init__.py +23 -0
  30. scanoss/api/licenses/v2/__init__.py +23 -0
  31. scanoss/api/licenses/v2/scanoss_licenses_pb2.py +84 -0
  32. scanoss/api/licenses/v2/scanoss_licenses_pb2_grpc.py +302 -0
  33. scanoss/api/scanning/__init__.py +17 -17
  34. scanoss/api/scanning/v2/__init__.py +17 -17
  35. scanoss/api/scanning/v2/scanoss_scanning_pb2.py +42 -13
  36. scanoss/api/scanning/v2/scanoss_scanning_pb2_grpc.py +86 -7
  37. scanoss/api/semgrep/__init__.py +17 -17
  38. scanoss/api/semgrep/v2/__init__.py +17 -17
  39. scanoss/api/semgrep/v2/scanoss_semgrep_pb2.py +50 -23
  40. scanoss/api/semgrep/v2/scanoss_semgrep_pb2_grpc.py +151 -16
  41. scanoss/api/vulnerabilities/__init__.py +17 -17
  42. scanoss/api/vulnerabilities/v2/__init__.py +17 -17
  43. scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2.py +78 -31
  44. scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2_grpc.py +282 -18
  45. scanoss/cli.py +2359 -370
  46. scanoss/components.py +187 -94
  47. scanoss/constants.py +22 -0
  48. scanoss/cryptography.py +308 -0
  49. scanoss/csvoutput.py +91 -58
  50. scanoss/cyclonedx.py +221 -63
  51. scanoss/data/build_date.txt +1 -1
  52. scanoss/data/osadl-copyleft.json +133 -0
  53. scanoss/data/scanoss-settings-schema.json +254 -0
  54. scanoss/delta.py +197 -0
  55. scanoss/export/__init__.py +23 -0
  56. scanoss/export/dependency_track.py +227 -0
  57. scanoss/file_filters.py +582 -0
  58. scanoss/filecount.py +75 -69
  59. scanoss/gitlabqualityreport.py +214 -0
  60. scanoss/header_filter.py +563 -0
  61. scanoss/inspection/__init__.py +23 -0
  62. scanoss/inspection/policy_check/__init__.py +0 -0
  63. scanoss/inspection/policy_check/dependency_track/__init__.py +0 -0
  64. scanoss/inspection/policy_check/dependency_track/project_violation.py +479 -0
  65. scanoss/inspection/policy_check/policy_check.py +222 -0
  66. scanoss/inspection/policy_check/scanoss/__init__.py +0 -0
  67. scanoss/inspection/policy_check/scanoss/copyleft.py +243 -0
  68. scanoss/inspection/policy_check/scanoss/undeclared_component.py +309 -0
  69. scanoss/inspection/summary/__init__.py +0 -0
  70. scanoss/inspection/summary/component_summary.py +170 -0
  71. scanoss/inspection/summary/license_summary.py +191 -0
  72. scanoss/inspection/summary/match_summary.py +341 -0
  73. scanoss/inspection/utils/file_utils.py +44 -0
  74. scanoss/inspection/utils/license_utils.py +123 -0
  75. scanoss/inspection/utils/markdown_utils.py +63 -0
  76. scanoss/inspection/utils/scan_result_processor.py +417 -0
  77. scanoss/osadl.py +125 -0
  78. scanoss/results.py +275 -0
  79. scanoss/scancodedeps.py +87 -38
  80. scanoss/scanner.py +431 -539
  81. scanoss/scanners/__init__.py +23 -0
  82. scanoss/scanners/container_scanner.py +476 -0
  83. scanoss/scanners/folder_hasher.py +358 -0
  84. scanoss/scanners/scanner_config.py +73 -0
  85. scanoss/scanners/scanner_hfh.py +252 -0
  86. scanoss/scanoss_settings.py +337 -0
  87. scanoss/scanossapi.py +140 -101
  88. scanoss/scanossbase.py +59 -22
  89. scanoss/scanossgrpc.py +799 -251
  90. scanoss/scanpostprocessor.py +294 -0
  91. scanoss/scantype.py +22 -21
  92. scanoss/services/dependency_track_service.py +132 -0
  93. scanoss/spdxlite.py +532 -174
  94. scanoss/threadeddependencies.py +148 -47
  95. scanoss/threadedscanning.py +53 -37
  96. scanoss/utils/__init__.py +23 -0
  97. scanoss/utils/abstract_presenter.py +103 -0
  98. scanoss/utils/crc64.py +96 -0
  99. scanoss/utils/file.py +84 -0
  100. scanoss/utils/scanoss_scan_results_utils.py +41 -0
  101. scanoss/utils/simhash.py +198 -0
  102. scanoss/winnowing.py +241 -63
  103. {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info}/METADATA +18 -9
  104. scanoss-1.43.1.dist-info/RECORD +110 -0
  105. {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info}/WHEEL +1 -1
  106. scanoss-1.12.2.dist-info/RECORD +0 -58
  107. {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info}/entry_points.txt +0 -0
  108. {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info/licenses}/LICENSE +0 -0
  109. {scanoss-1.12.2.dist-info → scanoss-1.43.1.dist-info}/top_level.txt +0 -0
scanoss/winnowing.py CHANGED
@@ -1,39 +1,43 @@
1
1
  """
2
- SPDX-License-Identifier: MIT
2
+ SPDX-License-Identifier: MIT
3
3
 
4
- Copyright (c) 2021, SCANOSS
4
+ Copyright (c) 2021, SCANOSS
5
5
 
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the "Software"), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
12
 
13
- The above copyright notice and this permission notice shall be included in
14
- all copies or substantial portions of the Software.
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
15
 
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- THE SOFTWARE.
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
23
23
 
24
- Winnowing Algorithm implementation for SCANOSS.
24
+ Winnowing Algorithm implementation for SCANOSS.
25
25
 
26
- This module implements an adaptation of the original winnowing algorithm by S. Schleimer, D. S. Wilkerson and
27
- A. Aiken as described in their seminal article which can be found here:
28
- https://theory.stanford.edu/~aiken/publications/papers/sigmod03.pdf
26
+ This module implements an adaptation of the original winnowing algorithm by S. Schleimer, D. S. Wilkerson and
27
+ A. Aiken as described in their seminal article which can be found here:
28
+ https://theory.stanford.edu/~aiken/publications/papers/sigmod03.pdf
29
29
  """
30
+
30
31
  import hashlib
31
32
  import pathlib
33
+ import platform
32
34
  import re
35
+ from typing import Tuple
33
36
 
34
- from crc32c import crc32c
35
37
  from binaryornot.check import is_binary
38
+ from crc32c import crc32c
36
39
 
40
+ from .header_filter import HeaderFilter
37
41
  from .scanossbase import ScanossBase
38
42
 
39
43
  # Winnowing configuration. DO NOT CHANGE.
@@ -54,11 +58,56 @@ MAX_POST_SIZE = 64 * 1024 # 64k Max post size
54
58
  MIN_FILE_SIZE = 256
55
59
 
56
60
  SKIP_SNIPPET_EXT = { # File extensions to ignore snippets for
57
- ".exe", ".zip", ".tar", ".tgz", ".gz", ".7z", ".rar", ".jar", ".war", ".ear", ".class", ".pyc",
58
- ".o", ".a", ".so", ".obj", ".dll", ".lib", ".out", ".app", ".bin",
59
- ".lst", ".dat", ".json", ".htm", ".html", ".xml", ".md", ".txt",
60
- ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".odt", ".ods", ".odp", ".pages", ".key", ".numbers",
61
- ".pdf", ".min.js", ".mf", ".sum", ".woff", ".woff2", '.xsd', ".pom", ".whl",
61
+ '.exe',
62
+ '.zip',
63
+ '.tar',
64
+ '.tgz',
65
+ '.gz',
66
+ '.7z',
67
+ '.rar',
68
+ '.jar',
69
+ '.war',
70
+ '.ear',
71
+ '.class',
72
+ '.pyc',
73
+ '.o',
74
+ '.a',
75
+ '.so',
76
+ '.obj',
77
+ '.dll',
78
+ '.lib',
79
+ '.out',
80
+ '.app',
81
+ '.bin',
82
+ '.lst',
83
+ '.dat',
84
+ '.json',
85
+ '.htm',
86
+ '.html',
87
+ '.xml',
88
+ '.md',
89
+ '.txt',
90
+ '.doc',
91
+ '.docx',
92
+ '.xls',
93
+ '.xlsx',
94
+ '.ppt',
95
+ '.pptx',
96
+ '.odt',
97
+ '.ods',
98
+ '.odp',
99
+ '.pages',
100
+ '.key',
101
+ '.numbers',
102
+ '.pdf',
103
+ '.min.js',
104
+ '.mf',
105
+ '.sum',
106
+ '.woff',
107
+ '.woff2',
108
+ '.xsd',
109
+ '.pom',
110
+ '.whl',
62
111
  }
63
112
 
64
113
  CRC8_MAXIM_DOW_TABLE_SIZE = 0x100
@@ -110,11 +159,23 @@ class Winnowing(ScanossBase):
110
159
  a list of WFP fingerprints with their corresponding line numbers.
111
160
  """
112
161
 
113
- def __init__(self, size_limit: bool = False, debug: bool = False, trace: bool = False, quiet: bool = False,
114
- skip_snippets: bool = False, post_size: int = 32, all_extensions: bool = False,
115
- obfuscate: bool = False, hpsm: bool = False,
116
- strip_hpsm_ids=None, strip_snippet_ids=None, skip_md5_ids=None
117
- ):
162
+ def __init__( # noqa: PLR0913
163
+ self,
164
+ size_limit: bool = False,
165
+ debug: bool = False,
166
+ trace: bool = False,
167
+ quiet: bool = False,
168
+ skip_snippets: bool = False,
169
+ post_size: int = 32,
170
+ all_extensions: bool = False,
171
+ obfuscate: bool = False,
172
+ hpsm: bool = False,
173
+ strip_hpsm_ids=None,
174
+ strip_snippet_ids=None,
175
+ skip_md5_ids=None,
176
+ skip_headers: bool = False,
177
+ skip_headers_limit: int = 0,
178
+ ):
118
179
  """
119
180
  Instantiate Winnowing class
120
181
  Parameters
@@ -140,6 +201,9 @@ class Winnowing(ScanossBase):
140
201
  self.strip_hpsm_ids = strip_hpsm_ids
141
202
  self.strip_snippet_ids = strip_snippet_ids
142
203
  self.hpsm = hpsm
204
+ self.skip_headers = skip_headers
205
+ self.is_windows = platform.system() == 'Windows'
206
+ self.header_filter = HeaderFilter(debug=debug, trace=trace, quiet=quiet, skip_limit=skip_headers_limit)
143
207
  if hpsm:
144
208
  self.crc8_maxim_dow_table = []
145
209
  self.crc8_generate_table()
@@ -161,11 +225,11 @@ class Winnowing(ScanossBase):
161
225
  return byte
162
226
  if byte >= ASCII_a:
163
227
  return byte
164
- if (byte >= 65) and (byte <= 90):
228
+ if (byte >= ASCII_A) and (byte <= ASCII_Z):
165
229
  return byte + 32
166
230
  return 0
167
231
 
168
- def __skip_snippets(self, file: str, src: str) -> bool:
232
+ def __skip_snippets(self, file: str, src: str) -> bool: # noqa: PLR0911
169
233
  """
170
234
  Determine files that are not of interest based on their content or file extension
171
235
  Parameters
@@ -189,12 +253,16 @@ class Winnowing(ScanossBase):
189
253
  if src_len == 0 or src_len <= MIN_FILE_SIZE: # Ignore empty or files that are too small
190
254
  self.print_trace(f'Skipping snippets as the file is too small: {file} - {src_len}')
191
255
  return True
192
- prefix = src[0:(MIN_FILE_SIZE - 1)].lower().strip()
193
- if len(prefix) > 0 and (prefix[0] == "{" or prefix[0] == "["): # Ignore json
256
+ prefix = src[0 : (MIN_FILE_SIZE - 1)].lower().strip()
257
+ if len(prefix) > 0 and (prefix[0] == '{' or prefix[0] == '['): # Ignore json
194
258
  self.print_trace(f'Skipping snippets as the file appears to be JSON: {file}')
195
259
  return True
196
- if prefix.startswith("<?xml") or prefix.startswith("<html") or prefix.startswith("<ac3d") or prefix.startswith(
197
- "<!doc"):
260
+ if (
261
+ prefix.startswith('<?xml')
262
+ or prefix.startswith('<html')
263
+ or prefix.startswith('<ac3d')
264
+ or prefix.startswith('<!doc')
265
+ ):
198
266
  self.print_trace(f'Skipping snippets as the file appears to be xml/html/binary: {file}')
199
267
  return True # Ignore xml & html & ac3d
200
268
  index = src.index('\n') if '\n' in src else (src_len - 1) # TODO still necessary if we have a binary check?
@@ -257,11 +325,12 @@ class Winnowing(ScanossBase):
257
325
  elif hpsm_id_len % 2 == 1:
258
326
  hpsm_id_len = hpsm_id_len + 1
259
327
 
260
- to_remove = hpsm[hpsm_id_index:hpsm_id_index + hpsm_id_len]
328
+ to_remove = hpsm[hpsm_id_index : hpsm_id_index + hpsm_id_len]
261
329
  self.print_debug(f'HPSM ID {to_remove} to replace')
262
330
  # Calculate the XOR of each byte to produce the correct ignore sequence.
263
331
  replacement = ''.join(
264
- [format(int(to_remove[i:i + 2], 16) ^ 0xFF, '02x') for i in range(0, len(to_remove), 2)])
332
+ [format(int(to_remove[i : i + 2], 16) ^ 0xFF, '02x') for i in range(0, len(to_remove), 2)]
333
+ )
265
334
 
266
335
  self.print_debug(f'HPSM ID replacement {replacement}')
267
336
  # Overwrite HPSM bytes to be removed.
@@ -289,7 +358,96 @@ class Winnowing(ScanossBase):
289
358
  self.print_debug(f'Stripped snippet ids from {file}')
290
359
  return wfp
291
360
 
292
- def wfp_for_contents(self, file: str, bin_file: bool, contents: bytes) -> str:
361
+ def __strip_lines_until_offset(self, file: str, wfp: str, line_offset: int) -> str:
362
+ """
363
+ Strip lines from the WFP up to and including the line_offset
364
+
365
+ :param file: name of fingerprinted file
366
+ :param wfp: WFP to clean
367
+ :param line_offset: line number offset to strip up to
368
+ :return: updated WFP
369
+ """
370
+ # No offset specified, return original WFP
371
+ if line_offset <= 0:
372
+ return wfp
373
+ lines = wfp.split('\n')
374
+ filtered_lines = []
375
+ start_line_added = False
376
+ for line in lines:
377
+ # Check if a line contains snippet data (format: line_number=hash,hash,...)
378
+ line_details = line.split('=')
379
+ if line_details[0].isdigit():
380
+ try:
381
+ line_num = int(line_details[0])
382
+ # Keep lines that are after the offset
383
+ # (line_offset is the last line previous to real code)
384
+ if line_num > line_offset:
385
+ # Add the start_line tag before the first snippet line
386
+ if not start_line_added:
387
+ filtered_lines.append(f'start_line={line_offset}')
388
+ start_line_added = True
389
+ filtered_lines.append(line)
390
+ except (ValueError, IndexError) as e:
391
+ self.print_stderr(f'Error decoding line number from line {line} in {file}: {e}')
392
+ # Keep non-snippet lines (like file=, hpsm=, etc.)
393
+ filtered_lines.append(line)
394
+ else:
395
+ # Keep non-snippet lines (like file=, hpsm=, etc.)
396
+ filtered_lines.append(line)
397
+ # End for loop comment
398
+ wfp = '\n'.join(filtered_lines)
399
+ if start_line_added:
400
+ self.print_debug(f'Stripped lines up to offset {line_offset} from {file}')
401
+ return wfp
402
+
403
+ def __detect_line_endings(self, contents: bytes) -> Tuple[bool, bool, bool]:
404
+ """Detect the types of line endings present in file contents.
405
+
406
+ Args:
407
+ contents: File contents as bytes.
408
+
409
+ Returns:
410
+ Tuple of (has_crlf, has_lf_only, has_cr_only, has_mixed) indicating which line ending types are present.
411
+ """
412
+ if not contents:
413
+ self.print_debug('Warning: No file contents provided')
414
+ has_crlf = b'\r\n' in contents
415
+ # For LF detection, we need to find LF that's not part of CRLF
416
+ content_without_crlf = contents.replace(b'\r\n', b'')
417
+ has_standalone_lf = b'\n' in content_without_crlf
418
+ # For CR detection, we need to find CR that's not part of CRLF
419
+ has_standalone_cr = b'\r' in content_without_crlf
420
+ return has_crlf, has_standalone_lf, has_standalone_cr
421
+
422
+ def __calculate_opposite_line_ending_hash(self, contents: bytes):
423
+ """Calculate hash for contents with opposite line endings.
424
+
425
+ If the file is primarily Unix (LF), calculates Windows (CRLF) hash.
426
+ If the file is primarily Windows (CRLF), calculates Unix (LF) hash.
427
+
428
+ Args:
429
+ contents: File contents as bytes.
430
+
431
+ Returns:
432
+ Hash with opposite line endings as hex string, or None if no line endings detected.
433
+ """
434
+ has_crlf, has_standalone_lf, has_standalone_cr = self.__detect_line_endings(contents)
435
+ if not has_crlf and not has_standalone_lf and not has_standalone_cr:
436
+ self.print_debug('No line endings detected in file contents')
437
+ return None
438
+ # Normalise all line endings to LF first
439
+ normalized = contents.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
440
+ # Determine the dominant line ending type
441
+ if has_crlf and not has_standalone_lf and not has_standalone_cr:
442
+ # File is Windows (CRLF) - produce Unix (LF) hash
443
+ opposite_contents = normalized
444
+ else:
445
+ # File is Unix (LF/CR) or mixed - produce Windows (CRLF) hash
446
+ opposite_contents = normalized.replace(b'\n', b'\r\n')
447
+ # Return the MD5 hash of the opposite contents
448
+ return hashlib.md5(opposite_contents).hexdigest()
449
+
450
+ def wfp_for_contents(self, file: str, bin_file: bool, contents: bytes) -> str: # noqa: PLR0912, PLR0915
293
451
  """
294
452
  Generate a Winnowing fingerprint (WFP) for the given file contents
295
453
  Parameters
@@ -307,17 +465,27 @@ class Winnowing(ScanossBase):
307
465
  return ''
308
466
  # Print file line
309
467
  content_length = len(contents)
310
- wfp_filename = file
311
- if self.obfuscate: # hide the real size of the file and its name, but keep the suffix
312
- wfp_filename = f'{self.ob_count}{pathlib.Path(file).suffix}'
468
+ original_filename = file
469
+ if self.is_windows:
470
+ original_filename = file.replace('\\', '/')
471
+ wfp_filename = repr(original_filename).strip("'") # return a utf-8 compatible version of the filename
472
+ # hide the real size of the file and its name but keep the suffix
473
+ if self.obfuscate:
474
+ wfp_filename = f'{self.ob_count}{pathlib.Path(original_filename).suffix}'
313
475
  self.ob_count = self.ob_count + 1
314
- self.file_map[wfp_filename] = file # Save the file name map for later (reverse lookup)
315
-
476
+ self.file_map[wfp_filename] = original_filename # Save the file name map for later (reverse lookup)
477
+ # Construct the WFP header
316
478
  wfp = 'file={0},{1},{2}\n'.format(file_md5, content_length, wfp_filename)
479
+ # Add the opposite line ending hash based on line ending analysis
480
+ if not bin_file:
481
+ opposite_hash = self.__calculate_opposite_line_ending_hash(contents)
482
+ if opposite_hash is not None:
483
+ wfp += f'fh2={opposite_hash}\n'
317
484
  # We don't process snippets for binaries, or other uninteresting files, or if we're requested to skip
318
- if bin_file or self.skip_snippets or self.__skip_snippets(file, contents.decode('utf-8', 'ignore')):
485
+ decoded_contents = contents.decode('utf-8', 'ignore')
486
+ if bin_file or self.skip_snippets or self.__skip_snippets(file, decoded_contents):
319
487
  return wfp
320
- # Add HPSM
488
+ # Add HPSM (calculated from original contents, not filtered)
321
489
  if self.hpsm:
322
490
  hpsm = self.__strip_hpsm(file, self.calc_hpsm(contents))
323
491
  if len(hpsm) > 0:
@@ -325,7 +493,7 @@ class Winnowing(ScanossBase):
325
493
  # Initialize variables
326
494
  gram = ''
327
495
  window = []
328
- line = 1
496
+ line = 1 # Line counter for WFP generation
329
497
  last_hash = MAX_CRC32
330
498
  last_line = 0
331
499
  output = ''
@@ -356,14 +524,16 @@ class Winnowing(ScanossBase):
356
524
  crc_hex = '{:08x}'.format(crc)
357
525
  if last_line != line:
358
526
  if output != '':
359
- if self.size_limit and \
360
- (len(wfp.encode("utf-8")) + len(
361
- output.encode("utf-8"))) > self.max_post_size:
527
+ if (
528
+ self.size_limit
529
+ and (len(wfp.encode('utf-8')) + len(output.encode('utf-8')))
530
+ > self.max_post_size
531
+ ):
362
532
  self.print_debug(f'Truncating WFP ({self.max_post_size} limit) for: {file}')
363
533
  output = ''
364
534
  break # Stop collecting snippets as it's over 64k
365
535
  wfp += output + '\n'
366
- output = "%d=%s" % (line, crc_hex)
536
+ output = '%d=%s' % (line, crc_hex)
367
537
  else:
368
538
  output += ',' + crc_hex
369
539
 
@@ -374,16 +544,23 @@ class Winnowing(ScanossBase):
374
544
  # Shift gram
375
545
  gram = gram[1:]
376
546
  if output != '':
377
- if not self.size_limit or (len(wfp.encode("utf-8")) + len(output.encode("utf-8"))) < self.max_post_size:
547
+ if not self.size_limit or (len(wfp.encode('utf-8')) + len(output.encode('utf-8'))) < self.max_post_size:
378
548
  wfp += output + '\n'
379
549
  else:
380
550
  self.print_debug(f'Warning: skipping output in WFP for {file} - "{output}"')
381
-
551
+ # Warn if we don't have any WFP content
382
552
  if wfp is None or wfp == '':
383
553
  self.print_stderr(f'Warning: No WFP content data for {file}')
384
- elif self.strip_snippet_ids:
385
- wfp = self.__strip_snippets(file, wfp)
386
-
554
+ else:
555
+ # Apply line filter to remove headers, comments, and imports from the beginning (if enabled)
556
+ if self.skip_headers:
557
+ line_offset = self.header_filter.filter(file, decoded_contents)
558
+ if line_offset > 0:
559
+ wfp = self.__strip_lines_until_offset(file, wfp, line_offset)
560
+ # Strip snippet IDs from the WFP (if enabled)
561
+ if self.strip_snippet_ids:
562
+ wfp = self.__strip_snippets(file, wfp)
563
+ # Return the WFP contents
387
564
  return wfp
388
565
 
389
566
  def calc_hpsm(self, content):
@@ -398,13 +575,13 @@ class Winnowing(ScanossBase):
398
575
  last_line = 0
399
576
  for i, byte in enumerate(content):
400
577
  c = byte
401
- if c == ASCII_LF: # When there is a new line
402
- if len(list_normalized):
578
+ if c == ASCII_LF: # When there is a new line
579
+ if list_normalized:
403
580
  crc_lines.append(self.crc8_buffer(list_normalized))
404
581
  list_normalized = []
405
- elif last_line+1 == i:
582
+ elif last_line + 1 == i:
406
583
  crc_lines.append(0xFF)
407
- elif i-last_line > 1:
584
+ elif i - last_line > 1:
408
585
  crc_lines.append(0x00)
409
586
  last_line = i
410
587
  else:
@@ -464,7 +641,8 @@ class Winnowing(ScanossBase):
464
641
  crc = self.crc8_byte(crc, buffer[index])
465
642
  crc ^= CRC8_MAXIM_DOW_FINAL # Bitwise OR (XOR) of crc in Maxim Dow Final
466
643
  return crc
467
-
644
+
645
+
468
646
  #
469
647
  # End of Winnowing Class
470
648
  #
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: scanoss
3
- Version: 1.12.2
3
+ Version: 1.43.1
4
4
  Summary: Simple Python library to leverage the SCANOSS APIs
5
5
  Home-page: https://scanoss.com
6
6
  Author: SCANOSS
@@ -13,20 +13,29 @@ Classifier: License :: OSI Approved :: MIT License
13
13
  Classifier: Operating System :: OS Independent
14
14
  Classifier: Development Status :: 5 - Production/Stable
15
15
  Classifier: Programming Language :: Python :: 3
16
- Requires-Python: >=3.7
16
+ Requires-Python: >=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
19
  Requires-Dist: requests
20
- Requires-Dist: crc32c >=2.2
20
+ Requires-Dist: crc32c>=2.2
21
21
  Requires-Dist: binaryornot
22
22
  Requires-Dist: progress
23
- Requires-Dist: grpcio >1.42.0
24
- Requires-Dist: protobuf >3.19.1
23
+ Requires-Dist: grpcio>=1.73.1
24
+ Requires-Dist: protobuf>=6.3.1
25
+ Requires-Dist: protoc-gen-openapiv2
25
26
  Requires-Dist: pypac
26
27
  Requires-Dist: pyOpenSSL
27
28
  Requires-Dist: google-api-core
28
- Provides-Extra: fast_winnowing
29
- Requires-Dist: scanoss-winnowing >=0.5.0 ; extra == 'fast_winnowing'
29
+ Requires-Dist: importlib_resources
30
+ Requires-Dist: packageurl-python
31
+ Requires-Dist: pathspec
32
+ Requires-Dist: jsonschema
33
+ Requires-Dist: crc
34
+ Requires-Dist: protoc-gen-openapiv2
35
+ Requires-Dist: cyclonedx-python-lib[validation]
36
+ Provides-Extra: fast-winnowing
37
+ Requires-Dist: scanoss_winnowing>=0.5.0; extra == "fast-winnowing"
38
+ Dynamic: license-file
30
39
 
31
40
  # SCANOSS Python Package
32
41
  The SCANOSS python package provides a simple easy to consume library for interacting with SCANOSS APIs/Engine.
@@ -168,7 +177,7 @@ if __name__ == "__main__":
168
177
  ```
169
178
 
170
179
  ## Requirements
171
- Python 3.7 or higher.
180
+ Python 3.9 or higher.
172
181
 
173
182
  ## Source code
174
183
  The source for this package can be found [here](https://github.com/scanoss/scanoss.py).
@@ -0,0 +1,110 @@
1
+ protoc_gen_swagger/__init__.py,sha256=WIZ8oAZVdZQxoQSsQDnOlVPKAYGBYza4gGHI6t7DACM,802
2
+ protoc_gen_swagger/options/__init__.py,sha256=WIZ8oAZVdZQxoQSsQDnOlVPKAYGBYza4gGHI6t7DACM,802
3
+ protoc_gen_swagger/options/annotations_pb2.py,sha256=EGK2vx7EPxFrNI3_kOYQTxFZiZqdhWMLu1AVxPhmf6c,2434
4
+ protoc_gen_swagger/options/annotations_pb2.pyi,sha256=DETCxnwInbkywttMsUugA3kqFajzhwgUXaccLNezekk,2490
5
+ protoc_gen_swagger/options/annotations_pb2_grpc.py,sha256=KZOW9Ciio-f9iL42FuLFnSVKAuoilgwMuZ_DcCIZ0jY,919
6
+ protoc_gen_swagger/options/openapiv2_pb2.py,sha256=w0xDs63uyrWGgzRaQZXfJpfI7Jpyvh-i9ay_uzOR-aM,16475
7
+ protoc_gen_swagger/options/openapiv2_pb2.pyi,sha256=hYOV6uQ2yqhP89042_V3GuAsvoBBiXf5CGuYmnFnfv4,54665
8
+ protoc_gen_swagger/options/openapiv2_pb2_grpc.py,sha256=sje9Nh3yE7CHCUWZwtjTgwsKB4GvyGz5vOrGTnRXJfc,917
9
+ scanoss/__init__.py,sha256=lwPI4-clDHq4wUHNYOI6cksqekMeupq-O8d0iRfUd_A,1146
10
+ scanoss/cli.py,sha256=27gumZDiD5ui5ICmmaIaf8OM8LlAWZ2rlI4LC7DFvUU,104579
11
+ scanoss/components.py,sha256=NFyt_w3aoMotr_ZaFU-ng00_89sruc0kgY7ERnJXkmM,15891
12
+ scanoss/constants.py,sha256=vurzLNIfP_dnRMwOdZsUWvr5XAVuGoj98XZ0yjXNOjQ,632
13
+ scanoss/cryptography.py,sha256=lOoD_dW16ARQxYiYyb5R8S7gx0FqWIsnGkKfsB0nGaU,10627
14
+ scanoss/csvoutput.py,sha256=3wdXPeIqZG84bCtXFh8fMZO3XodekeSx6RZXoOhZMFc,10551
15
+ scanoss/cyclonedx.py,sha256=mHeX66yQCk41N3YCIzKy_fI7fLqQnetYPFRIzUKy_M4,18416
16
+ scanoss/delta.py,sha256=slmgnD7SsUOmfSE2zb0zdRAGo-JcjPJAtxyzuCSzO3I,9455
17
+ scanoss/file_filters.py,sha256=QcLqunaBKQIafjNZ9_Snh9quBX5_-fsTusVmxwjC1q8,18511
18
+ scanoss/filecount.py,sha256=icWaKN_xapMrH3ZZ-D3nldx7hWiguIOjoKg4gCeKDOM,6678
19
+ scanoss/gitlabqualityreport.py,sha256=_VG0Xoh8wYF3lsXGJvjoj-Ty58OS_-H1Domiq9OpQEo,8830
20
+ scanoss/header_filter.py,sha256=-Dqore9coROLMWWw9yP3nz8dpCB7jYAVm842hoRTmeE,21879
21
+ scanoss/osadl.py,sha256=VWalcHpshWxtRDGje2cK32SfFeSBAO62knfSW9pyYqc,4558
22
+ scanoss/results.py,sha256=47ZXXuU2sDjYa5vhtbWTmikit9jHhA0rsYKwkvZFI5w,9252
23
+ scanoss/scancodedeps.py,sha256=JbpoGW1POtPMmowzfwa4oh8sSBeeQCqaW9onvc4UFYM,11517
24
+ scanoss/scanner.py,sha256=3dkkNwi4KSHeBMk0Pmjf3WJ6SA28-om2iGxuDsqnfGg,39778
25
+ scanoss/scanoss_settings.py,sha256=W8uFQ6uRIqtE-DXXA56bO8I4GsbJ-aA1c84hQ_qBel4,12161
26
+ scanoss/scanossapi.py,sha256=O1ZNH9Kt8JzhLVBxfOSmJdEwSJTDP-rA54DulYdE8e4,13243
27
+ scanoss/scanossbase.py,sha256=tKlHPAi50ZarGaPXsNi1XrowQBynsSqSSst-NuG2ScI,3163
28
+ scanoss/scanossgrpc.py,sha256=9UuVPUjBLUhqim_tSntyoRZW-OAtiz5iP_VjjNr5RPY,41715
29
+ scanoss/scanpostprocessor.py,sha256=-JsThlxrU70r92GHykTMERnicdd-6jmwNsE4PH0MN2o,11063
30
+ scanoss/scantype.py,sha256=gFmyVmKQpHWogN2iCmMj032e_sZo4T92xS3_EH5B3Tc,1310
31
+ scanoss/spdxlite.py,sha256=4JMxmyNmvcL6fjScihk8toWfSuQ-Pj1gzaT3SIn1fXA,29425
32
+ scanoss/threadeddependencies.py,sha256=aN8E43iKS1pWJLJP3xCle5ewlfR5DE2-ljUzI_29Xwk,9851
33
+ scanoss/threadedscanning.py,sha256=Y-OYamD3xJvFiqwCn5y_4QD5gk_rJ5xs2jI1DxNtJlc,9661
34
+ scanoss/winnowing.py,sha256=py4gFKVHI5ZsLNyQIvNtnO6k3tBbvEXYNw24yuMgoTc,24751
35
+ scanoss/api/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
36
+ scanoss/api/common/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
37
+ scanoss/api/common/v2/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
38
+ scanoss/api/common/v2/scanoss_common_pb2.py,sha256=uF1xIFu9o_srr8fZWkIOtdInbDk-duesJKyFKPznTRU,4646
39
+ scanoss/api/common/v2/scanoss_common_pb2_grpc.py,sha256=YMOEV6H5rFsx05X1ZfTh7rbOl0ThP6_F5QIal2hJkhI,1031
40
+ scanoss/api/components/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
41
+ scanoss/api/components/v2/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
42
+ scanoss/api/components/v2/scanoss_components_pb2.py,sha256=godS4LyRzJCpUkGgOK2KTdmNs8RM-7CvAL5iHTiouNI,12775
43
+ scanoss/api/components/v2/scanoss_components_pb2_grpc.py,sha256=OZA9S0JTnrc3EBDKZ-Rvbcthwr6hCapDZKj16Rxzs3A,10225
44
+ scanoss/api/cryptography/v2/scanoss_cryptography_pb2.py,sha256=LuO7duf1cOlX96JmIRnONpiCcJcbmX8_xOkkW_1j8S4,28971
45
+ scanoss/api/cryptography/v2/scanoss_cryptography_pb2_grpc.py,sha256=1BAsN2d6ypZdbdoCDlwVJhwv49HHT2ov0DPkSgrLKGo,41260
46
+ scanoss/api/dependencies/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
47
+ scanoss/api/dependencies/v2/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
48
+ scanoss/api/dependencies/v2/scanoss_dependencies_pb2.py,sha256=fLfFdcH1oeUwsdkr4ujFRh-CQ3_b4gob_qftxNUzCso,10153
49
+ scanoss/api/dependencies/v2/scanoss_dependencies_pb2_grpc.py,sha256=eMtHXvKYure23zzsvJB2bz9ML7mNdbE5OOOGVB04FBc,8315
50
+ scanoss/api/geoprovenance/__init__.py,sha256=KlDD87JmyZP-10T-fuJo0_v2zt1gxWfTgs70wjky9xg,1139
51
+ scanoss/api/geoprovenance/v2/__init__.py,sha256=KlDD87JmyZP-10T-fuJo0_v2zt1gxWfTgs70wjky9xg,1139
52
+ scanoss/api/geoprovenance/v2/scanoss_geoprovenance_pb2.py,sha256=z7uIFxo77eY_2oQHyM1jLtSSFXqqmkCAdfvlfjzoM8E,14252
53
+ scanoss/api/geoprovenance/v2/scanoss_geoprovenance_pb2_grpc.py,sha256=hs0WAHoLCLbnfVUkvyh5QAwfRMnrwpAlQOx0Azfe_ws,18234
54
+ scanoss/api/licenses/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
55
+ scanoss/api/licenses/v2/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
56
+ scanoss/api/licenses/v2/scanoss_licenses_pb2.py,sha256=YjEtJyJIfo-7RDz5W3sdF8BPhaSIu1Wt7kidUaYng0E,12139
57
+ scanoss/api/licenses/v2/scanoss_licenses_pb2_grpc.py,sha256=SHu4I44tYho6uYq0TuNHHWk_58nRd2sadxypwj5gGyM,13288
58
+ scanoss/api/scanning/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
59
+ scanoss/api/scanning/v2/__init__.py,sha256=hx-P78xbDsh6WQIigewkJ7Y7y1fqc_eYnyHC5IZTKmo,1122
60
+ scanoss/api/scanning/v2/scanoss_scanning_pb2.py,sha256=npvLPyJ1CzWSK3m-Qvk9loN94bsQXj0FdjY4H9Je1-4,6000
61
+ scanoss/api/scanning/v2/scanoss_scanning_pb2_grpc.py,sha256=fP_cz41eUKuSHCpRzCwvi8nJzrZmqV7efTM9kGnG1_Y,5869
62
+ scanoss/api/semgrep/__init__.py,sha256=UAhvL2dFNZsG4g3I8HCauwQK6e0QoEFhMGqZ_9GgGhI,1122
63
+ scanoss/api/semgrep/v2/__init__.py,sha256=UAhvL2dFNZsG4g3I8HCauwQK6e0QoEFhMGqZ_9GgGhI,1122
64
+ scanoss/api/semgrep/v2/scanoss_semgrep_pb2.py,sha256=agTsO1MvoDD-loeF_BJSMwAdlTtGs7xQZ8pAjmjF28g,9200
65
+ scanoss/api/semgrep/v2/scanoss_semgrep_pb2_grpc.py,sha256=NUejrEnb3fLfh0z22SxEghPEkelB_SAlF_pYEYlgdk0,10620
66
+ scanoss/api/vulnerabilities/__init__.py,sha256=IFrDk_DTJgKSZmmU-nuLXuq_s8sQZlrSCHhIDMJT4r0,1122
67
+ scanoss/api/vulnerabilities/v2/__init__.py,sha256=IFrDk_DTJgKSZmmU-nuLXuq_s8sQZlrSCHhIDMJT4r0,1122
68
+ scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2.py,sha256=pmm0MSiXkdf8e4rCIIDRcsNRixR2vGvD1Xak4l-wdwI,16550
69
+ scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2_grpc.py,sha256=BNxT5kUKQ-mgtOt5QYBM1Qrg5LNDqSpWKpfEZquIlsM,19127
70
+ scanoss/data/build_date.txt,sha256=iGs8QX_FYWZn7LBC-nwnjX8Ul1Sb9cklgACl5eIHb2Q,40
71
+ scanoss/data/osadl-copyleft.json,sha256=O9b2XAfpjQY0TL0fYzO6kwMcp5IwQbF6f_YWbB10MhQ,4761
72
+ scanoss/data/scanoss-settings-schema.json,sha256=ClkRYAkjAN0Sk704G8BE_Ok006oQ6YnIGmX84CF8h9w,8798
73
+ scanoss/data/spdx-exceptions.json,sha256=s7UTYxC7jqQXr11YBlIWYCNwN6lRDFTR33Y8rpN_dA4,17953
74
+ scanoss/data/spdx-licenses.json,sha256=A6Z0q82gaTLtnopBfzeIVZjJFxkdRW1g2TuumQc-lII,228794
75
+ scanoss/export/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
76
+ scanoss/export/dependency_track.py,sha256=A_xQH6_r9xL_fth1Wr770GCTRFVyn7XcUPfVUsXp4-w,9271
77
+ scanoss/inspection/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
78
+ scanoss/inspection/policy_check/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ scanoss/inspection/policy_check/policy_check.py,sha256=nMb5ogRDntYMebm3xrIBde2GqNuzOCAsawyldEtfWkA,8365
80
+ scanoss/inspection/policy_check/dependency_track/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ scanoss/inspection/policy_check/dependency_track/project_violation.py,sha256=elc35kWffWxOoF8YMi50hK_obtc1Xa8E3dwUnz7WXcA,20713
82
+ scanoss/inspection/policy_check/scanoss/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ scanoss/inspection/policy_check/scanoss/copyleft.py,sha256=ykTU4ZfK0V3iIboE8D5boJ4PlqQz6aqJoc4pvbEsVhQ,9659
84
+ scanoss/inspection/policy_check/scanoss/undeclared_component.py,sha256=ZkqPbfFzUHNEde-iVRWUSpkNKMTW_rOZQqG0y94MtUU,11673
85
+ scanoss/inspection/summary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ scanoss/inspection/summary/component_summary.py,sha256=ZaQzvZBQDFtow43UC9bij5NCTHjY_QAEqIUyRp3KtWk,7308
87
+ scanoss/inspection/summary/license_summary.py,sha256=BC_REu2e4PkMHp0ttvSdf6yRW3MvFc623fT6_Ze_TQA,7958
88
+ scanoss/inspection/summary/match_summary.py,sha256=GdjIV7ws7fanQTVdBigYGx3683KPL6e6HO4wuXTKq9g,13812
89
+ scanoss/inspection/utils/file_utils.py,sha256=b-xTH6FSyPpl3EPZ9WzK0c4734yE9mAexT1_YLLqymE,1641
90
+ scanoss/inspection/utils/license_utils.py,sha256=7jjtNcQPL_QNHY22drQqh7D7Pskq_AvAY1rLHAJWAhI,4809
91
+ scanoss/inspection/utils/markdown_utils.py,sha256=zkFs48TM-NR6nUHYOyQmHCwV82_fUsks5UB4BmyGifU,2446
92
+ scanoss/inspection/utils/scan_result_processor.py,sha256=zSPSWDBTqwRrF-pE6YaXi7tTYS4t1Qw_YIqw3hWvkW8,17736
93
+ scanoss/scanners/__init__.py,sha256=D4C0lWLuNp8k_BjQZEc07WZcUgAvriVwQWOk063b0ZU,1122
94
+ scanoss/scanners/container_scanner.py,sha256=fOrb64owrstX7LnTuxiIan059YgLeKXeBS6g2QaCyq0,16346
95
+ scanoss/scanners/folder_hasher.py,sha256=UzOmtYTLMqeL3Jf4CpvT-L4qaPNCy9-7xV0BwYhAuRc,12973
96
+ scanoss/scanners/scanner_config.py,sha256=egG7cw3S2akU-D9M1aLE5jLrfz_c8e7_DIotMnnpM84,2601
97
+ scanoss/scanners/scanner_hfh.py,sha256=gn2DnWD0J1_EPAKm5Zmu6ZjbGBPPSdz0YjqcPESPE-c,9512
98
+ scanoss/services/dependency_track_service.py,sha256=JIpqev4I-x_ZajMxD5W2Y3OAUvEJ_4nstzAPV90vfP8,5070
99
+ scanoss/utils/__init__.py,sha256=0hjb5ktavp7utJzFhGMPImPaZiHWgilM2HwvTp5lXJE,1122
100
+ scanoss/utils/abstract_presenter.py,sha256=teiDTxBj5jBMCk2T8i4l1BJPf_u4zBLWrtCTFHSSECM,3148
101
+ scanoss/utils/crc64.py,sha256=TMrwQimSdE6imhFOUL7oAG6Kxu-8qMpGWMuMg8QpSVs,3169
102
+ scanoss/utils/file.py,sha256=62cA9a17TU9ZvfA3FY5HY4-QOajJeSrc8S6xLA_f-3M,2980
103
+ scanoss/utils/scanoss_scan_results_utils.py,sha256=ho9-DKefHFJlVZkw4gXOmMI-mgPIbV9Y2ftkI83fC1k,1727
104
+ scanoss/utils/simhash.py,sha256=6iu8DOcecPAY36SZjCOzrrLMT9oIE7-gI6QuYwUQ7B0,5793
105
+ scanoss-1.43.1.dist-info/licenses/LICENSE,sha256=LLUaXoiyOroIbr5ubAyrxBOwSRLTm35ETO2FmLpy8QQ,1074
106
+ scanoss-1.43.1.dist-info/METADATA,sha256=DNoaMcUBfFRxK_HK8jRU_kGY-Beh-FGK314qzEUqhT4,6181
107
+ scanoss-1.43.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
108
+ scanoss-1.43.1.dist-info/entry_points.txt,sha256=Uy28xnaDL5KQ7V77sZD5VLDXPNxYYzSr5tsqtiXVzAs,48
109
+ scanoss-1.43.1.dist-info/top_level.txt,sha256=V11PrQ6Pnrc-nDF9xnisnJ8e6-i7HqSIKVNqduRWcL8,27
110
+ scanoss-1.43.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5