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

21 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-08-04 22:15 +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 service: PackageIntelligenceService | None = None, 

31) -> CheckResult: 

32 if min_health < 0 or min_health > 100: 

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

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

35 result = ( 

36 await require_package(ref, refresh, service=service) 

37 if service is not None 

38 else await require_package(ref, refresh) 

39 ) 

40 checks = evaluate_default_policy( 

41 result.info, 

42 result.derived, 

43 min_health=min_health, 

44 require_ci=require_ci, 

45 ) 

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