Coverage for src/secchi/workflows/check.py: 92%

25 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-08-14 23:28 +0000

1"""Package policy-check workflow.""" 

2 

3from dataclasses import dataclass 

4 

5from secchi.models import PackageRef 

6from secchi.policy import PolicyResult, evaluate_default_policy 

7from secchi.services.intelligence import PackageIntelligenceService 

8from secchi.services.resolver import parse_package_spec 

9from secchi.workflows.common import require_package 

10 

11 

12@dataclass(frozen=True) 

13class CheckResult: 

14 package: PackageRef 

15 checks: list[PolicyResult] 

16 warnings: list[object] 

17 

18 @property 

19 def passed(self) -> bool: 

20 return all(check.passed for check in self.checks) 

21 

22 

23async def run( 

24 package: str | PackageRef, 

25 *, 

26 registry: str | None = None, 

27 min_health: int = 70, 

28 require_ci: bool = False, 

29 refresh: bool = False, 

30 security_refresh: bool = False, 

31 service: PackageIntelligenceService | None = None, 

32) -> CheckResult: 

33 if min_health < 0 or min_health > 100: 

34 raise ValueError("min_health must be between 0 and 100") 

35 ref = parse_package_spec(package, registry) if isinstance(package, str) else package 

36 if security_refresh: 

37 result = await require_package( 

38 ref, refresh, security_refresh=True, service=service 

39 ) 

40 elif service is not None: 

41 result = await require_package(ref, refresh, service=service) 

42 else: 

43 result = await require_package(ref, refresh) 

44 checks = evaluate_default_policy( 

45 result.info, 

46 result.derived, 

47 min_health=min_health, 

48 require_ci=require_ci, 

49 ) 

50 return CheckResult(ref, checks, result.warnings)