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
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-14 23:28 +0000
1"""Package policy-check workflow."""
3from dataclasses import dataclass
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
12@dataclass(frozen=True)
13class CheckResult:
14 package: PackageRef
15 checks: list[PolicyResult]
16 warnings: list[object]
18 @property
19 def passed(self) -> bool:
20 return all(check.passed for check in self.checks)
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)