Coverage for src \ sec_report_kit \ parsers \ gitleaks.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 _extract_findings(data: dict | list) -> list[dict]: 

8 if isinstance(data, list): 

9 return [item for item in data if isinstance(item, dict)] 

10 if isinstance(data, dict) and isinstance(data.get("findings"), list): 

11 return [item for item in data["findings"] if isinstance(item, dict)] 

12 return [] 

13 

14 

15def _build_title(entry: dict) -> str: 

16 description = str(entry.get("Description") or "Potential secret detected") 

17 file_path = str(entry.get("File") or "unknown-file") 

18 start_line = entry.get("StartLine") 

19 if start_line is not None: 

20 return f"{description} ({file_path}:{start_line})" 

21 return f"{description} ({file_path})" 

22 

23 

24def parse_gitleaks_json(data: dict | list) -> list[Finding]: 

25 findings: list[Finding] = [] 

26 

27 for entry in _extract_findings(data): 

28 findings.append( 

29 Finding( 

30 source_type="secret-scan", 

31 target=str(entry.get("File") or "repository"), 

32 severity=normalize_severity(entry.get("Severity")), 

33 vulnerability_id=str(entry.get("RuleID") or entry.get("Fingerprint") or "-"), 

34 package=str(entry.get("RuleID") or "gitleaks-rule"), 

35 installed_version="-", 

36 fixed_version="-", 

37 title=_build_title(entry), 

38 primary_url="", 

39 ) 

40 ) 

41 

42 return findings