Coverage for src \ sec_report_kit \ parsers \ semgrep.py: 100%

21 statements  

« prev     ^ index     » next       coverage.py v7.14.0, created at 2026-05-13 08:06 +0530

1from __future__ import annotations 

2 

3from sec_report_kit.models import Finding 

4from sec_report_kit.services.normalize import normalize_severity 

5 

6 

7def _severity(extra: dict) -> str: 

8 value = extra.get("severity") 

9 if not value and isinstance(extra.get("metadata"), dict): 

10 value = extra["metadata"].get("severity") 

11 return normalize_severity(value) 

12 

13 

14def _primary_url(extra: dict) -> str: 

15 metadata = extra.get("metadata") 

16 if isinstance(metadata, dict): 

17 refs = metadata.get("references") 

18 if isinstance(refs, list) and refs: 

19 return str(refs[0]) 

20 return "" 

21 

22 

23def parse_semgrep_json(data: dict) -> list[Finding]: 

24 findings: list[Finding] = [] 

25 

26 for issue in data.get("results", []) if isinstance(data, dict) else []: 

27 extra = issue.get("extra") if isinstance(issue.get("extra"), dict) else {} 

28 findings.append( 

29 Finding( 

30 source_type="semgrep-sast", 

31 target=str(issue.get("path") or "repository"), 

32 severity=_severity(extra), 

33 vulnerability_id=str(issue.get("check_id") or "-"), 

34 package=str(issue.get("check_id") or "semgrep-rule"), 

35 installed_version="-", 

36 fixed_version="-", 

37 title=str(extra.get("message") or issue.get("check_id") or "Semgrep finding"), 

38 primary_url=_primary_url(extra), 

39 ) 

40 ) 

41 

42 return findings