scanoss 1.19.2__tar.gz → 1.19.4__tar.gz
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-1.19.2/src/scanoss.egg-info → scanoss-1.19.4}/PKG-INFO +1 -1
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/__init__.py +1 -1
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/cli.py +1 -1
- scanoss-1.19.4/src/scanoss/data/build_date.txt +1 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/inspection/copyleft.py +28 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/inspection/policy_check.py +30 -2
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/inspection/undeclared_component.py +38 -0
- {scanoss-1.19.2 → scanoss-1.19.4/src/scanoss.egg-info}/PKG-INFO +1 -1
- {scanoss-1.19.2 → scanoss-1.19.4}/tests/test_policy_inspect.py +62 -1
- scanoss-1.19.2/src/scanoss/data/build_date.txt +0 -1
- {scanoss-1.19.2 → scanoss-1.19.4}/LICENSE +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/PACKAGE.md +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/README.md +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/pyproject.toml +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/setup.cfg +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/protoc_gen_swagger/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/protoc_gen_swagger/options/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/protoc_gen_swagger/options/annotations_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/protoc_gen_swagger/options/annotations_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/protoc_gen_swagger/options/openapiv2_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/protoc_gen_swagger/options/openapiv2_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/common/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/common/v2/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/common/v2/scanoss_common_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/common/v2/scanoss_common_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/components/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/components/v2/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/components/v2/scanoss_components_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/components/v2/scanoss_components_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/cryptography/v2/scanoss_cryptography_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/cryptography/v2/scanoss_cryptography_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/dependencies/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/dependencies/v2/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/dependencies/v2/scanoss_dependencies_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/dependencies/v2/scanoss_dependencies_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/scanning/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/scanning/v2/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/scanning/v2/scanoss_scanning_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/scanning/v2/scanoss_scanning_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/semgrep/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/semgrep/v2/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/semgrep/v2/scanoss_semgrep_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/semgrep/v2/scanoss_semgrep_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/vulnerabilities/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/vulnerabilities/v2/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2_grpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/components.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/csvoutput.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/cyclonedx.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/data/scanoss-settings-schema.json +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/data/spdx-exceptions.json +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/data/spdx-licenses.json +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/file_filters.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/filecount.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/inspection/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/inspection/utils/license_utils.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/results.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/scancodedeps.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/scanner.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/scanoss_settings.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/scanossapi.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/scanossbase.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/scanossgrpc.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/scanpostprocessor.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/scantype.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/spdxlite.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/threadeddependencies.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/threadedscanning.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/utils/__init__.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/utils/file.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/winnowing.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss.egg-info/SOURCES.txt +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss.egg-info/dependency_links.txt +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss.egg-info/entry_points.txt +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss.egg-info/requires.txt +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss.egg-info/top_level.txt +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/tests/test_csv_output.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/tests/test_file_filters.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/tests/test_scan_post_processor.py +0 -0
- {scanoss-1.19.2 → scanoss-1.19.4}/tests/test_winnowing.py +0 -0
|
@@ -334,7 +334,7 @@ def setup_args() -> None:
|
|
|
334
334
|
|
|
335
335
|
for p in [p_copyleft, p_undeclared]:
|
|
336
336
|
p.add_argument('-i', '--input', nargs='?', help='Path to results file')
|
|
337
|
-
p.add_argument('-f', '--format',required=False ,choices=['json', 'md'], default='json', help='Output format (default: json)')
|
|
337
|
+
p.add_argument('-f', '--format',required=False ,choices=['json', 'md', 'jira_md'], default='json', help='Output format (default: json)')
|
|
338
338
|
p.add_argument('-o', '--output', type=str, help='Save details into a file')
|
|
339
339
|
p.add_argument('-s', '--status', type=str, help='Save summary data into Markdown file')
|
|
340
340
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
date: 20250108144949, utime: 1736347789
|
|
@@ -58,6 +58,7 @@ class Copyleft(PolicyCheck):
|
|
|
58
58
|
self.exclude = exclude
|
|
59
59
|
self.explicit = explicit
|
|
60
60
|
|
|
61
|
+
|
|
61
62
|
def _json(self, components: list) -> Dict[str, Any]:
|
|
62
63
|
"""
|
|
63
64
|
Format the components with copyleft licenses as JSON.
|
|
@@ -100,6 +101,33 @@ class Copyleft(PolicyCheck):
|
|
|
100
101
|
'summary' : f'{len(components)} component(s) with copyleft licenses were found.\n'
|
|
101
102
|
}
|
|
102
103
|
|
|
104
|
+
def _jira_markdown(self, components: list) -> Dict[str,Any]:
|
|
105
|
+
"""
|
|
106
|
+
Format the components with copyleft licenses as Markdown.
|
|
107
|
+
|
|
108
|
+
:param components: List of components with copyleft licenses
|
|
109
|
+
:return: Dictionary with formatted Markdown details and summary
|
|
110
|
+
"""
|
|
111
|
+
headers = ['Component', 'Version', 'License', 'URL', 'Copyleft']
|
|
112
|
+
centered_columns = [1, 4]
|
|
113
|
+
rows: [[]]= []
|
|
114
|
+
for component in components:
|
|
115
|
+
for lic in component['licenses']:
|
|
116
|
+
row = [
|
|
117
|
+
component['purl'],
|
|
118
|
+
component['version'],
|
|
119
|
+
lic['spdxid'],
|
|
120
|
+
lic['url'],
|
|
121
|
+
'YES' if lic['copyleft'] else 'NO'
|
|
122
|
+
]
|
|
123
|
+
rows.append(row)
|
|
124
|
+
# End license loop
|
|
125
|
+
# End component loop
|
|
126
|
+
return {
|
|
127
|
+
'details': f'{self.generate_jira_table(headers,rows,centered_columns)}',
|
|
128
|
+
'summary' : f'{len(components)} component(s) with copyleft licenses were found.\n'
|
|
129
|
+
}
|
|
130
|
+
|
|
103
131
|
def _filter_components_with_copyleft_licenses(self, components: list) -> list:
|
|
104
132
|
"""
|
|
105
133
|
Filter the components list to include only those with copyleft licenses.
|
|
@@ -76,7 +76,7 @@ class PolicyCheck(ScanossBase):
|
|
|
76
76
|
ScanossBase: A base class providing common functionality for SCANOSS-related operations.
|
|
77
77
|
"""
|
|
78
78
|
|
|
79
|
-
VALID_FORMATS = {'md', 'json'}
|
|
79
|
+
VALID_FORMATS = {'md', 'json', 'jira_md'}
|
|
80
80
|
|
|
81
81
|
def __init__(self, debug: bool = False, trace: bool = True, quiet: bool = False, filepath: str = None,
|
|
82
82
|
format_type: str = None, status: str = None, output: str = None, name: str = None):
|
|
@@ -134,6 +134,19 @@ class PolicyCheck(ScanossBase):
|
|
|
134
134
|
"""
|
|
135
135
|
pass
|
|
136
136
|
|
|
137
|
+
@abstractmethod
|
|
138
|
+
def _jira_markdown(self, components: list) -> Dict[str, Any]:
|
|
139
|
+
"""
|
|
140
|
+
Generate Markdown output for the policy check results.
|
|
141
|
+
|
|
142
|
+
This method should be implemented by subclasses to create a Markdown representation
|
|
143
|
+
of the policy check results.
|
|
144
|
+
|
|
145
|
+
:param components: List of components to be included in the output.
|
|
146
|
+
:return: A dictionary representing the Markdown output.
|
|
147
|
+
"""
|
|
148
|
+
pass
|
|
149
|
+
|
|
137
150
|
def _append_component(self,components: Dict[str, Any], new_component: Dict[str, Any],
|
|
138
151
|
id: str, status: str) -> Dict[str, Any]:
|
|
139
152
|
"""
|
|
@@ -270,6 +283,20 @@ class PolicyCheck(ScanossBase):
|
|
|
270
283
|
table_rows.extend(col_sep + col_sep.join(row) + col_sep for row in rows)
|
|
271
284
|
return '\n'.join(table_rows)
|
|
272
285
|
|
|
286
|
+
def generate_jira_table(self, headers, rows, centered_columns=None):
|
|
287
|
+
col_sep = '*|*'
|
|
288
|
+
if headers is None:
|
|
289
|
+
self.print_stderr('ERROR: Header are no set')
|
|
290
|
+
return None
|
|
291
|
+
|
|
292
|
+
table_header = '|*' + col_sep.join(headers) + '*|\n'
|
|
293
|
+
table = table_header
|
|
294
|
+
for row in rows:
|
|
295
|
+
if len(headers) == len(row):
|
|
296
|
+
table += '|' + '|'.join(row) + '|\n'
|
|
297
|
+
|
|
298
|
+
return table
|
|
299
|
+
|
|
273
300
|
def _get_formatter(self)-> Callable[[List[dict]], Dict[str,Any]] or None:
|
|
274
301
|
"""
|
|
275
302
|
Get the appropriate formatter function based on the specified format.
|
|
@@ -282,7 +309,8 @@ class PolicyCheck(ScanossBase):
|
|
|
282
309
|
# a map of which format function to return
|
|
283
310
|
function_map = {
|
|
284
311
|
'json': self._json,
|
|
285
|
-
'md': self._markdown
|
|
312
|
+
'md': self._markdown,
|
|
313
|
+
'jira_md': self._jira_markdown,
|
|
286
314
|
}
|
|
287
315
|
return function_map[self.format_type]
|
|
288
316
|
|
|
@@ -71,6 +71,26 @@ class UndeclaredComponent(PolicyCheck):
|
|
|
71
71
|
# end component loop
|
|
72
72
|
return undeclared_components
|
|
73
73
|
|
|
74
|
+
def _get_jira_summary(self, components: list) -> str:
|
|
75
|
+
"""
|
|
76
|
+
Get a summary of the undeclared components.
|
|
77
|
+
|
|
78
|
+
:param components: List of all components
|
|
79
|
+
:return: Component summary markdown
|
|
80
|
+
"""
|
|
81
|
+
if len(components) > 0:
|
|
82
|
+
if self.sbom_format == 'settings':
|
|
83
|
+
json_str = (json.dumps(self._generate_scanoss_file(components), indent=2).replace('\n', '\\n')
|
|
84
|
+
.replace('"', '\\"'))
|
|
85
|
+
return f'{len(components)} undeclared component(s) were found.\nAdd the following snippet into your `scanoss.json` file\n{{code:json}}\n{json.dumps(self._generate_scanoss_file(components), indent=2)}\n{{code}}\n'
|
|
86
|
+
else:
|
|
87
|
+
json_str = (json.dumps(self._generate_scanoss_file(components), indent=2).replace('\n', '\\n')
|
|
88
|
+
.replace('"', '\\"'))
|
|
89
|
+
return f'{len(components)} undeclared component(s) were found.\nAdd the following snippet into your `sbom.json` file\n{{code:json}}\n{json.dumps(self._generate_scanoss_file(components), indent=2)}\n{{code}}\n'
|
|
90
|
+
|
|
91
|
+
return f'{len(components)} undeclared component(s) were found.\\n'
|
|
92
|
+
|
|
93
|
+
|
|
74
94
|
def _get_summary(self, components: list) -> str:
|
|
75
95
|
"""
|
|
76
96
|
Get a summary of the undeclared components.
|
|
@@ -122,6 +142,24 @@ class UndeclaredComponent(PolicyCheck):
|
|
|
122
142
|
'summary': self._get_summary(components),
|
|
123
143
|
}
|
|
124
144
|
|
|
145
|
+
def _jira_markdown(self, components: list) -> Dict[str,Any]:
|
|
146
|
+
"""
|
|
147
|
+
Format the undeclared components as Markdown.
|
|
148
|
+
|
|
149
|
+
:param components: List of undeclared components
|
|
150
|
+
:return: Dictionary with formatted Markdown details and summary
|
|
151
|
+
"""
|
|
152
|
+
headers = ['Component', 'Version', 'License']
|
|
153
|
+
rows: [[]]= []
|
|
154
|
+
# TODO look at using SpdxLite license name lookup method
|
|
155
|
+
for component in components:
|
|
156
|
+
licenses = " - ".join(lic.get('spdxid', 'Unknown') for lic in component['licenses'])
|
|
157
|
+
rows.append([component['purl'], component['version'], licenses])
|
|
158
|
+
return {
|
|
159
|
+
'details': f'{self.generate_jira_table(headers,rows)}',
|
|
160
|
+
'summary': self._get_jira_summary(components),
|
|
161
|
+
}
|
|
162
|
+
|
|
125
163
|
def _get_unique_components(self, components: list) -> list:
|
|
126
164
|
"""
|
|
127
165
|
Generate a list of unique components.
|
|
@@ -153,7 +153,7 @@ class MyTestCase(unittest.TestCase):
|
|
|
153
153
|
Inspect for undeclared components empty path
|
|
154
154
|
"""
|
|
155
155
|
def test_copyleft_policy_empty_path(self):
|
|
156
|
-
copyleft =
|
|
156
|
+
copyleft = Copyleft(filepath='', format_type='json')
|
|
157
157
|
success, results = copyleft.run()
|
|
158
158
|
self.assertTrue(success,2)
|
|
159
159
|
|
|
@@ -332,5 +332,66 @@ class MyTestCase(unittest.TestCase):
|
|
|
332
332
|
self.assertEqual(re.sub(r'\s|\\(?!`)|\\(?=`)', '', summary),
|
|
333
333
|
re.sub(r'\s|\\(?!`)|\\(?=`)', '', expected_summary_output))
|
|
334
334
|
|
|
335
|
+
def test_undeclared_policy_jira_markdown_output(self):
|
|
336
|
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
337
|
+
file_name = "result.json"
|
|
338
|
+
input_file_name = os.path.join(script_dir, 'data', file_name)
|
|
339
|
+
undeclared = UndeclaredComponent(filepath=input_file_name, format_type='jira_md')
|
|
340
|
+
status, results = undeclared.run()
|
|
341
|
+
details = results['details']
|
|
342
|
+
summary = results['summary']
|
|
343
|
+
expected_details_output = """|*Component*|*Version*|*License*|
|
|
344
|
+
|pkg:github/scanoss/scanner.c|1.3.3|BSD-2-Clause - GPL-2.0-only|
|
|
345
|
+
|pkg:github/scanoss/scanner.c|1.1.4|GPL-2.0-only|
|
|
346
|
+
|pkg:github/scanoss/wfp|6afc1f6|Zlib - GPL-2.0-only|
|
|
347
|
+
|pkg:npm/%40electron/rebuild|3.7.0|MIT|
|
|
348
|
+
|pkg:npm/%40emotion/react|11.13.3|MIT|
|
|
349
|
+
"""
|
|
350
|
+
expected_summary_output = """5 undeclared component(s) were found.
|
|
351
|
+
Add the following snippet into your `scanoss.json` file
|
|
352
|
+
{code:json}
|
|
353
|
+
{
|
|
354
|
+
"bom": {
|
|
355
|
+
"include": [
|
|
356
|
+
{
|
|
357
|
+
"purl": "pkg:github/scanoss/scanner.c"
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
"purl": "pkg:github/scanoss/wfp"
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"purl": "pkg:npm/%40electron/rebuild"
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
"purl": "pkg:npm/%40emotion/react"
|
|
367
|
+
}
|
|
368
|
+
]
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
{code}
|
|
372
|
+
"""
|
|
373
|
+
self.assertEqual(status, 0)
|
|
374
|
+
self.assertEqual(expected_details_output, details)
|
|
375
|
+
self.assertEqual(summary, expected_summary_output)
|
|
376
|
+
|
|
377
|
+
def test_copyleft_policy_jira_markdown_output(self):
|
|
378
|
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
379
|
+
file_name = "result.json"
|
|
380
|
+
input_file_name = os.path.join(script_dir, 'data', file_name)
|
|
381
|
+
copyleft = Copyleft(filepath=input_file_name, format_type='jira_md')
|
|
382
|
+
status, results = copyleft.run()
|
|
383
|
+
details = results['details']
|
|
384
|
+
expected_details_output = """|*Component*|*Version*|*License*|*URL*|*Copyleft*|
|
|
385
|
+
|pkg:github/scanoss/scanner.c|1.3.3|GPL-2.0-only|https://spdx.org/licenses/GPL-2.0-only.html|YES|
|
|
386
|
+
|pkg:github/scanoss/scanner.c|1.1.4|GPL-2.0-only|https://spdx.org/licenses/GPL-2.0-only.html|YES|
|
|
387
|
+
|pkg:github/scanoss/engine|5.4.0|GPL-2.0-only|https://spdx.org/licenses/GPL-2.0-only.html|YES|
|
|
388
|
+
|pkg:github/scanoss/wfp|6afc1f6|GPL-2.0-only|https://spdx.org/licenses/GPL-2.0-only.html|YES|
|
|
389
|
+
|pkg:github/scanoss/engine|4.0.4|GPL-2.0-only|https://spdx.org/licenses/GPL-2.0-only.html|YES|
|
|
390
|
+
"""
|
|
391
|
+
self.assertEqual(status, 0)
|
|
392
|
+
self.assertEqual(expected_details_output, details)
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
|
|
335
396
|
if __name__ == '__main__':
|
|
336
397
|
unittest.main()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
date: 20250106152810, utime: 1736177290
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/components/v2/scanoss_components_pb2_grpc.py
RENAMED
|
File without changes
|
{scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/cryptography/v2/scanoss_cryptography_pb2.py
RENAMED
|
File without changes
|
{scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/cryptography/v2/scanoss_cryptography_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/dependencies/v2/scanoss_dependencies_pb2.py
RENAMED
|
File without changes
|
{scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/dependencies/v2/scanoss_dependencies_pb2_grpc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scanoss-1.19.2 → scanoss-1.19.4}/src/scanoss/api/vulnerabilities/v2/scanoss_vulnerabilities_pb2.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|