Skip to content

Commit fde1536

Browse files
feat: add OutputConfig data model with from_args() method
- Add OutputConfig class with all 15 CLI output fields and defaults - Implement explicit string-to-boolean conversion for display_vulnerability_findings - Add from_args() class method for converting legacy args to structured config - Add comprehensive test coverage (21 OutputConfig tests) - Use CLI defaults for output paths and threshold values
1 parent 52e652c commit fde1536

File tree

2 files changed

+187
-1
lines changed

2 files changed

+187
-1
lines changed

entrypoint/entrypoint/data_model.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,62 @@ def from_args(ScanConfig, args):
4343
skip_scanners=parse_comma_list(args.skip_scanners),
4444
skip_files=parse_comma_list(args.skip_files)
4545
)
46+
47+
48+
class OutputConfig:
49+
def __init__(self,
50+
display_vulnerability_findings="disabled",
51+
show_only_fixable_vulns=False,
52+
output_sbom_path="sbom.json",
53+
output_inspector_scan_path="inspector-scan.json",
54+
output_inspector_scan_path_csv="inspector-scan.csv",
55+
output_inspector_scan_path_markdown="inspector-scan.md",
56+
output_dockerfile_scan_csv="inspector-dockerfile-scan.csv",
57+
output_dockerfile_scan_markdown="inspector-dockerfile-scan.md",
58+
thresholds=False,
59+
critical_threshold=0,
60+
high_threshold=0,
61+
medium_threshold=0,
62+
low_threshold=0,
63+
other_threshold=0,
64+
threshold_fixable_only=False):
65+
# Convert string to boolean for type safety
66+
if display_vulnerability_findings == "enabled":
67+
self.display_vulnerability_findings = True
68+
else:
69+
self.display_vulnerability_findings = False
70+
71+
self.show_only_fixable_vulns = show_only_fixable_vulns
72+
self.output_sbom_path = output_sbom_path
73+
self.output_inspector_scan_path = output_inspector_scan_path
74+
self.output_inspector_scan_path_csv = output_inspector_scan_path_csv
75+
self.output_inspector_scan_path_markdown = output_inspector_scan_path_markdown
76+
self.output_dockerfile_scan_csv = output_dockerfile_scan_csv
77+
self.output_dockerfile_scan_markdown = output_dockerfile_scan_markdown
78+
self.thresholds = thresholds
79+
self.critical_threshold = critical_threshold
80+
self.high_threshold = high_threshold
81+
self.medium_threshold = medium_threshold
82+
self.low_threshold = low_threshold
83+
self.other_threshold = other_threshold
84+
self.threshold_fixable_only = threshold_fixable_only
85+
86+
@classmethod
87+
def from_args(OutputConfig, args):
88+
return OutputConfig(
89+
display_vulnerability_findings=args.display_vuln_findings,
90+
show_only_fixable_vulns=args.show_only_fixable_vulns,
91+
output_sbom_path=args.out_sbom,
92+
output_inspector_scan_path=args.out_scan,
93+
output_inspector_scan_path_csv=args.out_scan_csv,
94+
output_inspector_scan_path_markdown=args.out_scan_markdown,
95+
output_dockerfile_scan_csv=args.out_dockerfile_scan_csv,
96+
output_dockerfile_scan_markdown=args.out_dockerfile_scan_md,
97+
thresholds=args.thresholds,
98+
critical_threshold=args.critical,
99+
high_threshold=args.high,
100+
medium_threshold=args.medium,
101+
low_threshold=args.low,
102+
other_threshold=args.other,
103+
threshold_fixable_only=args.threshold_fixable_only
104+
)

entrypoint/tests/test_data_model.py

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import unittest
2-
from entrypoint.data_model import ArtifactType, ScanConfig, parse_comma_list
2+
from entrypoint.data_model import ArtifactType, ScanConfig, OutputConfig, parse_comma_list
33

44

55
class MockArgs:
@@ -13,6 +13,24 @@ class MockArgs:
1313
skip_files = './media,/tmp/foo'
1414

1515

16+
class MockOutputArgs:
17+
display_vuln_findings = 'enabled'
18+
show_only_fixable_vulns = True
19+
out_sbom = 'test_sbom.json'
20+
out_scan = 'test_scan.json'
21+
out_scan_csv = 'test_scan.csv'
22+
out_scan_markdown = 'test_scan.md'
23+
out_dockerfile_scan_csv = 'test_dockerfile.csv'
24+
out_dockerfile_scan_md = 'test_dockerfile.md'
25+
thresholds = True
26+
critical = 5
27+
high = 10
28+
medium = 15
29+
low = 20
30+
other = 25
31+
threshold_fixable_only = True
32+
33+
1634
class TestDataModel(unittest.TestCase):
1735

1836
def test_artifact_type_repository_exists(self):
@@ -196,3 +214,112 @@ def test_scan_config_comprehensive_access(self):
196214
self.assertEqual(config.sbomgen_version, "1.8.0")
197215
self.assertEqual(config.timeout, 300)
198216
self.assertEqual(config.platform, "linux/amd64")
217+
218+
def test_output_config_can_be_created(self):
219+
config = OutputConfig()
220+
self.assertIsNotNone(config)
221+
222+
def test_output_config_has_display_vulnerability_findings(self):
223+
config = OutputConfig(display_vulnerability_findings="enabled")
224+
self.assertEqual(config.display_vulnerability_findings, True)
225+
226+
def test_output_config_has_show_only_fixable_vulns(self):
227+
config = OutputConfig(show_only_fixable_vulns=True)
228+
self.assertEqual(config.show_only_fixable_vulns, True)
229+
230+
def test_output_config_has_output_sbom_path(self):
231+
config = OutputConfig(output_sbom_path="./sbom_123.json")
232+
self.assertEqual(config.output_sbom_path, "./sbom_123.json")
233+
234+
def test_output_config_has_output_inspector_scan_path(self):
235+
config = OutputConfig(output_inspector_scan_path="inspector_scan_123.json")
236+
self.assertEqual(config.output_inspector_scan_path, "inspector_scan_123.json")
237+
238+
def test_output_config_uses_action_yml_defaults(self):
239+
config = OutputConfig()
240+
self.assertEqual(config.display_vulnerability_findings, False)
241+
self.assertEqual(config.show_only_fixable_vulns, False)
242+
self.assertEqual(config.output_sbom_path, "sbom.json")
243+
self.assertEqual(config.output_inspector_scan_path, "inspector-scan.json")
244+
self.assertEqual(config.output_inspector_scan_path_csv, "inspector-scan.csv")
245+
self.assertEqual(config.output_inspector_scan_path_markdown, "inspector-scan.md")
246+
self.assertEqual(config.output_dockerfile_scan_csv, "inspector-dockerfile-scan.csv")
247+
self.assertEqual(config.output_dockerfile_scan_markdown, "inspector-dockerfile-scan.md")
248+
self.assertEqual(config.thresholds, False)
249+
self.assertEqual(config.critical_threshold, 0)
250+
self.assertEqual(config.high_threshold, 0)
251+
self.assertEqual(config.medium_threshold, 0)
252+
self.assertEqual(config.low_threshold, 0)
253+
self.assertEqual(config.other_threshold, 0)
254+
self.assertEqual(config.threshold_fixable_only, False)
255+
256+
def test_output_config_converts_enabled_to_true(self):
257+
config = OutputConfig(display_vulnerability_findings="enabled")
258+
self.assertEqual(config.display_vulnerability_findings, True)
259+
260+
def test_output_config_converts_disabled_to_false(self):
261+
config = OutputConfig(display_vulnerability_findings="disabled")
262+
self.assertEqual(config.display_vulnerability_findings, False)
263+
264+
def test_output_config_converts_invalid_string_to_false(self):
265+
config = OutputConfig(display_vulnerability_findings="invalid")
266+
self.assertEqual(config.display_vulnerability_findings, False)
267+
268+
def test_output_config_has_output_inspector_scan_path_csv(self):
269+
config = OutputConfig(output_inspector_scan_path_csv="inspector_scan_123.csv")
270+
self.assertEqual(config.output_inspector_scan_path_csv, "inspector_scan_123.csv")
271+
272+
def test_output_config_has_output_inspector_scan_path_markdown(self):
273+
config = OutputConfig(output_inspector_scan_path_markdown="inspector_scan_123.md")
274+
self.assertEqual(config.output_inspector_scan_path_markdown, "inspector_scan_123.md")
275+
276+
def test_output_config_has_output_dockerfile_scan_csv(self):
277+
config = OutputConfig(output_dockerfile_scan_csv="dockerfile_scan_123.csv")
278+
self.assertEqual(config.output_dockerfile_scan_csv, "dockerfile_scan_123.csv")
279+
280+
def test_output_config_has_output_dockerfile_scan_markdown(self):
281+
config = OutputConfig(output_dockerfile_scan_markdown="dockerfile_scan_123.md")
282+
self.assertEqual(config.output_dockerfile_scan_markdown, "dockerfile_scan_123.md")
283+
284+
def test_output_config_has_thresholds(self):
285+
config = OutputConfig(thresholds=True)
286+
self.assertEqual(config.thresholds, True)
287+
288+
def test_output_config_has_critical_threshold(self):
289+
config = OutputConfig(critical_threshold=5)
290+
self.assertEqual(config.critical_threshold, 5)
291+
292+
def test_output_config_has_threshold_fixable_only(self):
293+
config = OutputConfig(threshold_fixable_only=True)
294+
self.assertEqual(config.threshold_fixable_only, True)
295+
296+
def test_output_config_from_args_exists(self):
297+
mock_args = MockOutputArgs()
298+
config = OutputConfig.from_args(mock_args)
299+
self.assertIsNotNone(config)
300+
301+
def test_output_config_from_args_converts_display_vuln_findings(self):
302+
mock_args = MockOutputArgs()
303+
config = OutputConfig.from_args(mock_args)
304+
self.assertEqual(config.display_vulnerability_findings, True)
305+
306+
def test_output_config_from_args_converts_output_paths(self):
307+
mock_args = MockOutputArgs()
308+
config = OutputConfig.from_args(mock_args)
309+
self.assertEqual(config.output_sbom_path, 'test_sbom.json')
310+
self.assertEqual(config.output_inspector_scan_path, 'test_scan.json')
311+
self.assertEqual(config.output_inspector_scan_path_csv, 'test_scan.csv')
312+
313+
def test_output_config_from_args_converts_thresholds(self):
314+
mock_args = MockOutputArgs()
315+
config = OutputConfig.from_args(mock_args)
316+
self.assertEqual(config.thresholds, True)
317+
self.assertEqual(config.critical_threshold, 5)
318+
self.assertEqual(config.high_threshold, 10)
319+
self.assertEqual(config.threshold_fixable_only, True)
320+
321+
def test_output_config_from_args_converts_boolean_fields(self):
322+
mock_args = MockOutputArgs()
323+
config = OutputConfig.from_args(mock_args)
324+
self.assertEqual(config.show_only_fixable_vulns, True)
325+
self.assertEqual(config.threshold_fixable_only, True)

0 commit comments

Comments
 (0)